blob: 6e97183da1c4f64cfb9b0ffc601b1d7454aca90d [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
419 if (getToolChain().getDriver().IsCLMode()) {
420 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
421 // include is compiled into foo.h, and everything after goes into
422 // the .obj file. /Yufoo.h means that all includes prior to and including
423 // foo.h are completely skipped and replaced with a use of the pch file
424 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
425 // just mean that the last one wins.) If /Yc and /Yu are both present
426 // and refer to the same file, /Yc wins.
427 // Note that OPT__SLASH_FI gets mapped to OPT_include.
428 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
429 // cl.exe seems to support both flags with different values, but that
430 // seems strange (which flag does /Fp now refer to?), so don't implement
431 // that until someone needs that.
432 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
433 if (PchIndex != -1) {
434 if (isa<PrecompileJobAction>(JA)) {
435 // When building the pch, skip all includes after the pch.
436 assert(YcIndex != -1 && PchIndex == YcIndex);
437 if (AI >= YcIndex)
438 continue;
439 } else {
440 // When using the pch, skip all includes prior to the pch.
441 if (AI < PchIndex)
442 continue;
443 if (AI == PchIndex) {
444 A->claim();
445 CmdArgs.push_back("-include-pch");
446 CmdArgs.push_back(
447 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
448 continue;
449 }
450 }
451 }
452 } else if (A->getOption().matches(options::OPT_include)) {
453 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000454 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
455 RenderedImplicitInclude = true;
456
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000457 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000458 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000459
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000460 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000461 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000462 SmallString<128> P(A->getValue());
463 // We want the files to have a name like foo.h.pch. Add a dummy extension
464 // so that replace_extension does the right thing.
465 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000466 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000467 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000468 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000469 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000470 }
471
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000473 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000474 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000476 }
477
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000479 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000480 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000481 FoundPCH = UsePCH;
482 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000483 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000484 }
485
486 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000487 if (IsFirstImplicitInclude) {
488 A->claim();
489 if (UsePCH)
490 CmdArgs.push_back("-include-pch");
491 else
492 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000493 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000494 continue;
495 } else {
496 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000497 D.Diag(diag::warn_drv_pch_not_first_include) << P
498 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000499 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000500 }
501 }
502
503 // Not translated, render as usual.
504 A->claim();
505 A->render(Args, CmdArgs);
506 }
507
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000508 Args.AddAllArgs(CmdArgs,
509 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
510 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000511
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000512 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000513
514 // FIXME: There is a very unfortunate problem here, some troubled
515 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
516 // really support that we would have to parse and then translate
517 // those options. :(
518 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
519 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000520
521 // -I- is a deprecated GCC feature, reject it.
522 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000523 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000524
525 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
526 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000527 StringRef sysroot = C.getSysRoot();
528 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000529 if (!Args.hasArg(options::OPT_isysroot)) {
530 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000531 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 }
533 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000534
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000535 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000536 // FIXME: We should probably sink the logic for handling these from the
537 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // CPATH - included following the user specified includes (but prior to
539 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000540 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000542 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000543 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000544 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000545 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000546 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000547 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000548 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000549
Artem Belevichfa11ab52015-11-17 22:28:46 +0000550 // Optional AuxToolChain indicates that we need to include headers
551 // for more than one target. If that's the case, add include paths
552 // from AuxToolChain right after include paths of the same kind for
553 // the current target.
554
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000555 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000556 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000557 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000558 if (AuxToolChain)
559 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
560 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000561
562 // Add system include arguments.
563 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000564 if (AuxToolChain)
565 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
566
567 // Add CUDA include arguments, if needed.
568 if (types::isCuda(Inputs[0].getType()))
569 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000570}
571
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000572// FIXME: Move to target hook.
573static bool isSignedCharDefault(const llvm::Triple &Triple) {
574 switch (Triple.getArch()) {
575 default:
576 return true;
577
Tim Northover9bb857a2013-01-31 12:13:10 +0000578 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000579 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000580 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000581 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000582 case llvm::Triple::thumb:
583 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000584 if (Triple.isOSDarwin() || Triple.isOSWindows())
585 return true;
586 return false;
587
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000588 case llvm::Triple::ppc:
589 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000590 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 return true;
592 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000593
David Majnemerdcecd932015-05-23 19:23:55 +0000594 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000595 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000596 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000597 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000598 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000599 }
600}
601
Robert Lytton0e076492013-08-13 09:43:10 +0000602static bool isNoCommonDefault(const llvm::Triple &Triple) {
603 switch (Triple.getArch()) {
604 default:
605 return false;
606
607 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000608 case llvm::Triple::wasm32:
609 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000610 return true;
611 }
612}
613
Renato Goline17c5802015-07-27 23:44:42 +0000614// ARM tools start.
615
616// Get SubArch (vN).
617static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
618 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000619 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000620}
621
622// True if M-profile.
623static bool isARMMProfile(const llvm::Triple &Triple) {
624 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000625 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000626 return Profile == llvm::ARM::PK_M;
627}
628
629// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000630static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
631 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000632 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
633 CPU = A->getValue();
634 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
635 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000636 if (!FromAs)
637 return;
638
639 for (const Arg *A :
640 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
641 StringRef Value = A->getValue();
642 if (Value.startswith("-mcpu="))
643 CPU = Value.substr(6);
644 if (Value.startswith("-march="))
645 Arch = Value.substr(7);
646 }
Renato Goline17c5802015-07-27 23:44:42 +0000647}
648
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000649// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000650// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000651static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000652 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000653 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000654 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
655 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000656 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
657}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000658
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000659// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000660static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000661 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000663 unsigned FPUID = llvm::ARM::parseFPU(FPU);
664 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000665 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
666}
667
Bradley Smithbbf5a002015-11-18 16:33:48 +0000668// Decode ARM features from string like +[no]featureA+[no]featureB+...
669static bool DecodeARMFeatures(const Driver &D, StringRef text,
670 std::vector<const char *> &Features) {
671 SmallVector<StringRef, 8> Split;
672 text.split(Split, StringRef("+"), -1, false);
673
674 for (StringRef Feature : Split) {
675 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
676 if (FeatureName)
677 Features.push_back(FeatureName);
678 else
679 return false;
680 }
681 return true;
682}
683
Renato Golin7c542b42015-07-27 23:44:45 +0000684// Check if -march is valid by checking if it can be canonicalised and parsed.
685// getARMArch is used here instead of just checking the -march value in order
686// to handle -march=native correctly.
687static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000688 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000689 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000690 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000691 std::pair<StringRef, StringRef> Split = ArchName.split("+");
692
Renato Goline17c5802015-07-27 23:44:42 +0000693 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
695 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000696 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000697}
698
Renato Golin7c542b42015-07-27 23:44:45 +0000699// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
700static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
701 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000702 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000703 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000704 std::pair<StringRef, StringRef> Split = CPUName.split("+");
705
Renato Goline17c5802015-07-27 23:44:42 +0000706 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
708 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000709 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000710}
711
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000712static bool useAAPCSForMachO(const llvm::Triple &T) {
713 // The backend is hardwired to assume AAPCS for M-class processors, ensure
714 // the frontend matches that.
715 return T.getEnvironment() == llvm::Triple::EABI ||
716 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
717}
718
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000719// Select the float ABI as determined by -msoft-float, -mhard-float, and
720// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000721arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
722 const Driver &D = TC.getDriver();
723 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000724 auto SubArch = getARMSubArchVersionNumber(Triple);
725 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000726 if (Arg *A =
727 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
728 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000729 if (A->getOption().matches(options::OPT_msoft_float)) {
730 ABI = FloatABI::Soft;
731 } else if (A->getOption().matches(options::OPT_mhard_float)) {
732 ABI = FloatABI::Hard;
733 } else {
734 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
735 .Case("soft", FloatABI::Soft)
736 .Case("softfp", FloatABI::SoftFP)
737 .Case("hard", FloatABI::Hard)
738 .Default(FloatABI::Invalid);
739 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000740 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000741 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000742 }
743 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000744
745 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
746 // "apcs-gnu".
747 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000748 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000749 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
750 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000752 }
753
754 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000755 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000756 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000757 case llvm::Triple::Darwin:
758 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000759 case llvm::Triple::IOS:
760 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000761 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000762 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000763 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 break;
765 }
Tim Northover756447a2015-10-30 16:30:36 +0000766 case llvm::Triple::WatchOS:
767 ABI = FloatABI::Hard;
768 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000769
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000770 // FIXME: this is invalid for WindowsCE
771 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000772 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 break;
774
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000775 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000776 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000777 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000778 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000779 break;
780 default:
781 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000782 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000783 break;
784 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000785 break;
786
Daniel Dunbar78485922009-09-10 23:00:09 +0000787 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000788 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000789 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000790 case llvm::Triple::EABIHF:
791 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000793 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000794 case llvm::Triple::EABI:
795 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000796 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000798 case llvm::Triple::Android:
799 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000800 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000801 default:
802 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000803 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000804 if (Triple.getOS() != llvm::Triple::UnknownOS ||
805 !Triple.isOSBinFormatMachO())
806 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000807 break;
808 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000809 }
810 }
811
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000812 assert(ABI != FloatABI::Invalid && "must select an ABI");
813 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000814}
815
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000816static void getARMTargetFeatures(const ToolChain &TC,
817 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000818 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000819 std::vector<const char *> &Features,
820 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000821 const Driver &D = TC.getDriver();
822
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000823 bool KernelOrKext =
824 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000825 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000826 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
827 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
828
Nico Weber6e0ebae2015-04-29 21:16:40 +0000829 if (!ForAS) {
830 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
831 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
832 // stripped out by the ARM target. We should probably pass this a new
833 // -target-option, which is handled by the -cc1/-cc1as invocation.
834 //
835 // FIXME2: For consistency, it would be ideal if we set up the target
836 // machine state the same when using the frontend or the assembler. We don't
837 // currently do that for the assembler, we pass the options directly to the
838 // backend and never even instantiate the frontend TargetInfo. If we did,
839 // and used its handleTargetFeatures hook, then we could ensure the
840 // assembler and the frontend behave the same.
841
842 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000843 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000844 Features.push_back("+soft-float");
845
846 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000847 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000848 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000849 } else {
850 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
851 // to the assembler correctly.
852 for (const Arg *A :
853 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
854 StringRef Value = A->getValue();
855 if (Value.startswith("-mfpu=")) {
856 WaFPU = A;
857 } else if (Value.startswith("-mcpu=")) {
858 WaCPU = A;
859 } else if (Value.startswith("-mhwdiv=")) {
860 WaHDiv = A;
861 } else if (Value.startswith("-march=")) {
862 WaArch = A;
863 }
864 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000865 }
866
Renato Golin7c542b42015-07-27 23:44:45 +0000867 // Check -march. ClangAs gives preference to -Wa,-march=.
868 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000869 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000870 if (WaArch) {
871 if (ArchArg)
872 D.Diag(clang::diag::warn_drv_unused_argument)
873 << ArchArg->getAsString(Args);
874 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000875 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000876 // FIXME: Set Arch.
877 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
878 } else if (ArchArg) {
879 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000880 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000881 }
882
Renato Golin7c542b42015-07-27 23:44:45 +0000883 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
884 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000885 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000886 if (WaCPU) {
887 if (CPUArg)
888 D.Diag(clang::diag::warn_drv_unused_argument)
889 << CPUArg->getAsString(Args);
890 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000891 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000892 } else if (CPUArg) {
893 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000894 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000895 }
John Brawna95c1a82015-05-08 12:52:18 +0000896
Renato Golin23459c62015-07-30 16:40:17 +0000897 // Add CPU features for generic CPUs
898 if (CPUName == "native") {
899 llvm::StringMap<bool> HostFeatures;
900 if (llvm::sys::getHostCPUFeatures(HostFeatures))
901 for (auto &F : HostFeatures)
902 Features.push_back(
903 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
904 }
905
906 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
907 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
908 if (WaFPU) {
909 if (FPUArg)
910 D.Diag(clang::diag::warn_drv_unused_argument)
911 << FPUArg->getAsString(Args);
912 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
913 Features);
914 } else if (FPUArg) {
915 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
916 }
917
918 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
919 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
920 if (WaHDiv) {
921 if (HDivArg)
922 D.Diag(clang::diag::warn_drv_unused_argument)
923 << HDivArg->getAsString(Args);
924 getARMHWDivFeatures(D, WaHDiv, Args,
925 StringRef(WaHDiv->getValue()).substr(8), Features);
926 } else if (HDivArg)
927 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
928
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000929 // Setting -msoft-float effectively disables NEON because of the GCC
930 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000931 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000932 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000933 // Also need to explicitly disable features which imply NEON.
934 Features.push_back("-crypto");
935 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000936
Eric Christopher269c2a22015-04-04 03:34:43 +0000937 // En/disable crc code generation.
938 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000939 if (A->getOption().matches(options::OPT_mcrc))
940 Features.push_back("+crc");
941 else
942 Features.push_back("-crc");
943 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000944
Akira Hatanakac2694822015-07-07 08:28:42 +0000945 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
946 // neither options are specified, see if we are compiling for kernel/kext and
947 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000948 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
949 options::OPT_mno_long_calls)) {
950 if (A->getOption().matches(options::OPT_mlong_calls))
951 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000952 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
953 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000954 Features.push_back("+long-calls");
955 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000956
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000957 // Kernel code has more strict alignment requirements.
958 if (KernelOrKext)
959 Features.push_back("+strict-align");
960 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
961 options::OPT_munaligned_access)) {
962 if (A->getOption().matches(options::OPT_munaligned_access)) {
963 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
964 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
965 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
966 } else
967 Features.push_back("+strict-align");
968 } else {
969 // Assume pre-ARMv6 doesn't support unaligned accesses.
970 //
971 // ARMv6 may or may not support unaligned accesses depending on the
972 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
973 // Darwin and NetBSD targets support unaligned accesses, and others don't.
974 //
975 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
976 // which raises an alignment fault on unaligned accesses. Linux
977 // defaults this bit to 0 and handles it as a system-wide (not
978 // per-process) setting. It is therefore safe to assume that ARMv7+
979 // Linux targets support unaligned accesses. The same goes for NaCl.
980 //
981 // The above behavior is consistent with GCC.
982 int VersionNum = getARMSubArchVersionNumber(Triple);
983 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000984 if (VersionNum < 6 ||
985 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000986 Features.push_back("+strict-align");
987 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
988 if (VersionNum < 7)
989 Features.push_back("+strict-align");
990 } else
991 Features.push_back("+strict-align");
992 }
993
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000994 // llvm does not support reserving registers in general. There is support
995 // for reserving r9 on ARM though (defined as a platform-specific register
996 // in ARM EABI).
997 if (Args.hasArg(options::OPT_ffixed_r9))
998 Features.push_back("+reserve-r9");
999
Dimitry Andric08107392016-01-06 07:42:18 +00001000 // The kext linker doesn't know how to deal with movw/movt.
1001 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001002 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001003}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001004
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001005void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1006 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001007 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001008 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001009 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001010 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001011 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001012 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001013 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001014 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001015 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001016 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001017 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001018 } else {
1019 ABIName = "apcs-gnu";
1020 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001021 } else if (Triple.isOSWindows()) {
1022 // FIXME: this is invalid for WindowsCE
1023 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001024 } else {
1025 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001026 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001027 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001028 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001029 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001030 ABIName = "aapcs-linux";
1031 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001032 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001033 case llvm::Triple::EABI:
1034 ABIName = "aapcs";
1035 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001036 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001037 if (Triple.getOS() == llvm::Triple::NetBSD)
1038 ABIName = "apcs-gnu";
1039 else
1040 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001041 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001042 }
1043 }
1044 CmdArgs.push_back("-target-abi");
1045 CmdArgs.push_back(ABIName);
1046
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001047 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001048 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001049 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001050 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001051 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001052 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001053 CmdArgs.push_back("-mfloat-abi");
1054 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001055 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001056 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001057 CmdArgs.push_back("-mfloat-abi");
1058 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001059 } else {
1060 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001061 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001062 CmdArgs.push_back("-mfloat-abi");
1063 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001064 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001065
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001066 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001067 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1068 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001069 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001070 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001071 CmdArgs.push_back("-arm-global-merge=false");
1072 else
1073 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001074 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001075
Bob Wilson9c8af452013-04-11 18:53:25 +00001076 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001077 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001078 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001079}
Renato Goline17c5802015-07-27 23:44:42 +00001080// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001081
Tim Northover573cbee2014-05-24 12:52:07 +00001082/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1083/// targeting.
1084static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001085 Arg *A;
1086 std::string CPU;
1087 // If we have -mtune or -mcpu, use that.
1088 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001089 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001090 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001091 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001092 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001093 }
1094
Kevin Qin110db6f2014-07-18 07:03:22 +00001095 // Handle CPU name is 'native'.
1096 if (CPU == "native")
1097 return llvm::sys::getHostCPUName();
1098 else if (CPU.size())
1099 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001100
James Molloy9b1586b2014-04-17 12:51:17 +00001101 // Make sure we pick "cyclone" if -arch is used.
1102 // FIXME: Should this be picked by checking the target triple instead?
1103 if (Args.getLastArg(options::OPT_arch))
1104 return "cyclone";
1105
1106 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001107}
1108
Tim Northover573cbee2014-05-24 12:52:07 +00001109void Clang::AddAArch64TargetArgs(const ArgList &Args,
1110 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001111 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1112 llvm::Triple Triple(TripleStr);
1113
1114 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1115 Args.hasArg(options::OPT_mkernel) ||
1116 Args.hasArg(options::OPT_fapple_kext))
1117 CmdArgs.push_back("-disable-red-zone");
1118
1119 if (!Args.hasFlag(options::OPT_mimplicit_float,
1120 options::OPT_mno_implicit_float, true))
1121 CmdArgs.push_back("-no-implicit-float");
1122
Craig Topper92fc2df2014-05-17 16:56:41 +00001123 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001124 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1125 ABIName = A->getValue();
1126 else if (Triple.isOSDarwin())
1127 ABIName = "darwinpcs";
1128 else
1129 ABIName = "aapcs";
1130
1131 CmdArgs.push_back("-target-abi");
1132 CmdArgs.push_back(ABIName);
1133
Bradley Smith9ff64332014-10-13 10:16:06 +00001134 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1135 options::OPT_mno_fix_cortex_a53_835769)) {
1136 CmdArgs.push_back("-backend-option");
1137 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1138 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1139 else
1140 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001141 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001142 // Enabled A53 errata (835769) workaround by default on android
1143 CmdArgs.push_back("-backend-option");
1144 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001145 }
1146
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001147 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001148 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1149 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001150 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001151 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001152 CmdArgs.push_back("-aarch64-global-merge=false");
1153 else
1154 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001155 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001156}
1157
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001158// Get CPU and ABI names. They are not independent
1159// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001160void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1161 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001162 const char *DefMips32CPU = "mips32r2";
1163 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001164
Daniel Sanders2bf13662014-07-10 14:40:57 +00001165 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1166 // default for mips64(el)?-img-linux-gnu.
1167 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1168 Triple.getEnvironment() == llvm::Triple::GNU) {
1169 DefMips32CPU = "mips32r6";
1170 DefMips64CPU = "mips64r6";
1171 }
Renato Golin7c542b42015-07-27 23:44:45 +00001172
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001173 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001174 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001175 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001176
Brad Smithba26f582015-01-06 02:53:17 +00001177 // MIPS3 is the default for mips64*-unknown-openbsd.
1178 if (Triple.getOS() == llvm::Triple::OpenBSD)
1179 DefMips64CPU = "mips3";
1180
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001181 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001182 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001183
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001184 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001185 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001186 // Convert a GNU style Mips ABI name to the name
1187 // accepted by LLVM Mips backend.
1188 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001189 .Case("32", "o32")
1190 .Case("64", "n64")
1191 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001192 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001193
1194 // Setup default CPU and ABI names.
1195 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001196 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001197 default:
1198 llvm_unreachable("Unexpected triple arch name");
1199 case llvm::Triple::mips:
1200 case llvm::Triple::mipsel:
1201 CPUName = DefMips32CPU;
1202 break;
1203 case llvm::Triple::mips64:
1204 case llvm::Triple::mips64el:
1205 CPUName = DefMips64CPU;
1206 break;
1207 }
1208 }
1209
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001210 if (ABIName.empty()) {
1211 // Deduce ABI name from the target triple.
1212 if (Triple.getArch() == llvm::Triple::mips ||
1213 Triple.getArch() == llvm::Triple::mipsel)
1214 ABIName = "o32";
1215 else
1216 ABIName = "n64";
1217 }
1218
1219 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001220 // Deduce CPU name from ABI name.
1221 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001222 .Cases("o32", "eabi", DefMips32CPU)
1223 .Cases("n32", "n64", DefMips64CPU)
1224 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001225 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001226
1227 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001228}
1229
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001230std::string mips::getMipsABILibSuffix(const ArgList &Args,
1231 const llvm::Triple &Triple) {
1232 StringRef CPUName, ABIName;
1233 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1234 return llvm::StringSwitch<std::string>(ABIName)
1235 .Case("o32", "")
1236 .Case("n32", "32")
1237 .Case("n64", "64");
1238}
1239
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001240// Convert ABI name to the GNU tools acceptable variant.
1241static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1242 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001243 .Case("o32", "32")
1244 .Case("n64", "64")
1245 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001246}
1247
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001248// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1249// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001250static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1251 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001252 if (Arg *A =
1253 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1254 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001255 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001256 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001257 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001258 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001259 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001260 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1261 .Case("soft", mips::FloatABI::Soft)
1262 .Case("hard", mips::FloatABI::Hard)
1263 .Default(mips::FloatABI::Invalid);
1264 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001265 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001266 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001267 }
1268 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001269 }
1270
1271 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001272 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001273 // Assume "hard", because it's a default value used by gcc.
1274 // When we start to recognize specific target MIPS processors,
1275 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001276 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001277 }
1278
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001279 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1280 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001281}
1282
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001283static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001284 std::vector<const char *> &Features,
1285 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001286 StringRef FeatureName) {
1287 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001288 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001289 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001290 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001291 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001292 }
1293}
1294
Daniel Sanders379d44b2014-07-16 11:52:23 +00001295static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1296 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001297 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001298 StringRef CPUName;
1299 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001300 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001301 ABIName = getGnuCompatibleMipsABIName(ABIName);
1302
Daniel Sandersfeb61302014-08-08 15:47:17 +00001303 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1304 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001305
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001306 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1307 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001308 // FIXME: Note, this is a hack. We need to pass the selected float
1309 // mode to the MipsTargetInfoBase to define appropriate macros there.
1310 // Now it is the only method.
1311 Features.push_back("+soft-float");
1312 }
1313
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001314 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001315 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001316 if (Val == "2008") {
1317 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1318 Features.push_back("+nan2008");
1319 else {
1320 Features.push_back("-nan2008");
1321 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1322 }
1323 } else if (Val == "legacy") {
1324 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1325 Features.push_back("-nan2008");
1326 else {
1327 Features.push_back("+nan2008");
1328 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1329 }
1330 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001331 D.Diag(diag::err_drv_unsupported_option_argument)
1332 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001333 }
1334
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001335 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1336 options::OPT_mdouble_float, "single-float");
1337 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1338 "mips16");
1339 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1340 options::OPT_mno_micromips, "micromips");
1341 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1342 "dsp");
1343 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1344 "dspr2");
1345 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1346 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001347
1348 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1349 // pass -mfpxx
1350 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1351 options::OPT_mfp64)) {
1352 if (A->getOption().matches(options::OPT_mfp32))
1353 Features.push_back(Args.MakeArgString("-fp64"));
1354 else if (A->getOption().matches(options::OPT_mfpxx)) {
1355 Features.push_back(Args.MakeArgString("+fpxx"));
1356 Features.push_back(Args.MakeArgString("+nooddspreg"));
1357 } else
1358 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001359 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001360 Features.push_back(Args.MakeArgString("+fpxx"));
1361 Features.push_back(Args.MakeArgString("+nooddspreg"));
1362 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001363
Daniel Sanders28e5d392014-07-10 10:39:51 +00001364 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1365 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001366}
1367
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001368void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001369 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001370 const Driver &D = getToolChain().getDriver();
1371 StringRef CPUName;
1372 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001373 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001374 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001375
1376 CmdArgs.push_back("-target-abi");
1377 CmdArgs.push_back(ABIName.data());
1378
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001379 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1380 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001381 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001382 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001383 CmdArgs.push_back("-mfloat-abi");
1384 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001385 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001386 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001387 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001388 CmdArgs.push_back("-mfloat-abi");
1389 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001390 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001391
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001392 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1393 if (A->getOption().matches(options::OPT_mxgot)) {
1394 CmdArgs.push_back("-mllvm");
1395 CmdArgs.push_back("-mxgot");
1396 }
1397 }
1398
Simon Atanasyanc580b322013-05-11 06:33:44 +00001399 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1400 options::OPT_mno_ldc1_sdc1)) {
1401 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1402 CmdArgs.push_back("-mllvm");
1403 CmdArgs.push_back("-mno-ldc1-sdc1");
1404 }
1405 }
1406
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001407 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1408 options::OPT_mno_check_zero_division)) {
1409 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1410 CmdArgs.push_back("-mllvm");
1411 CmdArgs.push_back("-mno-check-zero-division");
1412 }
1413 }
1414
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001415 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001416 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001417 CmdArgs.push_back("-mllvm");
1418 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1419 A->claim();
1420 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001421}
1422
Hal Finkel8eb59282012-06-11 22:35:19 +00001423/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1424static std::string getPPCTargetCPU(const ArgList &Args) {
1425 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001426 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001427
1428 if (CPUName == "native") {
1429 std::string CPU = llvm::sys::getHostCPUName();
1430 if (!CPU.empty() && CPU != "generic")
1431 return CPU;
1432 else
1433 return "";
1434 }
1435
1436 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001437 .Case("common", "generic")
1438 .Case("440", "440")
1439 .Case("440fp", "440")
1440 .Case("450", "450")
1441 .Case("601", "601")
1442 .Case("602", "602")
1443 .Case("603", "603")
1444 .Case("603e", "603e")
1445 .Case("603ev", "603ev")
1446 .Case("604", "604")
1447 .Case("604e", "604e")
1448 .Case("620", "620")
1449 .Case("630", "pwr3")
1450 .Case("G3", "g3")
1451 .Case("7400", "7400")
1452 .Case("G4", "g4")
1453 .Case("7450", "7450")
1454 .Case("G4+", "g4+")
1455 .Case("750", "750")
1456 .Case("970", "970")
1457 .Case("G5", "g5")
1458 .Case("a2", "a2")
1459 .Case("a2q", "a2q")
1460 .Case("e500mc", "e500mc")
1461 .Case("e5500", "e5500")
1462 .Case("power3", "pwr3")
1463 .Case("power4", "pwr4")
1464 .Case("power5", "pwr5")
1465 .Case("power5x", "pwr5x")
1466 .Case("power6", "pwr6")
1467 .Case("power6x", "pwr6x")
1468 .Case("power7", "pwr7")
1469 .Case("power8", "pwr8")
1470 .Case("pwr3", "pwr3")
1471 .Case("pwr4", "pwr4")
1472 .Case("pwr5", "pwr5")
1473 .Case("pwr5x", "pwr5x")
1474 .Case("pwr6", "pwr6")
1475 .Case("pwr6x", "pwr6x")
1476 .Case("pwr7", "pwr7")
1477 .Case("pwr8", "pwr8")
1478 .Case("powerpc", "ppc")
1479 .Case("powerpc64", "ppc64")
1480 .Case("powerpc64le", "ppc64le")
1481 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001482 }
1483
1484 return "";
1485}
1486
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001487static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1488 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001489 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001490 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001491
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001492 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1493 if (FloatABI == ppc::FloatABI::Soft &&
1494 !(Triple.getArch() == llvm::Triple::ppc64 ||
1495 Triple.getArch() == llvm::Triple::ppc64le))
1496 Features.push_back("+soft-float");
1497 else if (FloatABI == ppc::FloatABI::Soft &&
1498 (Triple.getArch() == llvm::Triple::ppc64 ||
1499 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001500 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001501 << "soft float is not supported for ppc64";
1502
Eric Christopher643bb6a2013-10-16 20:40:08 +00001503 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001504 AddTargetFeature(Args, Features, options::OPT_faltivec,
1505 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001506}
1507
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001508ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1509 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1510 if (Arg *A =
1511 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1512 options::OPT_mfloat_abi_EQ)) {
1513 if (A->getOption().matches(options::OPT_msoft_float))
1514 ABI = ppc::FloatABI::Soft;
1515 else if (A->getOption().matches(options::OPT_mhard_float))
1516 ABI = ppc::FloatABI::Hard;
1517 else {
1518 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1519 .Case("soft", ppc::FloatABI::Soft)
1520 .Case("hard", ppc::FloatABI::Hard)
1521 .Default(ppc::FloatABI::Invalid);
1522 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1523 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1524 ABI = ppc::FloatABI::Hard;
1525 }
1526 }
1527 }
1528
1529 // If unspecified, choose the default based on the platform.
1530 if (ABI == ppc::FloatABI::Invalid) {
1531 ABI = ppc::FloatABI::Hard;
1532 }
1533
1534 return ABI;
1535}
1536
Ulrich Weigand8afad612014-07-28 13:17:52 +00001537void Clang::AddPPCTargetArgs(const ArgList &Args,
1538 ArgStringList &CmdArgs) const {
1539 // Select the ABI to use.
1540 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001541 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001542 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001543 case llvm::Triple::ppc64: {
1544 // When targeting a processor that supports QPX, or if QPX is
1545 // specifically enabled, default to using the ABI that supports QPX (so
1546 // long as it is not specifically disabled).
1547 bool HasQPX = false;
1548 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1549 HasQPX = A->getValue() == StringRef("a2q");
1550 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1551 if (HasQPX) {
1552 ABIName = "elfv1-qpx";
1553 break;
1554 }
1555
Ulrich Weigand8afad612014-07-28 13:17:52 +00001556 ABIName = "elfv1";
1557 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001558 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001559 case llvm::Triple::ppc64le:
1560 ABIName = "elfv2";
1561 break;
1562 default:
1563 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001564 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001565
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001566 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1567 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1568 // the option if given as we don't have backend support for any targets
1569 // that don't use the altivec abi.
1570 if (StringRef(A->getValue()) != "altivec")
1571 ABIName = A->getValue();
1572
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001573 ppc::FloatABI FloatABI =
1574 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1575
1576 if (FloatABI == ppc::FloatABI::Soft) {
1577 // Floating point operations and argument passing are soft.
1578 CmdArgs.push_back("-msoft-float");
1579 CmdArgs.push_back("-mfloat-abi");
1580 CmdArgs.push_back("soft");
1581 } else {
1582 // Floating point operations and argument passing are hard.
1583 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1584 CmdArgs.push_back("-mfloat-abi");
1585 CmdArgs.push_back("hard");
1586 }
1587
Ulrich Weigand8afad612014-07-28 13:17:52 +00001588 if (ABIName) {
1589 CmdArgs.push_back("-target-abi");
1590 CmdArgs.push_back(ABIName);
1591 }
1592}
1593
1594bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1595 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1596 return A && (A->getValue() == StringRef(Value));
1597}
1598
Tom Stellard6674c702013-04-01 20:56:53 +00001599/// Get the (LLVM) name of the R600 gpu we are targeting.
1600static std::string getR600TargetGPU(const ArgList &Args) {
1601 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001602 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001603 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001604 .Cases("rv630", "rv635", "r600")
1605 .Cases("rv610", "rv620", "rs780", "rs880")
1606 .Case("rv740", "rv770")
1607 .Case("palm", "cedar")
1608 .Cases("sumo", "sumo2", "sumo")
1609 .Case("hemlock", "cypress")
1610 .Case("aruba", "cayman")
1611 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001612 }
1613 return "";
1614}
1615
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001616void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001617 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001618 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001619 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001620
James Y Knightb2406522015-06-15 20:51:24 +00001621 bool SoftFloatABI = false;
1622 if (Arg *A =
1623 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001624 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001625 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001626 }
1627
James Y Knightb2406522015-06-15 20:51:24 +00001628 // Only the hard-float ABI on Sparc is standardized, and it is the
1629 // default. GCC also supports a nonstandard soft-float ABI mode, and
1630 // perhaps LLVM should implement that, too. However, since llvm
1631 // currently does not support Sparc soft-float, at all, display an
1632 // error if it's requested.
1633 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001634 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1635 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001636 }
1637}
1638
Richard Sandiford4652d892013-07-19 16:51:51 +00001639static const char *getSystemZTargetCPU(const ArgList &Args) {
1640 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1641 return A->getValue();
1642 return "z10";
1643}
1644
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001645static void getSystemZTargetFeatures(const ArgList &Args,
1646 std::vector<const char *> &Features) {
1647 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001648 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001649 if (A->getOption().matches(options::OPT_mhtm))
1650 Features.push_back("+transactional-execution");
1651 else
1652 Features.push_back("-transactional-execution");
1653 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001654 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001655 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001656 if (A->getOption().matches(options::OPT_mvx))
1657 Features.push_back("+vector");
1658 else
1659 Features.push_back("-vector");
1660 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001661}
1662
Chandler Carruth953fb082013-01-13 11:46:33 +00001663static const char *getX86TargetCPU(const ArgList &Args,
1664 const llvm::Triple &Triple) {
1665 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001666 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001667 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001668 return "core-avx2";
1669
Chandler Carruth953fb082013-01-13 11:46:33 +00001670 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001671 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001672
1673 // FIXME: Reject attempts to use -march=native unless the target matches
1674 // the host.
1675 //
1676 // FIXME: We should also incorporate the detected target features for use
1677 // with -native.
1678 std::string CPU = llvm::sys::getHostCPUName();
1679 if (!CPU.empty() && CPU != "generic")
1680 return Args.MakeArgString(CPU);
1681 }
1682
Reid Kleckner3123eff2015-06-30 16:32:04 +00001683 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1684 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1685 StringRef Arch = A->getValue();
1686 const char *CPU;
1687 if (Triple.getArch() == llvm::Triple::x86) {
1688 CPU = llvm::StringSwitch<const char *>(Arch)
1689 .Case("IA32", "i386")
1690 .Case("SSE", "pentium3")
1691 .Case("SSE2", "pentium4")
1692 .Case("AVX", "sandybridge")
1693 .Case("AVX2", "haswell")
1694 .Default(nullptr);
1695 } else {
1696 CPU = llvm::StringSwitch<const char *>(Arch)
1697 .Case("AVX", "sandybridge")
1698 .Case("AVX2", "haswell")
1699 .Default(nullptr);
1700 }
1701 if (CPU)
1702 return CPU;
1703 }
1704
Chandler Carruth953fb082013-01-13 11:46:33 +00001705 // Select the default CPU if none was given (or detection failed).
1706
1707 if (Triple.getArch() != llvm::Triple::x86_64 &&
1708 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001709 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001710
1711 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1712
1713 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001714 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001715 if (Triple.getArchName() == "x86_64h")
1716 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001717 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001718 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001719
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001720 // Set up default CPU name for PS4 compilers.
1721 if (Triple.isPS4CPU())
1722 return "btver2";
1723
Alexey Bataev286d1b92014-01-31 04:07:13 +00001724 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001725 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001726 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001727
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001728 // Everything else goes to x86-64 in 64-bit mode.
1729 if (Is64Bit)
1730 return "x86-64";
1731
1732 switch (Triple.getOS()) {
1733 case llvm::Triple::FreeBSD:
1734 case llvm::Triple::NetBSD:
1735 case llvm::Triple::OpenBSD:
1736 return "i486";
1737 case llvm::Triple::Haiku:
1738 return "i586";
1739 case llvm::Triple::Bitrig:
1740 return "i686";
1741 default:
1742 // Fallback to p4.
1743 return "pentium4";
1744 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001745}
1746
Dan Gohmanc2853072015-09-03 22:51:53 +00001747/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1748static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1749 // If we have -mcpu=, use that.
1750 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1751 StringRef CPU = A->getValue();
1752
1753#ifdef __wasm__
1754 // Handle "native" by examining the host. "native" isn't meaningful when
1755 // cross compiling, so only support this when the host is also WebAssembly.
1756 if (CPU == "native")
1757 return llvm::sys::getHostCPUName();
1758#endif
1759
1760 return CPU;
1761 }
1762
1763 return "generic";
1764}
1765
Renato Golin7c542b42015-07-27 23:44:45 +00001766static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1767 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001768 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001769 default:
1770 return "";
1771
Amara Emerson703da2e2013-10-31 09:32:33 +00001772 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001773 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001774 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001775
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001776 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001777 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001778 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001779 case llvm::Triple::thumbeb: {
1780 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001781 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001782 return arm::getARMTargetCPU(MCPU, MArch, T);
1783 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001784 case llvm::Triple::mips:
1785 case llvm::Triple::mipsel:
1786 case llvm::Triple::mips64:
1787 case llvm::Triple::mips64el: {
1788 StringRef CPUName;
1789 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001790 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001791 return CPUName;
1792 }
1793
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001794 case llvm::Triple::nvptx:
1795 case llvm::Triple::nvptx64:
1796 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1797 return A->getValue();
1798 return "";
1799
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001800 case llvm::Triple::ppc:
1801 case llvm::Triple::ppc64:
1802 case llvm::Triple::ppc64le: {
1803 std::string TargetCPUName = getPPCTargetCPU(Args);
1804 // LLVM may default to generating code for the native CPU,
1805 // but, like gcc, we default to a more generic option for
1806 // each architecture. (except on Darwin)
1807 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1808 if (T.getArch() == llvm::Triple::ppc64)
1809 TargetCPUName = "ppc64";
1810 else if (T.getArch() == llvm::Triple::ppc64le)
1811 TargetCPUName = "ppc64le";
1812 else
1813 TargetCPUName = "ppc";
1814 }
1815 return TargetCPUName;
1816 }
1817
1818 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001819 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001820 case llvm::Triple::sparcv9:
1821 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001822 return A->getValue();
1823 return "";
1824
1825 case llvm::Triple::x86:
1826 case llvm::Triple::x86_64:
1827 return getX86TargetCPU(Args, T);
1828
1829 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001830 return "hexagon" +
1831 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001832
1833 case llvm::Triple::systemz:
1834 return getSystemZTargetCPU(Args);
1835
1836 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001837 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001838 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001839
1840 case llvm::Triple::wasm32:
1841 case llvm::Triple::wasm64:
1842 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001843 }
1844}
1845
Alp Tokerce365ca2013-12-02 12:43:03 +00001846static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001847 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001848 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1849 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1850 // forward.
1851 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001852 std::string Plugin =
1853 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001854 CmdArgs.push_back(Args.MakeArgString(Plugin));
1855
1856 // Try to pass driver level flags relevant to LTO code generation down to
1857 // the plugin.
1858
1859 // Handle flags for selecting CPU variants.
1860 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1861 if (!CPU.empty())
1862 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001863
James Molloyf97fdae2015-12-21 10:44:36 +00001864 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1865 StringRef OOpt;
1866 if (A->getOption().matches(options::OPT_O4) ||
1867 A->getOption().matches(options::OPT_Ofast))
1868 OOpt = "3";
1869 else if (A->getOption().matches(options::OPT_O))
1870 OOpt = A->getValue();
1871 else if (A->getOption().matches(options::OPT_O0))
1872 OOpt = "0";
1873 if (!OOpt.empty())
1874 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1875 }
1876
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001877 if (IsThinLTO)
1878 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001879
1880 // If an explicit debugger tuning argument appeared, pass it along.
1881 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1882 options::OPT_ggdbN_Group)) {
1883 if (A->getOption().matches(options::OPT_glldb))
1884 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1885 else if (A->getOption().matches(options::OPT_gsce))
1886 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1887 else
1888 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1889 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001890}
1891
Sanjay Patel2987c292015-06-11 14:53:41 +00001892/// This is a helper function for validating the optional refinement step
1893/// parameter in reciprocal argument strings. Return false if there is an error
1894/// parsing the refinement step. Otherwise, return true and set the Position
1895/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001896static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001897 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001898 const char RefinementStepToken = ':';
1899 Position = In.find(RefinementStepToken);
1900 if (Position != StringRef::npos) {
1901 StringRef Option = A.getOption().getName();
1902 StringRef RefStep = In.substr(Position + 1);
1903 // Allow exactly one numeric character for the additional refinement
1904 // step parameter. This is reasonable for all currently-supported
1905 // operations and architectures because we would expect that a larger value
1906 // of refinement steps would cause the estimate "optimization" to
1907 // under-perform the native operation. Also, if the estimate does not
1908 // converge quickly, it probably will not ever converge, so further
1909 // refinement steps will not produce a better answer.
1910 if (RefStep.size() != 1) {
1911 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1912 return false;
1913 }
1914 char RefStepChar = RefStep[0];
1915 if (RefStepChar < '0' || RefStepChar > '9') {
1916 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1917 return false;
1918 }
1919 }
1920 return true;
1921}
1922
1923/// The -mrecip flag requires processing of many optional parameters.
1924static void ParseMRecip(const Driver &D, const ArgList &Args,
1925 ArgStringList &OutStrings) {
1926 StringRef DisabledPrefixIn = "!";
1927 StringRef DisabledPrefixOut = "!";
1928 StringRef EnabledPrefixOut = "";
1929 StringRef Out = "-mrecip=";
1930
1931 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1932 if (!A)
1933 return;
1934
1935 unsigned NumOptions = A->getNumValues();
1936 if (NumOptions == 0) {
1937 // No option is the same as "all".
1938 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1939 return;
1940 }
1941
1942 // Pass through "all", "none", or "default" with an optional refinement step.
1943 if (NumOptions == 1) {
1944 StringRef Val = A->getValue(0);
1945 size_t RefStepLoc;
1946 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1947 return;
1948 StringRef ValBase = Val.slice(0, RefStepLoc);
1949 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1950 OutStrings.push_back(Args.MakeArgString(Out + Val));
1951 return;
1952 }
1953 }
1954
1955 // Each reciprocal type may be enabled or disabled individually.
1956 // Check each input value for validity, concatenate them all back together,
1957 // and pass through.
1958
1959 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001960 OptionStrings.insert(std::make_pair("divd", false));
1961 OptionStrings.insert(std::make_pair("divf", false));
1962 OptionStrings.insert(std::make_pair("vec-divd", false));
1963 OptionStrings.insert(std::make_pair("vec-divf", false));
1964 OptionStrings.insert(std::make_pair("sqrtd", false));
1965 OptionStrings.insert(std::make_pair("sqrtf", false));
1966 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1967 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001968
1969 for (unsigned i = 0; i != NumOptions; ++i) {
1970 StringRef Val = A->getValue(i);
1971
1972 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1973 // Ignore the disablement token for string matching.
1974 if (IsDisabled)
1975 Val = Val.substr(1);
1976
1977 size_t RefStep;
1978 if (!getRefinementStep(Val, D, *A, RefStep))
1979 return;
1980
1981 StringRef ValBase = Val.slice(0, RefStep);
1982 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1983 if (OptionIter == OptionStrings.end()) {
1984 // Try again specifying float suffix.
1985 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1986 if (OptionIter == OptionStrings.end()) {
1987 // The input name did not match any known option string.
1988 D.Diag(diag::err_drv_unknown_argument) << Val;
1989 return;
1990 }
1991 // The option was specified without a float or double suffix.
1992 // Make sure that the double entry was not already specified.
1993 // The float entry will be checked below.
1994 if (OptionStrings[ValBase.str() + 'd']) {
1995 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1996 return;
1997 }
1998 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001999
Sanjay Patel2987c292015-06-11 14:53:41 +00002000 if (OptionIter->second == true) {
2001 // Duplicate option specified.
2002 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2003 return;
2004 }
2005
2006 // Mark the matched option as found. Do not allow duplicate specifiers.
2007 OptionIter->second = true;
2008
2009 // If the precision was not specified, also mark the double entry as found.
2010 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2011 OptionStrings[ValBase.str() + 'd'] = true;
2012
2013 // Build the output string.
2014 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2015 Out = Args.MakeArgString(Out + Prefix + Val);
2016 if (i != NumOptions - 1)
2017 Out = Args.MakeArgString(Out + ",");
2018 }
2019
2020 OutStrings.push_back(Args.MakeArgString(Out));
2021}
2022
Eric Christopherc54920a2015-03-23 19:26:05 +00002023static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002024 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002025 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002026 // If -march=native, autodetect the feature list.
2027 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2028 if (StringRef(A->getValue()) == "native") {
2029 llvm::StringMap<bool> HostFeatures;
2030 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2031 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002032 Features.push_back(
2033 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002034 }
2035 }
2036
Jim Grosbach82eee262013-11-16 00:53:35 +00002037 if (Triple.getArchName() == "x86_64h") {
2038 // x86_64h implies quite a few of the more modern subtarget features
2039 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2040 Features.push_back("-rdrnd");
2041 Features.push_back("-aes");
2042 Features.push_back("-pclmul");
2043 Features.push_back("-rtm");
2044 Features.push_back("-hle");
2045 Features.push_back("-fsgsbase");
2046 }
2047
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002048 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002049 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002050 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002051 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002052 Features.push_back("+sse4.2");
2053 Features.push_back("+popcnt");
2054 } else
2055 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002056 }
2057
Eric Christopherc54920a2015-03-23 19:26:05 +00002058 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002059 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2060 StringRef Arch = A->getValue();
2061 bool ArchUsed = false;
2062 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002063 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002064 if (Arch == "AVX" || Arch == "AVX2") {
2065 ArchUsed = true;
2066 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2067 }
2068 }
2069 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002070 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002071 if (Arch == "IA32") {
2072 ArchUsed = true;
2073 } else if (Arch == "SSE" || Arch == "SSE2") {
2074 ArchUsed = true;
2075 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2076 }
2077 }
2078 if (!ArchUsed)
2079 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2080 }
2081
Jim Grosbach82eee262013-11-16 00:53:35 +00002082 // Now add any that the user explicitly requested on the command line,
2083 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002084 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002085}
2086
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002087void Clang::AddX86TargetArgs(const ArgList &Args,
2088 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002089 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002090 Args.hasArg(options::OPT_mkernel) ||
2091 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002092 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002093
Bob Wilson2616e2e2013-02-10 16:01:41 +00002094 // Default to avoid implicit floating-point for kernel/kext code, but allow
2095 // that to be overridden with -mno-soft-float.
2096 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2097 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002098 if (Arg *A = Args.getLastArg(
2099 options::OPT_msoft_float, options::OPT_mno_soft_float,
2100 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002101 const Option &O = A->getOption();
2102 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2103 O.matches(options::OPT_msoft_float));
2104 }
2105 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002106 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002107
2108 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2109 StringRef Value = A->getValue();
2110 if (Value == "intel" || Value == "att") {
2111 CmdArgs.push_back("-mllvm");
2112 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2113 } else {
2114 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2115 << A->getOption().getName() << Value;
2116 }
2117 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002118}
2119
Tony Linthicum76329bf2011-12-12 21:14:55 +00002120void Clang::AddHexagonTargetArgs(const ArgList &Args,
2121 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002122 CmdArgs.push_back("-mqdsp6-compat");
2123 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002124
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002125 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2126 std::string N = llvm::utostr(G.getValue());
2127 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002128 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002129 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002130 }
2131
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002132 if (!Args.hasArg(options::OPT_fno_short_enums))
2133 CmdArgs.push_back("-fshort-enums");
2134 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002135 CmdArgs.push_back("-mllvm");
2136 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002137 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002138 CmdArgs.push_back("-mllvm");
2139 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002140}
2141
Dan Gohmane3d71e12016-01-07 01:00:21 +00002142void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2143 ArgStringList &CmdArgs) const {
2144 // Default to "hidden" visibility.
2145 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2146 options::OPT_fvisibility_ms_compat)) {
2147 CmdArgs.push_back("-fvisibility");
2148 CmdArgs.push_back("hidden");
2149 }
2150}
2151
Kevin Qin110db6f2014-07-18 07:03:22 +00002152// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002153static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002154 std::vector<const char *> &Features) {
2155 SmallVector<StringRef, 8> Split;
2156 text.split(Split, StringRef("+"), -1, false);
2157
Benjamin Kramer72e64312015-09-24 14:48:49 +00002158 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002159 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002160 .Case("fp", "+fp-armv8")
2161 .Case("simd", "+neon")
2162 .Case("crc", "+crc")
2163 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002164 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002165 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002166 .Case("nofp", "-fp-armv8")
2167 .Case("nosimd", "-neon")
2168 .Case("nocrc", "-crc")
2169 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002170 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002171 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002172 .Default(nullptr);
2173 if (result)
2174 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002175 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002176 D.Diag(diag::err_drv_no_neon_modifier);
2177 else
2178 return false;
2179 }
2180 return true;
2181}
2182
2183// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2184// decode CPU and feature.
2185static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2186 std::vector<const char *> &Features) {
2187 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2188 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002189 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002190 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2191 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002192 Features.push_back("+neon");
2193 Features.push_back("+crc");
2194 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002195 } else if (CPU == "cyclone") {
2196 Features.push_back("+neon");
2197 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002198 } else if (CPU == "generic") {
2199 Features.push_back("+neon");
2200 } else {
2201 return false;
2202 }
2203
2204 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2205 return false;
2206
2207 return true;
2208}
2209
2210static bool
2211getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2212 const ArgList &Args,
2213 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002214 std::string MarchLowerCase = March.lower();
2215 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002216
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002217 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002218 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002219 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002220 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002221 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2222 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002223 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002224 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002225 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002226
2227 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2228 return false;
2229
2230 return true;
2231}
2232
2233static bool
2234getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2235 const ArgList &Args,
2236 std::vector<const char *> &Features) {
2237 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002238 std::string McpuLowerCase = Mcpu.lower();
2239 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002240 return false;
2241
2242 return true;
2243}
2244
2245static bool
2246getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2247 const ArgList &Args,
2248 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002249 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002250 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002251 if (MtuneLowerCase == "native")
2252 MtuneLowerCase = llvm::sys::getHostCPUName();
2253 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002254 Features.push_back("+zcm");
2255 Features.push_back("+zcz");
2256 }
2257 return true;
2258}
2259
2260static bool
2261getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2262 const ArgList &Args,
2263 std::vector<const char *> &Features) {
2264 StringRef CPU;
2265 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002266 std::string McpuLowerCase = Mcpu.lower();
2267 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002268 return false;
2269
2270 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2271}
2272
Justin Bognerf9052562015-11-13 23:07:31 +00002273static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002274 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002275 Arg *A;
2276 bool success = true;
2277 // Enable NEON by default.
2278 Features.push_back("+neon");
2279 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2280 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2281 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2282 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002283 else if (Args.hasArg(options::OPT_arch))
2284 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2285 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002286
2287 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2288 success =
2289 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2290 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2291 success =
2292 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002293 else if (Args.hasArg(options::OPT_arch))
2294 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2295 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002296
2297 if (!success)
2298 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002299
2300 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2301 Features.push_back("-fp-armv8");
2302 Features.push_back("-crypto");
2303 Features.push_back("-neon");
2304 }
Bradley Smith418c5932014-05-02 15:17:51 +00002305
2306 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002307 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002308 if (A->getOption().matches(options::OPT_mcrc))
2309 Features.push_back("+crc");
2310 else
2311 Features.push_back("-crc");
2312 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002313
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002314 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2315 options::OPT_munaligned_access))
2316 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2317 Features.push_back("+strict-align");
2318
Justin Bognerf9052562015-11-13 23:07:31 +00002319 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002320 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002321}
2322
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002323static void getHexagonTargetFeatures(const ArgList &Args,
2324 std::vector<const char *> &Features) {
2325 bool HasHVX = false, HasHVXD = false;
2326
Eric Christopher49062a52015-12-22 03:12:34 +00002327 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2328 // doing dependent option handling here rather than in initFeatureMap or a
2329 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002330 for (auto &A : Args) {
2331 auto &Opt = A->getOption();
2332 if (Opt.matches(options::OPT_mhexagon_hvx))
2333 HasHVX = true;
2334 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2335 HasHVXD = HasHVX = false;
2336 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2337 HasHVXD = HasHVX = true;
2338 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2339 HasHVXD = false;
2340 else
2341 continue;
2342 A->claim();
2343 }
2344
2345 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2346 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2347}
2348
Dan Gohmanc2853072015-09-03 22:51:53 +00002349static void getWebAssemblyTargetFeatures(const ArgList &Args,
2350 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002351 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002352}
2353
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002354static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002355 const ArgList &Args, ArgStringList &CmdArgs,
2356 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002357 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002358 std::vector<const char *> Features;
2359 switch (Triple.getArch()) {
2360 default:
2361 break;
2362 case llvm::Triple::mips:
2363 case llvm::Triple::mipsel:
2364 case llvm::Triple::mips64:
2365 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002366 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002367 break;
2368
2369 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002370 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002371 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002372 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002373 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002374 break;
2375
2376 case llvm::Triple::ppc:
2377 case llvm::Triple::ppc64:
2378 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002379 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002380 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002381 case llvm::Triple::systemz:
2382 getSystemZTargetFeatures(Args, Features);
2383 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002384 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002385 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002386 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002387 break;
2388 case llvm::Triple::x86:
2389 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002390 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002391 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002392 case llvm::Triple::hexagon:
2393 getHexagonTargetFeatures(Args, Features);
2394 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002395 case llvm::Triple::wasm32:
2396 case llvm::Triple::wasm64:
2397 getWebAssemblyTargetFeatures(Args, Features);
2398 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002399 }
Rafael Espindola43964802013-08-21 17:34:32 +00002400
2401 // Find the last of each feature.
2402 llvm::StringMap<unsigned> LastOpt;
2403 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2404 const char *Name = Features[I];
2405 assert(Name[0] == '-' || Name[0] == '+');
2406 LastOpt[Name + 1] = I;
2407 }
2408
2409 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2410 // If this feature was overridden, ignore it.
2411 const char *Name = Features[I];
2412 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2413 assert(LastI != LastOpt.end());
2414 unsigned Last = LastI->second;
2415 if (Last != I)
2416 continue;
2417
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002418 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002419 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002420 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002421}
2422
David Majnemerae394812014-12-09 00:12:30 +00002423static bool
2424shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2425 const llvm::Triple &Triple) {
2426 // We use the zero-cost exception tables for Objective-C if the non-fragile
2427 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2428 // later.
2429 if (runtime.isNonFragile())
2430 return true;
2431
2432 if (!Triple.isMacOSX())
2433 return false;
2434
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002435 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002436 (Triple.getArch() == llvm::Triple::x86_64 ||
2437 Triple.getArch() == llvm::Triple::arm));
2438}
2439
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002440/// Adds exception related arguments to the driver command arguments. There's a
2441/// master flag, -fexceptions and also language specific flags to enable/disable
2442/// C++ and Objective-C exceptions. This makes it possible to for example
2443/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002444static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002445 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002446 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002447 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002448 const Driver &D = TC.getDriver();
2449 const llvm::Triple &Triple = TC.getTriple();
2450
Chad Rosier4fab82c2012-03-26 22:04:46 +00002451 if (KernelOrKext) {
2452 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2453 // arguments now to avoid warnings about unused arguments.
2454 Args.ClaimAllArgs(options::OPT_fexceptions);
2455 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2456 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2457 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2458 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2459 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002460 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002461 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002462
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002463 // See if the user explicitly enabled exceptions.
2464 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2465 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002466
David Majnemerae394812014-12-09 00:12:30 +00002467 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2468 // is not necessarily sensible, but follows GCC.
2469 if (types::isObjC(InputType) &&
2470 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002471 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002472 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002473
David Majnemerae394812014-12-09 00:12:30 +00002474 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002475 }
2476
2477 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002478 // Disable C++ EH by default on XCore and PS4.
2479 bool CXXExceptionsEnabled =
2480 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002481 Arg *ExceptionArg = Args.getLastArg(
2482 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2483 options::OPT_fexceptions, options::OPT_fno_exceptions);
2484 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002485 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002486 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2487 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002488
2489 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002490 if (Triple.isPS4CPU()) {
2491 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2492 assert(ExceptionArg &&
2493 "On the PS4 exceptions should only be enabled if passing "
2494 "an argument");
2495 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2496 const Arg *RTTIArg = TC.getRTTIArg();
2497 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2498 D.Diag(diag::err_drv_argument_not_allowed_with)
2499 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2500 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2501 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2502 } else
2503 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2504
Anders Carlssone96ab552011-02-28 02:27:16 +00002505 CmdArgs.push_back("-fcxx-exceptions");
2506
David Majnemer8de68642014-12-05 08:11:58 +00002507 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002508 }
2509 }
2510
David Majnemer8de68642014-12-05 08:11:58 +00002511 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002512 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002513}
2514
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002515static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002516 bool Default = true;
2517 if (TC.getTriple().isOSDarwin()) {
2518 // The native darwin assembler doesn't support the linker_option directives,
2519 // so we disable them if we think the .s file will be passed to it.
2520 Default = TC.useIntegratedAs();
2521 }
2522 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2523 Default);
2524}
2525
Ted Kremenek62093662013-03-12 17:02:12 +00002526static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2527 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002528 bool UseDwarfDirectory =
2529 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2530 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002531 return !UseDwarfDirectory;
2532}
2533
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002534/// \brief Check whether the given input tree contains any compilation actions.
2535static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002536 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002537 return true;
2538
Nico Weber5a459f82016-02-23 19:30:43 +00002539 for (const auto &AI : A->inputs())
2540 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002541 return true;
2542
2543 return false;
2544}
2545
2546/// \brief Check if -relax-all should be passed to the internal assembler.
2547/// This is done by default when compiling non-assembler source with -O0.
2548static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2549 bool RelaxDefault = true;
2550
2551 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2552 RelaxDefault = A->getOption().matches(options::OPT_O0);
2553
2554 if (RelaxDefault) {
2555 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002556 for (const auto &Act : C.getActions()) {
2557 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002558 RelaxDefault = true;
2559 break;
2560 }
2561 }
2562 }
2563
2564 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002565 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002566}
2567
Paul Robinson0334a042015-12-19 19:41:48 +00002568// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2569// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002570static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002571 assert(A.getOption().matches(options::OPT_gN_Group) &&
2572 "Not a -g option that specifies a debug-info level");
2573 if (A.getOption().matches(options::OPT_g0) ||
2574 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002575 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002576 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2577 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002578 return codegenoptions::DebugLineTablesOnly;
2579 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002580}
2581
Douglas Katzman3459ce22015-10-08 04:24:12 +00002582// Extract the integer N from a string spelled "-dwarf-N", returning 0
2583// on mismatch. The StringRef input (rather than an Arg) allows
2584// for use by the "-Xassembler" option parser.
2585static unsigned DwarfVersionNum(StringRef ArgValue) {
2586 return llvm::StringSwitch<unsigned>(ArgValue)
2587 .Case("-gdwarf-2", 2)
2588 .Case("-gdwarf-3", 3)
2589 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002590 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002591 .Default(0);
2592}
2593
2594static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002595 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002596 unsigned DwarfVersion,
2597 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002598 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002599 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002600 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2601 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002602 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002603 CmdArgs.push_back("-debug-info-kind=limited");
2604 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002605 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002606 CmdArgs.push_back("-debug-info-kind=standalone");
2607 break;
2608 default:
2609 break;
2610 }
2611 if (DwarfVersion > 0)
2612 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002613 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002614 switch (DebuggerTuning) {
2615 case llvm::DebuggerKind::GDB:
2616 CmdArgs.push_back("-debugger-tuning=gdb");
2617 break;
2618 case llvm::DebuggerKind::LLDB:
2619 CmdArgs.push_back("-debugger-tuning=lldb");
2620 break;
2621 case llvm::DebuggerKind::SCE:
2622 CmdArgs.push_back("-debugger-tuning=sce");
2623 break;
2624 default:
2625 break;
2626 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002627}
2628
David Blaikie9260ed62013-07-25 21:19:01 +00002629static void CollectArgsForIntegratedAssembler(Compilation &C,
2630 const ArgList &Args,
2631 ArgStringList &CmdArgs,
2632 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002633 if (UseRelaxAll(C, Args))
2634 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002635
David Majnemer2b9349d2015-12-21 22:09:34 +00002636 // Only default to -mincremental-linker-compatible if we think we are
2637 // targeting the MSVC linker.
2638 bool DefaultIncrementalLinkerCompatible =
2639 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2640 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2641 options::OPT_mno_incremental_linker_compatible,
2642 DefaultIncrementalLinkerCompatible))
2643 CmdArgs.push_back("-mincremental-linker-compatible");
2644
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002645 // When passing -I arguments to the assembler we sometimes need to
2646 // unconditionally take the next argument. For example, when parsing
2647 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2648 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2649 // arg after parsing the '-I' arg.
2650 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002651
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002652 // When using an integrated assembler, translate -Wa, and -Xassembler
2653 // options.
2654 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002655 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002656 for (const Arg *A :
2657 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2658 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002659
Benjamin Kramer72e64312015-09-24 14:48:49 +00002660 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002661 if (TakeNextArg) {
2662 CmdArgs.push_back(Value.data());
2663 TakeNextArg = false;
2664 continue;
2665 }
David Blaikie9260ed62013-07-25 21:19:01 +00002666
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002667 switch (C.getDefaultToolChain().getArch()) {
2668 default:
2669 break;
2670 case llvm::Triple::mips:
2671 case llvm::Triple::mipsel:
2672 case llvm::Triple::mips64:
2673 case llvm::Triple::mips64el:
2674 if (Value == "--trap") {
2675 CmdArgs.push_back("-target-feature");
2676 CmdArgs.push_back("+use-tcc-in-div");
2677 continue;
2678 }
2679 if (Value == "--break") {
2680 CmdArgs.push_back("-target-feature");
2681 CmdArgs.push_back("-use-tcc-in-div");
2682 continue;
2683 }
2684 if (Value.startswith("-msoft-float")) {
2685 CmdArgs.push_back("-target-feature");
2686 CmdArgs.push_back("+soft-float");
2687 continue;
2688 }
2689 if (Value.startswith("-mhard-float")) {
2690 CmdArgs.push_back("-target-feature");
2691 CmdArgs.push_back("-soft-float");
2692 continue;
2693 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002694
2695 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2696 .Case("-mips1", "+mips1")
2697 .Case("-mips2", "+mips2")
2698 .Case("-mips3", "+mips3")
2699 .Case("-mips4", "+mips4")
2700 .Case("-mips5", "+mips5")
2701 .Case("-mips32", "+mips32")
2702 .Case("-mips32r2", "+mips32r2")
2703 .Case("-mips32r3", "+mips32r3")
2704 .Case("-mips32r5", "+mips32r5")
2705 .Case("-mips32r6", "+mips32r6")
2706 .Case("-mips64", "+mips64")
2707 .Case("-mips64r2", "+mips64r2")
2708 .Case("-mips64r3", "+mips64r3")
2709 .Case("-mips64r5", "+mips64r5")
2710 .Case("-mips64r6", "+mips64r6")
2711 .Default(nullptr);
2712 if (MipsTargetFeature)
2713 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002714 }
2715
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002716 if (Value == "-force_cpusubtype_ALL") {
2717 // Do nothing, this is the default and we don't support anything else.
2718 } else if (Value == "-L") {
2719 CmdArgs.push_back("-msave-temp-labels");
2720 } else if (Value == "--fatal-warnings") {
2721 CmdArgs.push_back("-massembler-fatal-warnings");
2722 } else if (Value == "--noexecstack") {
2723 CmdArgs.push_back("-mnoexecstack");
2724 } else if (Value == "-compress-debug-sections" ||
2725 Value == "--compress-debug-sections") {
2726 CompressDebugSections = true;
2727 } else if (Value == "-nocompress-debug-sections" ||
2728 Value == "--nocompress-debug-sections") {
2729 CompressDebugSections = false;
2730 } else if (Value.startswith("-I")) {
2731 CmdArgs.push_back(Value.data());
2732 // We need to consume the next argument if the current arg is a plain
2733 // -I. The next arg will be the include directory.
2734 if (Value == "-I")
2735 TakeNextArg = true;
2736 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002737 // "-gdwarf-N" options are not cc1as options.
2738 unsigned DwarfVersion = DwarfVersionNum(Value);
2739 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2740 CmdArgs.push_back(Value.data());
2741 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002742 RenderDebugEnablingArgs(Args, CmdArgs,
2743 codegenoptions::LimitedDebugInfo,
2744 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002745 }
Renato Golin7c542b42015-07-27 23:44:45 +00002746 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2747 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2748 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002749 } else {
2750 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002751 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002752 }
2753 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002754 }
2755 if (CompressDebugSections) {
2756 if (llvm::zlib::isAvailable())
2757 CmdArgs.push_back("-compress-debug-sections");
2758 else
2759 D.Diag(diag::warn_debug_compression_unavailable);
2760 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002761 if (MipsTargetFeature != nullptr) {
2762 CmdArgs.push_back("-target-feature");
2763 CmdArgs.push_back(MipsTargetFeature);
2764 }
David Blaikie9260ed62013-07-25 21:19:01 +00002765}
2766
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002767// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002768// FIXME: Make sure we can also emit shared objects if they're requested
2769// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002770static void addClangRT(const ToolChain &TC, const ArgList &Args,
2771 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002772 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002773}
2774
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002775namespace {
2776enum OpenMPRuntimeKind {
2777 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2778 /// without knowing what runtime to target.
2779 OMPRT_Unknown,
2780
2781 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2782 /// the default for Clang.
2783 OMPRT_OMP,
2784
2785 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2786 /// this runtime but can swallow the pragmas, and find and link against the
2787 /// runtime library itself.
2788 OMPRT_GOMP,
2789
Chandler Carruthc6625c62015-05-28 21:10:31 +00002790 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002791 /// OpenMP runtime. We support this mode for users with existing dependencies
2792 /// on this runtime library name.
2793 OMPRT_IOMP5
2794};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002795}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002796
2797/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002798static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2799 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002800 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2801
2802 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2803 if (A)
2804 RuntimeName = A->getValue();
2805
2806 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002807 .Case("libomp", OMPRT_OMP)
2808 .Case("libgomp", OMPRT_GOMP)
2809 .Case("libiomp5", OMPRT_IOMP5)
2810 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002811
2812 if (RT == OMPRT_Unknown) {
2813 if (A)
2814 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002815 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002816 else
2817 // FIXME: We could use a nicer diagnostic here.
2818 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2819 }
2820
2821 return RT;
2822}
2823
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002824static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2825 const ArgList &Args) {
2826 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2827 options::OPT_fno_openmp, false))
2828 return;
2829
2830 switch (getOpenMPRuntime(TC, Args)) {
2831 case OMPRT_OMP:
2832 CmdArgs.push_back("-lomp");
2833 break;
2834 case OMPRT_GOMP:
2835 CmdArgs.push_back("-lgomp");
2836 break;
2837 case OMPRT_IOMP5:
2838 CmdArgs.push_back("-liomp5");
2839 break;
2840 case OMPRT_Unknown:
2841 // Already diagnosed.
2842 break;
2843 }
2844}
2845
Alexey Samsonov52550342014-09-15 19:58:40 +00002846static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2847 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002848 bool IsShared, bool IsWhole) {
2849 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002850 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002851 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002852 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002853 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002854}
2855
Alexey Samsonov52550342014-09-15 19:58:40 +00002856// Tries to use a file with the list of dynamic symbols that need to be exported
2857// from the runtime library. Returns true if the file was found.
2858static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2859 ArgStringList &CmdArgs,
2860 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002861 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002862 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2863 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002864 return true;
2865 }
2866 return false;
2867}
2868
2869static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2870 ArgStringList &CmdArgs) {
2871 // Force linking against the system libraries sanitizers depends on
2872 // (see PR15823 why this is necessary).
2873 CmdArgs.push_back("--no-as-needed");
2874 CmdArgs.push_back("-lpthread");
2875 CmdArgs.push_back("-lrt");
2876 CmdArgs.push_back("-lm");
2877 // There's no libdl on FreeBSD.
2878 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2879 CmdArgs.push_back("-ldl");
2880}
2881
2882static void
2883collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2884 SmallVectorImpl<StringRef> &SharedRuntimes,
2885 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002886 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2887 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2888 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002889 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2890 // Collect shared runtimes.
2891 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2892 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002893 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002894 // The stats_client library is also statically linked into DSOs.
2895 if (SanArgs.needsStatsRt())
2896 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002897
Alexey Samsonov52550342014-09-15 19:58:40 +00002898 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002899 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002900 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002901 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002902 }
2903 if (SanArgs.needsAsanRt()) {
2904 if (SanArgs.needsSharedAsanRt()) {
2905 HelperStaticRuntimes.push_back("asan-preinit");
2906 } else {
2907 StaticRuntimes.push_back("asan");
2908 if (SanArgs.linkCXXRuntimes())
2909 StaticRuntimes.push_back("asan_cxx");
2910 }
2911 }
2912 if (SanArgs.needsDfsanRt())
2913 StaticRuntimes.push_back("dfsan");
2914 if (SanArgs.needsLsanRt())
2915 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002916 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002917 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002918 if (SanArgs.linkCXXRuntimes())
2919 StaticRuntimes.push_back("msan_cxx");
2920 }
2921 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002922 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002923 if (SanArgs.linkCXXRuntimes())
2924 StaticRuntimes.push_back("tsan_cxx");
2925 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002926 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002927 StaticRuntimes.push_back("ubsan_standalone");
2928 if (SanArgs.linkCXXRuntimes())
2929 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002930 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002931 if (SanArgs.needsSafeStackRt())
2932 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002933 if (SanArgs.needsCfiRt())
2934 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002935 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002936 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002937 if (SanArgs.linkCXXRuntimes())
2938 StaticRuntimes.push_back("ubsan_standalone_cxx");
2939 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002940 if (SanArgs.needsStatsRt()) {
2941 NonWholeStaticRuntimes.push_back("stats");
2942 RequiredSymbols.push_back("__sanitizer_stats_register");
2943 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002944}
2945
Alexey Samsonov52550342014-09-15 19:58:40 +00002946// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2947// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2948static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002949 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002950 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002951 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002952 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002953 NonWholeStaticRuntimes, HelperStaticRuntimes,
2954 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002955 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002956 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002957 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002958 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002959 bool AddExportDynamic = false;
2960 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002961 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002962 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2963 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002964 for (auto RT : NonWholeStaticRuntimes) {
2965 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2966 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2967 }
2968 for (auto S : RequiredSymbols) {
2969 CmdArgs.push_back("-u");
2970 CmdArgs.push_back(Args.MakeArgString(S));
2971 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002972 // If there is a static runtime with no dynamic list, force all the symbols
2973 // to be dynamic to be sure we export sanitizer interface functions.
2974 if (AddExportDynamic)
2975 CmdArgs.push_back("-export-dynamic");
2976 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002977}
2978
Reid Kleckner86ea7702015-02-04 23:45:07 +00002979static bool areOptimizationsEnabled(const ArgList &Args) {
2980 // Find the last -O arg and see if it is non-zero.
2981 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2982 return !A->getOption().matches(options::OPT_O0);
2983 // Defaults to -O0.
2984 return false;
2985}
2986
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002987static bool shouldUseFramePointerForTarget(const ArgList &Args,
2988 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002989 switch (Triple.getArch()) {
2990 case llvm::Triple::xcore:
2991 case llvm::Triple::wasm32:
2992 case llvm::Triple::wasm64:
2993 // XCore never wants frame pointers, regardless of OS.
2994 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002995 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002996 default:
2997 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002998 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002999
3000 if (Triple.isOSLinux()) {
3001 switch (Triple.getArch()) {
3002 // Don't use a frame pointer on linux if optimizing for certain targets.
3003 case llvm::Triple::mips64:
3004 case llvm::Triple::mips64el:
3005 case llvm::Triple::mips:
3006 case llvm::Triple::mipsel:
3007 case llvm::Triple::systemz:
3008 case llvm::Triple::x86:
3009 case llvm::Triple::x86_64:
3010 return !areOptimizationsEnabled(Args);
3011 default:
3012 return true;
3013 }
3014 }
3015
3016 if (Triple.isOSWindows()) {
3017 switch (Triple.getArch()) {
3018 case llvm::Triple::x86:
3019 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003020 case llvm::Triple::x86_64:
3021 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003022 case llvm::Triple::arm:
3023 case llvm::Triple::thumb:
3024 // Windows on ARM builds with FPO disabled to aid fast stack walking
3025 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003026 default:
3027 // All other supported Windows ISAs use xdata unwind information, so frame
3028 // pointers are not generally useful.
3029 return false;
3030 }
3031 }
3032
3033 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003034}
3035
Rafael Espindola224dd632011-12-14 21:02:23 +00003036static bool shouldUseFramePointer(const ArgList &Args,
3037 const llvm::Triple &Triple) {
3038 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3039 options::OPT_fomit_frame_pointer))
3040 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003041 if (Args.hasArg(options::OPT_pg))
3042 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003043
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003044 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003045}
3046
Eric Christopherb7d97e92013-04-03 01:58:53 +00003047static bool shouldUseLeafFramePointer(const ArgList &Args,
3048 const llvm::Triple &Triple) {
3049 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3050 options::OPT_momit_leaf_frame_pointer))
3051 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003052 if (Args.hasArg(options::OPT_pg))
3053 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003054
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003055 if (Triple.isPS4CPU())
3056 return false;
3057
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003058 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003059}
3060
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003061/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003062static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003063 SmallString<128> cwd;
3064 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003065 CmdArgs.push_back("-fdebug-compilation-dir");
3066 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003067 }
3068}
3069
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003070static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003071 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3072 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3073 SmallString<128> T(FinalOutput->getValue());
3074 llvm::sys::path::replace_extension(T, "dwo");
3075 return Args.MakeArgString(T);
3076 } else {
3077 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003078 SmallString<128> T(
3079 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003080 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003081 llvm::sys::path::replace_extension(F, "dwo");
3082 T += F;
3083 return Args.MakeArgString(F);
3084 }
3085}
3086
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003087static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3088 const JobAction &JA, const ArgList &Args,
3089 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003090 ArgStringList ExtractArgs;
3091 ExtractArgs.push_back("--extract-dwo");
3092
3093 ArgStringList StripArgs;
3094 StripArgs.push_back("--strip-dwo");
3095
3096 // Grabbing the output of the earlier compile step.
3097 StripArgs.push_back(Output.getFilename());
3098 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003099 ExtractArgs.push_back(OutFile);
3100
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003101 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003102 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003103
3104 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003105 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003106
3107 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003108 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003109}
3110
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003111/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003112/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3113static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003114 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003115 if (A->getOption().matches(options::OPT_O4) ||
3116 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003117 return true;
3118
3119 if (A->getOption().matches(options::OPT_O0))
3120 return false;
3121
3122 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3123
Rafael Espindola91780de2013-08-26 14:05:41 +00003124 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003125 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003126 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003127 return true;
3128
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003129 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003130 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003131 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003132
3133 unsigned OptLevel = 0;
3134 if (S.getAsInteger(10, OptLevel))
3135 return false;
3136
3137 return OptLevel > 1;
3138 }
3139
3140 return false;
3141}
3142
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003143/// Add -x lang to \p CmdArgs for \p Input.
3144static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3145 ArgStringList &CmdArgs) {
3146 // When using -verify-pch, we don't want to provide the type
3147 // 'precompiled-header' if it was inferred from the file extension
3148 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3149 return;
3150
3151 CmdArgs.push_back("-x");
3152 if (Args.hasArg(options::OPT_rewrite_objc))
3153 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3154 else
3155 CmdArgs.push_back(types::getTypeName(Input.getType()));
3156}
3157
David Majnemerc371ff02015-03-22 08:39:22 +00003158static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003159 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003160 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003161
3162 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003163 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003164
3165 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003166 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003167 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003168 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003169}
3170
Rafael Espindola577637a2015-01-03 00:06:04 +00003171// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003172// options that build systems might add but are unused when assembling or only
3173// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003174static void claimNoWarnArgs(const ArgList &Args) {
3175 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003176 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003177 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003178 Args.ClaimAllArgs(options::OPT_flto);
3179 Args.ClaimAllArgs(options::OPT_fno_lto);
3180}
3181
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003182static void appendUserToPath(SmallVectorImpl<char> &Result) {
3183#ifdef LLVM_ON_UNIX
3184 const char *Username = getenv("LOGNAME");
3185#else
3186 const char *Username = getenv("USERNAME");
3187#endif
3188 if (Username) {
3189 // Validate that LoginName can be used in a path, and get its length.
3190 size_t Len = 0;
3191 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003192 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003193 Username = nullptr;
3194 break;
3195 }
3196 }
3197
3198 if (Username && Len > 0) {
3199 Result.append(Username, Username + Len);
3200 return;
3201 }
3202 }
3203
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003204// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003205#ifdef LLVM_ON_UNIX
3206 std::string UID = llvm::utostr(getuid());
3207#else
3208 // FIXME: Windows seems to have an 'SID' that might work.
3209 std::string UID = "9999";
3210#endif
3211 Result.append(UID.begin(), UID.end());
3212}
3213
David Majnemere11d3732015-06-08 00:22:46 +00003214VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3215 const llvm::Triple &Triple,
3216 const llvm::opt::ArgList &Args,
3217 bool IsWindowsMSVC) {
3218 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3219 IsWindowsMSVC) ||
3220 Args.hasArg(options::OPT_fmsc_version) ||
3221 Args.hasArg(options::OPT_fms_compatibility_version)) {
3222 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3223 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003224 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003225
3226 if (MSCVersion && MSCompatibilityVersion) {
3227 if (D)
3228 D->Diag(diag::err_drv_argument_not_allowed_with)
3229 << MSCVersion->getAsString(Args)
3230 << MSCompatibilityVersion->getAsString(Args);
3231 return VersionTuple();
3232 }
3233
3234 if (MSCompatibilityVersion) {
3235 VersionTuple MSVT;
3236 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3237 D->Diag(diag::err_drv_invalid_value)
3238 << MSCompatibilityVersion->getAsString(Args)
3239 << MSCompatibilityVersion->getValue();
3240 return MSVT;
3241 }
3242
3243 if (MSCVersion) {
3244 unsigned Version = 0;
3245 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3246 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3247 << MSCVersion->getValue();
3248 return getMSCompatibilityVersion(Version);
3249 }
3250
3251 unsigned Major, Minor, Micro;
3252 Triple.getEnvironmentVersion(Major, Minor, Micro);
3253 if (Major || Minor || Micro)
3254 return VersionTuple(Major, Minor, Micro);
3255
3256 return VersionTuple(18);
3257 }
3258 return VersionTuple();
3259}
3260
Diego Novilloa0545962015-07-10 18:00:07 +00003261static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3262 const InputInfo &Output, const ArgList &Args,
3263 ArgStringList &CmdArgs) {
3264 auto *ProfileGenerateArg = Args.getLastArg(
3265 options::OPT_fprofile_instr_generate,
3266 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003267 options::OPT_fprofile_generate_EQ,
3268 options::OPT_fno_profile_instr_generate);
3269 if (ProfileGenerateArg &&
3270 ProfileGenerateArg->getOption().matches(
3271 options::OPT_fno_profile_instr_generate))
3272 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003273
3274 auto *ProfileUseArg = Args.getLastArg(
3275 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003276 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3277 options::OPT_fno_profile_instr_use);
3278 if (ProfileUseArg &&
3279 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3280 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003281
3282 if (ProfileGenerateArg && ProfileUseArg)
3283 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003284 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003285
Diego Novillo758f3f52015-08-05 21:49:51 +00003286 if (ProfileGenerateArg) {
3287 if (ProfileGenerateArg->getOption().matches(
3288 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003289 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3290 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003291 else if (ProfileGenerateArg->getOption().matches(
3292 options::OPT_fprofile_generate_EQ)) {
3293 SmallString<128> Path(ProfileGenerateArg->getValue());
3294 llvm::sys::path::append(Path, "default.profraw");
3295 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003296 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3297 }
3298 // The default is to use Clang Instrumentation.
3299 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003300 }
Diego Novilloa0545962015-07-10 18:00:07 +00003301
Diego Novillo758f3f52015-08-05 21:49:51 +00003302 if (ProfileUseArg) {
3303 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003304 CmdArgs.push_back(Args.MakeArgString(
3305 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003306 else if ((ProfileUseArg->getOption().matches(
3307 options::OPT_fprofile_use_EQ) ||
3308 ProfileUseArg->getOption().matches(
3309 options::OPT_fprofile_instr_use))) {
3310 SmallString<128> Path(
3311 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3312 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3313 llvm::sys::path::append(Path, "default.profdata");
3314 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003315 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003316 }
Diego Novilloa0545962015-07-10 18:00:07 +00003317 }
3318
3319 if (Args.hasArg(options::OPT_ftest_coverage) ||
3320 Args.hasArg(options::OPT_coverage))
3321 CmdArgs.push_back("-femit-coverage-notes");
3322 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3323 false) ||
3324 Args.hasArg(options::OPT_coverage))
3325 CmdArgs.push_back("-femit-coverage-data");
3326
Diego Novilloc4b94da2015-08-05 23:27:40 +00003327 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3328 options::OPT_fno_coverage_mapping, false) &&
3329 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003330 D.Diag(diag::err_drv_argument_only_allowed_with)
3331 << "-fcoverage-mapping"
3332 << "-fprofile-instr-generate";
3333
Diego Novilloc4b94da2015-08-05 23:27:40 +00003334 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3335 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003336 CmdArgs.push_back("-fcoverage-mapping");
3337
3338 if (C.getArgs().hasArg(options::OPT_c) ||
3339 C.getArgs().hasArg(options::OPT_S)) {
3340 if (Output.isFilename()) {
3341 CmdArgs.push_back("-coverage-file");
3342 SmallString<128> CoverageFilename;
3343 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3344 CoverageFilename = FinalOutput->getValue();
3345 } else {
3346 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3347 }
3348 if (llvm::sys::path::is_relative(CoverageFilename)) {
3349 SmallString<128> Pwd;
3350 if (!llvm::sys::fs::current_path(Pwd)) {
3351 llvm::sys::path::append(Pwd, CoverageFilename);
3352 CoverageFilename.swap(Pwd);
3353 }
3354 }
3355 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3356 }
3357 }
3358}
3359
Paul Robinsond083b9a2015-12-16 17:25:27 +00003360static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3361 ArgStringList &CmdArgs) {
3362 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3363 false) ||
3364 Args.hasFlag(options::OPT_fprofile_generate,
3365 options::OPT_fno_profile_instr_generate, false) ||
3366 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3367 options::OPT_fno_profile_instr_generate, false) ||
3368 Args.hasFlag(options::OPT_fprofile_instr_generate,
3369 options::OPT_fno_profile_instr_generate, false) ||
3370 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3371 options::OPT_fno_profile_instr_generate, false) ||
3372 Args.hasArg(options::OPT_fcreate_profile) ||
3373 Args.hasArg(options::OPT_coverage)))
3374 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3375}
3376
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003377/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3378/// smooshes them together with platform defaults, to decide whether
3379/// this compile should be using PIC mode or not. Returns a tuple of
3380/// (RelocationModel, PICLevel, IsPIE).
3381static std::tuple<llvm::Reloc::Model, unsigned, bool>
3382ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3383 const ArgList &Args) {
3384 // FIXME: why does this code...and so much everywhere else, use both
3385 // ToolChain.getTriple() and Triple?
3386 bool PIE = ToolChain.isPIEDefault();
3387 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003388 // The Darwin/MachO default to use PIC does not apply when using -static.
3389 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3390 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003391 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003392 bool IsPICLevelTwo = PIC;
3393
3394 bool KernelOrKext =
3395 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3396
3397 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003398 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003399 switch (ToolChain.getArch()) {
3400 case llvm::Triple::arm:
3401 case llvm::Triple::armeb:
3402 case llvm::Triple::thumb:
3403 case llvm::Triple::thumbeb:
3404 case llvm::Triple::aarch64:
3405 case llvm::Triple::mips:
3406 case llvm::Triple::mipsel:
3407 case llvm::Triple::mips64:
3408 case llvm::Triple::mips64el:
3409 PIC = true; // "-fpic"
3410 break;
3411
3412 case llvm::Triple::x86:
3413 case llvm::Triple::x86_64:
3414 PIC = true; // "-fPIC"
3415 IsPICLevelTwo = true;
3416 break;
3417
3418 default:
3419 break;
3420 }
3421 }
3422
3423 // OpenBSD-specific defaults for PIE
3424 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3425 switch (ToolChain.getArch()) {
3426 case llvm::Triple::mips64:
3427 case llvm::Triple::mips64el:
3428 case llvm::Triple::sparcel:
3429 case llvm::Triple::x86:
3430 case llvm::Triple::x86_64:
3431 IsPICLevelTwo = false; // "-fpie"
3432 break;
3433
3434 case llvm::Triple::ppc:
3435 case llvm::Triple::sparc:
3436 case llvm::Triple::sparcv9:
3437 IsPICLevelTwo = true; // "-fPIE"
3438 break;
3439
3440 default:
3441 break;
3442 }
3443 }
3444
3445 // The last argument relating to either PIC or PIE wins, and no
3446 // other argument is used. If the last argument is any flavor of the
3447 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3448 // option implicitly enables PIC at the same level.
3449 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3450 options::OPT_fpic, options::OPT_fno_pic,
3451 options::OPT_fPIE, options::OPT_fno_PIE,
3452 options::OPT_fpie, options::OPT_fno_pie);
3453 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3454 // is forced, then neither PIC nor PIE flags will have no effect.
3455 if (!ToolChain.isPICDefaultForced()) {
3456 if (LastPICArg) {
3457 Option O = LastPICArg->getOption();
3458 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3459 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3460 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3461 PIC =
3462 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3463 IsPICLevelTwo =
3464 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3465 } else {
3466 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003467 if (Triple.isPS4CPU()) {
3468 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3469 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3470 if (Model != "kernel") {
3471 PIC = true;
3472 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3473 << LastPICArg->getSpelling();
3474 }
3475 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003476 }
3477 }
3478 }
3479
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003480 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3481 // PIC level would've been set to level 1, force it back to level 2 PIC
3482 // instead.
3483 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003484 IsPICLevelTwo |= ToolChain.isPICDefault();
3485
James Y Knightc4015d32015-08-21 04:14:55 +00003486 // This kernel flags are a trump-card: they will disable PIC/PIE
3487 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003488 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3489 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003490 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003491
3492 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3493 // This is a very special mode. It trumps the other modes, almost no one
3494 // uses it, and it isn't even valid on any OS but Darwin.
3495 if (!ToolChain.getTriple().isOSDarwin())
3496 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3497 << A->getSpelling() << ToolChain.getTriple().str();
3498
3499 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3500
3501 // Only a forced PIC mode can cause the actual compile to have PIC defines
3502 // etc., no flags are sufficient. This behavior was selected to closely
3503 // match that of llvm-gcc and Apple GCC before that.
3504 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3505
3506 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3507 }
3508
3509 if (PIC)
3510 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3511
3512 return std::make_tuple(llvm::Reloc::Static, 0, false);
3513}
3514
3515static const char *RelocationModelName(llvm::Reloc::Model Model) {
3516 switch (Model) {
3517 case llvm::Reloc::Default:
3518 return nullptr;
3519 case llvm::Reloc::Static:
3520 return "static";
3521 case llvm::Reloc::PIC_:
3522 return "pic";
3523 case llvm::Reloc::DynamicNoPIC:
3524 return "dynamic-no-pic";
3525 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003526 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003527}
3528
3529static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3530 ArgStringList &CmdArgs) {
3531 llvm::Reloc::Model RelocationModel;
3532 unsigned PICLevel;
3533 bool IsPIE;
3534 std::tie(RelocationModel, PICLevel, IsPIE) =
3535 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3536
3537 if (RelocationModel != llvm::Reloc::Static)
3538 CmdArgs.push_back("-KPIC");
3539}
3540
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003541void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003542 const InputInfo &Output, const InputInfoList &Inputs,
3543 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003544 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3545 const llvm::Triple Triple(TripleStr);
3546
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547 bool KernelOrKext =
3548 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003549 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003550 ArgStringList CmdArgs;
3551
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003552 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003553 bool IsWindowsCygnus =
3554 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003555 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003556 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003557
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003558 // Check number of inputs for sanity. We need at least one input.
3559 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003560 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003561 // CUDA compilation may have multiple inputs (source file + results of
3562 // device-side compilations). All other jobs are expected to have exactly one
3563 // input.
3564 bool IsCuda = types::isCuda(Input.getType());
3565 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003566
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003567 // Invoke ourselves in -cc1 mode.
3568 //
3569 // FIXME: Implement custom jobs for internal actions.
3570 CmdArgs.push_back("-cc1");
3571
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003572 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003573 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003574 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003575
Artem Belevichfa11ab52015-11-17 22:28:46 +00003576 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003577 if (IsCuda) {
3578 // FIXME: We need a (better) way to pass information about
3579 // particular compilation pass we're constructing here. For now we
3580 // can check which toolchain we're using and pick the other one to
3581 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003582 if (&getToolChain() == C.getCudaDeviceToolChain())
3583 AuxToolChain = C.getCudaHostToolChain();
3584 else if (&getToolChain() == C.getCudaHostToolChain())
3585 AuxToolChain = C.getCudaDeviceToolChain();
3586 else
3587 llvm_unreachable("Can't figure out CUDA compilation mode.");
3588 assert(AuxToolChain != nullptr && "No aux toolchain.");
3589 CmdArgs.push_back("-aux-triple");
3590 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003591 CmdArgs.push_back("-fcuda-target-overloads");
3592 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003593 }
3594
James Y Knight2db38f32015-08-15 03:45:25 +00003595 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3596 Triple.getArch() == llvm::Triple::thumb)) {
3597 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003598 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003599 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003600 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003601 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003602 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003603 }
3604
Tim Northover336f1892014-03-29 13:16:12 +00003605 // Push all default warning arguments that are specific to
3606 // the given target. These come before user provided warning options
3607 // are provided.
3608 getToolChain().addClangWarningOptions(CmdArgs);
3609
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003610 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003611 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003612
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003613 if (isa<AnalyzeJobAction>(JA)) {
3614 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3615 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003616 } else if (isa<MigrateJobAction>(JA)) {
3617 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003618 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003619 if (Output.getType() == types::TY_Dependencies)
3620 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003621 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003622 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003623 if (Args.hasArg(options::OPT_rewrite_objc) &&
3624 !Args.hasArg(options::OPT_g_Group))
3625 CmdArgs.push_back("-P");
3626 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003627 } else if (isa<AssembleJobAction>(JA)) {
3628 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003629
David Blaikie9260ed62013-07-25 21:19:01 +00003630 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003631
3632 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003633 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003634 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003635 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003636 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003637
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003638 if (JA.getType() == types::TY_Nothing)
3639 CmdArgs.push_back("-fsyntax-only");
3640 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003641 CmdArgs.push_back("-emit-pch");
3642 else
3643 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003644 } else if (isa<VerifyPCHJobAction>(JA)) {
3645 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003646 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003647 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3648 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003649 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003650 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003651 } else if (JA.getType() == types::TY_LLVM_IR ||
3652 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003653 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003654 } else if (JA.getType() == types::TY_LLVM_BC ||
3655 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003656 CmdArgs.push_back("-emit-llvm-bc");
3657 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003658 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003659 } else if (JA.getType() == types::TY_AST) {
3660 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003661 } else if (JA.getType() == types::TY_ModuleFile) {
3662 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003663 } else if (JA.getType() == types::TY_RewrittenObjC) {
3664 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003665 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003666 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3667 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003668 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003669 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003670 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003671 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003672
3673 // Preserve use-list order by default when emitting bitcode, so that
3674 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3675 // same result as running passes here. For LTO, we don't need to preserve
3676 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003677 if (JA.getType() == types::TY_LLVM_BC)
3678 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003679
3680 if (D.isUsingLTO())
3681 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003682 }
3683
Teresa Johnsonaff22322015-12-07 19:21:34 +00003684 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3685 if (!types::isLLVMIR(Input.getType()))
3686 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3687 << "-x ir";
3688 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3689 }
3690
Steven Wu574b0f22016-03-01 01:07:58 +00003691 // Embed-bitcode option.
3692 if (C.getDriver().embedBitcodeEnabled() &&
3693 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3694 // Add flags implied by -fembed-bitcode.
3695 CmdArgs.push_back("-fembed-bitcode");
3696 // Disable all llvm IR level optimizations.
3697 CmdArgs.push_back("-disable-llvm-optzns");
3698 }
3699 if (C.getDriver().embedBitcodeMarkerOnly())
3700 CmdArgs.push_back("-fembed-bitcode-marker");
3701
Justin Bognera88f0122014-06-20 22:59:50 +00003702 // We normally speed up the clang process a bit by skipping destructors at
3703 // exit, but when we're generating diagnostics we can rely on some of the
3704 // cleanup.
3705 if (!C.isForDiagnostics())
3706 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003707
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003708// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003709#ifdef NDEBUG
3710 CmdArgs.push_back("-disable-llvm-verifier");
3711#endif
3712
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003713 // Set the main file name, so that debug info works even with
3714 // -save-temps.
3715 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003716 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003717
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003718 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003719 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003720 if (Args.hasArg(options::OPT_static))
3721 CmdArgs.push_back("-static-define");
3722
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003723 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003724 // Enable region store model by default.
3725 CmdArgs.push_back("-analyzer-store=region");
3726
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003727 // Treat blocks as analysis entry points.
3728 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3729
Ted Kremenek49c79792011-03-24 00:28:47 +00003730 CmdArgs.push_back("-analyzer-eagerly-assume");
3731
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003732 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003733 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003734 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003735
Devin Coughlin65c77082016-01-21 20:09:49 +00003736 if (!IsWindowsMSVC) {
3737 CmdArgs.push_back("-analyzer-checker=unix");
3738 } else {
3739 // Enable "unix" checkers that also work on Windows.
3740 CmdArgs.push_back("-analyzer-checker=unix.API");
3741 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3742 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3743 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3744 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3745 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3746 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003747
Sean Evesonb38c32b2016-01-06 10:03:58 +00003748 // Disable some unix checkers for PS4.
3749 if (IsPS4CPU) {
3750 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3751 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3752 }
3753
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003754 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003755 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003756
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003757 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003758
Artem Belevichba558952015-05-06 18:20:23 +00003759 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003760 CmdArgs.push_back("-analyzer-checker=cplusplus");
3761
Sean Evesonb38c32b2016-01-06 10:03:58 +00003762 if (!IsPS4CPU) {
3763 CmdArgs.push_back(
3764 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3765 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3766 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3767 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3768 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3769 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3770 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003771
3772 // Default nullability checks.
3773 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3774 CmdArgs.push_back(
3775 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003776 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003777
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003778 // Set the output format. The default is plist, for (lame) historical
3779 // reasons.
3780 CmdArgs.push_back("-analyzer-output");
3781 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003782 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003783 else
3784 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003785
Ted Kremenekfe449a22010-03-22 22:32:05 +00003786 // Disable the presentation of standard compiler warnings when
3787 // using --analyze. We only want to show static analyzer diagnostics
3788 // or frontend errors.
3789 CmdArgs.push_back("-w");
3790
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003791 // Add -Xanalyzer arguments when running as analyzer.
3792 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003793 }
3794
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003795 CheckCodeGenerationOptions(D, Args);
3796
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003797 llvm::Reloc::Model RelocationModel;
3798 unsigned PICLevel;
3799 bool IsPIE;
3800 std::tie(RelocationModel, PICLevel, IsPIE) =
3801 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003802
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003803 const char *RMName = RelocationModelName(RelocationModel);
3804 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003805 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003806 CmdArgs.push_back(RMName);
3807 }
3808 if (PICLevel > 0) {
3809 CmdArgs.push_back("-pic-level");
3810 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3811 if (IsPIE) {
3812 CmdArgs.push_back("-pie-level");
3813 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003814 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003815 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003816
Renato Golin4854d802015-11-09 12:40:41 +00003817 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3818 CmdArgs.push_back("-meabi");
3819 CmdArgs.push_back(A->getValue());
3820 }
3821
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003822 CmdArgs.push_back("-mthread-model");
3823 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3824 CmdArgs.push_back(A->getValue());
3825 else
3826 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3827
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003828 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3829
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003830 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3831 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003832 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003833
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003834 // LLVM Code Generator Options.
3835
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003836 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3837 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003838 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3839 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003840 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003841 CmdArgs.push_back(A->getValue());
3842 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003843 }
3844 }
3845
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003846 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3847 StringRef v = A->getValue();
3848 CmdArgs.push_back("-mllvm");
3849 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3850 A->claim();
3851 }
3852
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003853 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3854 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003855 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003856 }
3857
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003858 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3859 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003860 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003861 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003862 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003863 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3864 CmdArgs.push_back("-fpcc-struct-return");
3865 } else {
3866 assert(A->getOption().matches(options::OPT_freg_struct_return));
3867 CmdArgs.push_back("-freg-struct-return");
3868 }
3869 }
3870
Roman Divacky65b88cd2011-03-01 17:40:53 +00003871 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3872 CmdArgs.push_back("-mrtd");
3873
Rafael Espindola224dd632011-12-14 21:02:23 +00003874 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003875 CmdArgs.push_back("-mdisable-fp-elim");
3876 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3877 options::OPT_fno_zero_initialized_in_bss))
3878 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003879
3880 bool OFastEnabled = isOptimizationLevelFast(Args);
3881 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3882 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003883 OptSpecifier StrictAliasingAliasOption =
3884 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003885 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3886 // doesn't do any TBAA.
3887 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003888 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003889 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003890 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003891 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3892 options::OPT_fno_struct_path_tbaa))
3893 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003894 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3895 false))
3896 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003897 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3898 options::OPT_fno_strict_vtable_pointers,
3899 false))
3900 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003901 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3902 options::OPT_fno_optimize_sibling_calls))
3903 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003904
Eric Christopher006208c2013-04-04 06:29:47 +00003905 // Handle segmented stacks.
3906 if (Args.hasArg(options::OPT_fsplit_stack))
3907 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003908
3909 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3910 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003911 OptSpecifier FastMathAliasOption =
3912 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3913
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003914 // Handle various floating point optimization flags, mapping them to the
3915 // appropriate LLVM code generation flags. The pattern for all of these is to
3916 // default off the codegen optimizations, and if any flag enables them and no
3917 // flag disables them after the flag enabling them, enable the codegen
3918 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003919 if (Arg *A = Args.getLastArg(
3920 options::OPT_ffast_math, FastMathAliasOption,
3921 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3922 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3923 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003924 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3925 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003926 A->getOption().getID() != options::OPT_fhonor_infinities)
3927 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003928 if (Arg *A = Args.getLastArg(
3929 options::OPT_ffast_math, FastMathAliasOption,
3930 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3931 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3932 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003933 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3934 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003935 A->getOption().getID() != options::OPT_fhonor_nans)
3936 CmdArgs.push_back("-menable-no-nans");
3937
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003938 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3939 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003940 if (Arg *A =
3941 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3942 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3943 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003944 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3945 // However, turning *off* -ffast_math merely restores the toolchain default
3946 // (which may be false).
3947 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3948 A->getOption().getID() == options::OPT_ffast_math ||
3949 A->getOption().getID() == options::OPT_Ofast)
3950 MathErrno = false;
3951 else if (A->getOption().getID() == options::OPT_fmath_errno)
3952 MathErrno = true;
3953 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003954 if (MathErrno)
3955 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003956
3957 // There are several flags which require disabling very specific
3958 // optimizations. Any of these being disabled forces us to turn off the
3959 // entire set of LLVM optimizations, so collect them through all the flag
3960 // madness.
3961 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003962 if (Arg *A = Args.getLastArg(
3963 options::OPT_ffast_math, FastMathAliasOption,
3964 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3965 options::OPT_fno_unsafe_math_optimizations,
3966 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003967 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3968 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003969 A->getOption().getID() != options::OPT_fno_associative_math)
3970 AssociativeMath = true;
3971 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003972 if (Arg *A = Args.getLastArg(
3973 options::OPT_ffast_math, FastMathAliasOption,
3974 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3975 options::OPT_fno_unsafe_math_optimizations,
3976 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003977 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3978 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003979 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3980 ReciprocalMath = true;
3981 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003982 if (Arg *A = Args.getLastArg(
3983 options::OPT_ffast_math, FastMathAliasOption,
3984 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3985 options::OPT_fno_unsafe_math_optimizations,
3986 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003987 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3988 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003989 A->getOption().getID() != options::OPT_fsigned_zeros)
3990 SignedZeros = false;
3991 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003992 if (Arg *A = Args.getLastArg(
3993 options::OPT_ffast_math, FastMathAliasOption,
3994 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3995 options::OPT_fno_unsafe_math_optimizations,
3996 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003997 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3998 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003999 A->getOption().getID() != options::OPT_ftrapping_math)
4000 TrappingMath = false;
4001 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4002 !TrappingMath)
4003 CmdArgs.push_back("-menable-unsafe-fp-math");
4004
Sanjay Patel76c9e092015-01-23 16:40:50 +00004005 if (!SignedZeros)
4006 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004007
Sanjay Patel359b1052015-04-09 15:03:23 +00004008 if (ReciprocalMath)
4009 CmdArgs.push_back("-freciprocal-math");
4010
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004011 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004012 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004013 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004014 options::OPT_ffp_contract)) {
4015 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004016 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004017 if (Val == "fast" || Val == "on" || Val == "off") {
4018 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4019 } else {
4020 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004021 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004022 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004023 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4024 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004025 // If fast-math is set then set the fp-contract mode to fast.
4026 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4027 }
4028 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004029
Sanjay Patel2987c292015-06-11 14:53:41 +00004030 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004031
Bob Wilson6a039162012-07-19 03:52:53 +00004032 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4033 // and if we find them, tell the frontend to provide the appropriate
4034 // preprocessor macros. This is distinct from enabling any optimizations as
4035 // these options induce language changes which must survive serialization
4036 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004037 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4038 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004039 if (!A->getOption().matches(options::OPT_fno_fast_math))
4040 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004041 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4042 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004043 if (A->getOption().matches(options::OPT_ffinite_math_only))
4044 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004045
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004046 // Decide whether to use verbose asm. Verbose assembly is the default on
4047 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004048 bool IsIntegratedAssemblerDefault =
4049 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004050 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004051 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004052 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004053 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004054
Rafael Espindolab8a12932015-05-22 20:44:03 +00004055 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4056 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004057 CmdArgs.push_back("-no-integrated-as");
4058
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004059 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4060 CmdArgs.push_back("-mdebug-pass");
4061 CmdArgs.push_back("Structure");
4062 }
4063 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4064 CmdArgs.push_back("-mdebug-pass");
4065 CmdArgs.push_back("Arguments");
4066 }
4067
Justin Lebar710a35f2016-01-25 22:36:35 +00004068 // Enable -mconstructor-aliases except on darwin, where we have to work around
4069 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4070 // aliases aren't supported.
4071 if (!getToolChain().getTriple().isOSDarwin() &&
4072 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004073 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004074
John McCall7ef5cb32011-03-18 02:56:14 +00004075 // Darwin's kernel doesn't support guard variables; just die if we
4076 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004077 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004078 CmdArgs.push_back("-fforbid-guard-variables");
4079
Akira Hatanaka02028482015-11-12 17:21:22 +00004080 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4081 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004082 CmdArgs.push_back("-mms-bitfields");
4083 }
John McCall8517abc2010-02-19 02:45:38 +00004084
Daniel Dunbar306945d2009-09-16 06:17:29 +00004085 // This is a coarse approximation of what llvm-gcc actually does, both
4086 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4087 // complicated ways.
4088 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004089 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4090 options::OPT_fno_asynchronous_unwind_tables,
4091 (getToolChain().IsUnwindTablesDefault() ||
4092 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4093 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004094 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4095 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004096 CmdArgs.push_back("-munwind-tables");
4097
Chandler Carruth05fb5852012-11-21 23:40:23 +00004098 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004099
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004100 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4101 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004102 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004103 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004104
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004105 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004106 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004107
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004108 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004109 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004110 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004111 }
4112
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004113 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004114 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004115 if (!CPU.empty()) {
4116 CmdArgs.push_back("-target-cpu");
4117 CmdArgs.push_back(Args.MakeArgString(CPU));
4118 }
4119
Rafael Espindolaeb265472013-08-21 21:59:03 +00004120 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4121 CmdArgs.push_back("-mfpmath");
4122 CmdArgs.push_back(A->getValue());
4123 }
4124
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004125 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004126 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004127
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004128 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004129 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004130 default:
4131 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004132
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004133 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004134 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004135 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004136 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004137 // Use the effective triple, which takes into account the deployment target.
4138 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004139 break;
4140
Tim Northover573cbee2014-05-24 12:52:07 +00004141 case llvm::Triple::aarch64:
4142 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004143 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004144 break;
4145
Eric Christopher0b26a612010-03-02 02:41:08 +00004146 case llvm::Triple::mips:
4147 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004148 case llvm::Triple::mips64:
4149 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004150 AddMIPSTargetArgs(Args, CmdArgs);
4151 break;
4152
Ulrich Weigand8afad612014-07-28 13:17:52 +00004153 case llvm::Triple::ppc:
4154 case llvm::Triple::ppc64:
4155 case llvm::Triple::ppc64le:
4156 AddPPCTargetArgs(Args, CmdArgs);
4157 break;
4158
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004159 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004160 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004161 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004162 AddSparcTargetArgs(Args, CmdArgs);
4163 break;
4164
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004165 case llvm::Triple::x86:
4166 case llvm::Triple::x86_64:
4167 AddX86TargetArgs(Args, CmdArgs);
4168 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004169
4170 case llvm::Triple::hexagon:
4171 AddHexagonTargetArgs(Args, CmdArgs);
4172 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004173
4174 case llvm::Triple::wasm32:
4175 case llvm::Triple::wasm64:
4176 AddWebAssemblyTargetArgs(Args, CmdArgs);
4177 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004178 }
4179
Douglas Katzman3459ce22015-10-08 04:24:12 +00004180 // The 'g' groups options involve a somewhat intricate sequence of decisions
4181 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004182 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004183 // * what level of debug info to generate
4184 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004185 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004186 // This avoids having to monkey around further in cc1 other than to disable
4187 // codeview if not running in a Windows environment. Perhaps even that
4188 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004189 unsigned DwarfVersion = 0;
4190 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4191 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004192 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004193 bool EmitCodeView = false;
4194
Hans Wennborg75958c42013-08-08 00:17:41 +00004195 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004196 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004197 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004198 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004199
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004200 // Pass the linker version in use.
4201 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4202 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004203 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004204 }
4205
Eric Christopherb7d97e92013-04-03 01:58:53 +00004206 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004207 CmdArgs.push_back("-momit-leaf-frame-pointer");
4208
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004209 // Explicitly error on some things we know we don't support and can't just
4210 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004211 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4212 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004213 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004214 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004215 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4216 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004217 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004218 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004219 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004220 }
4221
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004222 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004223 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004224 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004225 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004226 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4227 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004228 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004229 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004230 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004231
Chad Rosierbe10f982011-08-02 17:58:04 +00004232 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004233 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004234 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4235 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004236 }
4237
Rafael Espindola08a692a2010-03-07 04:46:18 +00004238 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004239 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004240 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004241 // If the last option explicitly specified a debug-info level, use it.
4242 if (A->getOption().matches(options::OPT_gN_Group)) {
4243 DebugInfoKind = DebugLevelToInfoKind(*A);
4244 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4245 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4246 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004247 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004248 A->getIndex() > SplitDwarfArg->getIndex())
4249 SplitDwarfArg = nullptr;
4250 } else
4251 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004252 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004253 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004254
Paul Robinson0334a042015-12-19 19:41:48 +00004255 // If a debugger tuning argument appeared, remember it.
4256 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4257 options::OPT_ggdbN_Group)) {
4258 if (A->getOption().matches(options::OPT_glldb))
4259 DebuggerTuning = llvm::DebuggerKind::LLDB;
4260 else if (A->getOption().matches(options::OPT_gsce))
4261 DebuggerTuning = llvm::DebuggerKind::SCE;
4262 else
4263 DebuggerTuning = llvm::DebuggerKind::GDB;
4264 }
4265
4266 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004267 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004268 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004269 DwarfVersion = DwarfVersionNum(A->getSpelling());
4270
Reid Kleckner124955a2015-08-05 18:51:13 +00004271 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004272 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4273 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4274 // DwarfVersion remains at 0 if no explicit choice was made.
4275 CmdArgs.push_back("-gcodeview");
4276 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004277 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004278 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4279 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004280
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004281 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4282 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004283
4284 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004285 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004286 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004287 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004288
Eric Christopher138c32b2013-09-13 22:37:55 +00004289 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004290 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004291 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004292 CmdArgs.push_back("-dwarf-ext-refs");
4293 CmdArgs.push_back("-fmodule-format=obj");
4294 }
4295
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004296 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4297 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004298 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004299 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004300 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004301 CmdArgs.push_back("-backend-option");
4302 CmdArgs.push_back("-split-dwarf=Enable");
4303 }
4304
Douglas Katzman3459ce22015-10-08 04:24:12 +00004305 // After we've dealt with all combinations of things that could
4306 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4307 // figure out if we need to "upgrade" it to standalone debug info.
4308 // We parse these two '-f' options whether or not they will be used,
4309 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4310 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4311 options::OPT_fno_standalone_debug,
4312 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004313 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4314 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004315 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4316 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004317
Eric Christopher138c32b2013-09-13 22:37:55 +00004318 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4319 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4320 CmdArgs.push_back("-backend-option");
4321 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4322 }
Eric Christophereec89c22013-06-18 00:03:50 +00004323
Eric Christopher0d403d22014-02-14 01:27:03 +00004324 // -gdwarf-aranges turns on the emission of the aranges section in the
4325 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004326 // Always enabled on the PS4.
4327 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004328 CmdArgs.push_back("-backend-option");
4329 CmdArgs.push_back("-generate-arange-section");
4330 }
4331
David Blaikief36d9ba2014-01-27 18:52:43 +00004332 if (Args.hasFlag(options::OPT_fdebug_types_section,
4333 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004334 CmdArgs.push_back("-backend-option");
4335 CmdArgs.push_back("-generate-type-units");
4336 }
Eric Christophereec89c22013-06-18 00:03:50 +00004337
Dan Gohmana5b804b2016-01-07 00:50:27 +00004338 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4339 // default.
4340 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4341 Triple.getArch() == llvm::Triple::wasm32 ||
4342 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004343
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004344 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004345 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004346 CmdArgs.push_back("-ffunction-sections");
4347 }
4348
Peter Collingbourneceef1452016-02-24 22:03:06 +00004349 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4350 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004351 if (!D.isUsingLTO())
4352 D.Diag(diag::err_drv_argument_only_allowed_with)
4353 << "-fwhole-program-vtables"
4354 << "-flto";
4355 CmdArgs.push_back("-fwhole-program-vtables");
4356
4357 clang::SmallString<64> Path(D.ResourceDir);
4358 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4359 if (llvm::sys::fs::exists(Path)) {
4360 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4361 BlacklistOpt += Path.str();
4362 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4363 }
4364
4365 for (const Arg *A :
4366 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4367 A->claim();
4368 if (!llvm::sys::fs::exists(A->getValue()))
4369 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4370 }
4371
4372 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4373 }
4374
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004375 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4376 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004377 CmdArgs.push_back("-fdata-sections");
4378 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004379
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004380 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004381 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004382 CmdArgs.push_back("-fno-unique-section-names");
4383
Chris Lattner3c77a352010-06-22 00:03:40 +00004384 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4385
Diego Novilloa0545962015-07-10 18:00:07 +00004386 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004387
Paul Robinsond083b9a2015-12-16 17:25:27 +00004388 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4389 if (getToolChain().getTriple().isPS4CPU())
4390 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4391
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004392 // Pass options for controlling the default header search paths.
4393 if (Args.hasArg(options::OPT_nostdinc)) {
4394 CmdArgs.push_back("-nostdsysteminc");
4395 CmdArgs.push_back("-nobuiltininc");
4396 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004397 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004398 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004399 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4400 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4401 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004402
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004403 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004404 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004405 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004406
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004407 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4408
Ted Kremenekf7639e12012-03-06 20:06:33 +00004409 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004410 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004411 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004412 options::OPT_ccc_arcmt_modify,
4413 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004414 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004415 switch (A->getOption().getID()) {
4416 default:
4417 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004418 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004419 CmdArgs.push_back("-arcmt-check");
4420 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004421 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004422 CmdArgs.push_back("-arcmt-modify");
4423 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004424 case options::OPT_ccc_arcmt_migrate:
4425 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004426 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004427 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004428
4429 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4430 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004431 break;
John McCalld70fb982011-06-15 23:25:17 +00004432 }
4433 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004434 } else {
4435 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4436 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4437 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004438 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004439
Ted Kremenekf7639e12012-03-06 20:06:33 +00004440 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4441 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004442 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4443 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004444 }
4445 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004446 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004447
4448 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004449 options::OPT_objcmt_migrate_subscripting,
4450 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004451 // None specified, means enable them all.
4452 CmdArgs.push_back("-objcmt-migrate-literals");
4453 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004454 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004455 } else {
4456 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4457 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004458 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004459 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004460 } else {
4461 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4462 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4463 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4464 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4465 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4466 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004467 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004468 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4469 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4470 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4471 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4472 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4473 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4474 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004475 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004476 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004477 }
4478
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004479 // Add preprocessing options like -I, -D, etc. if we are using the
4480 // preprocessor.
4481 //
4482 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004483 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004484 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4485 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004486
Rafael Espindolaa7431922011-07-21 23:40:37 +00004487 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4488 // that "The compiler can only warn and ignore the option if not recognized".
4489 // When building with ccache, it will pass -D options to clang even on
4490 // preprocessed inputs and configure concludes that -fPIC is not supported.
4491 Args.ClaimAllArgs(options::OPT_D);
4492
Alp Toker7874bdc2013-11-15 20:40:58 +00004493 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004494 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4495 if (A->getOption().matches(options::OPT_O4)) {
4496 CmdArgs.push_back("-O3");
4497 D.Diag(diag::warn_O4_is_O3);
4498 } else {
4499 A->render(Args, CmdArgs);
4500 }
4501 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004502
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004503 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004504 for (const Arg *A :
4505 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4506 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004507 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004508 }
4509
Rafael Espindola577637a2015-01-03 00:06:04 +00004510 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004511
Richard Smith3be1cb22014-08-07 00:24:21 +00004512 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004513 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004514 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4515 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004516 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004517 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004518
4519 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004520 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004521 //
4522 // If a std is supplied, only add -trigraphs if it follows the
4523 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004524 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004525 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4526 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004527 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004528 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004529 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004530 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004531 else
4532 Std->render(Args, CmdArgs);
4533
Nico Weber00721502014-12-23 22:32:37 +00004534 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004535 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004536 options::OPT_ftrigraphs,
4537 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004538 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004539 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004540 } else {
4541 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004542 //
4543 // FIXME: Clang doesn't correctly handle -std= when the input language
4544 // doesn't match. For the time being just ignore this for C++ inputs;
4545 // eventually we want to do all the standard defaulting here instead of
4546 // splitting it between the driver and clang -cc1.
4547 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004548 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4549 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004550 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004551 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004552
Nico Weber00721502014-12-23 22:32:37 +00004553 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4554 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004555 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004556
Richard Smith282b4492013-09-04 22:50:31 +00004557 // GCC's behavior for -Wwrite-strings is a bit strange:
4558 // * In C, this "warning flag" changes the types of string literals from
4559 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4560 // for the discarded qualifier.
4561 // * In C++, this is just a normal warning flag.
4562 //
4563 // Implementing this warning correctly in C is hard, so we follow GCC's
4564 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4565 // a non-const char* in C, rather than using this crude hack.
4566 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004567 // FIXME: This should behave just like a warning flag, and thus should also
4568 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4569 Arg *WriteStrings =
4570 Args.getLastArg(options::OPT_Wwrite_strings,
4571 options::OPT_Wno_write_strings, options::OPT_w);
4572 if (WriteStrings &&
4573 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004574 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004575 }
4576
Chandler Carruth61fbf622011-04-23 09:27:53 +00004577 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004578 // during C++ compilation, which it is by default. GCC keeps this define even
4579 // in the presence of '-w', match this behavior bug-for-bug.
4580 if (types::isCXX(InputType) &&
4581 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4582 true)) {
4583 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004584 }
4585
Chandler Carruthe0391482010-05-22 02:21:53 +00004586 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4587 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4588 if (Asm->getOption().matches(options::OPT_fasm))
4589 CmdArgs.push_back("-fgnu-keywords");
4590 else
4591 CmdArgs.push_back("-fno-gnu-keywords");
4592 }
4593
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004594 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4595 CmdArgs.push_back("-fno-dwarf-directory-asm");
4596
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004597 if (ShouldDisableAutolink(Args, getToolChain()))
4598 CmdArgs.push_back("-fno-autolink");
4599
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004600 // Add in -fdebug-compilation-dir if necessary.
4601 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004602
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004603 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4604 StringRef Map = A->getValue();
4605 if (Map.find('=') == StringRef::npos)
4606 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4607 else
4608 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4609 A->claim();
4610 }
4611
Richard Smith9a568822011-11-21 19:36:32 +00004612 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4613 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004614 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004615 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004616 }
4617
Richard Smith79c927b2013-11-06 19:31:51 +00004618 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4619 CmdArgs.push_back("-foperator-arrow-depth");
4620 CmdArgs.push_back(A->getValue());
4621 }
4622
Richard Smith9a568822011-11-21 19:36:32 +00004623 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4624 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004625 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004626 }
4627
Richard Smitha3d3bd22013-05-08 02:12:03 +00004628 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4629 CmdArgs.push_back("-fconstexpr-steps");
4630 CmdArgs.push_back(A->getValue());
4631 }
4632
Richard Smithb3a14522013-02-22 01:59:51 +00004633 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4634 CmdArgs.push_back("-fbracket-depth");
4635 CmdArgs.push_back(A->getValue());
4636 }
4637
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004638 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4639 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004640 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004641 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004642 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4643 } else
4644 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004645 }
4646
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004647 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004648 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004649
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004650 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4651 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004652 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004653 }
David Chisnall5778fce2009-08-31 16:41:57 +00004654
Chris Lattnere23003d2010-01-09 21:54:33 +00004655 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4656 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004657 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004658 }
4659
Chris Lattnerb35583d2010-04-07 20:49:23 +00004660 CmdArgs.push_back("-ferror-limit");
4661 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004662 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004663 else
4664 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004665
Chandler Carrutha77a7272010-05-06 04:55:18 +00004666 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4667 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004668 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004669 }
4670
4671 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4672 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004673 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004674 }
4675
Richard Smithf6f003a2011-12-16 19:06:07 +00004676 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4677 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004678 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004679 }
4680
Nick Lewycky24653262014-12-16 21:39:02 +00004681 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4682 CmdArgs.push_back("-fspell-checking-limit");
4683 CmdArgs.push_back(A->getValue());
4684 }
4685
Daniel Dunbar2c978472009-11-04 06:24:47 +00004686 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004687 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004688 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004689 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004690 } else {
4691 // If -fmessage-length=N was not specified, determine whether this is a
4692 // terminal and, if so, implicitly define -fmessage-length appropriately.
4693 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004694 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004695 }
4696
John McCallb4a99d32013-02-19 01:57:35 +00004697 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4698 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4699 options::OPT_fvisibility_ms_compat)) {
4700 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4701 CmdArgs.push_back("-fvisibility");
4702 CmdArgs.push_back(A->getValue());
4703 } else {
4704 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4705 CmdArgs.push_back("-fvisibility");
4706 CmdArgs.push_back("hidden");
4707 CmdArgs.push_back("-ftype-visibility");
4708 CmdArgs.push_back("default");
4709 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004710 }
4711
Douglas Gregor08329632010-06-15 17:05:35 +00004712 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004713
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004714 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4715
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004716 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004717 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4718 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004719 CmdArgs.push_back("-ffreestanding");
4720
Daniel Dunbare357d562009-12-03 18:42:11 +00004721 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004722 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004723 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004724 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004725 // Emulated TLS is enabled by default on Android, and can be enabled manually
4726 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004727 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004728 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4729 EmulatedTLSDefault))
4730 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004731 // AltiVec-like language extensions aren't relevant for assembling.
4732 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004733 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004734 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4735 }
Richard Trieu91844232012-06-26 18:18:47 +00004736 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4737 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004738
Alexey Bataevdb390212015-05-20 04:24:19 +00004739 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004740 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4741 options::OPT_fno_openmp, false))
4742 switch (getOpenMPRuntime(getToolChain(), Args)) {
4743 case OMPRT_OMP:
4744 case OMPRT_IOMP5:
4745 // Clang can generate useful OpenMP code for these two runtime libraries.
4746 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004747
4748 // If no option regarding the use of TLS in OpenMP codegeneration is
4749 // given, decide a default based on the target. Otherwise rely on the
4750 // options and pass the right information to the frontend.
4751 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004752 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004753 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004754 break;
4755 default:
4756 // By default, if Clang doesn't know how to generate useful OpenMP code
4757 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4758 // down to the actual compilation.
4759 // FIXME: It would be better to have a mode which *only* omits IR
4760 // generation based on the OpenMP support so that we get consistent
4761 // semantic analysis, etc.
4762 break;
4763 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004764
Peter Collingbourne32701642013-11-01 18:16:25 +00004765 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004766 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004767
Eric Christopher459d2712013-02-19 06:16:53 +00004768 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004769 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4770 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4771 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4772 Arch == llvm::Triple::ppc64le))
4773 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4774 << "ppc/ppc64/ppc64le";
4775 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004776
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004777 // -fzvector is incompatible with -faltivec.
4778 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4779 if (Args.hasArg(options::OPT_faltivec))
4780 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4781 << "-faltivec";
4782
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004783 if (getToolChain().SupportsProfiling())
4784 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004785
4786 // -flax-vector-conversions is default.
4787 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4788 options::OPT_fno_lax_vector_conversions))
4789 CmdArgs.push_back("-fno-lax-vector-conversions");
4790
John Brawna7b4ec02015-08-10 11:11:28 +00004791 if (Args.getLastArg(options::OPT_fapple_kext) ||
4792 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004793 CmdArgs.push_back("-fapple-kext");
4794
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004795 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004796 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004797 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004798 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4799 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004800
4801 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4802 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004803 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004804 }
4805
Bob Wilson14adb362012-02-03 06:27:22 +00004806 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004807
Chandler Carruth6e501032011-03-27 00:04:55 +00004808 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4809 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004810 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004811 if (A->getOption().matches(options::OPT_fwrapv))
4812 CmdArgs.push_back("-fwrapv");
4813 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4814 options::OPT_fno_strict_overflow)) {
4815 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4816 CmdArgs.push_back("-fwrapv");
4817 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004818
4819 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4820 options::OPT_fno_reroll_loops))
4821 if (A->getOption().matches(options::OPT_freroll_loops))
4822 CmdArgs.push_back("-freroll-loops");
4823
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004824 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004825 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4826 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004827
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004828 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4829
Daniel Dunbar4930e332009-11-17 08:07:36 +00004830 // -stack-protector=0 is default.
4831 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004832 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4833 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4834 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4835 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4836 Args.ClaimAllArgs(options::OPT_fstack_protector);
4837 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004838 options::OPT_fstack_protector_all,
4839 options::OPT_fstack_protector_strong,
4840 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004841 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004842 StackProtectorLevel = std::max<unsigned>(
4843 LangOptions::SSPOn,
4844 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004845 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004846 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004847 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004848 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004849 } else {
4850 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004851 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004852 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004853 if (StackProtectorLevel) {
4854 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004855 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004856 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004857
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004858 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004859 for (const Arg *A : Args.filtered(options::OPT__param)) {
4860 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004861 if (Str.startswith("ssp-buffer-size=")) {
4862 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004863 CmdArgs.push_back("-stack-protector-buffer-size");
4864 // FIXME: Verify the argument is a valid integer.
4865 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004866 }
Sean Silva14facf32015-06-09 01:57:17 +00004867 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004868 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004869 }
4870
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004871 // Translate -mstackrealign
4872 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004873 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004874 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004875
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004876 if (Args.hasArg(options::OPT_mstack_alignment)) {
4877 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4878 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004879 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004880
Hans Wennborg77dc2362015-01-20 19:45:50 +00004881 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4882 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4883
4884 if (!Size.empty())
4885 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4886 else
4887 CmdArgs.push_back("-mstack-probe-size=0");
4888 }
4889
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004890 switch (getToolChain().getArch()) {
4891 case llvm::Triple::aarch64:
4892 case llvm::Triple::aarch64_be:
4893 case llvm::Triple::arm:
4894 case llvm::Triple::armeb:
4895 case llvm::Triple::thumb:
4896 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004897 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004898 break;
4899
4900 default:
4901 break;
4902 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004903
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004904 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4905 options::OPT_mno_restrict_it)) {
4906 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4907 CmdArgs.push_back("-backend-option");
4908 CmdArgs.push_back("-arm-restrict-it");
4909 } else {
4910 CmdArgs.push_back("-backend-option");
4911 CmdArgs.push_back("-arm-no-restrict-it");
4912 }
James Y Knight2db38f32015-08-15 03:45:25 +00004913 } else if (Triple.isOSWindows() &&
4914 (Triple.getArch() == llvm::Triple::arm ||
4915 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004916 // Windows on ARM expects restricted IT blocks
4917 CmdArgs.push_back("-backend-option");
4918 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004919 }
4920
Daniel Dunbard18049a2009-04-07 21:16:11 +00004921 // Forward -f options with positive and negative forms; we translate
4922 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004923 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4924 StringRef fname = A->getValue();
4925 if (!llvm::sys::fs::exists(fname))
4926 D.Diag(diag::err_drv_no_such_file) << fname;
4927 else
4928 A->render(Args, CmdArgs);
4929 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004930
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004931 // -fbuiltin is default unless -mkernel is used.
4932 bool UseBuiltins =
4933 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4934 !Args.hasArg(options::OPT_mkernel));
4935 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004936 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004937
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004938 // -ffreestanding implies -fno-builtin.
4939 if (Args.hasArg(options::OPT_ffreestanding))
4940 UseBuiltins = false;
4941
4942 // Process the -fno-builtin-* options.
4943 for (const auto &Arg : Args) {
4944 const Option &O = Arg->getOption();
4945 if (!O.matches(options::OPT_fno_builtin_))
4946 continue;
4947
4948 Arg->claim();
4949 // If -fno-builtin is specified, then there's no need to pass the option to
4950 // the frontend.
4951 if (!UseBuiltins)
4952 continue;
4953
4954 StringRef FuncName = Arg->getValue();
4955 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4956 }
4957
Nuno Lopes13c88c72009-12-16 16:59:22 +00004958 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4959 options::OPT_fno_assume_sane_operator_new))
4960 CmdArgs.push_back("-fno-assume-sane-operator-new");
4961
Daniel Dunbar4930e332009-11-17 08:07:36 +00004962 // -fblocks=0 is default.
4963 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004964 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004965 (Args.hasArg(options::OPT_fgnu_runtime) &&
4966 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4967 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004968 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004969
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004970 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004971 !getToolChain().hasBlocksRuntime())
4972 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004973 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004974
Richard Smith47972af2015-06-16 00:08:24 +00004975 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004976 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004977 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004978 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004979 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004980 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4981 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004982 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004983 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004984 HaveModules = true;
4985 }
4986 }
4987
Richard Smith47972af2015-06-16 00:08:24 +00004988 // -fmodule-maps enables implicit reading of module map files. By default,
4989 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004990 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4991 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004992 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004993 }
4994
Daniel Jasperac42b752013-10-21 06:34:34 +00004995 // -fmodules-decluse checks that modules used are declared so (off by
4996 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004997 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004998 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004999 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005000 }
5001
Daniel Jasper962b38e2014-04-11 11:47:45 +00005002 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5003 // all #included headers are part of modules.
5004 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005005 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005006 CmdArgs.push_back("-fmodules-strict-decluse");
5007 }
5008
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005009 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5010 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5011 options::OPT_fno_implicit_modules)) {
5012 CmdArgs.push_back("-fno-implicit-modules");
5013 }
5014
Daniel Jasperac42b752013-10-21 06:34:34 +00005015 // -fmodule-name specifies the module that is currently being built (or
5016 // used for header checking by -fmodule-maps).
Richard Smith7e82e012016-02-19 22:25:36 +00005017 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
Daniel Jasperac42b752013-10-21 06:34:34 +00005018
Richard Smith9887d792014-10-17 01:42:53 +00005019 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00005020 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00005021 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00005022
Richard Smithe842a472014-10-22 02:05:46 +00005023 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00005024 if (HaveModules)
5025 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5026 else
5027 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00005028
5029 // -fmodule-cache-path specifies where our implicitly-built module files
5030 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00005031 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00005032 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00005033 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005034 if (HaveModules) {
5035 if (C.isForDiagnostics()) {
5036 // When generating crash reports, we want to emit the modules along with
5037 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005038 Path = Output.getFilename();
5039 llvm::sys::path::replace_extension(Path, ".cache");
5040 llvm::sys::path::append(Path, "modules");
5041 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005042 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005043 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005044 llvm::sys::path::append(Path, "org.llvm.clang.");
5045 appendUserToPath(Path);
5046 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005047 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005048 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005049 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5050 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005051 }
5052
5053 // When building modules and generating crashdumps, we need to dump a module
5054 // dependency VFS alongside the output.
5055 if (HaveModules && C.isForDiagnostics()) {
5056 SmallString<128> VFSDir(Output.getFilename());
5057 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005058 // Add the cache directory as a temp so the crash diagnostics pick it up.
5059 C.addTempFile(Args.MakeArgString(VFSDir));
5060
Justin Bognera88f0122014-06-20 22:59:50 +00005061 llvm::sys::path::append(VFSDir, "vfs");
5062 CmdArgs.push_back("-module-dependency-dir");
5063 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005064 }
5065
Richard Smith9887d792014-10-17 01:42:53 +00005066 if (HaveModules)
5067 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005068
Douglas Gregor35b04d62013-02-07 19:01:24 +00005069 // Pass through all -fmodules-ignore-macro arguments.
5070 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005071 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5072 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005073
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005074 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5075
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005076 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5077 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5078 D.Diag(diag::err_drv_argument_not_allowed_with)
5079 << A->getAsString(Args) << "-fbuild-session-timestamp";
5080
5081 llvm::sys::fs::file_status Status;
5082 if (llvm::sys::fs::status(A->getValue(), Status))
5083 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005084 CmdArgs.push_back(Args.MakeArgString(
5085 "-fbuild-session-timestamp=" +
5086 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005087 }
5088
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005089 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005090 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5091 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005092 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5093
5094 Args.AddLastArg(CmdArgs,
5095 options::OPT_fmodules_validate_once_per_build_session);
5096 }
5097
Ben Langmuirdcf73862014-03-12 00:06:17 +00005098 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5099
John McCalldfea9982010-04-09 19:12:06 +00005100 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005101 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005102 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005103 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005104
Anders Carlssond470fef2010-11-21 00:09:52 +00005105 // -felide-constructors is the default.
5106 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005107 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005108 CmdArgs.push_back("-fno-elide-constructors");
5109
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005110 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005111
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005112 if (KernelOrKext || (types::isCXX(InputType) &&
5113 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5114 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005115 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005116
Tony Linthicum76329bf2011-12-12 21:14:55 +00005117 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005118 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5119 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005120 CmdArgs.push_back("-fshort-enums");
5121
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005122 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005123 if (Arg *A = Args.getLastArg(
5124 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5125 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5126 if (A->getOption().matches(options::OPT_funsigned_char) ||
5127 A->getOption().matches(options::OPT_fno_signed_char)) {
5128 CmdArgs.push_back("-fno-signed-char");
5129 }
5130 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005131 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005132 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005133
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005134 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005135 if (!Args.hasFlag(
5136 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5137 !IsWindowsCygnus && !IsWindowsGNU &&
5138 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5139 getToolChain().getArch() != llvm::Triple::hexagon &&
5140 getToolChain().getArch() != llvm::Triple::xcore &&
5141 ((getToolChain().getTriple().getVendor() !=
5142 llvm::Triple::MipsTechnologies) ||
5143 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005144 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005145 CmdArgs.push_back("-fno-use-cxa-atexit");
5146
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005147 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005148 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005149 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005150 CmdArgs.push_back("-fms-extensions");
5151
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005152 // -fno-use-line-directives is default.
5153 if (Args.hasFlag(options::OPT_fuse_line_directives,
5154 options::OPT_fno_use_line_directives, false))
5155 CmdArgs.push_back("-fuse-line-directives");
5156
Francois Pichet1b4f1632011-09-17 04:32:15 +00005157 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005158 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005159 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005160 (IsWindowsMSVC &&
5161 Args.hasFlag(options::OPT_fms_extensions,
5162 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005163 CmdArgs.push_back("-fms-compatibility");
5164
David Majnemerc371ff02015-03-22 08:39:22 +00005165 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005166 VersionTuple MSVT = visualstudio::getMSVCVersion(
5167 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5168 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005169 CmdArgs.push_back(
5170 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005171
David Majnemer8db91762015-05-18 04:49:30 +00005172 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5173 if (ImplyVCPPCXXVer) {
5174 if (IsMSVC2015Compatible)
5175 CmdArgs.push_back("-std=c++14");
5176 else
5177 CmdArgs.push_back("-std=c++11");
5178 }
5179
Eric Christopher5ecce122013-02-18 00:38:31 +00005180 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005181 if (Args.hasFlag(options::OPT_fborland_extensions,
5182 options::OPT_fno_borland_extensions, false))
5183 CmdArgs.push_back("-fborland-extensions");
5184
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005185 // -fno-declspec is default, except for PS4.
5186 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5187 getToolChain().getTriple().isPS4()))
5188 CmdArgs.push_back("-fdeclspec");
5189 else if (Args.hasArg(options::OPT_fno_declspec))
5190 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5191
David Majnemerc371ff02015-03-22 08:39:22 +00005192 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5193 // than 19.
5194 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5195 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005196 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005197 CmdArgs.push_back("-fno-threadsafe-statics");
5198
Francois Pichet02744872011-09-01 16:38:08 +00005199 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5200 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005201 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005202 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005203 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005204
Chandler Carruthe03aa552010-04-17 20:17:31 +00005205 // -fgnu-keywords default varies depending on language; only pass if
5206 // specified.
5207 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005208 options::OPT_fno_gnu_keywords))
5209 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005210
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005211 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005212 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005213 CmdArgs.push_back("-fgnu89-inline");
5214
Chad Rosier9c76d242012-03-15 22:31:42 +00005215 if (Args.hasArg(options::OPT_fno_inline))
5216 CmdArgs.push_back("-fno-inline");
5217
Chad Rosier64d6be92012-03-06 21:17:19 +00005218 if (Args.hasArg(options::OPT_fno_inline_functions))
5219 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005220
John McCall5fb5df92012-06-20 06:18:46 +00005221 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005222
John McCall5fb5df92012-06-20 06:18:46 +00005223 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005224 // legacy is the default. Except for deployment taget of 10.5,
5225 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5226 // gets ignored silently.
5227 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005228 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5229 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005230 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005231 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005232 if (getToolChain().UseObjCMixedDispatch())
5233 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5234 else
5235 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5236 }
5237 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005238
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005239 // When ObjectiveC legacy runtime is in effect on MacOSX,
5240 // turn on the option to do Array/Dictionary subscripting
5241 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005242 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005243 getToolChain().getTriple().isMacOSX() &&
5244 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5245 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005246 objcRuntime.isNeXTFamily())
5247 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005248
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005249 // -fencode-extended-block-signature=1 is default.
5250 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5251 CmdArgs.push_back("-fencode-extended-block-signature");
5252 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005253
John McCall24fc0de2011-07-06 00:26:06 +00005254 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5255 // NOTE: This logic is duplicated in ToolChains.cpp.
5256 bool ARC = isObjCAutoRefCount(Args);
5257 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005258 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005259
John McCall24fc0de2011-07-06 00:26:06 +00005260 CmdArgs.push_back("-fobjc-arc");
5261
Chandler Carruth491db322011-11-04 07:34:47 +00005262 // FIXME: It seems like this entire block, and several around it should be
5263 // wrapped in isObjC, but for now we just use it here as this is where it
5264 // was being used previously.
5265 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5266 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5267 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5268 else
5269 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5270 }
5271
John McCall24fc0de2011-07-06 00:26:06 +00005272 // Allow the user to enable full exceptions code emission.
5273 // We define off for Objective-CC, on for Objective-C++.
5274 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5275 options::OPT_fno_objc_arc_exceptions,
5276 /*default*/ types::isCXX(InputType)))
5277 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005278
John McCall24fc0de2011-07-06 00:26:06 +00005279 }
5280
5281 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5282 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005283 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005284 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005285
John McCall24fc0de2011-07-06 00:26:06 +00005286 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5287 // takes precedence.
5288 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5289 if (!GCArg)
5290 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5291 if (GCArg) {
5292 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005293 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005294 } else if (getToolChain().SupportsObjCGC()) {
5295 GCArg->render(Args, CmdArgs);
5296 } else {
5297 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005298 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005299 }
5300 }
5301
John McCallfbe5ed72015-11-05 19:19:56 +00005302 // Pass down -fobjc-weak or -fno-objc-weak if present.
5303 if (types::isObjC(InputType)) {
5304 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5305 options::OPT_fno_objc_weak);
5306 if (!WeakArg) {
5307 // nothing to do
5308 } else if (GCArg) {
5309 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5310 D.Diag(diag::err_objc_weak_with_gc);
5311 } else if (!objcRuntime.allowsWeak()) {
5312 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5313 D.Diag(diag::err_objc_weak_unsupported);
5314 } else {
5315 WeakArg->render(Args, CmdArgs);
5316 }
5317 }
5318
Bob Wilsonb111ec92015-03-02 19:01:14 +00005319 if (Args.hasFlag(options::OPT_fapplication_extension,
5320 options::OPT_fno_application_extension, false))
5321 CmdArgs.push_back("-fapplication-extension");
5322
Reid Klecknerc542d372014-06-27 17:02:02 +00005323 // Handle GCC-style exception args.
5324 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005325 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5326 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005327
Tim Northovere931f9f2015-10-30 16:30:41 +00005328 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005329 CmdArgs.push_back("-fsjlj-exceptions");
5330
5331 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005332 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5333 options::OPT_fno_assume_sane_operator_new))
5334 CmdArgs.push_back("-fno-assume-sane-operator-new");
5335
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005336 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5337 // most platforms.
5338 if (Args.hasFlag(options::OPT_fsized_deallocation,
5339 options::OPT_fno_sized_deallocation, false))
5340 CmdArgs.push_back("-fsized-deallocation");
5341
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005342 // -fconstant-cfstrings is default, and may be subject to argument translation
5343 // on Darwin.
5344 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5345 options::OPT_fno_constant_cfstrings) ||
5346 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5347 options::OPT_mno_constant_cfstrings))
5348 CmdArgs.push_back("-fno-constant-cfstrings");
5349
John Thompsoned4e2952009-11-05 20:14:16 +00005350 // -fshort-wchar default varies depending on platform; only
5351 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005352 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5353 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005354 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005355
Hans Wennborg28c96312013-07-31 23:39:13 +00005356 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005357 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005358 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005359 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005360
Daniel Dunbar096ed292011-10-05 21:04:55 +00005361 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5362 // -fno-pack-struct doesn't apply to -fpack-struct=.
5363 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005364 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005365 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005366 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005367 } else if (Args.hasFlag(options::OPT_fpack_struct,
5368 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005369 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005370 }
5371
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005372 // Handle -fmax-type-align=N and -fno-type-align
5373 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5374 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5375 if (!SkipMaxTypeAlign) {
5376 std::string MaxTypeAlignStr = "-fmax-type-align=";
5377 MaxTypeAlignStr += A->getValue();
5378 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5379 }
5380 } else if (getToolChain().getTriple().isOSDarwin()) {
5381 if (!SkipMaxTypeAlign) {
5382 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5383 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5384 }
5385 }
5386
John Brawna7b4ec02015-08-10 11:11:28 +00005387 // -fcommon is the default unless compiling kernel code or the target says so
5388 bool NoCommonDefault =
5389 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5390 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5391 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005392 CmdArgs.push_back("-fno-common");
5393
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005394 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005395 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005396 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005397 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005398 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005399 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005400
Daniel Dunbar6358d682010-10-15 22:30:42 +00005401 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005402 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005403 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005404 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005405
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005406 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005407 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5408 StringRef value = inputCharset->getValue();
5409 if (value != "UTF-8")
5410 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5411 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005412 }
5413
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005414 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005415 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5416 StringRef value = execCharset->getValue();
5417 if (value != "UTF-8")
5418 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5419 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005420 }
5421
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005422 // -fcaret-diagnostics is default.
5423 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5424 options::OPT_fno_caret_diagnostics, true))
5425 CmdArgs.push_back("-fno-caret-diagnostics");
5426
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005427 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005428 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005429 options::OPT_fno_diagnostics_fixit_info))
5430 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005431
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005432 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005433 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005434 options::OPT_fno_diagnostics_show_option))
5435 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005436
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005437 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005438 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005439 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005440 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005441 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005442
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005443 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005444 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005445 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005446 }
5447
Chandler Carruthb6766f02011-03-27 01:50:55 +00005448 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005449 options::OPT_fdiagnostics_show_note_include_stack,
5450 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005451 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005452 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005453 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5454 else
5455 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5456 }
5457
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005458 // Color diagnostics are the default, unless the terminal doesn't support
5459 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005460 // Support both clang's -f[no-]color-diagnostics and gcc's
5461 // -f[no-]diagnostics-colors[=never|always|auto].
5462 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005463 for (const auto &Arg : Args) {
5464 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005465 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5466 !O.matches(options::OPT_fdiagnostics_color) &&
5467 !O.matches(options::OPT_fno_color_diagnostics) &&
5468 !O.matches(options::OPT_fno_diagnostics_color) &&
5469 !O.matches(options::OPT_fdiagnostics_color_EQ))
5470 continue;
5471
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005472 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005473 if (O.matches(options::OPT_fcolor_diagnostics) ||
5474 O.matches(options::OPT_fdiagnostics_color)) {
5475 ShowColors = Colors_On;
5476 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5477 O.matches(options::OPT_fno_diagnostics_color)) {
5478 ShowColors = Colors_Off;
5479 } else {
5480 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005481 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005482 if (value == "always")
5483 ShowColors = Colors_On;
5484 else if (value == "never")
5485 ShowColors = Colors_Off;
5486 else if (value == "auto")
5487 ShowColors = Colors_Auto;
5488 else
5489 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005490 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005491 }
5492 }
5493 if (ShowColors == Colors_On ||
5494 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005495 CmdArgs.push_back("-fcolor-diagnostics");
5496
Nico Rieck7857d462013-09-11 00:38:02 +00005497 if (Args.hasArg(options::OPT_fansi_escape_codes))
5498 CmdArgs.push_back("-fansi-escape-codes");
5499
Daniel Dunbardb097022009-06-08 21:13:54 +00005500 if (!Args.hasFlag(options::OPT_fshow_source_location,
5501 options::OPT_fno_show_source_location))
5502 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005503
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005504 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005505 true))
5506 CmdArgs.push_back("-fno-show-column");
5507
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005508 if (!Args.hasFlag(options::OPT_fspell_checking,
5509 options::OPT_fno_spell_checking))
5510 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005511
Chad Rosierc8e56e82012-12-05 21:08:21 +00005512 // -fno-asm-blocks is default.
5513 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5514 false))
5515 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005516
Steven Wucb0d13f2015-01-16 23:05:28 +00005517 // -fgnu-inline-asm is default.
5518 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5519 options::OPT_fno_gnu_inline_asm, true))
5520 CmdArgs.push_back("-fno-gnu-inline-asm");
5521
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005522 // Enable vectorization per default according to the optimization level
5523 // selected. For optimization levels that want vectorization we use the alias
5524 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005525 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005526 OptSpecifier VectorizeAliasOption =
5527 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005528 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005529 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005530 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005531
Chad Rosier136d67d2014-04-28 19:30:57 +00005532 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005533 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005534 OptSpecifier SLPVectAliasOption =
5535 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005536 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005537 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005538 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005539
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005540 // -fno-slp-vectorize-aggressive is default.
5541 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005542 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005543 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005544
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005545 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5546 A->render(Args, CmdArgs);
5547
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005548 // -fdollars-in-identifiers default varies depending on platform and
5549 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005550 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005551 options::OPT_fno_dollars_in_identifiers)) {
5552 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005553 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005554 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005555 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005556 }
5557
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005558 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5559 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005560 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005561 options::OPT_fno_unit_at_a_time)) {
5562 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005563 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005564 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005565
Eli Friedman055c9702011-11-02 01:53:16 +00005566 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5567 options::OPT_fno_apple_pragma_pack, false))
5568 CmdArgs.push_back("-fapple-pragma-pack");
5569
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005570 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005571 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5572 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005573 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005574 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005575 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005576
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005577// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5578//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005579// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005580#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005581 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005582 (getToolChain().getArch() == llvm::Triple::arm ||
5583 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005584 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5585 CmdArgs.push_back("-fno-builtin-strcat");
5586 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5587 CmdArgs.push_back("-fno-builtin-strcpy");
5588 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005589#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005590
Justin Bognera88f0122014-06-20 22:59:50 +00005591 // Enable rewrite includes if the user's asked for it or if we're generating
5592 // diagnostics.
5593 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5594 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005595 if (Args.hasFlag(options::OPT_frewrite_includes,
5596 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005597 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005598 CmdArgs.push_back("-frewrite-includes");
5599
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005600 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005601 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005602 options::OPT_traditional_cpp)) {
5603 if (isa<PreprocessJobAction>(JA))
5604 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005605 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005606 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005607 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005608
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005609 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005610 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005611
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005612 // Handle serialized diagnostics.
5613 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5614 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005615 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005616 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005617
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005618 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5619 CmdArgs.push_back("-fretain-comments-from-system-headers");
5620
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005621 // Forward -fcomment-block-commands to -cc1.
5622 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005623 // Forward -fparse-all-comments to -cc1.
5624 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005625
John Brawnad31ace2015-09-23 13:55:40 +00005626 // Turn -fplugin=name.so into -load name.so
5627 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5628 CmdArgs.push_back("-load");
5629 CmdArgs.push_back(A->getValue());
5630 A->claim();
5631 }
5632
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005633 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5634 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005635 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005636 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5637 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005638
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005639 // We translate this by hand to the -cc1 argument, since nightly test uses
5640 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005641 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005642 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005643 } else
Sean Silva14facf32015-06-09 01:57:17 +00005644 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005645 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005646
Bob Wilson23a55f12014-12-21 07:00:00 +00005647 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005648 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5649 // by the frontend.
5650 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5651 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005652
Daniel Dunbard67a3222009-03-30 06:36:42 +00005653 if (Output.getType() == types::TY_Dependencies) {
5654 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005655 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005656 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005657 CmdArgs.push_back(Output.getFilename());
5658 } else {
5659 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005660 }
5661
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005662 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005663
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005664 if (Input.isFilename())
5665 CmdArgs.push_back(Input.getFilename());
5666 else
5667 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005668
Chris Lattnere9d7d782009-11-03 19:50:27 +00005669 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5670
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005671 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005672
5673 // Optionally embed the -cc1 level arguments into the debug info, for build
5674 // analysis.
5675 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005676 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005677 for (const auto &Arg : Args)
5678 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005679
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005680 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005681 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005682 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005683 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005684 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005685 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005686 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005687 }
5688 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005689 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005690 }
5691
Eric Christopherd3804002013-02-22 20:12:52 +00005692 // Add the split debug info name to the command lines here so we
5693 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005694 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005695 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5696 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005697 const char *SplitDwarfOut;
5698 if (SplitDwarf) {
5699 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005700 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005701 CmdArgs.push_back(SplitDwarfOut);
5702 }
5703
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005704 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5705 // Include them with -fcuda-include-gpubinary.
5706 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005707 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005708 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005709 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005710 }
5711
Eric Christopherd3804002013-02-22 20:12:52 +00005712 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005713 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005714 Output.getType() == types::TY_Object &&
5715 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005716 auto CLCommand =
5717 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005718 C.addCommand(llvm::make_unique<FallbackCommand>(
5719 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005720 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5721 isa<PrecompileJobAction>(JA)) {
5722 // In /fallback builds, run the main compilation even if the pch generation
5723 // fails, so that the main compilation's fallback to cl.exe runs.
5724 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5725 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005726 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005727 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005728 }
5729
Eric Christopherf1545832013-02-22 23:50:16 +00005730 // Handle the debug info splitting at object creation time if we're
5731 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005732 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005733 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005734 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005735
Roman Divacky178e01602011-02-10 16:52:03 +00005736 if (Arg *A = Args.getLastArg(options::OPT_pg))
5737 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005738 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5739 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005740
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005741 // Claim some arguments which clang supports automatically.
5742
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005743 // -fpch-preprocess is used with gcc to add a special marker in the output to
5744 // include the PCH file. Clang's PTH solution is completely transparent, so we
5745 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005746 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005747
Daniel Dunbar17731772009-03-23 19:03:36 +00005748 // Claim some arguments which clang doesn't support, but we don't
5749 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005750 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5751 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005752
Rafael Espindolab0092d72013-09-04 19:37:35 +00005753 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005754 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005755}
5756
John McCall5fb5df92012-06-20 06:18:46 +00005757/// Add options related to the Objective-C runtime/ABI.
5758///
5759/// Returns true if the runtime is non-fragile.
5760ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5761 ArgStringList &cmdArgs,
5762 RewriteKind rewriteKind) const {
5763 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005764 Arg *runtimeArg =
5765 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5766 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005767
5768 // Just forward -fobjc-runtime= to the frontend. This supercedes
5769 // options about fragility.
5770 if (runtimeArg &&
5771 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5772 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005773 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005774 if (runtime.tryParse(value)) {
5775 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005776 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005777 }
5778
5779 runtimeArg->render(args, cmdArgs);
5780 return runtime;
5781 }
5782
5783 // Otherwise, we'll need the ABI "version". Version numbers are
5784 // slightly confusing for historical reasons:
5785 // 1 - Traditional "fragile" ABI
5786 // 2 - Non-fragile ABI, version 1
5787 // 3 - Non-fragile ABI, version 2
5788 unsigned objcABIVersion = 1;
5789 // If -fobjc-abi-version= is present, use that to set the version.
5790 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005791 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005792 if (value == "1")
5793 objcABIVersion = 1;
5794 else if (value == "2")
5795 objcABIVersion = 2;
5796 else if (value == "3")
5797 objcABIVersion = 3;
5798 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005799 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005800 } else {
5801 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005802 bool nonFragileABIIsDefault =
5803 (rewriteKind == RK_NonFragile ||
5804 (rewriteKind == RK_None &&
5805 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005806 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5807 options::OPT_fno_objc_nonfragile_abi,
5808 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005809// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005810#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5811 unsigned nonFragileABIVersion = 1;
5812#else
5813 unsigned nonFragileABIVersion = 2;
5814#endif
5815
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005816 if (Arg *abiArg =
5817 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005818 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005819 if (value == "1")
5820 nonFragileABIVersion = 1;
5821 else if (value == "2")
5822 nonFragileABIVersion = 2;
5823 else
5824 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005825 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005826 }
5827
5828 objcABIVersion = 1 + nonFragileABIVersion;
5829 } else {
5830 objcABIVersion = 1;
5831 }
5832 }
5833
5834 // We don't actually care about the ABI version other than whether
5835 // it's non-fragile.
5836 bool isNonFragile = objcABIVersion != 1;
5837
5838 // If we have no runtime argument, ask the toolchain for its default runtime.
5839 // However, the rewriter only really supports the Mac runtime, so assume that.
5840 ObjCRuntime runtime;
5841 if (!runtimeArg) {
5842 switch (rewriteKind) {
5843 case RK_None:
5844 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5845 break;
5846 case RK_Fragile:
5847 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5848 break;
5849 case RK_NonFragile:
5850 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5851 break;
5852 }
5853
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005854 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005855 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5856 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005857 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005858 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5859
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005860 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005861 } else {
5862 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5863 }
5864
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005865 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005866 } else {
5867 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005868 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005869 // non-fragile mode or the GCC runtime in fragile mode.
5870 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005871 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005872 else
5873 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005874 }
5875
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005876 cmdArgs.push_back(
5877 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005878 return runtime;
5879}
5880
Reid Klecknerc542d372014-06-27 17:02:02 +00005881static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5882 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5883 I += HaveDash;
5884 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005885}
Reid Klecknerc542d372014-06-27 17:02:02 +00005886
Benjamin Kramere003ca22015-10-28 13:54:16 +00005887namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005888struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005889 bool Synch = false;
5890 bool Asynch = false;
5891 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005892};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005893} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005894
5895/// /EH controls whether to run destructor cleanups when exceptions are
5896/// thrown. There are three modifiers:
5897/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5898/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5899/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005900/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005901/// The default is /EHs-c-, meaning cleanups are disabled.
5902static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5903 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005904
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005905 std::vector<std::string> EHArgs =
5906 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005907 for (auto EHVal : EHArgs) {
5908 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5909 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005910 case 'a':
5911 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005912 if (EH.Asynch)
5913 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005914 continue;
5915 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005916 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005917 continue;
5918 case 's':
5919 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005920 if (EH.Synch)
5921 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005922 continue;
5923 default:
5924 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005925 }
5926 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5927 break;
5928 }
5929 }
David Majnemerb8809092016-02-20 09:23:44 +00005930 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005931 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005932 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005933 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5934 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005935 EH.Synch = true;
5936 EH.NoUnwindC = true;
5937 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005938
Reid Klecknerc542d372014-06-27 17:02:02 +00005939 return EH;
5940}
5941
David Majnemercd5855e2016-02-29 01:40:36 +00005942void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
5943 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005944 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005945 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005946 unsigned RTOptionID = options::OPT__SLASH_MT;
5947
Hans Wennborgf1a74252013-09-10 20:18:04 +00005948 if (Args.hasArg(options::OPT__SLASH_LDd))
5949 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5950 // but defining _DEBUG is sticky.
5951 RTOptionID = options::OPT__SLASH_MTd;
5952
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005953 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005954 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005955
David Majnemere2afb472015-07-24 06:49:13 +00005956 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005957 switch (RTOptionID) {
5958 case options::OPT__SLASH_MD:
5959 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005960 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005961 CmdArgs.push_back("-D_MT");
5962 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005963 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005964 break;
5965 case options::OPT__SLASH_MDd:
5966 CmdArgs.push_back("-D_DEBUG");
5967 CmdArgs.push_back("-D_MT");
5968 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005969 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005970 break;
5971 case options::OPT__SLASH_MT:
5972 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005973 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005974 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005975 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005976 break;
5977 case options::OPT__SLASH_MTd:
5978 CmdArgs.push_back("-D_DEBUG");
5979 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005980 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005981 break;
5982 default:
5983 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005984 }
5985
David Majnemere2afb472015-07-24 06:49:13 +00005986 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5987 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5988 } else {
5989 CmdArgs.push_back(FlagForCRT.data());
5990
5991 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5992 // users want. The /Za flag to cl.exe turns this off, but it's not
5993 // implemented in clang.
5994 CmdArgs.push_back("--dependent-lib=oldnames");
5995 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005996
Hans Wennborg8858a032014-07-21 23:42:07 +00005997 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5998 // would produce interleaved output, so ignore /showIncludes in such cases.
5999 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6000 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6001 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006002
David Majnemerf6072342014-07-01 22:24:56 +00006003 // This controls whether or not we emit RTTI data for polymorphic types.
6004 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6005 /*default=*/false))
6006 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006007
Reid Kleckner124955a2015-08-05 18:51:13 +00006008 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006009 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006010 if (*EmitCodeView)
6011 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006012 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006013 CmdArgs.push_back("-gcodeview");
6014
Reid Klecknerc542d372014-06-27 17:02:02 +00006015 const Driver &D = getToolChain().getDriver();
6016 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006017 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006018 if (types::isCXX(InputType))
6019 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006020 CmdArgs.push_back("-fexceptions");
6021 }
David Majnemercd5855e2016-02-29 01:40:36 +00006022 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6023 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006024
Hans Wennborge50cec32014-06-13 20:59:54 +00006025 // /EP should expand to -E -P.
6026 if (Args.hasArg(options::OPT__SLASH_EP)) {
6027 CmdArgs.push_back("-E");
6028 CmdArgs.push_back("-P");
6029 }
6030
David Majnemera5b195a2015-02-14 01:35:12 +00006031 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006032 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6033 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006034 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6035 else
6036 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6037
6038 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6039 VolatileOptionID = A->getOption().getID();
6040
6041 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6042 CmdArgs.push_back("-fms-volatile");
6043
David Majnemer86c318f2014-02-11 21:05:00 +00006044 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6045 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6046 if (MostGeneralArg && BestCaseArg)
6047 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6048 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6049
6050 if (MostGeneralArg) {
6051 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6052 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6053 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6054
6055 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6056 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6057 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6058 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6059 << FirstConflict->getAsString(Args)
6060 << SecondConflict->getAsString(Args);
6061
6062 if (SingleArg)
6063 CmdArgs.push_back("-fms-memptr-rep=single");
6064 else if (MultipleArg)
6065 CmdArgs.push_back("-fms-memptr-rep=multiple");
6066 else
6067 CmdArgs.push_back("-fms-memptr-rep=virtual");
6068 }
6069
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006070 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6071 A->render(Args, CmdArgs);
6072
Hans Wennborg81f74482013-09-10 01:07:07 +00006073 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6074 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006075 if (Args.hasArg(options::OPT__SLASH_fallback))
6076 CmdArgs.push_back("msvc-fallback");
6077 else
6078 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006079 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006080}
6081
Douglas Katzman95354292015-06-23 20:42:09 +00006082visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006083 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006084 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006085 return CLFallback.get();
6086}
6087
Daniel Sanders7f933f42015-01-30 17:35:23 +00006088void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6089 ArgStringList &CmdArgs) const {
6090 StringRef CPUName;
6091 StringRef ABIName;
6092 const llvm::Triple &Triple = getToolChain().getTriple();
6093 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6094
6095 CmdArgs.push_back("-target-abi");
6096 CmdArgs.push_back(ABIName.data());
6097}
6098
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006099void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006100 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006101 const ArgList &Args,
6102 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006103 ArgStringList CmdArgs;
6104
6105 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6106 const InputInfo &Input = Inputs[0];
6107
James Y Knight2db38f32015-08-15 03:45:25 +00006108 std::string TripleStr =
6109 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6110 const llvm::Triple Triple(TripleStr);
6111
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006112 // Don't warn about "clang -w -c foo.s"
6113 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006114 // and "clang -emit-llvm -c foo.s"
6115 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006116
Rafael Espindola577637a2015-01-03 00:06:04 +00006117 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006118
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006119 // Invoke ourselves in -cc1as mode.
6120 //
6121 // FIXME: Implement custom jobs for internal actions.
6122 CmdArgs.push_back("-cc1as");
6123
6124 // Add the "effective" target triple.
6125 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006126 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6127
6128 // Set the output mode, we currently only expect to be used as a real
6129 // assembler.
6130 CmdArgs.push_back("-filetype");
6131 CmdArgs.push_back("obj");
6132
Eric Christopher45f2e712012-12-18 00:31:10 +00006133 // Set the main file name, so that debug info works even with
6134 // -save-temps or preprocessed assembly.
6135 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006136 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006137
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006138 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006139 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006140 if (!CPU.empty()) {
6141 CmdArgs.push_back("-target-cpu");
6142 CmdArgs.push_back(Args.MakeArgString(CPU));
6143 }
6144
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006145 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006146 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006147
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006148 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006149 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006150
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006151 // Pass along any -I options so we get proper .include search paths.
6152 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6153
Eric Christopherfc3ee562012-01-10 00:38:01 +00006154 // Determine the original source input.
6155 const Action *SourceAction = &JA;
6156 while (SourceAction->getKind() != Action::InputClass) {
6157 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6158 SourceAction = SourceAction->getInputs()[0];
6159 }
6160
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006161 // Forward -g and handle debug info related flags, assuming we are dealing
6162 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006163 if (SourceAction->getType() == types::TY_Asm ||
6164 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006165 bool WantDebug = false;
6166 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006167 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006168 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006169 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6170 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006171 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006172 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006173 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006174 if (DwarfVersion == 0)
6175 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006176 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006177 (WantDebug ? codegenoptions::LimitedDebugInfo
6178 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006179 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006180
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006181 // Add the -fdebug-compilation-dir flag if needed.
6182 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006183
6184 // Set the AT_producer to the clang version when using the integrated
6185 // assembler on assembly source files.
6186 CmdArgs.push_back("-dwarf-debug-producer");
6187 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006188
6189 // And pass along -I options
6190 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006191 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006192
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006193 // Handle -fPIC et al -- the relocation-model affects the assembler
6194 // for some targets.
6195 llvm::Reloc::Model RelocationModel;
6196 unsigned PICLevel;
6197 bool IsPIE;
6198 std::tie(RelocationModel, PICLevel, IsPIE) =
6199 ParsePICArgs(getToolChain(), Triple, Args);
6200
6201 const char *RMName = RelocationModelName(RelocationModel);
6202 if (RMName) {
6203 CmdArgs.push_back("-mrelocation-model");
6204 CmdArgs.push_back(RMName);
6205 }
6206
Kevin Enderby292dc082011-12-22 19:31:58 +00006207 // Optionally embed the -cc1as level arguments into the debug info, for build
6208 // analysis.
6209 if (getToolChain().UseDwarfDebugFlags()) {
6210 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006211 for (const auto &Arg : Args)
6212 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006213
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006214 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006215 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6216 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006217 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006218 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006219 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006220 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006221 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006222 }
6223 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006224 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006225 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006226
6227 // FIXME: Add -static support, once we have it.
6228
Daniel Sanders7f933f42015-01-30 17:35:23 +00006229 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006230 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006231 default:
6232 break;
6233
6234 case llvm::Triple::mips:
6235 case llvm::Triple::mipsel:
6236 case llvm::Triple::mips64:
6237 case llvm::Triple::mips64el:
6238 AddMIPSTargetArgs(Args, CmdArgs);
6239 break;
6240 }
6241
David Blaikie372d9502014-01-17 03:17:40 +00006242 // Consume all the warning flags. Usually this would be handled more
6243 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6244 // doesn't handle that so rather than warning about unused flags that are
6245 // actually used, we'll lie by omission instead.
6246 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006247 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006248
David Blaikie9260ed62013-07-25 21:19:01 +00006249 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6250 getToolChain().getDriver());
6251
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006252 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006253
6254 assert(Output.isFilename() && "Unexpected lipo output.");
6255 CmdArgs.push_back("-o");
6256 CmdArgs.push_back(Output.getFilename());
6257
Daniel Dunbarb440f562010-08-02 02:38:21 +00006258 assert(Input.isFilename() && "Invalid input.");
6259 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006260
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006261 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006262 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006263
6264 // Handle the debug info splitting at object creation time if we're
6265 // creating an object.
6266 // TODO: Currently only works on linux with newer objcopy.
6267 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006268 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006269 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006270 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006271}
6272
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006273void GnuTool::anchor() {}
6274
Daniel Dunbara3246a02009-03-18 08:07:30 +00006275void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006276 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006277 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006278 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006279 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006280 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006281
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006282 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006283 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006284 // It is unfortunate that we have to claim here, as this means
6285 // we will basically never report anything interesting for
6286 // platforms using a generic gcc, even if we are just using gcc
6287 // to get to the assembler.
6288 A->claim();
6289
Daniel Dunbar939c1212010-08-03 16:14:14 +00006290 // Don't forward any -g arguments to assembly steps.
6291 if (isa<AssembleJobAction>(JA) &&
6292 A->getOption().matches(options::OPT_g_Group))
6293 continue;
6294
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006295 // Don't forward any -W arguments to assembly and link steps.
6296 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6297 A->getOption().matches(options::OPT_W_Group))
6298 continue;
6299
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006300 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006301 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006302 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006303
Daniel Dunbar4e295052010-01-25 22:35:08 +00006304 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006305
6306 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006307 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006308 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006309 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006310 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006311 }
6312
Daniel Dunbar5716d872009-05-02 21:41:52 +00006313 // Try to force gcc to match the tool chain we want, if we recognize
6314 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006315 //
6316 // FIXME: The triple class should directly provide the information we want
6317 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006318 switch (getToolChain().getArch()) {
6319 default:
6320 break;
6321 case llvm::Triple::x86:
6322 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006323 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006324 break;
6325 case llvm::Triple::x86_64:
6326 case llvm::Triple::ppc64:
6327 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006328 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006329 break;
6330 case llvm::Triple::sparcel:
6331 CmdArgs.push_back("-EL");
6332 break;
6333 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006334
Daniel Dunbarb440f562010-08-02 02:38:21 +00006335 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006336 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006337 CmdArgs.push_back(Output.getFilename());
6338 } else {
6339 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006340 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006341 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006342
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006343 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006344
6345 // Only pass -x if gcc will understand it; otherwise hope gcc
6346 // understands the suffix correctly. The main use case this would go
6347 // wrong in is for linker inputs if they happened to have an odd
6348 // suffix; really the only way to get this to happen is a command
6349 // like '-x foobar a.c' which will treat a.c like a linker input.
6350 //
6351 // FIXME: For the linker case specifically, can we safely convert
6352 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006353 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006354 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006355 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006356 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006357 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006358 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006359 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006360 else if (II.getType() == types::TY_ModuleFile)
6361 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006362 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006363
Daniel Dunbara3246a02009-03-18 08:07:30 +00006364 if (types::canTypeBeUserSpecified(II.getType())) {
6365 CmdArgs.push_back("-x");
6366 CmdArgs.push_back(types::getTypeName(II.getType()));
6367 }
6368
Daniel Dunbarb440f562010-08-02 02:38:21 +00006369 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006370 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006371 else {
6372 const Arg &A = II.getInputArg();
6373
6374 // Reverse translate some rewritten options.
6375 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6376 CmdArgs.push_back("-lstdc++");
6377 continue;
6378 }
6379
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006380 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006381 A.render(Args, CmdArgs);
6382 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006383 }
6384
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006385 const std::string customGCCName = D.getCCCGenericGCCName();
6386 const char *GCCName;
6387 if (!customGCCName.empty())
6388 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006389 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006390 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006391 } else
6392 GCCName = "gcc";
6393
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006394 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006395 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006396}
6397
Douglas Katzman95354292015-06-23 20:42:09 +00006398void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6399 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006400 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006401}
6402
Douglas Katzman95354292015-06-23 20:42:09 +00006403void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6404 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006405 const Driver &D = getToolChain().getDriver();
6406
Eric Christophercc7ff502015-01-29 00:56:17 +00006407 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006408 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006409 case types::TY_LLVM_IR:
6410 case types::TY_LTO_IR:
6411 case types::TY_LLVM_BC:
6412 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006413 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006414 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006415 // We assume we've got an "integrated" assembler in that gcc will produce an
6416 // object file itself.
6417 case types::TY_Object:
6418 CmdArgs.push_back("-c");
6419 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006420 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006421 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006422 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006423 case types::TY_Nothing:
6424 CmdArgs.push_back("-fsyntax-only");
6425 break;
6426 default:
6427 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006428 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006429}
6430
Douglas Katzman95354292015-06-23 20:42:09 +00006431void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6432 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006433 // The types are (hopefully) good enough.
6434}
6435
Tony Linthicum76329bf2011-12-12 21:14:55 +00006436// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006437void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006438 ArgStringList &CmdArgs) const {
6439}
6440
Douglas Katzman95354292015-06-23 20:42:09 +00006441void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6442 const InputInfo &Output,
6443 const InputInfoList &Inputs,
6444 const ArgList &Args,
6445 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006446 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006447
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006448 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6449 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006450 ArgStringList CmdArgs;
6451
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006452 std::string MArchString = "-march=hexagon";
6453 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454
6455 RenderExtraToolArgs(JA, CmdArgs);
6456
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006457 std::string AsName = "hexagon-llvm-mc";
6458 std::string MCpuString = "-mcpu=hexagon" +
6459 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6460 CmdArgs.push_back("-filetype=obj");
6461 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6462
Tony Linthicum76329bf2011-12-12 21:14:55 +00006463 if (Output.isFilename()) {
6464 CmdArgs.push_back("-o");
6465 CmdArgs.push_back(Output.getFilename());
6466 } else {
6467 assert(Output.isNothing() && "Unexpected output");
6468 CmdArgs.push_back("-fsyntax-only");
6469 }
6470
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006471 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6472 std::string N = llvm::utostr(G.getValue());
6473 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6474 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006475
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006476 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006477
Tony Linthicum76329bf2011-12-12 21:14:55 +00006478 // Only pass -x if gcc will understand it; otherwise hope gcc
6479 // understands the suffix correctly. The main use case this would go
6480 // wrong in is for linker inputs if they happened to have an odd
6481 // suffix; really the only way to get this to happen is a command
6482 // like '-x foobar a.c' which will treat a.c like a linker input.
6483 //
6484 // FIXME: For the linker case specifically, can we safely convert
6485 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006486 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006487 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006488 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006489 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006490 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006491 else if (II.getType() == types::TY_AST)
6492 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006493 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006494 else if (II.getType() == types::TY_ModuleFile)
6495 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006496 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006497
6498 if (II.isFilename())
6499 CmdArgs.push_back(II.getFilename());
6500 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006501 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006502 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006503 II.getInputArg().render(Args, CmdArgs);
6504 }
6505
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006506 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006507 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006508}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006509
Douglas Katzman95354292015-06-23 20:42:09 +00006510void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6511 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006512}
6513
Douglas Katzman54366072015-07-27 16:53:08 +00006514static void
6515constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006516 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006517 const InputInfo &Output, const InputInfoList &Inputs,
6518 const ArgList &Args, ArgStringList &CmdArgs,
6519 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006520
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006521 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006522
Matthew Curtise689b052012-12-06 15:46:07 +00006523 //----------------------------------------------------------------------------
6524 //
6525 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006526 bool IsStatic = Args.hasArg(options::OPT_static);
6527 bool IsShared = Args.hasArg(options::OPT_shared);
6528 bool IsPIE = Args.hasArg(options::OPT_pie);
6529 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6530 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6531 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6532 bool UseG0 = false;
6533 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006534
Matthew Curtise689b052012-12-06 15:46:07 +00006535 //----------------------------------------------------------------------------
6536 // Silence warnings for various options
6537 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006538 Args.ClaimAllArgs(options::OPT_g_Group);
6539 Args.ClaimAllArgs(options::OPT_emit_llvm);
6540 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6541 // handled somewhere else.
6542 Args.ClaimAllArgs(options::OPT_static_libgcc);
6543
6544 //----------------------------------------------------------------------------
6545 //
6546 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006547 if (Args.hasArg(options::OPT_s))
6548 CmdArgs.push_back("-s");
6549
6550 if (Args.hasArg(options::OPT_r))
6551 CmdArgs.push_back("-r");
6552
6553 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006554 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006555
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006556 CmdArgs.push_back("-march=hexagon");
6557 std::string CpuVer =
6558 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6559 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6560 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006561
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006562 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006563 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006564 // The following should be the default, but doing as hexagon-gcc does.
6565 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006566 }
6567
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006568 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006569 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006570
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006571 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006572 CmdArgs.push_back("-pie");
6573
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006574 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6575 std::string N = llvm::utostr(G.getValue());
6576 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6577 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006578 }
6579
Matthew Curtise689b052012-12-06 15:46:07 +00006580 //----------------------------------------------------------------------------
6581 //
6582 //----------------------------------------------------------------------------
6583 CmdArgs.push_back("-o");
6584 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006585
Matthew Curtise689b052012-12-06 15:46:07 +00006586 //----------------------------------------------------------------------------
6587 // moslib
6588 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006589 std::vector<std::string> OsLibs;
6590 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006591
Sean Silva14facf32015-06-09 01:57:17 +00006592 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6593 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006594 OsLibs.emplace_back(A->getValue());
6595 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006596 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006597 if (OsLibs.empty()) {
6598 OsLibs.push_back("standalone");
6599 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006600 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006601
Matthew Curtise689b052012-12-06 15:46:07 +00006602 //----------------------------------------------------------------------------
6603 // Start Files
6604 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006605 const std::string MCpuSuffix = "/" + CpuVer;
6606 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6607 const std::string RootDir =
6608 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6609 const std::string StartSubDir =
6610 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006611
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006612 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6613 const char *Name) -> std::string {
6614 std::string RelName = SubDir + Name;
6615 std::string P = HTC.GetFilePath(RelName.c_str());
6616 if (llvm::sys::fs::exists(P))
6617 return P;
6618 return RootDir + RelName;
6619 };
6620
6621 if (IncStdLib && IncStartFiles) {
6622 if (!IsShared) {
6623 if (HasStandalone) {
6624 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6625 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006626 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006627 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6628 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006629 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006630 std::string Init = UseShared
6631 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6632 : Find(RootDir, StartSubDir, "/init.o");
6633 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006634 }
6635
6636 //----------------------------------------------------------------------------
6637 // Library Search Paths
6638 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006639 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6640 for (const auto &LibPath : LibPaths)
6641 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006642
6643 //----------------------------------------------------------------------------
6644 //
6645 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006646 Args.AddAllArgs(CmdArgs,
6647 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6648 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006649
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006650 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006651
6652 //----------------------------------------------------------------------------
6653 // Libraries
6654 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006655 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006656 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006657 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006658 CmdArgs.push_back("-lm");
6659 }
6660
6661 CmdArgs.push_back("--start-group");
6662
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006663 if (!IsShared) {
6664 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006665 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006666 CmdArgs.push_back("-lc");
6667 }
6668 CmdArgs.push_back("-lgcc");
6669
6670 CmdArgs.push_back("--end-group");
6671 }
6672
6673 //----------------------------------------------------------------------------
6674 // End files
6675 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006676 if (IncStdLib && IncStartFiles) {
6677 std::string Fini = UseShared
6678 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6679 : Find(RootDir, StartSubDir, "/fini.o");
6680 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006681 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006682}
6683
Douglas Katzman95354292015-06-23 20:42:09 +00006684void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6685 const InputInfo &Output,
6686 const InputInfoList &Inputs,
6687 const ArgList &Args,
6688 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006689 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006690
6691 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006692 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006693 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006694
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006695 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006696 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006697 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006698}
6699// Hexagon tools end.
6700
Tom Stellard8fa33092015-07-18 01:49:05 +00006701void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6702 const InputInfo &Output,
6703 const InputInfoList &Inputs,
6704 const ArgList &Args,
6705 const char *LinkingOutput) const {
6706
6707 std::string Linker = getToolChain().GetProgramPath(getShortName());
6708 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006709 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6710 CmdArgs.push_back("-o");
6711 CmdArgs.push_back(Output.getFilename());
6712 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6713 CmdArgs, Inputs));
6714}
6715// AMDGPU tools end.
6716
Dan Gohman52816862015-12-16 23:30:41 +00006717wasm::Linker::Linker(const ToolChain &TC)
6718 : GnuTool("wasm::Linker", "lld", TC) {}
6719
6720bool wasm::Linker::isLinkJob() const {
6721 return true;
6722}
6723
6724bool wasm::Linker::hasIntegratedCPP() const {
6725 return false;
6726}
6727
6728void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6729 const InputInfo &Output,
6730 const InputInfoList &Inputs,
6731 const ArgList &Args,
6732 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006733
6734 const ToolChain &ToolChain = getToolChain();
6735 const Driver &D = ToolChain.getDriver();
6736 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006737 ArgStringList CmdArgs;
6738 CmdArgs.push_back("-flavor");
6739 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006740
6741 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006742 // size is of particular importance. This is significantly facilitated by
6743 // the enabling of -ffunction-sections and -fdata-sections in
6744 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006745 if (areOptimizationsEnabled(Args))
6746 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006747
Dan Gohman57b62c52016-02-22 19:26:15 +00006748 if (Args.hasArg(options::OPT_rdynamic))
6749 CmdArgs.push_back("-export-dynamic");
6750 if (Args.hasArg(options::OPT_s))
6751 CmdArgs.push_back("--strip-all");
6752 if (Args.hasArg(options::OPT_shared))
6753 CmdArgs.push_back("-shared");
6754 if (Args.hasArg(options::OPT_static))
6755 CmdArgs.push_back("-Bstatic");
6756
6757 Args.AddAllArgs(CmdArgs, options::OPT_L);
6758 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6759
6760 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6761 if (Args.hasArg(options::OPT_shared))
6762 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6763 else if (Args.hasArg(options::OPT_pie))
6764 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6765 else
6766 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6767
6768 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6769 }
6770
6771 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6772
6773 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6774 if (D.CCCIsCXX())
6775 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6776
6777 if (Args.hasArg(options::OPT_pthread))
6778 CmdArgs.push_back("-lpthread");
6779
6780 CmdArgs.push_back("-lc");
6781 CmdArgs.push_back("-lcompiler_rt");
6782 }
6783
6784 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6785 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6786
Dan Gohman52816862015-12-16 23:30:41 +00006787 CmdArgs.push_back("-o");
6788 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006789
Dan Gohman52816862015-12-16 23:30:41 +00006790 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6791}
6792
Renato Golin7c542b42015-07-27 23:44:45 +00006793const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006794 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006795 if (!Arch.empty())
6796 MArch = Arch;
6797 else
Bernard Ogden31561762013-12-12 13:27:11 +00006798 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006799 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006800
6801 // Handle -march=native.
6802 if (MArch == "native") {
6803 std::string CPU = llvm::sys::getHostCPUName();
6804 if (CPU != "generic") {
6805 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006806 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006807 // If there is no valid architecture suffix for this CPU we don't know how
6808 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006809 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006810 MArch = "";
6811 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006812 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006813 }
6814 }
6815
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006816 return MArch;
6817}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006818
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006819/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006820StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006821 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006822 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6823 // here means an -march=native that we can't handle, so instead return no CPU.
6824 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006825 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006826
John Brawna95c1a82015-05-08 12:52:18 +00006827 // We need to return an empty string here on invalid MArch values as the
6828 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006829 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006830}
6831
6832/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006833std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006834 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006835 // FIXME: Warn on inconsistent use of -mcpu and -march.
6836 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006837 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006838 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006839 // Handle -mcpu=native.
6840 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006841 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006842 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006843 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006844 }
6845
Renato Goline17c5802015-07-27 23:44:42 +00006846 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006847}
6848
6849/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006850/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006851// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006852StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6853 const llvm::Triple &Triple) {
6854 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006855 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006856 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006857 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006858 if (ArchKind == llvm::ARM::AK_INVALID)
6859 // In case of generic Arch, i.e. "arm",
6860 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006861 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006862 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006863 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6864 // armv7k triple if it's actually been specified via "-arch armv7k".
6865 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006866 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006867 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006868 }
Renato Golin3c007252015-05-28 15:05:53 +00006869 if (ArchKind == llvm::ARM::AK_INVALID)
6870 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006871 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006872}
6873
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006874void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006875 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006876 if (Args.hasArg(options::OPT_r))
6877 return;
6878
John Brawn94fd9632015-05-21 12:19:49 +00006879 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6880 // to generate BE-8 executables.
6881 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6882 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006883}
6884
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006885mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006886 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6887 // was first introduced in Release 3. However, other compilers have
6888 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006889 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6890 .Case("mips1", NanLegacy)
6891 .Case("mips2", NanLegacy)
6892 .Case("mips3", NanLegacy)
6893 .Case("mips4", NanLegacy)
6894 .Case("mips5", NanLegacy)
6895 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006896 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006897 .Case("mips32r3", NanLegacy | Nan2008)
6898 .Case("mips32r5", NanLegacy | Nan2008)
6899 .Case("mips32r6", Nan2008)
6900 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006901 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006902 .Case("mips64r3", NanLegacy | Nan2008)
6903 .Case("mips64r5", NanLegacy | Nan2008)
6904 .Case("mips64r6", Nan2008)
6905 .Default(NanLegacy);
6906}
6907
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006908bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6909 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6910 return A && (A->getValue() == StringRef(Value));
6911}
6912
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006913bool mips::isUCLibc(const ArgList &Args) {
6914 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006915 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006916}
6917
Daniel Sanders2bf13662014-07-10 14:40:57 +00006918bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006919 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6920 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006921 .Case("2008", true)
6922 .Case("legacy", false)
6923 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006924
6925 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006926 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006927 .Cases("mips32r6", "mips64r6", true)
6928 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006929
6930 return false;
6931}
6932
Daniel Sanders379d44b2014-07-16 11:52:23 +00006933bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006934 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006935 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006936 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006937 return false;
6938
6939 if (ABIName != "32")
6940 return false;
6941
Toma Tabacu94ea6862015-06-16 13:54:13 +00006942 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6943 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006944 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006945 return false;
6946
Daniel Sanders379d44b2014-07-16 11:52:23 +00006947 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006948 .Cases("mips2", "mips3", "mips4", "mips5", true)
6949 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6950 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6951 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006952}
6953
Toma Tabacu94ea6862015-06-16 13:54:13 +00006954bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6955 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006956 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006957 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6958
6959 // FPXX shouldn't be used if -msingle-float is present.
6960 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6961 options::OPT_mdouble_float))
6962 if (A->getOption().matches(options::OPT_msingle_float))
6963 UseFPXX = false;
6964
6965 return UseFPXX;
6966}
6967
Tim Northover157d9112014-01-16 08:48:16 +00006968llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006969 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6970 // archs which Darwin doesn't use.
6971
6972 // The matching this routine does is fairly pointless, since it is neither the
6973 // complete architecture list, nor a reasonable subset. The problem is that
6974 // historically the driver driver accepts this and also ties its -march=
6975 // handling to the architecture name, so we need to be careful before removing
6976 // support for it.
6977
6978 // This code must be kept in sync with Clang's Darwin specific argument
6979 // translation.
6980
6981 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006982 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6983 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6984 .Case("ppc64", llvm::Triple::ppc64)
6985 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6986 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6987 llvm::Triple::x86)
6988 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6989 // This is derived from the driver driver.
6990 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6991 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6992 .Cases("armv7s", "xscale", llvm::Triple::arm)
6993 .Case("arm64", llvm::Triple::aarch64)
6994 .Case("r600", llvm::Triple::r600)
6995 .Case("amdgcn", llvm::Triple::amdgcn)
6996 .Case("nvptx", llvm::Triple::nvptx)
6997 .Case("nvptx64", llvm::Triple::nvptx64)
6998 .Case("amdil", llvm::Triple::amdil)
6999 .Case("spir", llvm::Triple::spir)
7000 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007001}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007002
Tim Northover157d9112014-01-16 08:48:16 +00007003void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007004 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007005 T.setArch(Arch);
7006
7007 if (Str == "x86_64h")
7008 T.setArchName(Str);
7009 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7010 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007011 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007012 }
7013}
7014
Bob Wilsondecc03e2012-11-23 06:14:39 +00007015const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007016 const InputInfo &Input) {
7017 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007018}
7019
Bob Wilsondecc03e2012-11-23 06:14:39 +00007020const char *Clang::getBaseInputStem(const ArgList &Args,
7021 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007022 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007023
Chris Lattner906bb902011-01-16 08:14:11 +00007024 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007025 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007026
7027 return Str;
7028}
7029
Bob Wilsondecc03e2012-11-23 06:14:39 +00007030const char *Clang::getDependencyFileName(const ArgList &Args,
7031 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007032 // FIXME: Think about this more.
7033 std::string Res;
7034
7035 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007036 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007037 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007038 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007039 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007040 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007041 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007042}
7043
Douglas Katzman95354292015-06-23 20:42:09 +00007044void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7045 const InputInfo &Output,
7046 const InputInfoList &Inputs,
7047 const ArgList &Args,
7048 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007049 const ToolChain &ToolChain = getToolChain();
7050 const Driver &D = ToolChain.getDriver();
7051 ArgStringList CmdArgs;
7052
7053 // Silence warning for "clang -g foo.o -o foo"
7054 Args.ClaimAllArgs(options::OPT_g_Group);
7055 // and "clang -emit-llvm foo.o -o foo"
7056 Args.ClaimAllArgs(options::OPT_emit_llvm);
7057 // and for "clang -w foo.o -o foo". Other warning options are already
7058 // handled somewhere else.
7059 Args.ClaimAllArgs(options::OPT_w);
7060
7061 if (!D.SysRoot.empty())
7062 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7063
7064 // CloudABI only supports static linkage.
7065 CmdArgs.push_back("-Bstatic");
7066 CmdArgs.push_back("--eh-frame-hdr");
7067 CmdArgs.push_back("--gc-sections");
7068
7069 if (Output.isFilename()) {
7070 CmdArgs.push_back("-o");
7071 CmdArgs.push_back(Output.getFilename());
7072 } else {
7073 assert(Output.isNothing() && "Invalid output.");
7074 }
7075
Douglas Katzman78b37b02015-11-17 20:28:07 +00007076 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007077 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7078 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7079 }
7080
7081 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007082 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007083 Args.AddAllArgs(CmdArgs,
7084 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7085 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007086
Teresa Johnson945bc502015-10-15 20:35:53 +00007087 if (D.isUsingLTO())
7088 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007089
7090 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7091
Douglas Katzman78b37b02015-11-17 20:28:07 +00007092 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007093 if (D.CCCIsCXX())
7094 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7095 CmdArgs.push_back("-lc");
7096 CmdArgs.push_back("-lcompiler_rt");
7097 }
7098
Douglas Katzman78b37b02015-11-17 20:28:07 +00007099 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007100 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7101
7102 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007103 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007104}
7105
Douglas Katzman95354292015-06-23 20:42:09 +00007106void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7107 const InputInfo &Output,
7108 const InputInfoList &Inputs,
7109 const ArgList &Args,
7110 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007111 ArgStringList CmdArgs;
7112
7113 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7114 const InputInfo &Input = Inputs[0];
7115
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007116 // Determine the original source input.
7117 const Action *SourceAction = &JA;
7118 while (SourceAction->getKind() != Action::InputClass) {
7119 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7120 SourceAction = SourceAction->getInputs()[0];
7121 }
7122
Eric Christopherf5a8f492015-12-08 00:10:10 +00007123 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007124 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007125 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7126 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007127 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007128 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007129 const llvm::Triple &T(getToolChain().getTriple());
7130 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007131 CmdArgs.push_back("-Q");
7132 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007133
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007134 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007135 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007136 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007137 if (Args.hasArg(options::OPT_gstabs))
7138 CmdArgs.push_back("--gstabs");
7139 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007140 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007141 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007142
Daniel Dunbarbe220842009-03-20 16:06:39 +00007143 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007144 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007145
Daniel Dunbar6d484762010-07-22 01:47:22 +00007146 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007147 if (getToolChain().getArch() == llvm::Triple::x86 ||
7148 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007149 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7150 CmdArgs.push_back("-force_cpusubtype_ALL");
7151
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007152 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007153 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007154 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007155 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007156 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007157 CmdArgs.push_back("-static");
7158
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007159 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007160
7161 assert(Output.isFilename() && "Unexpected lipo output.");
7162 CmdArgs.push_back("-o");
7163 CmdArgs.push_back(Output.getFilename());
7164
Daniel Dunbarb440f562010-08-02 02:38:21 +00007165 assert(Input.isFilename() && "Invalid input.");
7166 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007167
7168 // asm_final spec is empty.
7169
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007170 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007171 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007172}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007173
Tim Northover157d9112014-01-16 08:48:16 +00007174void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007175
Tim Northover157d9112014-01-16 08:48:16 +00007176void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7177 ArgStringList &CmdArgs) const {
7178 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007179
Daniel Dunbarc1964212009-03-26 16:23:12 +00007180 // Derived from darwin_arch spec.
7181 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007182 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007183
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007184 // FIXME: Is this needed anymore?
7185 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007186 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007187}
7188
Douglas Katzman95354292015-06-23 20:42:09 +00007189bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007190 // We only need to generate a temp path for LTO if we aren't compiling object
7191 // files. When compiling source files, we run 'dsymutil' after linking. We
7192 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007193 for (const auto &Input : Inputs)
7194 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007195 return true;
7196
7197 return false;
7198}
7199
Douglas Katzman95354292015-06-23 20:42:09 +00007200void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7201 ArgStringList &CmdArgs,
7202 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007203 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007204 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007205
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007206 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007207 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7208 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007209 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7210 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007211 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007212 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007213 }
7214
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007215 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007216 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007217 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7218 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007219
Bob Wilson3d27dad2013-08-02 22:25:34 +00007220 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7221 CmdArgs.push_back("-export_dynamic");
7222
Bob Wilsonb111ec92015-03-02 19:01:14 +00007223 // If we are using App Extension restrictions, pass a flag to the linker
7224 // telling it that the compiled code has been audited.
7225 if (Args.hasFlag(options::OPT_fapplication_extension,
7226 options::OPT_fno_application_extension, false))
7227 CmdArgs.push_back("-application_extension");
7228
Teresa Johnson945bc502015-10-15 20:35:53 +00007229 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007230 // If we are using LTO, then automatically create a temporary file path for
7231 // the linker to use, so that it's lifetime will extend past a possible
7232 // dsymutil step.
7233 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7234 const char *TmpPath = C.getArgs().MakeArgString(
7235 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7236 C.addTempFile(TmpPath);
7237 CmdArgs.push_back("-object_path_lto");
7238 CmdArgs.push_back(TmpPath);
7239 }
7240
7241 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7242 // it in clang installed libraries. If not found, the option is not used
7243 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7244 if (Version[0] >= 133) {
7245 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7246 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7247 SmallString<128> LibLTOPath(P);
7248 llvm::sys::path::append(LibLTOPath, "lib");
7249 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7250 if (llvm::sys::fs::exists(LibLTOPath)) {
7251 CmdArgs.push_back("-lto_library");
7252 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7253 } else {
7254 D.Diag(diag::warn_drv_lto_libpath);
7255 }
7256 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007257 }
7258
Daniel Dunbarc1964212009-03-26 16:23:12 +00007259 // Derived from the "link" spec.
7260 Args.AddAllArgs(CmdArgs, options::OPT_static);
7261 if (!Args.hasArg(options::OPT_static))
7262 CmdArgs.push_back("-dynamic");
7263 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7264 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7265 // here. How do we wish to handle such things?
7266 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007267
Daniel Dunbarc1964212009-03-26 16:23:12 +00007268 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007269 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007270 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007271 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007272
7273 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7274 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7275 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7276
7277 Arg *A;
7278 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7279 (A = Args.getLastArg(options::OPT_current__version)) ||
7280 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007281 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7282 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007283
7284 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7285 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7286 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7287 } else {
7288 CmdArgs.push_back("-dylib");
7289
7290 Arg *A;
7291 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7292 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7293 (A = Args.getLastArg(options::OPT_client__name)) ||
7294 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7295 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7296 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007297 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7298 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007299
Daniel Dunbarc1964212009-03-26 16:23:12 +00007300 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7301 "-dylib_compatibility_version");
7302 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7303 "-dylib_current_version");
7304
Tim Northover157d9112014-01-16 08:48:16 +00007305 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007306
7307 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7308 "-dylib_install_name");
7309 }
7310
7311 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7312 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7313 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007314 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007315 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007316 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7317 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7318 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7319 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7320 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7321 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007322 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007323 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7324 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7325 Args.AddAllArgs(CmdArgs, options::OPT_init);
7326
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007327 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007328 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007329
Daniel Dunbarc1964212009-03-26 16:23:12 +00007330 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7331 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7332 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7333 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7334 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007335
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007336 if (const Arg *A =
7337 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7338 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007339 if (A->getOption().matches(options::OPT_fpie) ||
7340 A->getOption().matches(options::OPT_fPIE))
7341 CmdArgs.push_back("-pie");
7342 else
7343 CmdArgs.push_back("-no_pie");
7344 }
Steven Wu574b0f22016-03-01 01:07:58 +00007345 // for embed-bitcode, use -bitcode_bundle in linker command
7346 if (C.getDriver().embedBitcodeEnabled() ||
7347 C.getDriver().embedBitcodeMarkerOnly()) {
7348 // Check if the toolchain supports bitcode build flow.
7349 if (MachOTC.SupportsEmbeddedBitcode())
7350 CmdArgs.push_back("-bitcode_bundle");
7351 else
7352 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7353 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007354
7355 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7356 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7357 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7358 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7359 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7360 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7361 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7362 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7363 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7364 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7365 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7366 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7367 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7368 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7369 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7370 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007371
Daniel Dunbar84384642011-05-02 21:03:47 +00007372 // Give --sysroot= preference, over the Apple specific behavior to also use
7373 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007374 StringRef sysroot = C.getSysRoot();
7375 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007376 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007377 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007378 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7379 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007380 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007381 }
7382
Daniel Dunbarc1964212009-03-26 16:23:12 +00007383 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7384 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7385 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7386 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7387 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007388 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007389 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7390 Args.AddAllArgs(CmdArgs, options::OPT_y);
7391 Args.AddLastArg(CmdArgs, options::OPT_w);
7392 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7393 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7394 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7395 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7396 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7397 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7398 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7399 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7400 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7401 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7402 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7403 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7404}
7405
Douglas Katzman95354292015-06-23 20:42:09 +00007406void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7407 const InputInfo &Output,
7408 const InputInfoList &Inputs,
7409 const ArgList &Args,
7410 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007411 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007412
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007413 // If the number of arguments surpasses the system limits, we will encode the
7414 // input files in a separate file, shortening the command line. To this end,
7415 // build a list of input file names that can be passed via a file with the
7416 // -filelist linker option.
7417 llvm::opt::ArgStringList InputFileList;
7418
Daniel Dunbarc1964212009-03-26 16:23:12 +00007419 // The logic here is derived from gcc's behavior; most of which
7420 // comes from specs (starting with link_command). Consult gcc for
7421 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007422 ArgStringList CmdArgs;
7423
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007424 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7425 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7426 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007427 for (const auto &Arg : Args)
7428 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007429 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007430 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007431 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007432 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007433 return;
7434 }
7435
Daniel Dunbarc1964212009-03-26 16:23:12 +00007436 // I'm not sure why this particular decomposition exists in gcc, but
7437 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007438 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007439
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007440 // It seems that the 'e' option is completely ignored for dynamic executables
7441 // (the default), and with static executables, the last one wins, as expected.
7442 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7443 options::OPT_Z_Flag, options::OPT_u_Group,
7444 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007445
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007446 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7447 // members of static archive libraries which implement Objective-C classes or
7448 // categories.
7449 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7450 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007451
Daniel Dunbarc1964212009-03-26 16:23:12 +00007452 CmdArgs.push_back("-o");
7453 CmdArgs.push_back(Output.getFilename());
7454
Douglas Katzman78b37b02015-11-17 20:28:07 +00007455 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007456 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007457
Peter Collingbournec4122c12015-06-15 21:08:13 +00007458 // SafeStack requires its own runtime libraries
7459 // These libraries should be linked first, to make sure the
7460 // __safestack_init constructor executes before everything else
7461 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7462 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7463 "libclang_rt.safestack_osx.a",
7464 /*AlwaysLink=*/true);
7465 }
7466
Daniel Dunbarc1964212009-03-26 16:23:12 +00007467 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007468
Douglas Gregor9295df02012-05-15 21:00:27 +00007469 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007470 // Build the input file for -filelist (list of linker input files) in case we
7471 // need it later
7472 for (const auto &II : Inputs) {
7473 if (!II.isFilename()) {
7474 // This is a linker input argument.
7475 // We cannot mix input arguments and file names in a -filelist input, thus
7476 // we prematurely stop our list (remaining files shall be passed as
7477 // arguments).
7478 if (InputFileList.size() > 0)
7479 break;
7480
7481 continue;
7482 }
7483
7484 InputFileList.push_back(II.getFilename());
7485 }
7486
Douglas Katzman78b37b02015-11-17 20:28:07 +00007487 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007488 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7489
Douglas Katzman78b37b02015-11-17 20:28:07 +00007490 if (isObjCRuntimeLinked(Args) &&
7491 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007492 // We use arclite library for both ARC and subscripting support.
7493 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7494
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007495 CmdArgs.push_back("-framework");
7496 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007497 // Link libobj.
7498 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007499 }
John McCall31168b02011-06-15 23:02:42 +00007500
Daniel Dunbarc1964212009-03-26 16:23:12 +00007501 if (LinkingOutput) {
7502 CmdArgs.push_back("-arch_multiple");
7503 CmdArgs.push_back("-final_output");
7504 CmdArgs.push_back(LinkingOutput);
7505 }
7506
Daniel Dunbarc1964212009-03-26 16:23:12 +00007507 if (Args.hasArg(options::OPT_fnested_functions))
7508 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007509
Justin Bognerc7701242015-05-12 05:44:36 +00007510 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7511
Douglas Katzman78b37b02015-11-17 20:28:07 +00007512 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007513 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007514 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007515
Daniel Dunbarc1964212009-03-26 16:23:12 +00007516 // link_ssp spec is empty.
7517
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007518 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007519 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007520 }
7521
Douglas Katzman78b37b02015-11-17 20:28:07 +00007522 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007523 // endfile_spec is empty.
7524 }
7525
7526 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7527 Args.AddAllArgs(CmdArgs, options::OPT_F);
7528
Steven Wu3ffb61b2015-02-06 18:08:29 +00007529 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007530 for (const Arg *A : Args.filtered(options::OPT_iframework))
7531 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007532
Douglas Katzman78b37b02015-11-17 20:28:07 +00007533 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007534 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7535 if (A->getValue() == StringRef("Accelerate")) {
7536 CmdArgs.push_back("-framework");
7537 CmdArgs.push_back("Accelerate");
7538 }
7539 }
7540 }
7541
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007542 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007543 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007544 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007545 Cmd->setInputFileList(std::move(InputFileList));
7546 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007547}
7548
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007549void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007550 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007551 const InputInfoList &Inputs,
7552 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007553 const char *LinkingOutput) const {
7554 ArgStringList CmdArgs;
7555
7556 CmdArgs.push_back("-create");
7557 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007558
7559 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007560 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007561
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007562 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007563 assert(II.isFilename() && "Unexpected lipo input.");
7564 CmdArgs.push_back(II.getFilename());
7565 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007566
7567 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007568 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007569}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007570
Daniel Dunbar88299622010-06-04 18:28:36 +00007571void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007572 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007573 const InputInfoList &Inputs,
7574 const ArgList &Args,
7575 const char *LinkingOutput) const {
7576 ArgStringList CmdArgs;
7577
Daniel Dunbareb86b042011-05-09 17:23:16 +00007578 CmdArgs.push_back("-o");
7579 CmdArgs.push_back(Output.getFilename());
7580
Daniel Dunbar88299622010-06-04 18:28:36 +00007581 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7582 const InputInfo &Input = Inputs[0];
7583 assert(Input.isFilename() && "Unexpected dsymutil input.");
7584 CmdArgs.push_back(Input.getFilename());
7585
Daniel Dunbar88299622010-06-04 18:28:36 +00007586 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007587 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007588 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007589}
7590
Eric Christopher551ef452011-08-23 17:56:55 +00007591void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007592 const InputInfo &Output,
7593 const InputInfoList &Inputs,
7594 const ArgList &Args,
7595 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007596 ArgStringList CmdArgs;
7597 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007598 CmdArgs.push_back("--debug-info");
7599 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007600 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007601
7602 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7603 const InputInfo &Input = Inputs[0];
7604 assert(Input.isFilename() && "Unexpected verify input");
7605
7606 // Grabbing the output of the earlier dsymutil run.
7607 CmdArgs.push_back(Input.getFilename());
7608
7609 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007610 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007611 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007612}
7613
Douglas Katzman95354292015-06-23 20:42:09 +00007614void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007615 const InputInfo &Output,
7616 const InputInfoList &Inputs,
7617 const ArgList &Args,
7618 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007619 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007620 ArgStringList CmdArgs;
7621
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007622 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007623
7624 CmdArgs.push_back("-o");
7625 CmdArgs.push_back(Output.getFilename());
7626
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007627 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007628 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007629
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007630 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007631 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007632}
7633
Douglas Katzman95354292015-06-23 20:42:09 +00007634void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7635 const InputInfo &Output,
7636 const InputInfoList &Inputs,
7637 const ArgList &Args,
7638 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007639 ArgStringList CmdArgs;
7640
David Chisnall272a0712012-02-29 15:06:12 +00007641 // Demangle C++ names in errors
7642 CmdArgs.push_back("-C");
7643
Douglas Katzman78b37b02015-11-17 20:28:07 +00007644 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007645 CmdArgs.push_back("-e");
7646 CmdArgs.push_back("_start");
7647 }
7648
7649 if (Args.hasArg(options::OPT_static)) {
7650 CmdArgs.push_back("-Bstatic");
7651 CmdArgs.push_back("-dn");
7652 } else {
7653 CmdArgs.push_back("-Bdynamic");
7654 if (Args.hasArg(options::OPT_shared)) {
7655 CmdArgs.push_back("-shared");
7656 } else {
7657 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007658 CmdArgs.push_back(
7659 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007660 }
7661 }
7662
7663 if (Output.isFilename()) {
7664 CmdArgs.push_back("-o");
7665 CmdArgs.push_back(Output.getFilename());
7666 } else {
7667 assert(Output.isNothing() && "Invalid output.");
7668 }
7669
Douglas Katzman78b37b02015-11-17 20:28:07 +00007670 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007671 if (!Args.hasArg(options::OPT_shared))
7672 CmdArgs.push_back(
7673 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7674
7675 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7676 CmdArgs.push_back(
7677 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7678 CmdArgs.push_back(
7679 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007680 }
7681
Douglas Katzman6059ef92015-11-17 17:41:23 +00007682 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007683
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007684 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7685 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007686
7687 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7688
Douglas Katzman78b37b02015-11-17 20:28:07 +00007689 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007690 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007691 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007692 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007693 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007694 if (!Args.hasArg(options::OPT_shared)) {
7695 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007696 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007697 }
David Chisnallf571cde2012-02-15 13:39:01 +00007698 }
7699
Douglas Katzman78b37b02015-11-17 20:28:07 +00007700 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007701 CmdArgs.push_back(
7702 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007703 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007704 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007705
Xinliang David Li69306c02015-10-22 06:15:31 +00007706 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007707
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007708 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007709 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007710}
7711
Douglas Katzman95354292015-06-23 20:42:09 +00007712void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7713 const InputInfo &Output,
7714 const InputInfoList &Inputs,
7715 const ArgList &Args,
7716 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007717 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007718 ArgStringList CmdArgs;
7719
Rafael Espindolacc126272014-02-28 01:55:21 +00007720 switch (getToolChain().getArch()) {
7721 case llvm::Triple::x86:
7722 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7723 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007724 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007725 break;
7726
7727 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007728 CmdArgs.push_back("-mppc");
7729 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007730 break;
7731
7732 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007733 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007734 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007735 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7736 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7737 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007738 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007739 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007740
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007741 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007742 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007743 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7744 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7745 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007746 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007747 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007748
7749 case llvm::Triple::mips64:
7750 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007751 StringRef CPUName;
7752 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007753 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007754
7755 CmdArgs.push_back("-mabi");
7756 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7757
7758 if (getToolChain().getArch() == llvm::Triple::mips64)
7759 CmdArgs.push_back("-EB");
7760 else
7761 CmdArgs.push_back("-EL");
7762
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007763 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007764 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007765 }
7766
Rafael Espindolacc126272014-02-28 01:55:21 +00007767 default:
7768 break;
7769 }
7770
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007771 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007772
7773 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007774 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007775
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007776 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007777 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007778
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007779 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007780 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007781}
7782
Douglas Katzman95354292015-06-23 20:42:09 +00007783void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7784 const InputInfo &Output,
7785 const InputInfoList &Inputs,
7786 const ArgList &Args,
7787 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007788 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007789 ArgStringList CmdArgs;
7790
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007791 // Silence warning for "clang -g foo.o -o foo"
7792 Args.ClaimAllArgs(options::OPT_g_Group);
7793 // and "clang -emit-llvm foo.o -o foo"
7794 Args.ClaimAllArgs(options::OPT_emit_llvm);
7795 // and for "clang -w foo.o -o foo". Other warning options are already
7796 // handled somewhere else.
7797 Args.ClaimAllArgs(options::OPT_w);
7798
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007799 if (getToolChain().getArch() == llvm::Triple::mips64)
7800 CmdArgs.push_back("-EB");
7801 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7802 CmdArgs.push_back("-EL");
7803
Douglas Katzman78b37b02015-11-17 20:28:07 +00007804 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007805 CmdArgs.push_back("-e");
7806 CmdArgs.push_back("__start");
7807 }
7808
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007809 if (Args.hasArg(options::OPT_static)) {
7810 CmdArgs.push_back("-Bstatic");
7811 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007812 if (Args.hasArg(options::OPT_rdynamic))
7813 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007814 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007815 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007816 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007817 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007818 } else {
7819 CmdArgs.push_back("-dynamic-linker");
7820 CmdArgs.push_back("/usr/libexec/ld.so");
7821 }
7822 }
7823
Rafael Espindola044f7832013-06-05 04:28:55 +00007824 if (Args.hasArg(options::OPT_nopie))
7825 CmdArgs.push_back("-nopie");
7826
Daniel Dunbarb440f562010-08-02 02:38:21 +00007827 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007828 CmdArgs.push_back("-o");
7829 CmdArgs.push_back(Output.getFilename());
7830 } else {
7831 assert(Output.isNothing() && "Invalid output.");
7832 }
7833
Douglas Katzman78b37b02015-11-17 20:28:07 +00007834 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007835 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007836 if (Args.hasArg(options::OPT_pg))
7837 CmdArgs.push_back(
7838 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007839 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007840 CmdArgs.push_back(
7841 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7842 CmdArgs.push_back(
7843 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007844 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007845 CmdArgs.push_back(
7846 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007847 }
7848 }
7849
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007850 std::string Triple = getToolChain().getTripleString();
7851 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007852 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007853 CmdArgs.push_back(
7854 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007855
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007856 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7857 options::OPT_e, options::OPT_s, options::OPT_t,
7858 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007859
Daniel Dunbar54423b22010-09-17 00:24:54 +00007860 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007861
Douglas Katzman78b37b02015-11-17 20:28:07 +00007862 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007863 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007864 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007865 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007866 CmdArgs.push_back("-lm_p");
7867 else
7868 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007869 }
7870
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007871 // FIXME: For some reason GCC passes -lgcc before adding
7872 // the default system libraries. Just mimic this for now.
7873 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007874
Eric Christopher17674ec2012-09-13 06:32:34 +00007875 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007876 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7877 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007878 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007879 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007880 }
7881
Chandler Carruth45661652011-12-17 22:32:42 +00007882 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007883 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007884 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007885 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007886 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007887 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007888
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007889 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007890 }
7891
Douglas Katzman78b37b02015-11-17 20:28:07 +00007892 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007893 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007894 CmdArgs.push_back(
7895 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007896 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007897 CmdArgs.push_back(
7898 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007899 }
7900
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007901 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007902 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007903}
Ed Schoutene33194b2009-04-02 19:13:12 +00007904
Douglas Katzman95354292015-06-23 20:42:09 +00007905void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7906 const InputInfo &Output,
7907 const InputInfoList &Inputs,
7908 const ArgList &Args,
7909 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007910 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007911 ArgStringList CmdArgs;
7912
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007913 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007914
7915 CmdArgs.push_back("-o");
7916 CmdArgs.push_back(Output.getFilename());
7917
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007918 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007919 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007920
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007921 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007922 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007923}
7924
Douglas Katzman95354292015-06-23 20:42:09 +00007925void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7926 const InputInfo &Output,
7927 const InputInfoList &Inputs,
7928 const ArgList &Args,
7929 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007930 const Driver &D = getToolChain().getDriver();
7931 ArgStringList CmdArgs;
7932
Douglas Katzman78b37b02015-11-17 20:28:07 +00007933 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007934 CmdArgs.push_back("-e");
7935 CmdArgs.push_back("__start");
7936 }
7937
7938 if (Args.hasArg(options::OPT_static)) {
7939 CmdArgs.push_back("-Bstatic");
7940 } else {
7941 if (Args.hasArg(options::OPT_rdynamic))
7942 CmdArgs.push_back("-export-dynamic");
7943 CmdArgs.push_back("--eh-frame-hdr");
7944 CmdArgs.push_back("-Bdynamic");
7945 if (Args.hasArg(options::OPT_shared)) {
7946 CmdArgs.push_back("-shared");
7947 } else {
7948 CmdArgs.push_back("-dynamic-linker");
7949 CmdArgs.push_back("/usr/libexec/ld.so");
7950 }
7951 }
7952
7953 if (Output.isFilename()) {
7954 CmdArgs.push_back("-o");
7955 CmdArgs.push_back(Output.getFilename());
7956 } else {
7957 assert(Output.isNothing() && "Invalid output.");
7958 }
7959
Douglas Katzman78b37b02015-11-17 20:28:07 +00007960 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007961 if (!Args.hasArg(options::OPT_shared)) {
7962 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007963 CmdArgs.push_back(
7964 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007965 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007966 CmdArgs.push_back(
7967 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7968 CmdArgs.push_back(
7969 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007970 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007971 CmdArgs.push_back(
7972 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007973 }
7974 }
7975
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007976 Args.AddAllArgs(CmdArgs,
7977 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007978
7979 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7980
Douglas Katzman78b37b02015-11-17 20:28:07 +00007981 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007982 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007983 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7984 if (Args.hasArg(options::OPT_pg))
7985 CmdArgs.push_back("-lm_p");
7986 else
7987 CmdArgs.push_back("-lm");
7988 }
7989
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007990 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007991 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007992 CmdArgs.push_back("-lpthread_p");
7993 else
7994 CmdArgs.push_back("-lpthread");
7995 }
7996
Eli Friedman9fa28852012-08-08 23:57:20 +00007997 if (!Args.hasArg(options::OPT_shared)) {
7998 if (Args.hasArg(options::OPT_pg))
7999 CmdArgs.push_back("-lc_p");
8000 else
8001 CmdArgs.push_back("-lc");
8002 }
8003
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008004 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008005 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008006 case llvm::Triple::arm:
8007 MyArch = "arm";
8008 break;
8009 case llvm::Triple::x86:
8010 MyArch = "i386";
8011 break;
8012 case llvm::Triple::x86_64:
8013 MyArch = "amd64";
8014 break;
8015 default:
8016 llvm_unreachable("Unsupported architecture");
8017 }
8018 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008019 }
8020
Douglas Katzman78b37b02015-11-17 20:28:07 +00008021 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008022 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008023 CmdArgs.push_back(
8024 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008025 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008026 CmdArgs.push_back(
8027 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008028 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008029
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008030 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008031 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008032}
8033
Douglas Katzman95354292015-06-23 20:42:09 +00008034void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8035 const InputInfo &Output,
8036 const InputInfoList &Inputs,
8037 const ArgList &Args,
8038 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008039 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008040 ArgStringList CmdArgs;
8041
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008042 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8043 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008044 switch (getToolChain().getArch()) {
8045 default:
8046 break;
8047 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008048 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008049 break;
8050 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008051 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008052 break;
8053 case llvm::Triple::mips:
8054 case llvm::Triple::mipsel:
8055 case llvm::Triple::mips64:
8056 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008057 StringRef CPUName;
8058 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008059 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008060
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008061 CmdArgs.push_back("-march");
8062 CmdArgs.push_back(CPUName.data());
8063
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008064 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008065 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008066
8067 if (getToolChain().getArch() == llvm::Triple::mips ||
8068 getToolChain().getArch() == llvm::Triple::mips64)
8069 CmdArgs.push_back("-EB");
8070 else
8071 CmdArgs.push_back("-EL");
8072
Dimitry Andric46f338c2015-12-27 10:36:44 +00008073 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8074 StringRef v = A->getValue();
8075 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8076 A->claim();
8077 }
8078
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008079 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008080 break;
8081 }
8082 case llvm::Triple::arm:
8083 case llvm::Triple::armeb:
8084 case llvm::Triple::thumb:
8085 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008086 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008087
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008088 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008089 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008090 else
Renato Golinf4421f72014-02-19 10:44:07 +00008091 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008092
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008093 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008094 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008095 case llvm::Triple::GNUEABI:
8096 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008097 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008098 break;
8099
8100 default:
8101 CmdArgs.push_back("-matpcs");
8102 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008103 break;
8104 }
8105 case llvm::Triple::sparc:
8106 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008107 case llvm::Triple::sparcv9: {
8108 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8109 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008110 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008111 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008112 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008113 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008114
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008115 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008116
8117 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008118 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008119
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008120 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008121 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008122
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008123 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008124 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008125}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008126
Douglas Katzman95354292015-06-23 20:42:09 +00008127void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8128 const InputInfo &Output,
8129 const InputInfoList &Inputs,
8130 const ArgList &Args,
8131 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008132 const toolchains::FreeBSD &ToolChain =
8133 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008134 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008135 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008136 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008137 !Args.hasArg(options::OPT_shared) &&
8138 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008139 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008140
8141 // Silence warning for "clang -g foo.o -o foo"
8142 Args.ClaimAllArgs(options::OPT_g_Group);
8143 // and "clang -emit-llvm foo.o -o foo"
8144 Args.ClaimAllArgs(options::OPT_emit_llvm);
8145 // and for "clang -w foo.o -o foo". Other warning options are already
8146 // handled somewhere else.
8147 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008148
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008149 if (!D.SysRoot.empty())
8150 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8151
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008152 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008153 CmdArgs.push_back("-pie");
8154
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008155 if (Args.hasArg(options::OPT_static)) {
8156 CmdArgs.push_back("-Bstatic");
8157 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008158 if (Args.hasArg(options::OPT_rdynamic))
8159 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008160 CmdArgs.push_back("--eh-frame-hdr");
8161 if (Args.hasArg(options::OPT_shared)) {
8162 CmdArgs.push_back("-Bshareable");
8163 } else {
8164 CmdArgs.push_back("-dynamic-linker");
8165 CmdArgs.push_back("/libexec/ld-elf.so.1");
8166 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008167 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008168 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8169 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8170 CmdArgs.push_back("--hash-style=both");
8171 }
8172 }
8173 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008174 }
8175
8176 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8177 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008178 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008179 CmdArgs.push_back("-m");
8180 CmdArgs.push_back("elf_i386_fbsd");
8181 }
8182
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008183 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008184 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008185 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008186 }
8187
Dimitry Andric904895f2015-12-27 06:47:09 +00008188 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8189 if (ToolChain.getArch() == llvm::Triple::mips ||
8190 ToolChain.getArch() == llvm::Triple::mipsel ||
8191 ToolChain.getArch() == llvm::Triple::mips64 ||
8192 ToolChain.getArch() == llvm::Triple::mips64el) {
8193 StringRef v = A->getValue();
8194 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8195 A->claim();
8196 }
8197 }
8198
Daniel Dunbarb440f562010-08-02 02:38:21 +00008199 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008200 CmdArgs.push_back("-o");
8201 CmdArgs.push_back(Output.getFilename());
8202 } else {
8203 assert(Output.isNothing() && "Invalid output.");
8204 }
8205
Douglas Katzman78b37b02015-11-17 20:28:07 +00008206 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008207 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008208 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008209 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008210 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008211 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008212 crt1 = "Scrt1.o";
8213 else
8214 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008215 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008216 if (crt1)
8217 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8218
8219 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8220
Craig Topper92fc2df2014-05-17 16:56:41 +00008221 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008222 if (Args.hasArg(options::OPT_static))
8223 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008224 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008225 crtbegin = "crtbeginS.o";
8226 else
8227 crtbegin = "crtbegin.o";
8228
8229 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008230 }
8231
8232 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008233 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008234 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8235 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008236 Args.AddAllArgs(CmdArgs, options::OPT_s);
8237 Args.AddAllArgs(CmdArgs, options::OPT_t);
8238 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8239 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008240
Teresa Johnson945bc502015-10-15 20:35:53 +00008241 if (D.isUsingLTO())
8242 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008243
Alexey Samsonov52550342014-09-15 19:58:40 +00008244 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008245 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008246
Douglas Katzman78b37b02015-11-17 20:28:07 +00008247 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008248 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008249 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008250 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008251 if (Args.hasArg(options::OPT_pg))
8252 CmdArgs.push_back("-lm_p");
8253 else
8254 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008255 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008256 if (NeedsSanitizerDeps)
8257 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008258 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8259 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008260 if (Args.hasArg(options::OPT_pg))
8261 CmdArgs.push_back("-lgcc_p");
8262 else
8263 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008264 if (Args.hasArg(options::OPT_static)) {
8265 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008266 } else if (Args.hasArg(options::OPT_pg)) {
8267 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008268 } else {
8269 CmdArgs.push_back("--as-needed");
8270 CmdArgs.push_back("-lgcc_s");
8271 CmdArgs.push_back("--no-as-needed");
8272 }
8273
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008274 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008275 if (Args.hasArg(options::OPT_pg))
8276 CmdArgs.push_back("-lpthread_p");
8277 else
8278 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008279 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008280
Roman Divacky66f22762011-02-10 16:59:40 +00008281 if (Args.hasArg(options::OPT_pg)) {
8282 if (Args.hasArg(options::OPT_shared))
8283 CmdArgs.push_back("-lc");
8284 else
8285 CmdArgs.push_back("-lc_p");
8286 CmdArgs.push_back("-lgcc_p");
8287 } else {
8288 CmdArgs.push_back("-lc");
8289 CmdArgs.push_back("-lgcc");
8290 }
8291
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008292 if (Args.hasArg(options::OPT_static)) {
8293 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008294 } else if (Args.hasArg(options::OPT_pg)) {
8295 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008296 } else {
8297 CmdArgs.push_back("--as-needed");
8298 CmdArgs.push_back("-lgcc_s");
8299 CmdArgs.push_back("--no-as-needed");
8300 }
8301 }
8302
Douglas Katzman78b37b02015-11-17 20:28:07 +00008303 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008304 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008305 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008306 else
8307 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008308 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008309 }
8310
Xinliang David Li69306c02015-10-22 06:15:31 +00008311 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008312
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008313 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008314 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008315}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008316
Douglas Katzman95354292015-06-23 20:42:09 +00008317void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008318 const InputInfo &Output,
8319 const InputInfoList &Inputs,
8320 const ArgList &Args,
8321 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008322 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008323 ArgStringList CmdArgs;
8324
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008325 // GNU as needs different flags for creating the correct output format
8326 // on architectures with different ABIs or optional feature sets.
8327 switch (getToolChain().getArch()) {
8328 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008329 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008330 break;
8331 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008332 case llvm::Triple::armeb:
8333 case llvm::Triple::thumb:
8334 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008335 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008336 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8337 std::string Arch =
8338 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008339 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008340 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008341 }
8342
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008343 case llvm::Triple::mips:
8344 case llvm::Triple::mipsel:
8345 case llvm::Triple::mips64:
8346 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008347 StringRef CPUName;
8348 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008349 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008350
8351 CmdArgs.push_back("-march");
8352 CmdArgs.push_back(CPUName.data());
8353
8354 CmdArgs.push_back("-mabi");
8355 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8356
8357 if (getToolChain().getArch() == llvm::Triple::mips ||
8358 getToolChain().getArch() == llvm::Triple::mips64)
8359 CmdArgs.push_back("-EB");
8360 else
8361 CmdArgs.push_back("-EL");
8362
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008363 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008364 break;
8365 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008366
8367 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008368 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008369 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008370 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8371 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008372 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008373 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008374 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008375
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008376 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008377 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008378 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8379 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008380 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008381 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008382 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008383
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008384 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008385 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008386 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008387
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008388 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008389
8390 CmdArgs.push_back("-o");
8391 CmdArgs.push_back(Output.getFilename());
8392
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008393 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008394 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008395
David Chisnallddbd68f2011-09-27 22:03:18 +00008396 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008397 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008398}
8399
Douglas Katzman95354292015-06-23 20:42:09 +00008400void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8401 const InputInfo &Output,
8402 const InputInfoList &Inputs,
8403 const ArgList &Args,
8404 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008405 const Driver &D = getToolChain().getDriver();
8406 ArgStringList CmdArgs;
8407
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008408 if (!D.SysRoot.empty())
8409 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8410
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008411 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008412 if (Args.hasArg(options::OPT_static)) {
8413 CmdArgs.push_back("-Bstatic");
8414 } else {
8415 if (Args.hasArg(options::OPT_rdynamic))
8416 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008417 if (Args.hasArg(options::OPT_shared)) {
8418 CmdArgs.push_back("-Bshareable");
8419 } else {
8420 CmdArgs.push_back("-dynamic-linker");
8421 CmdArgs.push_back("/libexec/ld.elf_so");
8422 }
8423 }
8424
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008425 // Many NetBSD architectures support more than one ABI.
8426 // Determine the correct emulation for ld.
8427 switch (getToolChain().getArch()) {
8428 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008429 CmdArgs.push_back("-m");
8430 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008431 break;
8432 case llvm::Triple::arm:
8433 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008434 CmdArgs.push_back("-m");
8435 switch (getToolChain().getTriple().getEnvironment()) {
8436 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008437 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008438 CmdArgs.push_back("armelf_nbsd_eabi");
8439 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008440 case llvm::Triple::EABIHF:
8441 case llvm::Triple::GNUEABIHF:
8442 CmdArgs.push_back("armelf_nbsd_eabihf");
8443 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008444 default:
8445 CmdArgs.push_back("armelf_nbsd");
8446 break;
8447 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008448 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008449 case llvm::Triple::armeb:
8450 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008451 arm::appendEBLinkFlags(
8452 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008453 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008454 CmdArgs.push_back("-m");
8455 switch (getToolChain().getTriple().getEnvironment()) {
8456 case llvm::Triple::EABI:
8457 case llvm::Triple::GNUEABI:
8458 CmdArgs.push_back("armelfb_nbsd_eabi");
8459 break;
8460 case llvm::Triple::EABIHF:
8461 case llvm::Triple::GNUEABIHF:
8462 CmdArgs.push_back("armelfb_nbsd_eabihf");
8463 break;
8464 default:
8465 CmdArgs.push_back("armelfb_nbsd");
8466 break;
8467 }
8468 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008469 case llvm::Triple::mips64:
8470 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008471 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008472 CmdArgs.push_back("-m");
8473 if (getToolChain().getArch() == llvm::Triple::mips64)
8474 CmdArgs.push_back("elf32btsmip");
8475 else
8476 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008477 } else if (mips::hasMipsAbiArg(Args, "64")) {
8478 CmdArgs.push_back("-m");
8479 if (getToolChain().getArch() == llvm::Triple::mips64)
8480 CmdArgs.push_back("elf64btsmip");
8481 else
8482 CmdArgs.push_back("elf64ltsmip");
8483 }
8484 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008485 case llvm::Triple::ppc:
8486 CmdArgs.push_back("-m");
8487 CmdArgs.push_back("elf32ppc_nbsd");
8488 break;
8489
8490 case llvm::Triple::ppc64:
8491 case llvm::Triple::ppc64le:
8492 CmdArgs.push_back("-m");
8493 CmdArgs.push_back("elf64ppc");
8494 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008495
8496 case llvm::Triple::sparc:
8497 CmdArgs.push_back("-m");
8498 CmdArgs.push_back("elf32_sparc");
8499 break;
8500
8501 case llvm::Triple::sparcv9:
8502 CmdArgs.push_back("-m");
8503 CmdArgs.push_back("elf64_sparc");
8504 break;
8505
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008506 default:
8507 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008508 }
8509
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008510 if (Output.isFilename()) {
8511 CmdArgs.push_back("-o");
8512 CmdArgs.push_back(Output.getFilename());
8513 } else {
8514 assert(Output.isNothing() && "Invalid output.");
8515 }
8516
Douglas Katzman78b37b02015-11-17 20:28:07 +00008517 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008518 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008519 CmdArgs.push_back(
8520 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8521 CmdArgs.push_back(
8522 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8523 CmdArgs.push_back(
8524 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008525 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008526 CmdArgs.push_back(
8527 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8528 CmdArgs.push_back(
8529 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008530 }
8531 }
8532
8533 Args.AddAllArgs(CmdArgs, options::OPT_L);
8534 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8535 Args.AddAllArgs(CmdArgs, options::OPT_e);
8536 Args.AddAllArgs(CmdArgs, options::OPT_s);
8537 Args.AddAllArgs(CmdArgs, options::OPT_t);
8538 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8539 Args.AddAllArgs(CmdArgs, options::OPT_r);
8540
8541 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8542
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008543 unsigned Major, Minor, Micro;
8544 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8545 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008546 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008547 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008548 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008549 case llvm::Triple::arm:
8550 case llvm::Triple::armeb:
8551 case llvm::Triple::thumb:
8552 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008553 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008554 case llvm::Triple::ppc64:
8555 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008556 case llvm::Triple::sparc:
8557 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008558 case llvm::Triple::x86:
8559 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008560 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008561 break;
8562 default:
8563 break;
8564 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008565 }
8566
Douglas Katzman78b37b02015-11-17 20:28:07 +00008567 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008568 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008569 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008570 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8571 CmdArgs.push_back("-lm");
8572 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008573 if (Args.hasArg(options::OPT_pthread))
8574 CmdArgs.push_back("-lpthread");
8575 CmdArgs.push_back("-lc");
8576
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008577 if (useLibgcc) {
8578 if (Args.hasArg(options::OPT_static)) {
8579 // libgcc_eh depends on libc, so resolve as much as possible,
8580 // pull in any new requirements from libc and then get the rest
8581 // of libgcc.
8582 CmdArgs.push_back("-lgcc_eh");
8583 CmdArgs.push_back("-lc");
8584 CmdArgs.push_back("-lgcc");
8585 } else {
8586 CmdArgs.push_back("-lgcc");
8587 CmdArgs.push_back("--as-needed");
8588 CmdArgs.push_back("-lgcc_s");
8589 CmdArgs.push_back("--no-as-needed");
8590 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008591 }
8592 }
8593
Douglas Katzman78b37b02015-11-17 20:28:07 +00008594 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008595 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008596 CmdArgs.push_back(
8597 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008598 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008599 CmdArgs.push_back(
8600 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8601 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008602 }
8603
Xinliang David Li69306c02015-10-22 06:15:31 +00008604 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008605
Logan Chieneb9162f2014-06-26 14:23:45 +00008606 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008607 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008608}
8609
Douglas Katzman95354292015-06-23 20:42:09 +00008610void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8611 const InputInfo &Output,
8612 const InputInfoList &Inputs,
8613 const ArgList &Args,
8614 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008615 claimNoWarnArgs(Args);
8616
James Y Knight2db38f32015-08-15 03:45:25 +00008617 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8618 llvm::Triple Triple = llvm::Triple(TripleStr);
8619
Rafael Espindola92b00932010-08-10 00:25:48 +00008620 ArgStringList CmdArgs;
8621
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008622 llvm::Reloc::Model RelocationModel;
8623 unsigned PICLevel;
8624 bool IsPIE;
8625 std::tie(RelocationModel, PICLevel, IsPIE) =
8626 ParsePICArgs(getToolChain(), Triple, Args);
8627
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008628 switch (getToolChain().getArch()) {
8629 default:
8630 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008631 // Add --32/--64 to make sure we get the format we want.
8632 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008633 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008634 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008635 break;
8636 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008637 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8638 CmdArgs.push_back("--x32");
8639 else
8640 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008641 break;
8642 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008643 CmdArgs.push_back("-a32");
8644 CmdArgs.push_back("-mppc");
8645 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008646 break;
8647 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008648 CmdArgs.push_back("-a64");
8649 CmdArgs.push_back("-mppc64");
8650 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008651 break;
8652 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008653 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008654 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008655 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008656 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008657 break;
8658 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008659 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008660 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008661 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8662 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8663 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008664 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008665 }
8666 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008667 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008668 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8669 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8670 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008671 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008672 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008673 case llvm::Triple::arm:
8674 case llvm::Triple::armeb:
8675 case llvm::Triple::thumb:
8676 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008677 const llvm::Triple &Triple2 = getToolChain().getTriple();
8678 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008679 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008680 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008681 break;
8682 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008683 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008684 break;
8685 default:
8686 break;
8687 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008688
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008689 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008690 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8691 case arm::FloatABI::Soft:
8692 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8693 break;
8694 case arm::FloatABI::SoftFP:
8695 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8696 break;
8697 case arm::FloatABI::Hard:
8698 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8699 break;
8700 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008701
8702 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008703
8704 // FIXME: remove krait check when GNU tools support krait cpu
8705 // for now replace it with -march=armv7-a to avoid a lower
8706 // march from being picked in the absence of a cpu flag.
8707 Arg *A;
8708 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008709 StringRef(A->getValue()).lower() == "krait")
8710 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008711 else
8712 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008713 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008714 break;
8715 }
8716 case llvm::Triple::mips:
8717 case llvm::Triple::mipsel:
8718 case llvm::Triple::mips64:
8719 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008720 StringRef CPUName;
8721 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008722 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008723 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008724
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008725 CmdArgs.push_back("-march");
8726 CmdArgs.push_back(CPUName.data());
8727
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008728 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008729 CmdArgs.push_back(ABIName.data());
8730
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008731 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8732 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008733 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008734 CmdArgs.push_back("-mno-shared");
8735
Daniel Sanders379d44b2014-07-16 11:52:23 +00008736 // LLVM doesn't support -mplt yet and acts as if it is always given.
8737 // However, -mplt has no effect with the N64 ABI.
8738 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008739
8740 if (getToolChain().getArch() == llvm::Triple::mips ||
8741 getToolChain().getArch() == llvm::Triple::mips64)
8742 CmdArgs.push_back("-EB");
8743 else
8744 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008745
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008746 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8747 if (StringRef(A->getValue()) == "2008")
8748 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8749 }
8750
Daniel Sanders379d44b2014-07-16 11:52:23 +00008751 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8752 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8753 options::OPT_mfp64)) {
8754 A->claim();
8755 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008756 } else if (mips::shouldUseFPXX(
8757 Args, getToolChain().getTriple(), CPUName, ABIName,
8758 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008759 CmdArgs.push_back("-mfpxx");
8760
8761 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8762 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008763 if (Arg *A =
8764 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008765 if (A->getOption().matches(options::OPT_mips16)) {
8766 A->claim();
8767 A->render(Args, CmdArgs);
8768 } else {
8769 A->claim();
8770 CmdArgs.push_back("-no-mips16");
8771 }
8772 }
8773
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008774 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8775 options::OPT_mno_micromips);
8776 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8777 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8778
Simon Atanasyanbd986632013-11-26 11:58:04 +00008779 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8780 // Do not use AddLastArg because not all versions of MIPS assembler
8781 // support -mmsa / -mno-msa options.
8782 if (A->getOption().matches(options::OPT_mmsa))
8783 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8784 }
8785
Daniel Sanders379d44b2014-07-16 11:52:23 +00008786 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8787 options::OPT_msoft_float);
8788
Toma Tabacub36d6102015-06-11 12:13:18 +00008789 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8790 options::OPT_msingle_float);
8791
Daniel Sanders379d44b2014-07-16 11:52:23 +00008792 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8793 options::OPT_mno_odd_spreg);
8794
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008795 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008796 break;
8797 }
8798 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008799 // Always pass an -march option, since our default of z10 is later
8800 // than the GNU assembler's default.
8801 StringRef CPUName = getSystemZTargetCPU(Args);
8802 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008803 break;
8804 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008805 }
8806
Renato Golina74bbc72015-07-22 15:32:36 +00008807 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008808 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008809
8810 CmdArgs.push_back("-o");
8811 CmdArgs.push_back(Output.getFilename());
8812
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008813 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008814 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008815
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008816 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008817 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008818
8819 // Handle the debug info splitting at object creation time if we're
8820 // creating an object.
8821 // TODO: Currently only works on linux with newer objcopy.
8822 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008823 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008824 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008825 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008826}
8827
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008828static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008829 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008830 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008831 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008832 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8833 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008834 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008835 CmdArgs.push_back("-lgcc");
8836
Logan Chien3d3373c2012-11-19 12:04:11 +00008837 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008838 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008839 CmdArgs.push_back("-lgcc");
8840 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008841 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008842 CmdArgs.push_back("--as-needed");
8843 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008844 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008845 CmdArgs.push_back("--no-as-needed");
8846 }
8847
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008848 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008849 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008850 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008851 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008852
8853 // According to Android ABI, we have to link with libdl if we are
8854 // linking with non-static libgcc.
8855 //
8856 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8857 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8858 if (isAndroid && !StaticLibgcc)
8859 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008860}
8861
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008862static std::string getLinuxDynamicLinker(const ArgList &Args,
8863 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008864 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8865
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008866 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008867 if (ToolChain.getTriple().isArch64Bit())
8868 return "/system/bin/linker64";
8869 else
8870 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008871 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8872 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008873 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008874 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008875 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008876 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008877 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008878 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008879 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008880 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008881 return "/lib/ld-linux-armhf.so.3";
8882 else
8883 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008884 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8885 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008886 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008887 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008888 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008889 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008890 return "/lib/ld-linux.so.3";
8891 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8892 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008893 std::string LibDir =
8894 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008895 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008896 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008897 if (mips::isUCLibc(Args))
8898 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008899 else if (!ToolChain.getTriple().hasEnvironment()) {
8900 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8901 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8902 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8903 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008904 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008905
8906 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008907 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008908 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008909 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008910 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8911 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008912 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008913 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008914 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8915 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008916 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008917 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008918 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008919 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008920 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008921 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008922 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8923 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008924 else
8925 return "/lib64/ld-linux-x86-64.so.2";
8926}
8927
Renato Golinc4b49242014-02-13 10:01:16 +00008928static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008929 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008930 // Make use of compiler-rt if --rtlib option is used
8931 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8932
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008933 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008934 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008935 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008936 default:
8937 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008938 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008939 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008940 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008941 break;
8942 }
Renato Golinc4b49242014-02-13 10:01:16 +00008943 break;
8944 case ToolChain::RLT_Libgcc:
8945 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8946 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008947 }
8948}
8949
Rafael Espindola1e085772014-08-15 17:14:35 +00008950static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8951 switch (T.getArch()) {
8952 case llvm::Triple::x86:
8953 return "elf_i386";
8954 case llvm::Triple::aarch64:
8955 return "aarch64linux";
8956 case llvm::Triple::aarch64_be:
8957 return "aarch64_be_linux";
8958 case llvm::Triple::arm:
8959 case llvm::Triple::thumb:
8960 return "armelf_linux_eabi";
8961 case llvm::Triple::armeb:
8962 case llvm::Triple::thumbeb:
8963 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8964 case llvm::Triple::ppc:
8965 return "elf32ppclinux";
8966 case llvm::Triple::ppc64:
8967 return "elf64ppc";
8968 case llvm::Triple::ppc64le:
8969 return "elf64lppc";
8970 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008971 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008972 return "elf32_sparc";
8973 case llvm::Triple::sparcv9:
8974 return "elf64_sparc";
8975 case llvm::Triple::mips:
8976 return "elf32btsmip";
8977 case llvm::Triple::mipsel:
8978 return "elf32ltsmip";
8979 case llvm::Triple::mips64:
8980 if (mips::hasMipsAbiArg(Args, "n32"))
8981 return "elf32btsmipn32";
8982 return "elf64btsmip";
8983 case llvm::Triple::mips64el:
8984 if (mips::hasMipsAbiArg(Args, "n32"))
8985 return "elf32ltsmipn32";
8986 return "elf64ltsmip";
8987 case llvm::Triple::systemz:
8988 return "elf64_s390";
8989 case llvm::Triple::x86_64:
8990 if (T.getEnvironment() == llvm::Triple::GNUX32)
8991 return "elf32_x86_64";
8992 return "elf_x86_64";
8993 default:
8994 llvm_unreachable("Unexpected arch");
8995 }
8996}
8997
Douglas Katzman95354292015-06-23 20:42:09 +00008998void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8999 const InputInfo &Output,
9000 const InputInfoList &Inputs,
9001 const ArgList &Args,
9002 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009003 const toolchains::Linux &ToolChain =
9004 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009005 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009006
9007 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9008 llvm::Triple Triple = llvm::Triple(TripleStr);
9009
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009010 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009011 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009012 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009013 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9014 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009015 const bool HasCRTBeginEndFiles =
9016 ToolChain.getTriple().hasEnvironment() ||
9017 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009018
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009019 ArgStringList CmdArgs;
9020
Rafael Espindolad1002f62010-11-15 18:28:16 +00009021 // Silence warning for "clang -g foo.o -o foo"
9022 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009023 // and "clang -emit-llvm foo.o -o foo"
9024 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009025 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009026 // handled somewhere else.
9027 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009028
Peter Collingbourne39719a72015-11-20 20:49:39 +00009029 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9030 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009031 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009032 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009033 CmdArgs.push_back("-target");
9034 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9035 }
9036
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009037 if (!D.SysRoot.empty())
9038 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009039
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009040 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009041 CmdArgs.push_back("-pie");
9042
Rafael Espindola1c76c592010-11-07 22:57:16 +00009043 if (Args.hasArg(options::OPT_rdynamic))
9044 CmdArgs.push_back("-export-dynamic");
9045
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009046 if (Args.hasArg(options::OPT_s))
9047 CmdArgs.push_back("-s");
9048
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009049 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009050 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009051
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009052 for (const auto &Opt : ToolChain.ExtraOpts)
9053 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009054
9055 if (!Args.hasArg(options::OPT_static)) {
9056 CmdArgs.push_back("--eh-frame-hdr");
9057 }
9058
9059 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009060 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009061
9062 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009063 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9064 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009065 CmdArgs.push_back("-Bstatic");
9066 else
9067 CmdArgs.push_back("-static");
9068 } else if (Args.hasArg(options::OPT_shared)) {
9069 CmdArgs.push_back("-shared");
9070 }
9071
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009072 if (!Args.hasArg(options::OPT_static)) {
9073 if (Args.hasArg(options::OPT_rdynamic))
9074 CmdArgs.push_back("-export-dynamic");
9075
9076 if (!Args.hasArg(options::OPT_shared)) {
9077 const std::string Loader =
9078 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9079 CmdArgs.push_back("-dynamic-linker");
9080 CmdArgs.push_back(Args.MakeArgString(Loader));
9081 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009082 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009083
9084 CmdArgs.push_back("-o");
9085 CmdArgs.push_back(Output.getFilename());
9086
Douglas Katzman78b37b02015-11-17 20:28:07 +00009087 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009088 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009089 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009090 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009091 if (Args.hasArg(options::OPT_pg))
9092 crt1 = "gcrt1.o";
9093 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009094 crt1 = "Scrt1.o";
9095 else
9096 crt1 = "crt1.o";
9097 }
9098 if (crt1)
9099 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009100
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009101 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9102 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009103
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009104 const char *crtbegin;
9105 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009106 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009107 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009108 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009109 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009110 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009111 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009112 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009113
9114 if (HasCRTBeginEndFiles)
9115 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009116
9117 // Add crtfastmath.o if available and fast math is enabled.
9118 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009119 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009120
9121 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009122 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009123
Douglas Katzman6059ef92015-11-17 17:41:23 +00009124 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009125
Teresa Johnson945bc502015-10-15 20:35:53 +00009126 if (D.isUsingLTO())
9127 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009128
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009129 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9130 CmdArgs.push_back("--no-demangle");
9131
Alexey Samsonov52550342014-09-15 19:58:40 +00009132 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009133 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009134 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009135 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009136
Douglas Katzman78b37b02015-11-17 20:28:07 +00009137 if (D.CCCIsCXX() &&
9138 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009139 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009140 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009141 if (OnlyLibstdcxxStatic)
9142 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009143 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009144 if (OnlyLibstdcxxStatic)
9145 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009146 CmdArgs.push_back("-lm");
9147 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009148 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9149 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009150
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009151 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009152 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9153 if (Args.hasArg(options::OPT_static))
9154 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009155
Alexey Samsonov52550342014-09-15 19:58:40 +00009156 if (NeedsSanitizerDeps)
9157 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9158
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009159 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9160 Args.hasArg(options::OPT_pthreads);
9161
9162 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9163 options::OPT_fno_openmp, false)) {
9164 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9165 // FIXME: Does this really make sense for all GNU toolchains?
9166 WantPthread = true;
9167
9168 // Also link the particular OpenMP runtimes.
9169 switch (getOpenMPRuntime(ToolChain, Args)) {
9170 case OMPRT_OMP:
9171 CmdArgs.push_back("-lomp");
9172 break;
9173 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009174 CmdArgs.push_back("-lgomp");
9175
9176 // FIXME: Exclude this for platforms with libgomp that don't require
9177 // librt. Most modern Linux platforms require it, but some may not.
9178 CmdArgs.push_back("-lrt");
9179 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009180 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009181 CmdArgs.push_back("-liomp5");
9182 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009183 case OMPRT_Unknown:
9184 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009185 break;
9186 }
Chandler Carruth01538002013-01-17 13:19:29 +00009187 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009188
Renato Golinc4b49242014-02-13 10:01:16 +00009189 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009190
Richard Smith31d1de22015-05-20 22:48:44 +00009191 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009192 CmdArgs.push_back("-lpthread");
9193
Rafael Espindolab17bc532016-01-25 18:29:16 +00009194 if (Args.hasArg(options::OPT_fsplit_stack))
9195 CmdArgs.push_back("--wrap=pthread_create");
9196
Chandler Carruth94a32012012-05-14 18:31:18 +00009197 CmdArgs.push_back("-lc");
9198
9199 if (Args.hasArg(options::OPT_static))
9200 CmdArgs.push_back("--end-group");
9201 else
Renato Golinc4b49242014-02-13 10:01:16 +00009202 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009203 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009204
Rafael Espindola81937ec2010-12-01 01:52:43 +00009205 if (!Args.hasArg(options::OPT_nostartfiles)) {
9206 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009207 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009208 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009209 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009210 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009211 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009212 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009213
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009214 if (HasCRTBeginEndFiles)
9215 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009216 if (!isAndroid)
9217 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009218 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009219 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009220
Peter Collingbourne39719a72015-11-20 20:49:39 +00009221 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009222}
9223
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009224// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9225// for the various SFI requirements like register masking. The assembly tool
9226// inserts the file containing the macros as an input into all the assembly
9227// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009228void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9229 const InputInfo &Output,
9230 const InputInfoList &Inputs,
9231 const ArgList &Args,
9232 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009233 const toolchains::NaClToolChain &ToolChain =
9234 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009235 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009236 "nacl-arm-macros.s");
9237 InputInfoList NewInputs;
9238 NewInputs.push_back(NaClMacros);
9239 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009240 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9241 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009242}
9243
Douglas Katzman750cfc52015-06-29 18:42:16 +00009244// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009245// we use static by default, do not yet support sanitizers or LTO, and a few
9246// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009247// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009248void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9249 const InputInfo &Output,
9250 const InputInfoList &Inputs,
9251 const ArgList &Args,
9252 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009253
Douglas Katzman54366072015-07-27 16:53:08 +00009254 const toolchains::NaClToolChain &ToolChain =
9255 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009256 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009257 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009258 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009259 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009260
9261 ArgStringList CmdArgs;
9262
9263 // Silence warning for "clang -g foo.o -o foo"
9264 Args.ClaimAllArgs(options::OPT_g_Group);
9265 // and "clang -emit-llvm foo.o -o foo"
9266 Args.ClaimAllArgs(options::OPT_emit_llvm);
9267 // and for "clang -w foo.o -o foo". Other warning options are already
9268 // handled somewhere else.
9269 Args.ClaimAllArgs(options::OPT_w);
9270
9271 if (!D.SysRoot.empty())
9272 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9273
9274 if (Args.hasArg(options::OPT_rdynamic))
9275 CmdArgs.push_back("-export-dynamic");
9276
9277 if (Args.hasArg(options::OPT_s))
9278 CmdArgs.push_back("-s");
9279
Douglas Katzman54366072015-07-27 16:53:08 +00009280 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9281 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009282 CmdArgs.push_back("--build-id");
9283
9284 if (!IsStatic)
9285 CmdArgs.push_back("--eh-frame-hdr");
9286
9287 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009288 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009289 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009290 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009291 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009292 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009293 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009294 else if (Arch == llvm::Triple::mipsel)
9295 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009296 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009297 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9298 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009299
9300 if (IsStatic)
9301 CmdArgs.push_back("-static");
9302 else if (Args.hasArg(options::OPT_shared))
9303 CmdArgs.push_back("-shared");
9304
9305 CmdArgs.push_back("-o");
9306 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009307 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009308 if (!Args.hasArg(options::OPT_shared))
9309 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9310 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9311
9312 const char *crtbegin;
9313 if (IsStatic)
9314 crtbegin = "crtbeginT.o";
9315 else if (Args.hasArg(options::OPT_shared))
9316 crtbegin = "crtbeginS.o";
9317 else
9318 crtbegin = "crtbegin.o";
9319 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9320 }
9321
9322 Args.AddAllArgs(CmdArgs, options::OPT_L);
9323 Args.AddAllArgs(CmdArgs, options::OPT_u);
9324
Douglas Katzman6059ef92015-11-17 17:41:23 +00009325 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009326
9327 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9328 CmdArgs.push_back("--no-demangle");
9329
9330 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9331
Douglas Katzman78b37b02015-11-17 20:28:07 +00009332 if (D.CCCIsCXX() &&
9333 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009334 bool OnlyLibstdcxxStatic =
9335 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009336 if (OnlyLibstdcxxStatic)
9337 CmdArgs.push_back("-Bstatic");
9338 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9339 if (OnlyLibstdcxxStatic)
9340 CmdArgs.push_back("-Bdynamic");
9341 CmdArgs.push_back("-lm");
9342 }
9343
9344 if (!Args.hasArg(options::OPT_nostdlib)) {
9345 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9346 // Always use groups, since it has no effect on dynamic libraries.
9347 CmdArgs.push_back("--start-group");
9348 CmdArgs.push_back("-lc");
9349 // NaCl's libc++ currently requires libpthread, so just always include it
9350 // in the group for C++.
9351 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009352 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009353 // Gold, used by Mips, handles nested groups differently than ld, and
9354 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9355 // which is not a desired behaviour here.
9356 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9357 if (getToolChain().getArch() == llvm::Triple::mipsel)
9358 CmdArgs.push_back("-lnacl");
9359
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009360 CmdArgs.push_back("-lpthread");
9361 }
9362
9363 CmdArgs.push_back("-lgcc");
9364 CmdArgs.push_back("--as-needed");
9365 if (IsStatic)
9366 CmdArgs.push_back("-lgcc_eh");
9367 else
9368 CmdArgs.push_back("-lgcc_s");
9369 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009370
9371 // Mips needs to create and use pnacl_legacy library that contains
9372 // definitions from bitcode/pnaclmm.c and definitions for
9373 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9374 if (getToolChain().getArch() == llvm::Triple::mipsel)
9375 CmdArgs.push_back("-lpnacl_legacy");
9376
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009377 CmdArgs.push_back("--end-group");
9378 }
9379
9380 if (!Args.hasArg(options::OPT_nostartfiles)) {
9381 const char *crtend;
9382 if (Args.hasArg(options::OPT_shared))
9383 crtend = "crtendS.o";
9384 else
9385 crtend = "crtend.o";
9386
9387 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9388 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9389 }
9390 }
9391
Peter Collingbourne39719a72015-11-20 20:49:39 +00009392 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9393 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009394}
9395
Douglas Katzman95354292015-06-23 20:42:09 +00009396void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9397 const InputInfo &Output,
9398 const InputInfoList &Inputs,
9399 const ArgList &Args,
9400 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009401 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009402 ArgStringList CmdArgs;
9403
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009404 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009405
9406 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009407 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009408
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009409 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009410 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009411
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009412 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009413 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009414}
9415
Douglas Katzman95354292015-06-23 20:42:09 +00009416void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9417 const InputInfo &Output,
9418 const InputInfoList &Inputs,
9419 const ArgList &Args,
9420 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009421 const Driver &D = getToolChain().getDriver();
9422 ArgStringList CmdArgs;
9423
Daniel Dunbarb440f562010-08-02 02:38:21 +00009424 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009425 CmdArgs.push_back("-o");
9426 CmdArgs.push_back(Output.getFilename());
9427 } else {
9428 assert(Output.isNothing() && "Invalid output.");
9429 }
9430
Douglas Katzman78b37b02015-11-17 20:28:07 +00009431 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009432 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9433 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9434 CmdArgs.push_back(
9435 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9436 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009437 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009438
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009439 Args.AddAllArgs(CmdArgs,
9440 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009441
Daniel Dunbar54423b22010-09-17 00:24:54 +00009442 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009443
Xinliang David Li69306c02015-10-22 06:15:31 +00009444 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009445
Douglas Katzman78b37b02015-11-17 20:28:07 +00009446 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009447 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009448 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009449 CmdArgs.push_back("-lm");
9450 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009451 }
9452
Douglas Katzman78b37b02015-11-17 20:28:07 +00009453 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009454 if (Args.hasArg(options::OPT_pthread))
9455 CmdArgs.push_back("-lpthread");
9456 CmdArgs.push_back("-lc");
9457 CmdArgs.push_back("-lCompilerRT-Generic");
9458 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9459 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009460 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009461 }
9462
Logan Chieneb9162f2014-06-26 14:23:45 +00009463 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009464 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009465}
9466
Daniel Dunbarcc912342009-05-02 18:28:39 +00009467/// DragonFly Tools
9468
9469// For now, DragonFly Assemble does just about the same as for
9470// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009471void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9472 const InputInfo &Output,
9473 const InputInfoList &Inputs,
9474 const ArgList &Args,
9475 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009476 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009477 ArgStringList CmdArgs;
9478
9479 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9480 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009481 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009482 CmdArgs.push_back("--32");
9483
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009484 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009485
9486 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009487 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009488
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009489 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009490 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009491
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009492 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009493 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009494}
9495
Douglas Katzman95354292015-06-23 20:42:09 +00009496void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9497 const InputInfo &Output,
9498 const InputInfoList &Inputs,
9499 const ArgList &Args,
9500 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009501 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009502 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009503
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009504 if (!D.SysRoot.empty())
9505 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9506
John McCall65b8da02013-04-11 22:55:55 +00009507 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009508 if (Args.hasArg(options::OPT_static)) {
9509 CmdArgs.push_back("-Bstatic");
9510 } else {
John McCall65b8da02013-04-11 22:55:55 +00009511 if (Args.hasArg(options::OPT_rdynamic))
9512 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009513 if (Args.hasArg(options::OPT_shared))
9514 CmdArgs.push_back("-Bshareable");
9515 else {
9516 CmdArgs.push_back("-dynamic-linker");
9517 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9518 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009519 CmdArgs.push_back("--hash-style=gnu");
9520 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009521 }
9522
9523 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9524 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009525 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009526 CmdArgs.push_back("-m");
9527 CmdArgs.push_back("elf_i386");
9528 }
9529
Daniel Dunbarb440f562010-08-02 02:38:21 +00009530 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009531 CmdArgs.push_back("-o");
9532 CmdArgs.push_back(Output.getFilename());
9533 } else {
9534 assert(Output.isNothing() && "Invalid output.");
9535 }
9536
Douglas Katzman78b37b02015-11-17 20:28:07 +00009537 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009538 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009539 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009540 CmdArgs.push_back(
9541 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009542 else {
9543 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009544 CmdArgs.push_back(
9545 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009546 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009547 CmdArgs.push_back(
9548 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009549 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009550 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009551 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009552 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009553 CmdArgs.push_back(
9554 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009555 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009556 CmdArgs.push_back(
9557 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009558 }
9559
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009560 Args.AddAllArgs(CmdArgs,
9561 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009562
Daniel Dunbar54423b22010-09-17 00:24:54 +00009563 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009564
Douglas Katzman78b37b02015-11-17 20:28:07 +00009565 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009566 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009567
9568 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009569 CmdArgs.push_back("-rpath");
9570 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009571 }
9572
Hans Wennborg70850d82013-07-18 20:29:38 +00009573 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009574 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009575 CmdArgs.push_back("-lm");
9576 }
9577
Daniel Dunbarcc912342009-05-02 18:28:39 +00009578 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009579 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009580
9581 if (!Args.hasArg(options::OPT_nolibc)) {
9582 CmdArgs.push_back("-lc");
9583 }
9584
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009585 if (Args.hasArg(options::OPT_static) ||
9586 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009587 CmdArgs.push_back("-lgcc");
9588 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009589 } else {
9590 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009591 CmdArgs.push_back("-lgcc_pic");
9592 if (!Args.hasArg(options::OPT_shared))
9593 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009594 } else {
John McCall65b8da02013-04-11 22:55:55 +00009595 CmdArgs.push_back("-lgcc");
9596 CmdArgs.push_back("--as-needed");
9597 CmdArgs.push_back("-lgcc_pic");
9598 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009599 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009600 }
9601 }
9602
Douglas Katzman78b37b02015-11-17 20:28:07 +00009603 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009604 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009605 CmdArgs.push_back(
9606 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009607 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009608 CmdArgs.push_back(
9609 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9610 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009611 }
9612
Xinliang David Li69306c02015-10-22 06:15:31 +00009613 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009614
Logan Chieneb9162f2014-06-26 14:23:45 +00009615 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009616 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009617}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009618
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009619// Try to find Exe from a Visual Studio distribution. This first tries to find
9620// an installed copy of Visual Studio and, failing that, looks in the PATH,
9621// making sure that whatever executable that's found is not a same-named exe
9622// from clang itself to prevent clang from falling back to itself.
9623static std::string FindVisualStudioExecutable(const ToolChain &TC,
9624 const char *Exe,
9625 const char *ClangProgramPath) {
9626 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9627 std::string visualStudioBinDir;
9628 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9629 visualStudioBinDir)) {
9630 SmallString<128> FilePath(visualStudioBinDir);
9631 llvm::sys::path::append(FilePath, Exe);
9632 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9633 return FilePath.str();
9634 }
9635
9636 return Exe;
9637}
9638
Douglas Katzman95354292015-06-23 20:42:09 +00009639void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9640 const InputInfo &Output,
9641 const InputInfoList &Inputs,
9642 const ArgList &Args,
9643 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009644 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009645 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009646
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009647 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9648 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009649 CmdArgs.push_back(
9650 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009651
Douglas Katzman78b37b02015-11-17 20:28:07 +00009652 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9653 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009654 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009655
Zachary Turner10d75b22014-10-22 20:40:43 +00009656 if (!llvm::sys::Process::GetEnv("LIB")) {
9657 // If the VC environment hasn't been configured (perhaps because the user
9658 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009659 // the environment variable is set however, assume the user knows what
9660 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009661 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009662 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009663 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9664 SmallString<128> LibDir(VisualStudioDir);
9665 llvm::sys::path::append(LibDir, "VC", "lib");
9666 switch (MSVC.getArch()) {
9667 case llvm::Triple::x86:
9668 // x86 just puts the libraries directly in lib
9669 break;
9670 case llvm::Triple::x86_64:
9671 llvm::sys::path::append(LibDir, "amd64");
9672 break;
9673 case llvm::Triple::arm:
9674 llvm::sys::path::append(LibDir, "arm");
9675 break;
9676 default:
9677 break;
9678 }
9679 CmdArgs.push_back(
9680 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009681
9682 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9683 std::string UniversalCRTLibPath;
9684 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9685 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9686 UniversalCRTLibPath.c_str()));
9687 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009688 }
9689
9690 std::string WindowsSdkLibPath;
9691 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9692 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9693 WindowsSdkLibPath.c_str()));
9694 }
9695
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009696 CmdArgs.push_back("-nologo");
9697
Reid Kleckner124955a2015-08-05 18:51:13 +00009698 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009699 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009700
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009701 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009702 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009703 if (DLL) {
9704 CmdArgs.push_back(Args.MakeArgString("-dll"));
9705
9706 SmallString<128> ImplibName(Output.getFilename());
9707 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009708 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009709 }
9710
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009711 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009712 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009713 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009714 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009715 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9716 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009717 // Make sure the dynamic runtime thunk is not optimized out at link time
9718 // to ensure proper SEH handling.
9719 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009720 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009721 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009722 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009723 for (const auto &Lib : {"asan", "asan_cxx"})
9724 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009725 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009726 }
9727
Hans Wennborg2e274592013-08-13 23:38:57 +00009728 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009729
Alexey Bataevc7e84352015-08-19 04:49:01 +00009730 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9731 options::OPT_fno_openmp, false)) {
9732 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9733 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9734 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9735 TC.getDriver().Dir + "/../lib"));
9736 switch (getOpenMPRuntime(getToolChain(), Args)) {
9737 case OMPRT_OMP:
9738 CmdArgs.push_back("-defaultlib:libomp.lib");
9739 break;
9740 case OMPRT_IOMP5:
9741 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9742 break;
9743 case OMPRT_GOMP:
9744 break;
9745 case OMPRT_Unknown:
9746 // Already diagnosed.
9747 break;
9748 }
9749 }
9750
Reid Kleckner337188f2014-09-16 19:22:00 +00009751 // Add filenames, libraries, and other linker inputs.
9752 for (const auto &Input : Inputs) {
9753 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009754 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009755 continue;
9756 }
9757
9758 const Arg &A = Input.getInputArg();
9759
9760 // Render -l options differently for the MSVC linker.
9761 if (A.getOption().matches(options::OPT_l)) {
9762 StringRef Lib = A.getValue();
9763 const char *LinkLibArg;
9764 if (Lib.endswith(".lib"))
9765 LinkLibArg = Args.MakeArgString(Lib);
9766 else
9767 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9768 CmdArgs.push_back(LinkLibArg);
9769 continue;
9770 }
9771
9772 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9773 // or -L. Render it, even if MSVC doesn't understand it.
9774 A.renderAsInput(Args, CmdArgs);
9775 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009776
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009777 TC.addProfileRTLibs(Args, CmdArgs);
9778
Zachary Turner719f58c2014-12-01 23:06:47 +00009779 // We need to special case some linker paths. In the case of lld, we need to
9780 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9781 // linker, we need to use a special search algorithm.
9782 llvm::SmallString<128> linkPath;
9783 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9784 if (Linker.equals_lower("lld"))
9785 Linker = "lld-link";
9786
9787 if (Linker.equals_lower("link")) {
9788 // If we're using the MSVC linker, it's not sufficient to just use link
9789 // from the program PATH, because other environments like GnuWin32 install
9790 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009791 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009792 C.getDriver().getClangProgramPath());
9793 } else {
9794 linkPath = Linker;
9795 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009796 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009797 }
9798
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009799 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009800 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009801}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009802
Douglas Katzman95354292015-06-23 20:42:09 +00009803void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9804 const InputInfo &Output,
9805 const InputInfoList &Inputs,
9806 const ArgList &Args,
9807 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009808 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9809}
9810
Douglas Katzman95354292015-06-23 20:42:09 +00009811std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009812 Compilation &C, const JobAction &JA, const InputInfo &Output,
9813 const InputInfoList &Inputs, const ArgList &Args,
9814 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009815 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009816 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009817 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009818 CmdArgs.push_back("/W0"); // No warnings.
9819
9820 // The goal is to be able to invoke this tool correctly based on
9821 // any flag accepted by clang-cl.
9822
9823 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009824 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009825
9826 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009827 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9828 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9829 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009830 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9831 if (A->getOption().getID() == options::OPT_O0) {
9832 CmdArgs.push_back("/Od");
9833 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009834 CmdArgs.push_back("/Og");
9835
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009836 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009837 if (OptLevel == "s" || OptLevel == "z")
9838 CmdArgs.push_back("/Os");
9839 else
9840 CmdArgs.push_back("/Ot");
9841
9842 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009843 }
9844 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009845 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9846 options::OPT_fno_omit_frame_pointer))
9847 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9848 ? "/Oy"
9849 : "/Oy-");
9850 if (!Args.hasArg(options::OPT_fwritable_strings))
9851 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009852
Nico Weber3f8dafb2015-03-12 19:37:10 +00009853 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009854 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9855
David Majnemerf6072342014-07-01 22:24:56 +00009856 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9857 /*default=*/false))
9858 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009859 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9860 options::OPT_fno_function_sections))
9861 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9862 ? "/Gy"
9863 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009864 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9865 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009866 CmdArgs.push_back(
9867 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009868 if (Args.hasArg(options::OPT_fsyntax_only))
9869 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009870 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9871 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009872 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009873
Nico Weber3f8dafb2015-03-12 19:37:10 +00009874 std::vector<std::string> Includes =
9875 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009876 for (const auto &Include : Includes)
9877 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009878
Hans Wennborg87cfa712013-09-19 20:32:16 +00009879 // Flags that can simply be passed through.
9880 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9881 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009882 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9883 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009884 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009885 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009886
9887 // The order of these flags is relevant, so pick the last one.
9888 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9889 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9890 A->render(Args, CmdArgs);
9891
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009892 // Pass through all unknown arguments so that the fallback command can see
9893 // them too.
9894 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9895
Hans Wennborg87cfa712013-09-19 20:32:16 +00009896 // Input filename.
9897 assert(Inputs.size() == 1);
9898 const InputInfo &II = Inputs[0];
9899 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9900 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9901 if (II.isFilename())
9902 CmdArgs.push_back(II.getFilename());
9903 else
9904 II.getInputArg().renderAsInput(Args, CmdArgs);
9905
9906 // Output filename.
9907 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009908 const char *Fo =
9909 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009910 CmdArgs.push_back(Fo);
9911
Hans Wennborg188382e2013-09-20 18:16:35 +00009912 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009913 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9914 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009915 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009916 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009917}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009918
Yaron Keren1c0070c2015-07-02 04:45:27 +00009919/// MinGW Tools
9920void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9921 const InputInfo &Output,
9922 const InputInfoList &Inputs,
9923 const ArgList &Args,
9924 const char *LinkingOutput) const {
9925 claimNoWarnArgs(Args);
9926 ArgStringList CmdArgs;
9927
9928 if (getToolChain().getArch() == llvm::Triple::x86) {
9929 CmdArgs.push_back("--32");
9930 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9931 CmdArgs.push_back("--64");
9932 }
9933
9934 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9935
9936 CmdArgs.push_back("-o");
9937 CmdArgs.push_back(Output.getFilename());
9938
9939 for (const auto &II : Inputs)
9940 CmdArgs.push_back(II.getFilename());
9941
9942 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009943 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009944
9945 if (Args.hasArg(options::OPT_gsplit_dwarf))
9946 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9947 SplitDebugName(Args, Inputs[0]));
9948}
9949
9950void MinGW::Linker::AddLibGCC(const ArgList &Args,
9951 ArgStringList &CmdArgs) const {
9952 if (Args.hasArg(options::OPT_mthreads))
9953 CmdArgs.push_back("-lmingwthrd");
9954 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009955
Yaron Kerenaa281332015-08-09 00:24:07 +00009956 // Make use of compiler-rt if --rtlib option is used
9957 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9958 if (RLT == ToolChain::RLT_Libgcc) {
9959 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9960 Args.hasArg(options::OPT_static);
9961 bool Shared = Args.hasArg(options::OPT_shared);
9962 bool CXX = getToolChain().getDriver().CCCIsCXX();
9963
9964 if (Static || (!CXX && !Shared)) {
9965 CmdArgs.push_back("-lgcc");
9966 CmdArgs.push_back("-lgcc_eh");
9967 } else {
9968 CmdArgs.push_back("-lgcc_s");
9969 CmdArgs.push_back("-lgcc");
9970 }
9971 } else {
9972 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9973 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009974
Yaron Keren1c0070c2015-07-02 04:45:27 +00009975 CmdArgs.push_back("-lmoldname");
9976 CmdArgs.push_back("-lmingwex");
9977 CmdArgs.push_back("-lmsvcrt");
9978}
9979
9980void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9981 const InputInfo &Output,
9982 const InputInfoList &Inputs,
9983 const ArgList &Args,
9984 const char *LinkingOutput) const {
9985 const ToolChain &TC = getToolChain();
9986 const Driver &D = TC.getDriver();
9987 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9988
9989 ArgStringList CmdArgs;
9990
9991 // Silence warning for "clang -g foo.o -o foo"
9992 Args.ClaimAllArgs(options::OPT_g_Group);
9993 // and "clang -emit-llvm foo.o -o foo"
9994 Args.ClaimAllArgs(options::OPT_emit_llvm);
9995 // and for "clang -w foo.o -o foo". Other warning options are already
9996 // handled somewhere else.
9997 Args.ClaimAllArgs(options::OPT_w);
9998
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009999 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10000 if (LinkerName.equals_lower("lld")) {
10001 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010002 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010003 } else if (!LinkerName.equals_lower("ld")) {
10004 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010005 }
10006
Yaron Keren1c0070c2015-07-02 04:45:27 +000010007 if (!D.SysRoot.empty())
10008 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10009
10010 if (Args.hasArg(options::OPT_s))
10011 CmdArgs.push_back("-s");
10012
10013 CmdArgs.push_back("-m");
10014 if (TC.getArch() == llvm::Triple::x86)
10015 CmdArgs.push_back("i386pe");
10016 if (TC.getArch() == llvm::Triple::x86_64)
10017 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010018 if (TC.getArch() == llvm::Triple::arm)
10019 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010020
10021 if (Args.hasArg(options::OPT_mwindows)) {
10022 CmdArgs.push_back("--subsystem");
10023 CmdArgs.push_back("windows");
10024 } else if (Args.hasArg(options::OPT_mconsole)) {
10025 CmdArgs.push_back("--subsystem");
10026 CmdArgs.push_back("console");
10027 }
10028
10029 if (Args.hasArg(options::OPT_static))
10030 CmdArgs.push_back("-Bstatic");
10031 else {
10032 if (Args.hasArg(options::OPT_mdll))
10033 CmdArgs.push_back("--dll");
10034 else if (Args.hasArg(options::OPT_shared))
10035 CmdArgs.push_back("--shared");
10036 CmdArgs.push_back("-Bdynamic");
10037 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10038 CmdArgs.push_back("-e");
10039 if (TC.getArch() == llvm::Triple::x86)
10040 CmdArgs.push_back("_DllMainCRTStartup@12");
10041 else
10042 CmdArgs.push_back("DllMainCRTStartup");
10043 CmdArgs.push_back("--enable-auto-image-base");
10044 }
10045 }
10046
10047 CmdArgs.push_back("-o");
10048 CmdArgs.push_back(Output.getFilename());
10049
10050 Args.AddAllArgs(CmdArgs, options::OPT_e);
10051 // FIXME: add -N, -n flags
10052 Args.AddLastArg(CmdArgs, options::OPT_r);
10053 Args.AddLastArg(CmdArgs, options::OPT_s);
10054 Args.AddLastArg(CmdArgs, options::OPT_t);
10055 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10056 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10057
Douglas Katzman78b37b02015-11-17 20:28:07 +000010058 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010059 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10060 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10061 } else {
10062 if (Args.hasArg(options::OPT_municode))
10063 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10064 else
10065 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10066 }
10067 if (Args.hasArg(options::OPT_pg))
10068 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10069 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10070 }
10071
10072 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010073 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010074 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10075
10076 // TODO: Add ASan stuff here
10077
10078 // TODO: Add profile stuff here
10079
Douglas Katzman78b37b02015-11-17 20:28:07 +000010080 if (D.CCCIsCXX() &&
10081 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010082 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10083 !Args.hasArg(options::OPT_static);
10084 if (OnlyLibstdcxxStatic)
10085 CmdArgs.push_back("-Bstatic");
10086 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10087 if (OnlyLibstdcxxStatic)
10088 CmdArgs.push_back("-Bdynamic");
10089 }
10090
10091 if (!Args.hasArg(options::OPT_nostdlib)) {
10092 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10093 if (Args.hasArg(options::OPT_static))
10094 CmdArgs.push_back("--start-group");
10095
10096 if (Args.hasArg(options::OPT_fstack_protector) ||
10097 Args.hasArg(options::OPT_fstack_protector_strong) ||
10098 Args.hasArg(options::OPT_fstack_protector_all)) {
10099 CmdArgs.push_back("-lssp_nonshared");
10100 CmdArgs.push_back("-lssp");
10101 }
10102 if (Args.hasArg(options::OPT_fopenmp))
10103 CmdArgs.push_back("-lgomp");
10104
10105 AddLibGCC(Args, CmdArgs);
10106
10107 if (Args.hasArg(options::OPT_pg))
10108 CmdArgs.push_back("-lgmon");
10109
Yaron Kerenadce68e2015-07-06 18:52:19 +000010110 if (Args.hasArg(options::OPT_pthread))
10111 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010112
10113 // add system libraries
10114 if (Args.hasArg(options::OPT_mwindows)) {
10115 CmdArgs.push_back("-lgdi32");
10116 CmdArgs.push_back("-lcomdlg32");
10117 }
10118 CmdArgs.push_back("-ladvapi32");
10119 CmdArgs.push_back("-lshell32");
10120 CmdArgs.push_back("-luser32");
10121 CmdArgs.push_back("-lkernel32");
10122
10123 if (Args.hasArg(options::OPT_static))
10124 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010125 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010126 AddLibGCC(Args, CmdArgs);
10127 }
10128
10129 if (!Args.hasArg(options::OPT_nostartfiles)) {
10130 // Add crtfastmath.o if available and fast math is enabled.
10131 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10132
10133 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10134 }
10135 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010136 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010137 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010138}
10139
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010140/// XCore Tools
10141// We pass assemble and link construction to the xcc tool.
10142
Douglas Katzman95354292015-06-23 20:42:09 +000010143void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10144 const InputInfo &Output,
10145 const InputInfoList &Inputs,
10146 const ArgList &Args,
10147 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010148 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010149 ArgStringList CmdArgs;
10150
10151 CmdArgs.push_back("-o");
10152 CmdArgs.push_back(Output.getFilename());
10153
10154 CmdArgs.push_back("-c");
10155
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010156 if (Args.hasArg(options::OPT_v))
10157 CmdArgs.push_back("-v");
10158
Robert Lytton894d25c2014-05-02 09:33:25 +000010159 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10160 if (!A->getOption().matches(options::OPT_g0))
10161 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010162
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010163 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10164 false))
10165 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010166
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010167 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010168
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010169 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010170 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010171
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010172 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010173 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010174}
10175
Douglas Katzman95354292015-06-23 20:42:09 +000010176void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10177 const InputInfo &Output,
10178 const InputInfoList &Inputs,
10179 const ArgList &Args,
10180 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010181 ArgStringList CmdArgs;
10182
10183 if (Output.isFilename()) {
10184 CmdArgs.push_back("-o");
10185 CmdArgs.push_back(Output.getFilename());
10186 } else {
10187 assert(Output.isNothing() && "Invalid output.");
10188 }
10189
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010190 if (Args.hasArg(options::OPT_v))
10191 CmdArgs.push_back("-v");
10192
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010193 // Pass -fexceptions through to the linker if it was present.
10194 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10195 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010196 CmdArgs.push_back("-fexceptions");
10197
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010198 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10199
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010200 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010201 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010202}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010203
Douglas Katzman95354292015-06-23 20:42:09 +000010204void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10205 const InputInfo &Output,
10206 const InputInfoList &Inputs,
10207 const ArgList &Args,
10208 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010209 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010210 const auto &TC =
10211 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10212 ArgStringList CmdArgs;
10213 const char *Exec;
10214
10215 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010216 default:
10217 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010218 case llvm::Triple::arm:
10219 case llvm::Triple::thumb:
10220 break;
10221 case llvm::Triple::x86:
10222 CmdArgs.push_back("--32");
10223 break;
10224 case llvm::Triple::x86_64:
10225 CmdArgs.push_back("--64");
10226 break;
10227 }
10228
10229 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10230
10231 CmdArgs.push_back("-o");
10232 CmdArgs.push_back(Output.getFilename());
10233
10234 for (const auto &Input : Inputs)
10235 CmdArgs.push_back(Input.getFilename());
10236
10237 const std::string Assembler = TC.GetProgramPath("as");
10238 Exec = Args.MakeArgString(Assembler);
10239
Justin Bognerd3371d82015-07-17 03:35:54 +000010240 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010241}
10242
Douglas Katzman95354292015-06-23 20:42:09 +000010243void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10244 const InputInfo &Output,
10245 const InputInfoList &Inputs,
10246 const ArgList &Args,
10247 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010248 const auto &TC =
10249 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10250 const llvm::Triple &T = TC.getTriple();
10251 const Driver &D = TC.getDriver();
10252 SmallString<128> EntryPoint;
10253 ArgStringList CmdArgs;
10254 const char *Exec;
10255
10256 // Silence warning for "clang -g foo.o -o foo"
10257 Args.ClaimAllArgs(options::OPT_g_Group);
10258 // and "clang -emit-llvm foo.o -o foo"
10259 Args.ClaimAllArgs(options::OPT_emit_llvm);
10260 // and for "clang -w foo.o -o foo"
10261 Args.ClaimAllArgs(options::OPT_w);
10262 // Other warning options are already handled somewhere else.
10263
10264 if (!D.SysRoot.empty())
10265 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10266
10267 if (Args.hasArg(options::OPT_pie))
10268 CmdArgs.push_back("-pie");
10269 if (Args.hasArg(options::OPT_rdynamic))
10270 CmdArgs.push_back("-export-dynamic");
10271 if (Args.hasArg(options::OPT_s))
10272 CmdArgs.push_back("--strip-all");
10273
10274 CmdArgs.push_back("-m");
10275 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010276 default:
10277 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010278 case llvm::Triple::arm:
10279 case llvm::Triple::thumb:
10280 // FIXME: this is incorrect for WinCE
10281 CmdArgs.push_back("thumb2pe");
10282 break;
10283 case llvm::Triple::x86:
10284 CmdArgs.push_back("i386pe");
10285 EntryPoint.append("_");
10286 break;
10287 case llvm::Triple::x86_64:
10288 CmdArgs.push_back("i386pep");
10289 break;
10290 }
10291
10292 if (Args.hasArg(options::OPT_shared)) {
10293 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010294 default:
10295 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010296 case llvm::Triple::arm:
10297 case llvm::Triple::thumb:
10298 case llvm::Triple::x86_64:
10299 EntryPoint.append("_DllMainCRTStartup");
10300 break;
10301 case llvm::Triple::x86:
10302 EntryPoint.append("_DllMainCRTStartup@12");
10303 break;
10304 }
10305
10306 CmdArgs.push_back("-shared");
10307 CmdArgs.push_back("-Bdynamic");
10308
10309 CmdArgs.push_back("--enable-auto-image-base");
10310
10311 CmdArgs.push_back("--entry");
10312 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10313 } else {
10314 EntryPoint.append("mainCRTStartup");
10315
10316 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10317 : "-Bdynamic");
10318
Douglas Katzman78b37b02015-11-17 20:28:07 +000010319 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010320 CmdArgs.push_back("--entry");
10321 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10322 }
10323
10324 // FIXME: handle subsystem
10325 }
10326
10327 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010328 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010329
10330 CmdArgs.push_back("-o");
10331 CmdArgs.push_back(Output.getFilename());
10332
10333 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10334 SmallString<261> ImpLib(Output.getFilename());
10335 llvm::sys::path::replace_extension(ImpLib, ".lib");
10336
10337 CmdArgs.push_back("--out-implib");
10338 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10339 }
10340
Douglas Katzman78b37b02015-11-17 20:28:07 +000010341 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010342 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10343 const char *CRTBegin;
10344
10345 CRTBegin =
10346 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10347 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10348 }
10349
10350 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010351 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010352 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10353
10354 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10355 !Args.hasArg(options::OPT_nodefaultlibs)) {
10356 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10357 !Args.hasArg(options::OPT_static);
10358 if (StaticCXX)
10359 CmdArgs.push_back("-Bstatic");
10360 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10361 if (StaticCXX)
10362 CmdArgs.push_back("-Bdynamic");
10363 }
10364
10365 if (!Args.hasArg(options::OPT_nostdlib)) {
10366 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10367 // TODO handle /MT[d] /MD[d]
10368 CmdArgs.push_back("-lmsvcrt");
10369 AddRunTimeLibs(TC, D, CmdArgs, Args);
10370 }
10371 }
10372
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010373 if (TC.getSanitizerArgs().needsAsanRt()) {
10374 // TODO handle /MT[d] /MD[d]
10375 if (Args.hasArg(options::OPT_shared)) {
10376 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10377 } else {
10378 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10379 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10380 // Make sure the dynamic runtime thunk is not optimized out at link time
10381 // to ensure proper SEH handling.
10382 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10383 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10384 ? "___asan_seh_interceptor"
10385 : "__asan_seh_interceptor"));
10386 }
10387 }
10388
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010389 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010390
Justin Bognerd3371d82015-07-17 03:35:54 +000010391 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010392}
Douglas Katzman84a75642015-06-19 14:55:19 +000010393
Douglas Katzman95354292015-06-23 20:42:09 +000010394void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10395 const InputInfo &Output,
10396 const InputInfoList &Inputs,
10397 const ArgList &Args,
10398 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010399 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010400 assert(Inputs.size() == 1);
10401 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010402 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10403 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010404
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010405 if (JA.getKind() == Action::PreprocessJobClass) {
10406 Args.ClaimAllArgs();
10407 CmdArgs.push_back("-E");
10408 } else {
10409 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10410 CmdArgs.push_back("-S");
10411 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10412 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010413 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010414 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010415
Douglas Katzmanf6071112015-08-03 14:34:22 +000010416 // Append all -I, -iquote, -isystem paths, defines/undefines,
10417 // 'f' flags, optimize flags, and warning options.
10418 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010419 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010420 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010421 options::OPT_f_Group, options::OPT_f_clang_Group,
10422 options::OPT_g_Group, options::OPT_M_Group,
10423 options::OPT_O_Group, options::OPT_W_Group});
10424
10425 // If we're producing a dependency file, and assembly is the final action,
10426 // then the name of the target in the dependency file should be the '.o'
10427 // file, not the '.s' file produced by this step. For example, instead of
10428 // /tmp/mumble.s: mumble.c .../someheader.h
10429 // the filename on the lefthand side should be "mumble.o"
10430 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10431 C.getActions().size() == 1 &&
10432 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10433 Arg *A = Args.getLastArg(options::OPT_o);
10434 if (A) {
10435 CmdArgs.push_back("-MT");
10436 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10437 }
10438 }
10439
Douglas Katzman84a75642015-06-19 14:55:19 +000010440 CmdArgs.push_back(II.getFilename());
10441 CmdArgs.push_back("-o");
10442 CmdArgs.push_back(Output.getFilename());
10443
10444 std::string Exec =
10445 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010446 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10447 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010448}
10449
Douglas Katzman95354292015-06-23 20:42:09 +000010450void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10451 const InputInfo &Output,
10452 const InputInfoList &Inputs,
10453 const ArgList &Args,
10454 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010455 ArgStringList CmdArgs;
10456
10457 assert(Inputs.size() == 1);
10458 const InputInfo &II = Inputs[0];
10459 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10460 assert(Output.getType() == types::TY_Object);
10461
10462 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010463 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010464 CmdArgs.push_back("-noSPrefixing");
10465 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010466 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10467 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10468 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010469 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010470 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010471 }
10472 CmdArgs.push_back("-elf"); // Output format.
10473 CmdArgs.push_back(II.getFilename());
10474 CmdArgs.push_back(
10475 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10476
10477 std::string Exec =
10478 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010479 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10480 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010481}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010482
10483void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10484 const InputInfo &Output,
10485 const InputInfoList &Inputs,
10486 const ArgList &Args,
10487 const char *LinkingOutput) const {
10488 const auto &TC =
10489 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10490 const llvm::Triple &T = TC.getTriple();
10491 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010492 bool UseStartfiles =
10493 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010494 bool UseDefaultLibs =
10495 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010496
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010497 if (T.getArch() == llvm::Triple::sparc)
10498 CmdArgs.push_back("-EB");
10499 else // SHAVE assumes little-endian, and sparcel is expressly so.
10500 CmdArgs.push_back("-EL");
10501
10502 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10503 // but we never pass through a --sysroot option and various other bits.
10504 // For example, there are no sanitizers (yet) nor gold linker.
10505
10506 // Eat some arguments that may be present but have no effect.
10507 Args.ClaimAllArgs(options::OPT_g_Group);
10508 Args.ClaimAllArgs(options::OPT_w);
10509 Args.ClaimAllArgs(options::OPT_static_libgcc);
10510
10511 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10512 CmdArgs.push_back("-s");
10513
10514 CmdArgs.push_back("-o");
10515 CmdArgs.push_back(Output.getFilename());
10516
10517 if (UseStartfiles) {
10518 // If you want startfiles, it means you want the builtin crti and crtbegin,
10519 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010520 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10521 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010522 }
10523
10524 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10525 options::OPT_e, options::OPT_s, options::OPT_t,
10526 options::OPT_Z_Flag, options::OPT_r});
10527
Douglas Katzman674a3122015-11-18 16:24:46 +000010528 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010529
10530 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10531
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010532 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010533 if (C.getDriver().CCCIsCXX())
10534 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010535 if (T.getOS() == llvm::Triple::RTEMS) {
10536 CmdArgs.push_back("--start-group");
10537 CmdArgs.push_back("-lc");
10538 // You must provide your own "-L" option to enable finding these.
10539 CmdArgs.push_back("-lrtemscpu");
10540 CmdArgs.push_back("-lrtemsbsp");
10541 CmdArgs.push_back("--end-group");
10542 } else {
10543 CmdArgs.push_back("-lc");
10544 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010545 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010546 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010547 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010548 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10549 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010550 }
10551
10552 std::string Exec =
10553 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10554 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10555 CmdArgs, Inputs));
10556}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010557
10558void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10559 const InputInfo &Output,
10560 const InputInfoList &Inputs,
10561 const ArgList &Args,
10562 const char *LinkingOutput) const {
10563 claimNoWarnArgs(Args);
10564 ArgStringList CmdArgs;
10565
10566 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10567
10568 CmdArgs.push_back("-o");
10569 CmdArgs.push_back(Output.getFilename());
10570
10571 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10572 const InputInfo &Input = Inputs[0];
10573 assert(Input.isFilename() && "Invalid input.");
10574 CmdArgs.push_back(Input.getFilename());
10575
10576 const char *Exec =
10577 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10578 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10579}
10580
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010581static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10582 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10583 if (SanArgs.needsUbsanRt()) {
10584 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10585 }
10586 if (SanArgs.needsAsanRt()) {
10587 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10588 }
10589}
10590
10591static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10592 const JobAction &JA, const InputInfo &Output,
10593 const InputInfoList &Inputs,
10594 const ArgList &Args,
10595 const char *LinkingOutput) {
10596 const toolchains::FreeBSD &ToolChain =
10597 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10598 const Driver &D = ToolChain.getDriver();
10599 ArgStringList CmdArgs;
10600
10601 // Silence warning for "clang -g foo.o -o foo"
10602 Args.ClaimAllArgs(options::OPT_g_Group);
10603 // and "clang -emit-llvm foo.o -o foo"
10604 Args.ClaimAllArgs(options::OPT_emit_llvm);
10605 // and for "clang -w foo.o -o foo". Other warning options are already
10606 // handled somewhere else.
10607 Args.ClaimAllArgs(options::OPT_w);
10608
10609 if (!D.SysRoot.empty())
10610 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10611
10612 if (Args.hasArg(options::OPT_pie))
10613 CmdArgs.push_back("-pie");
10614
10615 if (Args.hasArg(options::OPT_rdynamic))
10616 CmdArgs.push_back("-export-dynamic");
10617 if (Args.hasArg(options::OPT_shared))
10618 CmdArgs.push_back("--oformat=so");
10619
10620 if (Output.isFilename()) {
10621 CmdArgs.push_back("-o");
10622 CmdArgs.push_back(Output.getFilename());
10623 } else {
10624 assert(Output.isNothing() && "Invalid output.");
10625 }
10626
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010627 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10628
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010629 Args.AddAllArgs(CmdArgs, options::OPT_L);
10630 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10631 Args.AddAllArgs(CmdArgs, options::OPT_e);
10632 Args.AddAllArgs(CmdArgs, options::OPT_s);
10633 Args.AddAllArgs(CmdArgs, options::OPT_t);
10634 Args.AddAllArgs(CmdArgs, options::OPT_r);
10635
10636 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10637 CmdArgs.push_back("--no-demangle");
10638
10639 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10640
10641 if (Args.hasArg(options::OPT_pthread)) {
10642 CmdArgs.push_back("-lpthread");
10643 }
10644
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010645 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10646
10647 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10648}
10649
10650static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10651 const JobAction &JA, const InputInfo &Output,
10652 const InputInfoList &Inputs,
10653 const ArgList &Args,
10654 const char *LinkingOutput) {
10655 const toolchains::FreeBSD &ToolChain =
10656 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10657 const Driver &D = ToolChain.getDriver();
10658 ArgStringList CmdArgs;
10659
10660 // Silence warning for "clang -g foo.o -o foo"
10661 Args.ClaimAllArgs(options::OPT_g_Group);
10662 // and "clang -emit-llvm foo.o -o foo"
10663 Args.ClaimAllArgs(options::OPT_emit_llvm);
10664 // and for "clang -w foo.o -o foo". Other warning options are already
10665 // handled somewhere else.
10666 Args.ClaimAllArgs(options::OPT_w);
10667
10668 if (!D.SysRoot.empty())
10669 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10670
10671 if (Args.hasArg(options::OPT_pie))
10672 CmdArgs.push_back("-pie");
10673
10674 if (Args.hasArg(options::OPT_static)) {
10675 CmdArgs.push_back("-Bstatic");
10676 } else {
10677 if (Args.hasArg(options::OPT_rdynamic))
10678 CmdArgs.push_back("-export-dynamic");
10679 CmdArgs.push_back("--eh-frame-hdr");
10680 if (Args.hasArg(options::OPT_shared)) {
10681 CmdArgs.push_back("-Bshareable");
10682 } else {
10683 CmdArgs.push_back("-dynamic-linker");
10684 CmdArgs.push_back("/libexec/ld-elf.so.1");
10685 }
10686 CmdArgs.push_back("--enable-new-dtags");
10687 }
10688
10689 if (Output.isFilename()) {
10690 CmdArgs.push_back("-o");
10691 CmdArgs.push_back(Output.getFilename());
10692 } else {
10693 assert(Output.isNothing() && "Invalid output.");
10694 }
10695
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010696 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10697
Douglas Katzman78b37b02015-11-17 20:28:07 +000010698 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010699 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010700 if (!Args.hasArg(options::OPT_shared)) {
10701 if (Args.hasArg(options::OPT_pg))
10702 crt1 = "gcrt1.o";
10703 else if (Args.hasArg(options::OPT_pie))
10704 crt1 = "Scrt1.o";
10705 else
10706 crt1 = "crt1.o";
10707 }
10708 if (crt1)
10709 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10710
10711 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10712
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010713 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010714 if (Args.hasArg(options::OPT_static))
10715 crtbegin = "crtbeginT.o";
10716 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10717 crtbegin = "crtbeginS.o";
10718 else
10719 crtbegin = "crtbegin.o";
10720
10721 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10722 }
10723
10724 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010725 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010726 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10727 Args.AddAllArgs(CmdArgs, options::OPT_e);
10728 Args.AddAllArgs(CmdArgs, options::OPT_s);
10729 Args.AddAllArgs(CmdArgs, options::OPT_t);
10730 Args.AddAllArgs(CmdArgs, options::OPT_r);
10731
10732 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10733 CmdArgs.push_back("--no-demangle");
10734
10735 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10736
Douglas Katzman78b37b02015-11-17 20:28:07 +000010737 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010738 // For PS4, we always want to pass libm, libstdc++ and libkernel
10739 // libraries for both C and C++ compilations.
10740 CmdArgs.push_back("-lkernel");
10741 if (D.CCCIsCXX()) {
10742 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10743 if (Args.hasArg(options::OPT_pg))
10744 CmdArgs.push_back("-lm_p");
10745 else
10746 CmdArgs.push_back("-lm");
10747 }
10748 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10749 // the default system libraries. Just mimic this for now.
10750 if (Args.hasArg(options::OPT_pg))
10751 CmdArgs.push_back("-lgcc_p");
10752 else
10753 CmdArgs.push_back("-lcompiler_rt");
10754 if (Args.hasArg(options::OPT_static)) {
10755 CmdArgs.push_back("-lstdc++");
10756 } else if (Args.hasArg(options::OPT_pg)) {
10757 CmdArgs.push_back("-lgcc_eh_p");
10758 } else {
10759 CmdArgs.push_back("--as-needed");
10760 CmdArgs.push_back("-lstdc++");
10761 CmdArgs.push_back("--no-as-needed");
10762 }
10763
10764 if (Args.hasArg(options::OPT_pthread)) {
10765 if (Args.hasArg(options::OPT_pg))
10766 CmdArgs.push_back("-lpthread_p");
10767 else
10768 CmdArgs.push_back("-lpthread");
10769 }
10770
10771 if (Args.hasArg(options::OPT_pg)) {
10772 if (Args.hasArg(options::OPT_shared))
10773 CmdArgs.push_back("-lc");
10774 else {
10775 if (Args.hasArg(options::OPT_static)) {
10776 CmdArgs.push_back("--start-group");
10777 CmdArgs.push_back("-lc_p");
10778 CmdArgs.push_back("-lpthread_p");
10779 CmdArgs.push_back("--end-group");
10780 } else {
10781 CmdArgs.push_back("-lc_p");
10782 }
10783 }
10784 CmdArgs.push_back("-lgcc_p");
10785 } else {
10786 if (Args.hasArg(options::OPT_static)) {
10787 CmdArgs.push_back("--start-group");
10788 CmdArgs.push_back("-lc");
10789 CmdArgs.push_back("-lpthread");
10790 CmdArgs.push_back("--end-group");
10791 } else {
10792 CmdArgs.push_back("-lc");
10793 }
10794 CmdArgs.push_back("-lcompiler_rt");
10795 }
10796
10797 if (Args.hasArg(options::OPT_static)) {
10798 CmdArgs.push_back("-lstdc++");
10799 } else if (Args.hasArg(options::OPT_pg)) {
10800 CmdArgs.push_back("-lgcc_eh_p");
10801 } else {
10802 CmdArgs.push_back("--as-needed");
10803 CmdArgs.push_back("-lstdc++");
10804 CmdArgs.push_back("--no-as-needed");
10805 }
10806 }
10807
Douglas Katzman78b37b02015-11-17 20:28:07 +000010808 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010809 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10810 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10811 else
10812 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10813 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10814 }
10815
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010816 const char *Exec =
10817#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010818 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010819#else
10820 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10821#endif
10822
10823 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10824}
10825
10826void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10827 const InputInfo &Output,
10828 const InputInfoList &Inputs,
10829 const ArgList &Args,
10830 const char *LinkingOutput) const {
10831 const toolchains::FreeBSD &ToolChain =
10832 static_cast<const toolchains::FreeBSD &>(getToolChain());
10833 const Driver &D = ToolChain.getDriver();
10834 bool PS4Linker;
10835 StringRef LinkerOptName;
10836 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10837 LinkerOptName = A->getValue();
10838 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10839 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10840 }
10841
10842 if (LinkerOptName == "gold")
10843 PS4Linker = false;
10844 else if (LinkerOptName == "ps4")
10845 PS4Linker = true;
10846 else
10847 PS4Linker = !Args.hasArg(options::OPT_shared);
10848
10849 if (PS4Linker)
10850 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10851 else
10852 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10853}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010854
10855void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10856 const InputInfo &Output,
10857 const InputInfoList &Inputs,
10858 const ArgList &Args,
10859 const char *LinkingOutput) const {
10860 const auto &TC =
10861 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010862 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010863
10864 std::vector<std::string> gpu_archs =
10865 Args.getAllArgValues(options::OPT_march_EQ);
10866 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10867 const std::string& gpu_arch = gpu_archs[0];
10868
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010869 ArgStringList CmdArgs;
10870 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010871 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10872 // ptxas does not accept -g option if optimization is enabled, so
10873 // we ignore the compiler's -O* options if we want debug info.
10874 CmdArgs.push_back("-g");
10875 CmdArgs.push_back("--dont-merge-basicblocks");
10876 CmdArgs.push_back("--return-at-end");
10877 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10878 // Map the -O we received to -O{0,1,2,3}.
10879 //
10880 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10881 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010882
Justin Lebar2836dcd2016-01-19 19:52:21 +000010883 // -O3 seems like the least-bad option when -Osomething is specified to
10884 // clang but it isn't handled below.
10885 StringRef OOpt = "3";
10886 if (A->getOption().matches(options::OPT_O4) ||
10887 A->getOption().matches(options::OPT_Ofast))
10888 OOpt = "3";
10889 else if (A->getOption().matches(options::OPT_O0))
10890 OOpt = "0";
10891 else if (A->getOption().matches(options::OPT_O)) {
10892 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10893 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10894 .Case("1", "1")
10895 .Case("2", "2")
10896 .Case("3", "3")
10897 .Case("s", "2")
10898 .Case("z", "2")
10899 .Default("2");
10900 }
10901 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10902 } else {
10903 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10904 // to no optimizations, but ptxas's default is -O3.
10905 CmdArgs.push_back("-O0");
10906 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010907
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010908 CmdArgs.push_back("--gpu-name");
10909 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10910 CmdArgs.push_back("--output-file");
10911 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10912 for (const auto& II : Inputs)
10913 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10914
10915 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10916 CmdArgs.push_back(Args.MakeArgString(A));
10917
10918 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10919 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10920}
10921
10922// All inputs to this linker must be from CudaDeviceActions, as we need to look
10923// at the Inputs' Actions in order to figure out which GPU architecture they
10924// correspond to.
10925void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10926 const InputInfo &Output,
10927 const InputInfoList &Inputs,
10928 const ArgList &Args,
10929 const char *LinkingOutput) const {
10930 const auto &TC =
10931 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010932 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010933
10934 ArgStringList CmdArgs;
10935 CmdArgs.push_back("--cuda");
10936 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10937 CmdArgs.push_back(Args.MakeArgString("--create"));
10938 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10939
10940 for (const auto& II : Inputs) {
10941 auto* A = cast<const CudaDeviceAction>(II.getAction());
10942 // We need to pass an Arch of the form "sm_XX" for cubin files and
10943 // "compute_XX" for ptx.
10944 const char *Arch = (II.getType() == types::TY_PP_Asm)
10945 ? A->getComputeArchName()
10946 : A->getGpuArchName();
10947 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10948 Arch + ",file=" + II.getFilename()));
10949 }
10950
10951 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10952 CmdArgs.push_back(Args.MakeArgString(A));
10953
10954 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10955 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10956}