blob: 574bf5cd77d14047b606ba09f00e3255c7e39573 [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.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000389 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000390 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000391 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
393 RenderedImplicitInclude = true;
394
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000395 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000396 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000397
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000398 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000399 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000400 SmallString<128> P(A->getValue());
401 // We want the files to have a name like foo.h.pch. Add a dummy extension
402 // so that replace_extension does the right thing.
403 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000404 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000405 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000406 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000407 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000408 }
409
Douglas Gregor111af7d2009-04-18 00:34:01 +0000410 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000411 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000413 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000414 }
415
Douglas Gregor111af7d2009-04-18 00:34:01 +0000416 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000417 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000419 FoundPCH = UsePCH;
420 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000421 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000422 }
423
424 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000425 if (IsFirstImplicitInclude) {
426 A->claim();
427 if (UsePCH)
428 CmdArgs.push_back("-include-pch");
429 else
430 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000431 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000432 continue;
433 } else {
434 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000435 D.Diag(diag::warn_drv_pch_not_first_include) << P
436 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000437 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000438 }
439 }
440
441 // Not translated, render as usual.
442 A->claim();
443 A->render(Args, CmdArgs);
444 }
445
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000446 Args.AddAllArgs(CmdArgs,
447 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
448 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000450 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000451
452 // FIXME: There is a very unfortunate problem here, some troubled
453 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
454 // really support that we would have to parse and then translate
455 // those options. :(
456 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
457 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000458
459 // -I- is a deprecated GCC feature, reject it.
460 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000461 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000462
463 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
464 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000465 StringRef sysroot = C.getSysRoot();
466 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000467 if (!Args.hasArg(options::OPT_isysroot)) {
468 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000469 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000470 }
471 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000472
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000473 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000474 // FIXME: We should probably sink the logic for handling these from the
475 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000476 // CPATH - included following the user specified includes (but prior to
477 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000478 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000479 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000480 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000481 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000482 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000483 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000484 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000485 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000486 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000487
Artem Belevichfa11ab52015-11-17 22:28:46 +0000488 // Optional AuxToolChain indicates that we need to include headers
489 // for more than one target. If that's the case, add include paths
490 // from AuxToolChain right after include paths of the same kind for
491 // the current target.
492
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000493 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000494 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000495 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000496 if (AuxToolChain)
497 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
498 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000499
500 // Add system include arguments.
501 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000502 if (AuxToolChain)
503 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
504
505 // Add CUDA include arguments, if needed.
506 if (types::isCuda(Inputs[0].getType()))
507 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000508}
509
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000510// FIXME: Move to target hook.
511static bool isSignedCharDefault(const llvm::Triple &Triple) {
512 switch (Triple.getArch()) {
513 default:
514 return true;
515
Tim Northover9bb857a2013-01-31 12:13:10 +0000516 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000517 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000518 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000519 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000522 if (Triple.isOSDarwin() || Triple.isOSWindows())
523 return true;
524 return false;
525
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000526 case llvm::Triple::ppc:
527 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000528 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000529 return true;
530 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000531
David Majnemerdcecd932015-05-23 19:23:55 +0000532 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000533 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000534 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000535 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000536 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000537 }
538}
539
Robert Lytton0e076492013-08-13 09:43:10 +0000540static bool isNoCommonDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return false;
544
545 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000546 case llvm::Triple::wasm32:
547 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000548 return true;
549 }
550}
551
Renato Goline17c5802015-07-27 23:44:42 +0000552// ARM tools start.
553
554// Get SubArch (vN).
555static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
556 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000557 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000558}
559
560// True if M-profile.
561static bool isARMMProfile(const llvm::Triple &Triple) {
562 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000563 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000564 return Profile == llvm::ARM::PK_M;
565}
566
567// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000568static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
569 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000570 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
571 CPU = A->getValue();
572 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
573 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000574 if (!FromAs)
575 return;
576
577 for (const Arg *A :
578 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
579 StringRef Value = A->getValue();
580 if (Value.startswith("-mcpu="))
581 CPU = Value.substr(6);
582 if (Value.startswith("-march="))
583 Arch = Value.substr(7);
584 }
Renato Goline17c5802015-07-27 23:44:42 +0000585}
586
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000587// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000588// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000589static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000590 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000591 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000592 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
593 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
595}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000596
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000597// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000598static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000599 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000600 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000601 unsigned FPUID = llvm::ARM::parseFPU(FPU);
602 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000603 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
604}
605
Bradley Smithbbf5a002015-11-18 16:33:48 +0000606// Decode ARM features from string like +[no]featureA+[no]featureB+...
607static bool DecodeARMFeatures(const Driver &D, StringRef text,
608 std::vector<const char *> &Features) {
609 SmallVector<StringRef, 8> Split;
610 text.split(Split, StringRef("+"), -1, false);
611
612 for (StringRef Feature : Split) {
613 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
614 if (FeatureName)
615 Features.push_back(FeatureName);
616 else
617 return false;
618 }
619 return true;
620}
621
Renato Golin7c542b42015-07-27 23:44:45 +0000622// Check if -march is valid by checking if it can be canonicalised and parsed.
623// getARMArch is used here instead of just checking the -march value in order
624// to handle -march=native correctly.
625static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000626 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000627 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000628 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000629 std::pair<StringRef, StringRef> Split = ArchName.split("+");
630
Renato Goline17c5802015-07-27 23:44:42 +0000631 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000632 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
633 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000634 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000635}
636
Renato Golin7c542b42015-07-27 23:44:45 +0000637// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
638static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
639 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000640 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000641 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000642 std::pair<StringRef, StringRef> Split = CPUName.split("+");
643
Renato Goline17c5802015-07-27 23:44:42 +0000644 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000645 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
646 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000647 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000648}
649
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000650static bool useAAPCSForMachO(const llvm::Triple &T) {
651 // The backend is hardwired to assume AAPCS for M-class processors, ensure
652 // the frontend matches that.
653 return T.getEnvironment() == llvm::Triple::EABI ||
654 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
655}
656
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000657// Select the float ABI as determined by -msoft-float, -mhard-float, and
658// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000659arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
660 const Driver &D = TC.getDriver();
661 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 auto SubArch = getARMSubArchVersionNumber(Triple);
663 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000664 if (Arg *A =
665 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
666 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000667 if (A->getOption().matches(options::OPT_msoft_float)) {
668 ABI = FloatABI::Soft;
669 } else if (A->getOption().matches(options::OPT_mhard_float)) {
670 ABI = FloatABI::Hard;
671 } else {
672 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
673 .Case("soft", FloatABI::Soft)
674 .Case("softfp", FloatABI::SoftFP)
675 .Case("hard", FloatABI::Hard)
676 .Default(FloatABI::Invalid);
677 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000678 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000679 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000680 }
681 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000682
683 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
684 // "apcs-gnu".
685 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000686 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000687 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
688 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000689 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000690 }
691
692 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000693 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000694 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000695 case llvm::Triple::Darwin:
696 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000697 case llvm::Triple::IOS:
698 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000699 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000700 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000701 break;
702 }
Tim Northover756447a2015-10-30 16:30:36 +0000703 case llvm::Triple::WatchOS:
704 ABI = FloatABI::Hard;
705 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000706
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000707 // FIXME: this is invalid for WindowsCE
708 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000709 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000710 break;
711
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000712 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000713 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000714 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000715 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000716 break;
717 default:
718 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000719 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000720 break;
721 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000722 break;
723
Daniel Dunbar78485922009-09-10 23:00:09 +0000724 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000725 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000726 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 case llvm::Triple::EABIHF:
728 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000729 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000730 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000731 case llvm::Triple::EABI:
732 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000733 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000734 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000735 case llvm::Triple::Android:
736 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000737 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000738 default:
739 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000740 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000741 if (Triple.getOS() != llvm::Triple::UnknownOS ||
742 !Triple.isOSBinFormatMachO())
743 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000744 break;
745 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000746 }
747 }
748
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000749 assert(ABI != FloatABI::Invalid && "must select an ABI");
750 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000751}
752
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000753static void getARMTargetFeatures(const ToolChain &TC,
754 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000755 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000756 std::vector<const char *> &Features,
757 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000758 const Driver &D = TC.getDriver();
759
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000760 bool KernelOrKext =
761 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000762 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000763 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
764 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
765
Nico Weber6e0ebae2015-04-29 21:16:40 +0000766 if (!ForAS) {
767 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
768 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
769 // stripped out by the ARM target. We should probably pass this a new
770 // -target-option, which is handled by the -cc1/-cc1as invocation.
771 //
772 // FIXME2: For consistency, it would be ideal if we set up the target
773 // machine state the same when using the frontend or the assembler. We don't
774 // currently do that for the assembler, we pass the options directly to the
775 // backend and never even instantiate the frontend TargetInfo. If we did,
776 // and used its handleTargetFeatures hook, then we could ensure the
777 // assembler and the frontend behave the same.
778
779 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000780 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000781 Features.push_back("+soft-float");
782
783 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000784 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000785 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000786 } else {
787 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
788 // to the assembler correctly.
789 for (const Arg *A :
790 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
791 StringRef Value = A->getValue();
792 if (Value.startswith("-mfpu=")) {
793 WaFPU = A;
794 } else if (Value.startswith("-mcpu=")) {
795 WaCPU = A;
796 } else if (Value.startswith("-mhwdiv=")) {
797 WaHDiv = A;
798 } else if (Value.startswith("-march=")) {
799 WaArch = A;
800 }
801 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000802 }
803
Renato Golin7c542b42015-07-27 23:44:45 +0000804 // Check -march. ClangAs gives preference to -Wa,-march=.
805 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000806 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000807 if (WaArch) {
808 if (ArchArg)
809 D.Diag(clang::diag::warn_drv_unused_argument)
810 << ArchArg->getAsString(Args);
811 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000812 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000813 // FIXME: Set Arch.
814 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
815 } else if (ArchArg) {
816 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000817 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000818 }
819
Renato Golin7c542b42015-07-27 23:44:45 +0000820 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
821 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000822 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000823 if (WaCPU) {
824 if (CPUArg)
825 D.Diag(clang::diag::warn_drv_unused_argument)
826 << CPUArg->getAsString(Args);
827 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000828 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000829 } else if (CPUArg) {
830 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000831 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000832 }
John Brawna95c1a82015-05-08 12:52:18 +0000833
Renato Golin23459c62015-07-30 16:40:17 +0000834 // Add CPU features for generic CPUs
835 if (CPUName == "native") {
836 llvm::StringMap<bool> HostFeatures;
837 if (llvm::sys::getHostCPUFeatures(HostFeatures))
838 for (auto &F : HostFeatures)
839 Features.push_back(
840 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
841 }
842
843 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
844 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
845 if (WaFPU) {
846 if (FPUArg)
847 D.Diag(clang::diag::warn_drv_unused_argument)
848 << FPUArg->getAsString(Args);
849 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
850 Features);
851 } else if (FPUArg) {
852 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
853 }
854
855 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
856 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
857 if (WaHDiv) {
858 if (HDivArg)
859 D.Diag(clang::diag::warn_drv_unused_argument)
860 << HDivArg->getAsString(Args);
861 getARMHWDivFeatures(D, WaHDiv, Args,
862 StringRef(WaHDiv->getValue()).substr(8), Features);
863 } else if (HDivArg)
864 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
865
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000866 // Setting -msoft-float effectively disables NEON because of the GCC
867 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000868 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000869 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000870 // Also need to explicitly disable features which imply NEON.
871 Features.push_back("-crypto");
872 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000873
Eric Christopher269c2a22015-04-04 03:34:43 +0000874 // En/disable crc code generation.
875 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000876 if (A->getOption().matches(options::OPT_mcrc))
877 Features.push_back("+crc");
878 else
879 Features.push_back("-crc");
880 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000881
882 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
883 Features.insert(Features.begin(), "+v8.1a");
884 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000885
Akira Hatanakac2694822015-07-07 08:28:42 +0000886 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
887 // neither options are specified, see if we are compiling for kernel/kext and
888 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000889 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
890 options::OPT_mno_long_calls)) {
891 if (A->getOption().matches(options::OPT_mlong_calls))
892 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000893 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
894 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000895 Features.push_back("+long-calls");
896 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000897
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000898 // Kernel code has more strict alignment requirements.
899 if (KernelOrKext)
900 Features.push_back("+strict-align");
901 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
902 options::OPT_munaligned_access)) {
903 if (A->getOption().matches(options::OPT_munaligned_access)) {
904 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
905 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
906 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
907 } else
908 Features.push_back("+strict-align");
909 } else {
910 // Assume pre-ARMv6 doesn't support unaligned accesses.
911 //
912 // ARMv6 may or may not support unaligned accesses depending on the
913 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
914 // Darwin and NetBSD targets support unaligned accesses, and others don't.
915 //
916 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
917 // which raises an alignment fault on unaligned accesses. Linux
918 // defaults this bit to 0 and handles it as a system-wide (not
919 // per-process) setting. It is therefore safe to assume that ARMv7+
920 // Linux targets support unaligned accesses. The same goes for NaCl.
921 //
922 // The above behavior is consistent with GCC.
923 int VersionNum = getARMSubArchVersionNumber(Triple);
924 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000925 if (VersionNum < 6 ||
926 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000927 Features.push_back("+strict-align");
928 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
929 if (VersionNum < 7)
930 Features.push_back("+strict-align");
931 } else
932 Features.push_back("+strict-align");
933 }
934
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000935 // llvm does not support reserving registers in general. There is support
936 // for reserving r9 on ARM though (defined as a platform-specific register
937 // in ARM EABI).
938 if (Args.hasArg(options::OPT_ffixed_r9))
939 Features.push_back("+reserve-r9");
940
Dimitry Andric08107392016-01-06 07:42:18 +0000941 // The kext linker doesn't know how to deal with movw/movt.
942 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +0000943 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000944}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000945
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000946void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
947 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000948 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000949 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000950 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000951 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000952 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000953 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000954 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000955 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000956 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000957 } else if (Triple.isWatchOS()) {
958 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000959 } else {
960 ABIName = "apcs-gnu";
961 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000962 } else if (Triple.isOSWindows()) {
963 // FIXME: this is invalid for WindowsCE
964 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000965 } else {
966 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000967 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000968 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000969 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000970 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000971 ABIName = "aapcs-linux";
972 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000973 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000974 case llvm::Triple::EABI:
975 ABIName = "aapcs";
976 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000977 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000978 if (Triple.getOS() == llvm::Triple::NetBSD)
979 ABIName = "apcs-gnu";
980 else
981 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000982 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000983 }
984 }
985 CmdArgs.push_back("-target-abi");
986 CmdArgs.push_back(ABIName);
987
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000988 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000989 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000990 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000991 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000992 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000993 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000994 CmdArgs.push_back("-mfloat-abi");
995 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000996 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000997 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000998 CmdArgs.push_back("-mfloat-abi");
999 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001000 } else {
1001 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001002 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001003 CmdArgs.push_back("-mfloat-abi");
1004 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001005 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001006
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001008 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1009 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001011 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001012 CmdArgs.push_back("-arm-global-merge=false");
1013 else
1014 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001015 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001016
Bob Wilson9c8af452013-04-11 18:53:25 +00001017 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001018 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001019 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001020}
Renato Goline17c5802015-07-27 23:44:42 +00001021// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001022
Tim Northover573cbee2014-05-24 12:52:07 +00001023/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1024/// targeting.
1025static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001026 Arg *A;
1027 std::string CPU;
1028 // If we have -mtune or -mcpu, use that.
1029 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001030 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001031 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001032 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001033 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001034 }
1035
Kevin Qin110db6f2014-07-18 07:03:22 +00001036 // Handle CPU name is 'native'.
1037 if (CPU == "native")
1038 return llvm::sys::getHostCPUName();
1039 else if (CPU.size())
1040 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001041
James Molloy9b1586b2014-04-17 12:51:17 +00001042 // Make sure we pick "cyclone" if -arch is used.
1043 // FIXME: Should this be picked by checking the target triple instead?
1044 if (Args.getLastArg(options::OPT_arch))
1045 return "cyclone";
1046
1047 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001048}
1049
Tim Northover573cbee2014-05-24 12:52:07 +00001050void Clang::AddAArch64TargetArgs(const ArgList &Args,
1051 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001052 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1053 llvm::Triple Triple(TripleStr);
1054
1055 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1056 Args.hasArg(options::OPT_mkernel) ||
1057 Args.hasArg(options::OPT_fapple_kext))
1058 CmdArgs.push_back("-disable-red-zone");
1059
1060 if (!Args.hasFlag(options::OPT_mimplicit_float,
1061 options::OPT_mno_implicit_float, true))
1062 CmdArgs.push_back("-no-implicit-float");
1063
Craig Topper92fc2df2014-05-17 16:56:41 +00001064 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001065 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1066 ABIName = A->getValue();
1067 else if (Triple.isOSDarwin())
1068 ABIName = "darwinpcs";
1069 else
1070 ABIName = "aapcs";
1071
1072 CmdArgs.push_back("-target-abi");
1073 CmdArgs.push_back(ABIName);
1074
Bradley Smith9ff64332014-10-13 10:16:06 +00001075 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1076 options::OPT_mno_fix_cortex_a53_835769)) {
1077 CmdArgs.push_back("-backend-option");
1078 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1079 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1080 else
1081 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001082 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001083 // Enabled A53 errata (835769) workaround by default on android
1084 CmdArgs.push_back("-backend-option");
1085 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001086 }
1087
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001088 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001089 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1090 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001091 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001092 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001093 CmdArgs.push_back("-aarch64-global-merge=false");
1094 else
1095 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001096 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001097}
1098
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001099// Get CPU and ABI names. They are not independent
1100// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001101void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1102 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001103 const char *DefMips32CPU = "mips32r2";
1104 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001105
Daniel Sanders2bf13662014-07-10 14:40:57 +00001106 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1107 // default for mips64(el)?-img-linux-gnu.
1108 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1109 Triple.getEnvironment() == llvm::Triple::GNU) {
1110 DefMips32CPU = "mips32r6";
1111 DefMips64CPU = "mips64r6";
1112 }
Renato Golin7c542b42015-07-27 23:44:45 +00001113
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001114 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001115 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001116 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001117
Brad Smithba26f582015-01-06 02:53:17 +00001118 // MIPS3 is the default for mips64*-unknown-openbsd.
1119 if (Triple.getOS() == llvm::Triple::OpenBSD)
1120 DefMips64CPU = "mips3";
1121
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001122 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001123 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001124
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001125 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001126 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001127 // Convert a GNU style Mips ABI name to the name
1128 // accepted by LLVM Mips backend.
1129 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001130 .Case("32", "o32")
1131 .Case("64", "n64")
1132 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001133 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001134
1135 // Setup default CPU and ABI names.
1136 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001137 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001138 default:
1139 llvm_unreachable("Unexpected triple arch name");
1140 case llvm::Triple::mips:
1141 case llvm::Triple::mipsel:
1142 CPUName = DefMips32CPU;
1143 break;
1144 case llvm::Triple::mips64:
1145 case llvm::Triple::mips64el:
1146 CPUName = DefMips64CPU;
1147 break;
1148 }
1149 }
1150
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001151 if (ABIName.empty()) {
1152 // Deduce ABI name from the target triple.
1153 if (Triple.getArch() == llvm::Triple::mips ||
1154 Triple.getArch() == llvm::Triple::mipsel)
1155 ABIName = "o32";
1156 else
1157 ABIName = "n64";
1158 }
1159
1160 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001161 // Deduce CPU name from ABI name.
1162 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001163 .Cases("o32", "eabi", DefMips32CPU)
1164 .Cases("n32", "n64", DefMips64CPU)
1165 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001166 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001167
1168 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001169}
1170
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001171std::string mips::getMipsABILibSuffix(const ArgList &Args,
1172 const llvm::Triple &Triple) {
1173 StringRef CPUName, ABIName;
1174 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1175 return llvm::StringSwitch<std::string>(ABIName)
1176 .Case("o32", "")
1177 .Case("n32", "32")
1178 .Case("n64", "64");
1179}
1180
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001181// Convert ABI name to the GNU tools acceptable variant.
1182static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1183 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001184 .Case("o32", "32")
1185 .Case("n64", "64")
1186 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001187}
1188
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001189// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1190// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001191static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1192 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A =
1194 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1195 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001196 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001197 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001198 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001201 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1202 .Case("soft", mips::FloatABI::Soft)
1203 .Case("hard", mips::FloatABI::Hard)
1204 .Default(mips::FloatABI::Invalid);
1205 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001206 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001207 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001208 }
1209 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001210 }
1211
1212 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001213 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001214 // Assume "hard", because it's a default value used by gcc.
1215 // When we start to recognize specific target MIPS processors,
1216 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001217 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001218 }
1219
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001220 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1221 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001222}
1223
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001224static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001225 std::vector<const char *> &Features,
1226 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001227 StringRef FeatureName) {
1228 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001229 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001230 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001231 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001232 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001233 }
1234}
1235
Daniel Sanders379d44b2014-07-16 11:52:23 +00001236static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1237 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001238 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001239 StringRef CPUName;
1240 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001241 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001242 ABIName = getGnuCompatibleMipsABIName(ABIName);
1243
Daniel Sandersfeb61302014-08-08 15:47:17 +00001244 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1245 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001246
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001247 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1248 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001249 // FIXME: Note, this is a hack. We need to pass the selected float
1250 // mode to the MipsTargetInfoBase to define appropriate macros there.
1251 // Now it is the only method.
1252 Features.push_back("+soft-float");
1253 }
1254
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001255 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001256 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001257 if (Val == "2008") {
1258 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1259 Features.push_back("+nan2008");
1260 else {
1261 Features.push_back("-nan2008");
1262 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1263 }
1264 } else if (Val == "legacy") {
1265 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1266 Features.push_back("-nan2008");
1267 else {
1268 Features.push_back("+nan2008");
1269 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1270 }
1271 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001272 D.Diag(diag::err_drv_unsupported_option_argument)
1273 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001274 }
1275
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001276 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1277 options::OPT_mdouble_float, "single-float");
1278 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1279 "mips16");
1280 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1281 options::OPT_mno_micromips, "micromips");
1282 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1283 "dsp");
1284 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1285 "dspr2");
1286 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1287 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001288
1289 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1290 // pass -mfpxx
1291 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1292 options::OPT_mfp64)) {
1293 if (A->getOption().matches(options::OPT_mfp32))
1294 Features.push_back(Args.MakeArgString("-fp64"));
1295 else if (A->getOption().matches(options::OPT_mfpxx)) {
1296 Features.push_back(Args.MakeArgString("+fpxx"));
1297 Features.push_back(Args.MakeArgString("+nooddspreg"));
1298 } else
1299 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001300 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001301 Features.push_back(Args.MakeArgString("+fpxx"));
1302 Features.push_back(Args.MakeArgString("+nooddspreg"));
1303 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001304
Daniel Sanders28e5d392014-07-10 10:39:51 +00001305 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1306 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001307}
1308
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001309void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001310 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001311 const Driver &D = getToolChain().getDriver();
1312 StringRef CPUName;
1313 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001314 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001315 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001316
1317 CmdArgs.push_back("-target-abi");
1318 CmdArgs.push_back(ABIName.data());
1319
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001320 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1321 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001322 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001323 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001324 CmdArgs.push_back("-mfloat-abi");
1325 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001326 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001327 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001328 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001329 CmdArgs.push_back("-mfloat-abi");
1330 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001331 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001332
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001333 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1334 if (A->getOption().matches(options::OPT_mxgot)) {
1335 CmdArgs.push_back("-mllvm");
1336 CmdArgs.push_back("-mxgot");
1337 }
1338 }
1339
Simon Atanasyanc580b322013-05-11 06:33:44 +00001340 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1341 options::OPT_mno_ldc1_sdc1)) {
1342 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1343 CmdArgs.push_back("-mllvm");
1344 CmdArgs.push_back("-mno-ldc1-sdc1");
1345 }
1346 }
1347
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001348 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1349 options::OPT_mno_check_zero_division)) {
1350 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1351 CmdArgs.push_back("-mllvm");
1352 CmdArgs.push_back("-mno-check-zero-division");
1353 }
1354 }
1355
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001356 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001357 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001358 CmdArgs.push_back("-mllvm");
1359 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1360 A->claim();
1361 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001362}
1363
Hal Finkel8eb59282012-06-11 22:35:19 +00001364/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1365static std::string getPPCTargetCPU(const ArgList &Args) {
1366 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001367 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001368
1369 if (CPUName == "native") {
1370 std::string CPU = llvm::sys::getHostCPUName();
1371 if (!CPU.empty() && CPU != "generic")
1372 return CPU;
1373 else
1374 return "";
1375 }
1376
1377 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001378 .Case("common", "generic")
1379 .Case("440", "440")
1380 .Case("440fp", "440")
1381 .Case("450", "450")
1382 .Case("601", "601")
1383 .Case("602", "602")
1384 .Case("603", "603")
1385 .Case("603e", "603e")
1386 .Case("603ev", "603ev")
1387 .Case("604", "604")
1388 .Case("604e", "604e")
1389 .Case("620", "620")
1390 .Case("630", "pwr3")
1391 .Case("G3", "g3")
1392 .Case("7400", "7400")
1393 .Case("G4", "g4")
1394 .Case("7450", "7450")
1395 .Case("G4+", "g4+")
1396 .Case("750", "750")
1397 .Case("970", "970")
1398 .Case("G5", "g5")
1399 .Case("a2", "a2")
1400 .Case("a2q", "a2q")
1401 .Case("e500mc", "e500mc")
1402 .Case("e5500", "e5500")
1403 .Case("power3", "pwr3")
1404 .Case("power4", "pwr4")
1405 .Case("power5", "pwr5")
1406 .Case("power5x", "pwr5x")
1407 .Case("power6", "pwr6")
1408 .Case("power6x", "pwr6x")
1409 .Case("power7", "pwr7")
1410 .Case("power8", "pwr8")
1411 .Case("pwr3", "pwr3")
1412 .Case("pwr4", "pwr4")
1413 .Case("pwr5", "pwr5")
1414 .Case("pwr5x", "pwr5x")
1415 .Case("pwr6", "pwr6")
1416 .Case("pwr6x", "pwr6x")
1417 .Case("pwr7", "pwr7")
1418 .Case("pwr8", "pwr8")
1419 .Case("powerpc", "ppc")
1420 .Case("powerpc64", "ppc64")
1421 .Case("powerpc64le", "ppc64le")
1422 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001423 }
1424
1425 return "";
1426}
1427
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001428static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1429 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001430 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001431 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001432
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001433 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1434 if (FloatABI == ppc::FloatABI::Soft &&
1435 !(Triple.getArch() == llvm::Triple::ppc64 ||
1436 Triple.getArch() == llvm::Triple::ppc64le))
1437 Features.push_back("+soft-float");
1438 else if (FloatABI == ppc::FloatABI::Soft &&
1439 (Triple.getArch() == llvm::Triple::ppc64 ||
1440 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001441 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001442 << "soft float is not supported for ppc64";
1443
Eric Christopher643bb6a2013-10-16 20:40:08 +00001444 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001445 AddTargetFeature(Args, Features, options::OPT_faltivec,
1446 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001447}
1448
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001449ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1450 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1451 if (Arg *A =
1452 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1453 options::OPT_mfloat_abi_EQ)) {
1454 if (A->getOption().matches(options::OPT_msoft_float))
1455 ABI = ppc::FloatABI::Soft;
1456 else if (A->getOption().matches(options::OPT_mhard_float))
1457 ABI = ppc::FloatABI::Hard;
1458 else {
1459 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1460 .Case("soft", ppc::FloatABI::Soft)
1461 .Case("hard", ppc::FloatABI::Hard)
1462 .Default(ppc::FloatABI::Invalid);
1463 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1464 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1465 ABI = ppc::FloatABI::Hard;
1466 }
1467 }
1468 }
1469
1470 // If unspecified, choose the default based on the platform.
1471 if (ABI == ppc::FloatABI::Invalid) {
1472 ABI = ppc::FloatABI::Hard;
1473 }
1474
1475 return ABI;
1476}
1477
Ulrich Weigand8afad612014-07-28 13:17:52 +00001478void Clang::AddPPCTargetArgs(const ArgList &Args,
1479 ArgStringList &CmdArgs) const {
1480 // Select the ABI to use.
1481 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001482 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001483 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001484 case llvm::Triple::ppc64: {
1485 // When targeting a processor that supports QPX, or if QPX is
1486 // specifically enabled, default to using the ABI that supports QPX (so
1487 // long as it is not specifically disabled).
1488 bool HasQPX = false;
1489 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1490 HasQPX = A->getValue() == StringRef("a2q");
1491 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1492 if (HasQPX) {
1493 ABIName = "elfv1-qpx";
1494 break;
1495 }
1496
Ulrich Weigand8afad612014-07-28 13:17:52 +00001497 ABIName = "elfv1";
1498 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001499 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001500 case llvm::Triple::ppc64le:
1501 ABIName = "elfv2";
1502 break;
1503 default:
1504 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001505 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001506
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001507 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1508 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1509 // the option if given as we don't have backend support for any targets
1510 // that don't use the altivec abi.
1511 if (StringRef(A->getValue()) != "altivec")
1512 ABIName = A->getValue();
1513
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001514 ppc::FloatABI FloatABI =
1515 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1516
1517 if (FloatABI == ppc::FloatABI::Soft) {
1518 // Floating point operations and argument passing are soft.
1519 CmdArgs.push_back("-msoft-float");
1520 CmdArgs.push_back("-mfloat-abi");
1521 CmdArgs.push_back("soft");
1522 } else {
1523 // Floating point operations and argument passing are hard.
1524 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1525 CmdArgs.push_back("-mfloat-abi");
1526 CmdArgs.push_back("hard");
1527 }
1528
Ulrich Weigand8afad612014-07-28 13:17:52 +00001529 if (ABIName) {
1530 CmdArgs.push_back("-target-abi");
1531 CmdArgs.push_back(ABIName);
1532 }
1533}
1534
1535bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1536 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1537 return A && (A->getValue() == StringRef(Value));
1538}
1539
Tom Stellard6674c702013-04-01 20:56:53 +00001540/// Get the (LLVM) name of the R600 gpu we are targeting.
1541static std::string getR600TargetGPU(const ArgList &Args) {
1542 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001543 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001544 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001545 .Cases("rv630", "rv635", "r600")
1546 .Cases("rv610", "rv620", "rs780", "rs880")
1547 .Case("rv740", "rv770")
1548 .Case("palm", "cedar")
1549 .Cases("sumo", "sumo2", "sumo")
1550 .Case("hemlock", "cypress")
1551 .Case("aruba", "cayman")
1552 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001553 }
1554 return "";
1555}
1556
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001557void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001558 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001559 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001560 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001561
James Y Knightb2406522015-06-15 20:51:24 +00001562 bool SoftFloatABI = false;
1563 if (Arg *A =
1564 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001565 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001566 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001567 }
1568
James Y Knightb2406522015-06-15 20:51:24 +00001569 // Only the hard-float ABI on Sparc is standardized, and it is the
1570 // default. GCC also supports a nonstandard soft-float ABI mode, and
1571 // perhaps LLVM should implement that, too. However, since llvm
1572 // currently does not support Sparc soft-float, at all, display an
1573 // error if it's requested.
1574 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001575 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1576 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001577 }
1578}
1579
Richard Sandiford4652d892013-07-19 16:51:51 +00001580static const char *getSystemZTargetCPU(const ArgList &Args) {
1581 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1582 return A->getValue();
1583 return "z10";
1584}
1585
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001586static void getSystemZTargetFeatures(const ArgList &Args,
1587 std::vector<const char *> &Features) {
1588 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001589 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001590 if (A->getOption().matches(options::OPT_mhtm))
1591 Features.push_back("+transactional-execution");
1592 else
1593 Features.push_back("-transactional-execution");
1594 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001595 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001596 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001597 if (A->getOption().matches(options::OPT_mvx))
1598 Features.push_back("+vector");
1599 else
1600 Features.push_back("-vector");
1601 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001602}
1603
Chandler Carruth953fb082013-01-13 11:46:33 +00001604static const char *getX86TargetCPU(const ArgList &Args,
1605 const llvm::Triple &Triple) {
1606 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001607 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001608 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 return "core-avx2";
1610
Chandler Carruth953fb082013-01-13 11:46:33 +00001611 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001612 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001613
1614 // FIXME: Reject attempts to use -march=native unless the target matches
1615 // the host.
1616 //
1617 // FIXME: We should also incorporate the detected target features for use
1618 // with -native.
1619 std::string CPU = llvm::sys::getHostCPUName();
1620 if (!CPU.empty() && CPU != "generic")
1621 return Args.MakeArgString(CPU);
1622 }
1623
Reid Kleckner3123eff2015-06-30 16:32:04 +00001624 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1625 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1626 StringRef Arch = A->getValue();
1627 const char *CPU;
1628 if (Triple.getArch() == llvm::Triple::x86) {
1629 CPU = llvm::StringSwitch<const char *>(Arch)
1630 .Case("IA32", "i386")
1631 .Case("SSE", "pentium3")
1632 .Case("SSE2", "pentium4")
1633 .Case("AVX", "sandybridge")
1634 .Case("AVX2", "haswell")
1635 .Default(nullptr);
1636 } else {
1637 CPU = llvm::StringSwitch<const char *>(Arch)
1638 .Case("AVX", "sandybridge")
1639 .Case("AVX2", "haswell")
1640 .Default(nullptr);
1641 }
1642 if (CPU)
1643 return CPU;
1644 }
1645
Chandler Carruth953fb082013-01-13 11:46:33 +00001646 // Select the default CPU if none was given (or detection failed).
1647
1648 if (Triple.getArch() != llvm::Triple::x86_64 &&
1649 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001650 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001651
1652 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1653
1654 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001655 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001656 if (Triple.getArchName() == "x86_64h")
1657 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001658 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001659 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001660
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001661 // Set up default CPU name for PS4 compilers.
1662 if (Triple.isPS4CPU())
1663 return "btver2";
1664
Alexey Bataev286d1b92014-01-31 04:07:13 +00001665 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001666 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001667 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001668
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001669 // Everything else goes to x86-64 in 64-bit mode.
1670 if (Is64Bit)
1671 return "x86-64";
1672
1673 switch (Triple.getOS()) {
1674 case llvm::Triple::FreeBSD:
1675 case llvm::Triple::NetBSD:
1676 case llvm::Triple::OpenBSD:
1677 return "i486";
1678 case llvm::Triple::Haiku:
1679 return "i586";
1680 case llvm::Triple::Bitrig:
1681 return "i686";
1682 default:
1683 // Fallback to p4.
1684 return "pentium4";
1685 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001686}
1687
Dan Gohmanc2853072015-09-03 22:51:53 +00001688/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1689static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1690 // If we have -mcpu=, use that.
1691 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1692 StringRef CPU = A->getValue();
1693
1694#ifdef __wasm__
1695 // Handle "native" by examining the host. "native" isn't meaningful when
1696 // cross compiling, so only support this when the host is also WebAssembly.
1697 if (CPU == "native")
1698 return llvm::sys::getHostCPUName();
1699#endif
1700
1701 return CPU;
1702 }
1703
1704 return "generic";
1705}
1706
Renato Golin7c542b42015-07-27 23:44:45 +00001707static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1708 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001709 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001710 default:
1711 return "";
1712
Amara Emerson703da2e2013-10-31 09:32:33 +00001713 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001714 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001715 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001716
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001717 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001718 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001719 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001720 case llvm::Triple::thumbeb: {
1721 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001722 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001723 return arm::getARMTargetCPU(MCPU, MArch, T);
1724 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001725 case llvm::Triple::mips:
1726 case llvm::Triple::mipsel:
1727 case llvm::Triple::mips64:
1728 case llvm::Triple::mips64el: {
1729 StringRef CPUName;
1730 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001731 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001732 return CPUName;
1733 }
1734
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001735 case llvm::Triple::nvptx:
1736 case llvm::Triple::nvptx64:
1737 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1738 return A->getValue();
1739 return "";
1740
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001741 case llvm::Triple::ppc:
1742 case llvm::Triple::ppc64:
1743 case llvm::Triple::ppc64le: {
1744 std::string TargetCPUName = getPPCTargetCPU(Args);
1745 // LLVM may default to generating code for the native CPU,
1746 // but, like gcc, we default to a more generic option for
1747 // each architecture. (except on Darwin)
1748 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1749 if (T.getArch() == llvm::Triple::ppc64)
1750 TargetCPUName = "ppc64";
1751 else if (T.getArch() == llvm::Triple::ppc64le)
1752 TargetCPUName = "ppc64le";
1753 else
1754 TargetCPUName = "ppc";
1755 }
1756 return TargetCPUName;
1757 }
1758
1759 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001760 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001761 case llvm::Triple::sparcv9:
1762 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001763 return A->getValue();
1764 return "";
1765
1766 case llvm::Triple::x86:
1767 case llvm::Triple::x86_64:
1768 return getX86TargetCPU(Args, T);
1769
1770 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001771 return "hexagon" +
1772 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001773
1774 case llvm::Triple::systemz:
1775 return getSystemZTargetCPU(Args);
1776
1777 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001778 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001779 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001780
1781 case llvm::Triple::wasm32:
1782 case llvm::Triple::wasm64:
1783 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001784 }
1785}
1786
Alp Tokerce365ca2013-12-02 12:43:03 +00001787static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001788 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001789 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1790 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1791 // forward.
1792 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001793 std::string Plugin =
1794 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001795 CmdArgs.push_back(Args.MakeArgString(Plugin));
1796
1797 // Try to pass driver level flags relevant to LTO code generation down to
1798 // the plugin.
1799
1800 // Handle flags for selecting CPU variants.
1801 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1802 if (!CPU.empty())
1803 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001804
James Molloyf97fdae2015-12-21 10:44:36 +00001805 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1806 StringRef OOpt;
1807 if (A->getOption().matches(options::OPT_O4) ||
1808 A->getOption().matches(options::OPT_Ofast))
1809 OOpt = "3";
1810 else if (A->getOption().matches(options::OPT_O))
1811 OOpt = A->getValue();
1812 else if (A->getOption().matches(options::OPT_O0))
1813 OOpt = "0";
1814 if (!OOpt.empty())
1815 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1816 }
1817
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001818 if (IsThinLTO)
1819 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001820}
1821
Sanjay Patel2987c292015-06-11 14:53:41 +00001822/// This is a helper function for validating the optional refinement step
1823/// parameter in reciprocal argument strings. Return false if there is an error
1824/// parsing the refinement step. Otherwise, return true and set the Position
1825/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001826static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001827 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001828 const char RefinementStepToken = ':';
1829 Position = In.find(RefinementStepToken);
1830 if (Position != StringRef::npos) {
1831 StringRef Option = A.getOption().getName();
1832 StringRef RefStep = In.substr(Position + 1);
1833 // Allow exactly one numeric character for the additional refinement
1834 // step parameter. This is reasonable for all currently-supported
1835 // operations and architectures because we would expect that a larger value
1836 // of refinement steps would cause the estimate "optimization" to
1837 // under-perform the native operation. Also, if the estimate does not
1838 // converge quickly, it probably will not ever converge, so further
1839 // refinement steps will not produce a better answer.
1840 if (RefStep.size() != 1) {
1841 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1842 return false;
1843 }
1844 char RefStepChar = RefStep[0];
1845 if (RefStepChar < '0' || RefStepChar > '9') {
1846 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1847 return false;
1848 }
1849 }
1850 return true;
1851}
1852
1853/// The -mrecip flag requires processing of many optional parameters.
1854static void ParseMRecip(const Driver &D, const ArgList &Args,
1855 ArgStringList &OutStrings) {
1856 StringRef DisabledPrefixIn = "!";
1857 StringRef DisabledPrefixOut = "!";
1858 StringRef EnabledPrefixOut = "";
1859 StringRef Out = "-mrecip=";
1860
1861 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1862 if (!A)
1863 return;
1864
1865 unsigned NumOptions = A->getNumValues();
1866 if (NumOptions == 0) {
1867 // No option is the same as "all".
1868 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1869 return;
1870 }
1871
1872 // Pass through "all", "none", or "default" with an optional refinement step.
1873 if (NumOptions == 1) {
1874 StringRef Val = A->getValue(0);
1875 size_t RefStepLoc;
1876 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1877 return;
1878 StringRef ValBase = Val.slice(0, RefStepLoc);
1879 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1880 OutStrings.push_back(Args.MakeArgString(Out + Val));
1881 return;
1882 }
1883 }
1884
1885 // Each reciprocal type may be enabled or disabled individually.
1886 // Check each input value for validity, concatenate them all back together,
1887 // and pass through.
1888
1889 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001890 OptionStrings.insert(std::make_pair("divd", false));
1891 OptionStrings.insert(std::make_pair("divf", false));
1892 OptionStrings.insert(std::make_pair("vec-divd", false));
1893 OptionStrings.insert(std::make_pair("vec-divf", false));
1894 OptionStrings.insert(std::make_pair("sqrtd", false));
1895 OptionStrings.insert(std::make_pair("sqrtf", false));
1896 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1897 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001898
1899 for (unsigned i = 0; i != NumOptions; ++i) {
1900 StringRef Val = A->getValue(i);
1901
1902 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1903 // Ignore the disablement token for string matching.
1904 if (IsDisabled)
1905 Val = Val.substr(1);
1906
1907 size_t RefStep;
1908 if (!getRefinementStep(Val, D, *A, RefStep))
1909 return;
1910
1911 StringRef ValBase = Val.slice(0, RefStep);
1912 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1913 if (OptionIter == OptionStrings.end()) {
1914 // Try again specifying float suffix.
1915 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1916 if (OptionIter == OptionStrings.end()) {
1917 // The input name did not match any known option string.
1918 D.Diag(diag::err_drv_unknown_argument) << Val;
1919 return;
1920 }
1921 // The option was specified without a float or double suffix.
1922 // Make sure that the double entry was not already specified.
1923 // The float entry will be checked below.
1924 if (OptionStrings[ValBase.str() + 'd']) {
1925 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1926 return;
1927 }
1928 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929
Sanjay Patel2987c292015-06-11 14:53:41 +00001930 if (OptionIter->second == true) {
1931 // Duplicate option specified.
1932 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1933 return;
1934 }
1935
1936 // Mark the matched option as found. Do not allow duplicate specifiers.
1937 OptionIter->second = true;
1938
1939 // If the precision was not specified, also mark the double entry as found.
1940 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1941 OptionStrings[ValBase.str() + 'd'] = true;
1942
1943 // Build the output string.
1944 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1945 Out = Args.MakeArgString(Out + Prefix + Val);
1946 if (i != NumOptions - 1)
1947 Out = Args.MakeArgString(Out + ",");
1948 }
1949
1950 OutStrings.push_back(Args.MakeArgString(Out));
1951}
1952
Eric Christopherc54920a2015-03-23 19:26:05 +00001953static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001954 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001955 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001956 // If -march=native, autodetect the feature list.
1957 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1958 if (StringRef(A->getValue()) == "native") {
1959 llvm::StringMap<bool> HostFeatures;
1960 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1961 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001962 Features.push_back(
1963 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001964 }
1965 }
1966
Jim Grosbach82eee262013-11-16 00:53:35 +00001967 if (Triple.getArchName() == "x86_64h") {
1968 // x86_64h implies quite a few of the more modern subtarget features
1969 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1970 Features.push_back("-rdrnd");
1971 Features.push_back("-aes");
1972 Features.push_back("-pclmul");
1973 Features.push_back("-rtm");
1974 Features.push_back("-hle");
1975 Features.push_back("-fsgsbase");
1976 }
1977
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001978 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001979 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001980 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001981 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001982 Features.push_back("+sse4.2");
1983 Features.push_back("+popcnt");
1984 } else
1985 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001986 }
1987
Eric Christopherc54920a2015-03-23 19:26:05 +00001988 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001989 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1990 StringRef Arch = A->getValue();
1991 bool ArchUsed = false;
1992 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001993 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001994 if (Arch == "AVX" || Arch == "AVX2") {
1995 ArchUsed = true;
1996 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1997 }
1998 }
1999 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002000 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002001 if (Arch == "IA32") {
2002 ArchUsed = true;
2003 } else if (Arch == "SSE" || Arch == "SSE2") {
2004 ArchUsed = true;
2005 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2006 }
2007 }
2008 if (!ArchUsed)
2009 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2010 }
2011
Jim Grosbach82eee262013-11-16 00:53:35 +00002012 // Now add any that the user explicitly requested on the command line,
2013 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002014 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002015}
2016
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002017void Clang::AddX86TargetArgs(const ArgList &Args,
2018 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002019 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002020 Args.hasArg(options::OPT_mkernel) ||
2021 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002022 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002023
Bob Wilson2616e2e2013-02-10 16:01:41 +00002024 // Default to avoid implicit floating-point for kernel/kext code, but allow
2025 // that to be overridden with -mno-soft-float.
2026 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2027 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002028 if (Arg *A = Args.getLastArg(
2029 options::OPT_msoft_float, options::OPT_mno_soft_float,
2030 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002031 const Option &O = A->getOption();
2032 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2033 O.matches(options::OPT_msoft_float));
2034 }
2035 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002036 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002037
2038 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2039 StringRef Value = A->getValue();
2040 if (Value == "intel" || Value == "att") {
2041 CmdArgs.push_back("-mllvm");
2042 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2043 } else {
2044 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2045 << A->getOption().getName() << Value;
2046 }
2047 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002048}
2049
Tony Linthicum76329bf2011-12-12 21:14:55 +00002050void Clang::AddHexagonTargetArgs(const ArgList &Args,
2051 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002052 CmdArgs.push_back("-mqdsp6-compat");
2053 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002054
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002055 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2056 std::string N = llvm::utostr(G.getValue());
2057 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002058 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002059 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002060 }
2061
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002062 if (!Args.hasArg(options::OPT_fno_short_enums))
2063 CmdArgs.push_back("-fshort-enums");
2064 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002065 CmdArgs.push_back("-mllvm");
2066 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002067 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002068 CmdArgs.push_back("-mllvm");
2069 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002070}
2071
Dan Gohmane3d71e12016-01-07 01:00:21 +00002072void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2073 ArgStringList &CmdArgs) const {
2074 // Default to "hidden" visibility.
2075 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2076 options::OPT_fvisibility_ms_compat)) {
2077 CmdArgs.push_back("-fvisibility");
2078 CmdArgs.push_back("hidden");
2079 }
2080}
2081
Kevin Qin110db6f2014-07-18 07:03:22 +00002082// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002083static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002084 std::vector<const char *> &Features) {
2085 SmallVector<StringRef, 8> Split;
2086 text.split(Split, StringRef("+"), -1, false);
2087
Benjamin Kramer72e64312015-09-24 14:48:49 +00002088 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002089 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002090 .Case("fp", "+fp-armv8")
2091 .Case("simd", "+neon")
2092 .Case("crc", "+crc")
2093 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002094 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002095 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002096 .Case("nofp", "-fp-armv8")
2097 .Case("nosimd", "-neon")
2098 .Case("nocrc", "-crc")
2099 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002100 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002101 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002102 .Default(nullptr);
2103 if (result)
2104 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002105 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002106 D.Diag(diag::err_drv_no_neon_modifier);
2107 else
2108 return false;
2109 }
2110 return true;
2111}
2112
2113// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2114// decode CPU and feature.
2115static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2116 std::vector<const char *> &Features) {
2117 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2118 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002119 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
MinSeong Kim50d9c152016-01-05 12:53:24 +00002120 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002121 Features.push_back("+neon");
2122 Features.push_back("+crc");
2123 Features.push_back("+crypto");
2124 } else if (CPU == "generic") {
2125 Features.push_back("+neon");
2126 } else {
2127 return false;
2128 }
2129
2130 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2131 return false;
2132
2133 return true;
2134}
2135
2136static bool
2137getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2138 const ArgList &Args,
2139 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002140 std::string MarchLowerCase = March.lower();
2141 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002142
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002143 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002144 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002145 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002146 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002147 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2148 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002149 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002150 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002151 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002152
2153 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2154 return false;
2155
2156 return true;
2157}
2158
2159static bool
2160getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2161 const ArgList &Args,
2162 std::vector<const char *> &Features) {
2163 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002164 std::string McpuLowerCase = Mcpu.lower();
2165 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002166 return false;
2167
2168 return true;
2169}
2170
2171static bool
2172getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2173 const ArgList &Args,
2174 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002175 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002176 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002177 if (MtuneLowerCase == "native")
2178 MtuneLowerCase = llvm::sys::getHostCPUName();
2179 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002180 Features.push_back("+zcm");
2181 Features.push_back("+zcz");
2182 }
2183 return true;
2184}
2185
2186static bool
2187getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2188 const ArgList &Args,
2189 std::vector<const char *> &Features) {
2190 StringRef CPU;
2191 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002192 std::string McpuLowerCase = Mcpu.lower();
2193 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002194 return false;
2195
2196 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2197}
2198
Justin Bognerf9052562015-11-13 23:07:31 +00002199static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002200 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002201 Arg *A;
2202 bool success = true;
2203 // Enable NEON by default.
2204 Features.push_back("+neon");
2205 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2206 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2207 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2208 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002209 else if (Args.hasArg(options::OPT_arch))
2210 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2211 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002212
2213 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2214 success =
2215 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2216 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2217 success =
2218 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002219 else if (Args.hasArg(options::OPT_arch))
2220 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2221 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002222
2223 if (!success)
2224 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002225
2226 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2227 Features.push_back("-fp-armv8");
2228 Features.push_back("-crypto");
2229 Features.push_back("-neon");
2230 }
Bradley Smith418c5932014-05-02 15:17:51 +00002231
2232 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002233 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002234 if (A->getOption().matches(options::OPT_mcrc))
2235 Features.push_back("+crc");
2236 else
2237 Features.push_back("-crc");
2238 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002239
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002240 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2241 options::OPT_munaligned_access))
2242 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2243 Features.push_back("+strict-align");
2244
Justin Bognerf9052562015-11-13 23:07:31 +00002245 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002246 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002247}
2248
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002249static void getHexagonTargetFeatures(const ArgList &Args,
2250 std::vector<const char *> &Features) {
2251 bool HasHVX = false, HasHVXD = false;
2252
Eric Christopher49062a52015-12-22 03:12:34 +00002253 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2254 // doing dependent option handling here rather than in initFeatureMap or a
2255 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002256 for (auto &A : Args) {
2257 auto &Opt = A->getOption();
2258 if (Opt.matches(options::OPT_mhexagon_hvx))
2259 HasHVX = true;
2260 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2261 HasHVXD = HasHVX = false;
2262 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2263 HasHVXD = HasHVX = true;
2264 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2265 HasHVXD = false;
2266 else
2267 continue;
2268 A->claim();
2269 }
2270
2271 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2272 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2273}
2274
Dan Gohmanc2853072015-09-03 22:51:53 +00002275static void getWebAssemblyTargetFeatures(const ArgList &Args,
2276 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002277 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002278}
2279
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002280static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002281 const ArgList &Args, ArgStringList &CmdArgs,
2282 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002283 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002284 std::vector<const char *> Features;
2285 switch (Triple.getArch()) {
2286 default:
2287 break;
2288 case llvm::Triple::mips:
2289 case llvm::Triple::mipsel:
2290 case llvm::Triple::mips64:
2291 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002292 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002293 break;
2294
2295 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002296 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002297 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002298 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002299 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002300 break;
2301
2302 case llvm::Triple::ppc:
2303 case llvm::Triple::ppc64:
2304 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002305 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002306 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002307 case llvm::Triple::systemz:
2308 getSystemZTargetFeatures(Args, Features);
2309 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002310 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002311 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002312 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002313 break;
2314 case llvm::Triple::x86:
2315 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002316 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002317 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002318 case llvm::Triple::hexagon:
2319 getHexagonTargetFeatures(Args, Features);
2320 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002321 case llvm::Triple::wasm32:
2322 case llvm::Triple::wasm64:
2323 getWebAssemblyTargetFeatures(Args, Features);
2324 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002325 }
Rafael Espindola43964802013-08-21 17:34:32 +00002326
2327 // Find the last of each feature.
2328 llvm::StringMap<unsigned> LastOpt;
2329 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2330 const char *Name = Features[I];
2331 assert(Name[0] == '-' || Name[0] == '+');
2332 LastOpt[Name + 1] = I;
2333 }
2334
2335 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2336 // If this feature was overridden, ignore it.
2337 const char *Name = Features[I];
2338 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2339 assert(LastI != LastOpt.end());
2340 unsigned Last = LastI->second;
2341 if (Last != I)
2342 continue;
2343
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002344 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002345 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002346 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002347}
2348
David Majnemerae394812014-12-09 00:12:30 +00002349static bool
2350shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2351 const llvm::Triple &Triple) {
2352 // We use the zero-cost exception tables for Objective-C if the non-fragile
2353 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2354 // later.
2355 if (runtime.isNonFragile())
2356 return true;
2357
2358 if (!Triple.isMacOSX())
2359 return false;
2360
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002361 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002362 (Triple.getArch() == llvm::Triple::x86_64 ||
2363 Triple.getArch() == llvm::Triple::arm));
2364}
2365
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002366/// Adds exception related arguments to the driver command arguments. There's a
2367/// master flag, -fexceptions and also language specific flags to enable/disable
2368/// C++ and Objective-C exceptions. This makes it possible to for example
2369/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002370static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002371 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002372 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002373 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002374 const Driver &D = TC.getDriver();
2375 const llvm::Triple &Triple = TC.getTriple();
2376
Chad Rosier4fab82c2012-03-26 22:04:46 +00002377 if (KernelOrKext) {
2378 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2379 // arguments now to avoid warnings about unused arguments.
2380 Args.ClaimAllArgs(options::OPT_fexceptions);
2381 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2382 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2383 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2384 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2385 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002386 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002387 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002388
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002389 // See if the user explicitly enabled exceptions.
2390 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2391 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002392
David Majnemerae394812014-12-09 00:12:30 +00002393 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2394 // is not necessarily sensible, but follows GCC.
2395 if (types::isObjC(InputType) &&
2396 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002397 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002398 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002399
David Majnemerae394812014-12-09 00:12:30 +00002400 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002401 }
2402
2403 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002404 // Disable C++ EH by default on XCore, PS4, and MSVC.
2405 // FIXME: Remove MSVC from this list once things work.
2406 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2407 !Triple.isPS4CPU() &&
2408 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002409 Arg *ExceptionArg = Args.getLastArg(
2410 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2411 options::OPT_fexceptions, options::OPT_fno_exceptions);
2412 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002413 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002414 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2415 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002416
2417 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002418 if (Triple.isPS4CPU()) {
2419 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2420 assert(ExceptionArg &&
2421 "On the PS4 exceptions should only be enabled if passing "
2422 "an argument");
2423 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2424 const Arg *RTTIArg = TC.getRTTIArg();
2425 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2426 D.Diag(diag::err_drv_argument_not_allowed_with)
2427 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2428 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2429 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2430 } else
2431 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2432
Anders Carlssone96ab552011-02-28 02:27:16 +00002433 CmdArgs.push_back("-fcxx-exceptions");
2434
David Majnemer8de68642014-12-05 08:11:58 +00002435 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002436 }
2437 }
2438
David Majnemer8de68642014-12-05 08:11:58 +00002439 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002440 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002441}
2442
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002443static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002444 bool Default = true;
2445 if (TC.getTriple().isOSDarwin()) {
2446 // The native darwin assembler doesn't support the linker_option directives,
2447 // so we disable them if we think the .s file will be passed to it.
2448 Default = TC.useIntegratedAs();
2449 }
2450 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2451 Default);
2452}
2453
Ted Kremenek62093662013-03-12 17:02:12 +00002454static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2455 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002456 bool UseDwarfDirectory =
2457 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2458 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002459 return !UseDwarfDirectory;
2460}
2461
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002462/// \brief Check whether the given input tree contains any compilation actions.
2463static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002464 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002465 return true;
2466
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002467 for (const auto &Act : *A)
2468 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002469 return true;
2470
2471 return false;
2472}
2473
2474/// \brief Check if -relax-all should be passed to the internal assembler.
2475/// This is done by default when compiling non-assembler source with -O0.
2476static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2477 bool RelaxDefault = true;
2478
2479 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2480 RelaxDefault = A->getOption().matches(options::OPT_O0);
2481
2482 if (RelaxDefault) {
2483 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002484 for (const auto &Act : C.getActions()) {
2485 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002486 RelaxDefault = true;
2487 break;
2488 }
2489 }
2490 }
2491
2492 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002493 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002494}
2495
Paul Robinson0334a042015-12-19 19:41:48 +00002496// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2497// to the corresponding DebugInfoKind.
2498static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
2499 assert(A.getOption().matches(options::OPT_gN_Group) &&
2500 "Not a -g option that specifies a debug-info level");
2501 if (A.getOption().matches(options::OPT_g0) ||
2502 A.getOption().matches(options::OPT_ggdb0))
2503 return CodeGenOptions::NoDebugInfo;
2504 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2505 A.getOption().matches(options::OPT_ggdb1))
2506 return CodeGenOptions::DebugLineTablesOnly;
2507 return CodeGenOptions::LimitedDebugInfo;
2508}
2509
Douglas Katzman3459ce22015-10-08 04:24:12 +00002510// Extract the integer N from a string spelled "-dwarf-N", returning 0
2511// on mismatch. The StringRef input (rather than an Arg) allows
2512// for use by the "-Xassembler" option parser.
2513static unsigned DwarfVersionNum(StringRef ArgValue) {
2514 return llvm::StringSwitch<unsigned>(ArgValue)
2515 .Case("-gdwarf-2", 2)
2516 .Case("-gdwarf-3", 3)
2517 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002518 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002519 .Default(0);
2520}
2521
2522static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2523 CodeGenOptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002524 unsigned DwarfVersion,
2525 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002526 switch (DebugInfoKind) {
2527 case CodeGenOptions::DebugLineTablesOnly:
2528 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2529 break;
2530 case CodeGenOptions::LimitedDebugInfo:
2531 CmdArgs.push_back("-debug-info-kind=limited");
2532 break;
2533 case CodeGenOptions::FullDebugInfo:
2534 CmdArgs.push_back("-debug-info-kind=standalone");
2535 break;
2536 default:
2537 break;
2538 }
2539 if (DwarfVersion > 0)
2540 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002541 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002542 switch (DebuggerTuning) {
2543 case llvm::DebuggerKind::GDB:
2544 CmdArgs.push_back("-debugger-tuning=gdb");
2545 break;
2546 case llvm::DebuggerKind::LLDB:
2547 CmdArgs.push_back("-debugger-tuning=lldb");
2548 break;
2549 case llvm::DebuggerKind::SCE:
2550 CmdArgs.push_back("-debugger-tuning=sce");
2551 break;
2552 default:
2553 break;
2554 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002555}
2556
David Blaikie9260ed62013-07-25 21:19:01 +00002557static void CollectArgsForIntegratedAssembler(Compilation &C,
2558 const ArgList &Args,
2559 ArgStringList &CmdArgs,
2560 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002561 if (UseRelaxAll(C, Args))
2562 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002563
David Majnemer2b9349d2015-12-21 22:09:34 +00002564 // Only default to -mincremental-linker-compatible if we think we are
2565 // targeting the MSVC linker.
2566 bool DefaultIncrementalLinkerCompatible =
2567 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2568 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2569 options::OPT_mno_incremental_linker_compatible,
2570 DefaultIncrementalLinkerCompatible))
2571 CmdArgs.push_back("-mincremental-linker-compatible");
2572
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002573 // When passing -I arguments to the assembler we sometimes need to
2574 // unconditionally take the next argument. For example, when parsing
2575 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2576 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2577 // arg after parsing the '-I' arg.
2578 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002580 // When using an integrated assembler, translate -Wa, and -Xassembler
2581 // options.
2582 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002583 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002584 for (const Arg *A :
2585 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2586 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002587
Benjamin Kramer72e64312015-09-24 14:48:49 +00002588 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002589 if (TakeNextArg) {
2590 CmdArgs.push_back(Value.data());
2591 TakeNextArg = false;
2592 continue;
2593 }
David Blaikie9260ed62013-07-25 21:19:01 +00002594
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002595 switch (C.getDefaultToolChain().getArch()) {
2596 default:
2597 break;
2598 case llvm::Triple::mips:
2599 case llvm::Triple::mipsel:
2600 case llvm::Triple::mips64:
2601 case llvm::Triple::mips64el:
2602 if (Value == "--trap") {
2603 CmdArgs.push_back("-target-feature");
2604 CmdArgs.push_back("+use-tcc-in-div");
2605 continue;
2606 }
2607 if (Value == "--break") {
2608 CmdArgs.push_back("-target-feature");
2609 CmdArgs.push_back("-use-tcc-in-div");
2610 continue;
2611 }
2612 if (Value.startswith("-msoft-float")) {
2613 CmdArgs.push_back("-target-feature");
2614 CmdArgs.push_back("+soft-float");
2615 continue;
2616 }
2617 if (Value.startswith("-mhard-float")) {
2618 CmdArgs.push_back("-target-feature");
2619 CmdArgs.push_back("-soft-float");
2620 continue;
2621 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002622
2623 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2624 .Case("-mips1", "+mips1")
2625 .Case("-mips2", "+mips2")
2626 .Case("-mips3", "+mips3")
2627 .Case("-mips4", "+mips4")
2628 .Case("-mips5", "+mips5")
2629 .Case("-mips32", "+mips32")
2630 .Case("-mips32r2", "+mips32r2")
2631 .Case("-mips32r3", "+mips32r3")
2632 .Case("-mips32r5", "+mips32r5")
2633 .Case("-mips32r6", "+mips32r6")
2634 .Case("-mips64", "+mips64")
2635 .Case("-mips64r2", "+mips64r2")
2636 .Case("-mips64r3", "+mips64r3")
2637 .Case("-mips64r5", "+mips64r5")
2638 .Case("-mips64r6", "+mips64r6")
2639 .Default(nullptr);
2640 if (MipsTargetFeature)
2641 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002642 }
2643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002644 if (Value == "-force_cpusubtype_ALL") {
2645 // Do nothing, this is the default and we don't support anything else.
2646 } else if (Value == "-L") {
2647 CmdArgs.push_back("-msave-temp-labels");
2648 } else if (Value == "--fatal-warnings") {
2649 CmdArgs.push_back("-massembler-fatal-warnings");
2650 } else if (Value == "--noexecstack") {
2651 CmdArgs.push_back("-mnoexecstack");
2652 } else if (Value == "-compress-debug-sections" ||
2653 Value == "--compress-debug-sections") {
2654 CompressDebugSections = true;
2655 } else if (Value == "-nocompress-debug-sections" ||
2656 Value == "--nocompress-debug-sections") {
2657 CompressDebugSections = false;
2658 } else if (Value.startswith("-I")) {
2659 CmdArgs.push_back(Value.data());
2660 // We need to consume the next argument if the current arg is a plain
2661 // -I. The next arg will be the include directory.
2662 if (Value == "-I")
2663 TakeNextArg = true;
2664 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002665 // "-gdwarf-N" options are not cc1as options.
2666 unsigned DwarfVersion = DwarfVersionNum(Value);
2667 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2668 CmdArgs.push_back(Value.data());
2669 } else {
2670 RenderDebugEnablingArgs(
Paul Robinson0334a042015-12-19 19:41:48 +00002671 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
2672 llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002673 }
Renato Golin7c542b42015-07-27 23:44:45 +00002674 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2675 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2676 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002677 } else {
2678 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002679 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002680 }
2681 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002682 }
2683 if (CompressDebugSections) {
2684 if (llvm::zlib::isAvailable())
2685 CmdArgs.push_back("-compress-debug-sections");
2686 else
2687 D.Diag(diag::warn_debug_compression_unavailable);
2688 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002689 if (MipsTargetFeature != nullptr) {
2690 CmdArgs.push_back("-target-feature");
2691 CmdArgs.push_back(MipsTargetFeature);
2692 }
David Blaikie9260ed62013-07-25 21:19:01 +00002693}
2694
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002695// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002696// FIXME: Make sure we can also emit shared objects if they're requested
2697// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002698static void addClangRT(const ToolChain &TC, const ArgList &Args,
2699 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002700 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002701}
2702
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002703namespace {
2704enum OpenMPRuntimeKind {
2705 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2706 /// without knowing what runtime to target.
2707 OMPRT_Unknown,
2708
2709 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2710 /// the default for Clang.
2711 OMPRT_OMP,
2712
2713 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2714 /// this runtime but can swallow the pragmas, and find and link against the
2715 /// runtime library itself.
2716 OMPRT_GOMP,
2717
Chandler Carruthc6625c62015-05-28 21:10:31 +00002718 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002719 /// OpenMP runtime. We support this mode for users with existing dependencies
2720 /// on this runtime library name.
2721 OMPRT_IOMP5
2722};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002723}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002724
2725/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002726static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2727 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002728 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2729
2730 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2731 if (A)
2732 RuntimeName = A->getValue();
2733
2734 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002735 .Case("libomp", OMPRT_OMP)
2736 .Case("libgomp", OMPRT_GOMP)
2737 .Case("libiomp5", OMPRT_IOMP5)
2738 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002739
2740 if (RT == OMPRT_Unknown) {
2741 if (A)
2742 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002743 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002744 else
2745 // FIXME: We could use a nicer diagnostic here.
2746 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2747 }
2748
2749 return RT;
2750}
2751
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002752static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2753 const ArgList &Args) {
2754 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2755 options::OPT_fno_openmp, false))
2756 return;
2757
2758 switch (getOpenMPRuntime(TC, Args)) {
2759 case OMPRT_OMP:
2760 CmdArgs.push_back("-lomp");
2761 break;
2762 case OMPRT_GOMP:
2763 CmdArgs.push_back("-lgomp");
2764 break;
2765 case OMPRT_IOMP5:
2766 CmdArgs.push_back("-liomp5");
2767 break;
2768 case OMPRT_Unknown:
2769 // Already diagnosed.
2770 break;
2771 }
2772}
2773
Alexey Samsonov52550342014-09-15 19:58:40 +00002774static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2775 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002776 bool IsShared, bool IsWhole) {
2777 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002778 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002779 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002780 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002781 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002782}
2783
Alexey Samsonov52550342014-09-15 19:58:40 +00002784// Tries to use a file with the list of dynamic symbols that need to be exported
2785// from the runtime library. Returns true if the file was found.
2786static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2787 ArgStringList &CmdArgs,
2788 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002789 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002790 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2791 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002792 return true;
2793 }
2794 return false;
2795}
2796
2797static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2798 ArgStringList &CmdArgs) {
2799 // Force linking against the system libraries sanitizers depends on
2800 // (see PR15823 why this is necessary).
2801 CmdArgs.push_back("--no-as-needed");
2802 CmdArgs.push_back("-lpthread");
2803 CmdArgs.push_back("-lrt");
2804 CmdArgs.push_back("-lm");
2805 // There's no libdl on FreeBSD.
2806 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2807 CmdArgs.push_back("-ldl");
2808}
2809
2810static void
2811collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2812 SmallVectorImpl<StringRef> &SharedRuntimes,
2813 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002814 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2815 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2816 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002817 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2818 // Collect shared runtimes.
2819 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2820 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002821 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002822 // The stats_client library is also statically linked into DSOs.
2823 if (SanArgs.needsStatsRt())
2824 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002825
Alexey Samsonov52550342014-09-15 19:58:40 +00002826 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002827 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002828 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002829 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002830 }
2831 if (SanArgs.needsAsanRt()) {
2832 if (SanArgs.needsSharedAsanRt()) {
2833 HelperStaticRuntimes.push_back("asan-preinit");
2834 } else {
2835 StaticRuntimes.push_back("asan");
2836 if (SanArgs.linkCXXRuntimes())
2837 StaticRuntimes.push_back("asan_cxx");
2838 }
2839 }
2840 if (SanArgs.needsDfsanRt())
2841 StaticRuntimes.push_back("dfsan");
2842 if (SanArgs.needsLsanRt())
2843 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002844 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002845 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002846 if (SanArgs.linkCXXRuntimes())
2847 StaticRuntimes.push_back("msan_cxx");
2848 }
2849 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002850 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002851 if (SanArgs.linkCXXRuntimes())
2852 StaticRuntimes.push_back("tsan_cxx");
2853 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002854 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002855 StaticRuntimes.push_back("ubsan_standalone");
2856 if (SanArgs.linkCXXRuntimes())
2857 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002858 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002859 if (SanArgs.needsSafeStackRt())
2860 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002861 if (SanArgs.needsCfiRt())
2862 StaticRuntimes.push_back("cfi");
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002863 if (SanArgs.needsCfiDiagRt())
2864 StaticRuntimes.push_back("cfi_diag");
Peter Collingbournedc134532016-01-16 00:31:22 +00002865 if (SanArgs.needsStatsRt()) {
2866 NonWholeStaticRuntimes.push_back("stats");
2867 RequiredSymbols.push_back("__sanitizer_stats_register");
2868 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002869}
2870
Alexey Samsonov52550342014-09-15 19:58:40 +00002871// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2872// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2873static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002874 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002875 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002876 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002877 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002878 NonWholeStaticRuntimes, HelperStaticRuntimes,
2879 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002880 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002881 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002882 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002883 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002884 bool AddExportDynamic = false;
2885 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002886 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002887 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2888 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002889 for (auto RT : NonWholeStaticRuntimes) {
2890 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2891 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2892 }
2893 for (auto S : RequiredSymbols) {
2894 CmdArgs.push_back("-u");
2895 CmdArgs.push_back(Args.MakeArgString(S));
2896 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002897 // If there is a static runtime with no dynamic list, force all the symbols
2898 // to be dynamic to be sure we export sanitizer interface functions.
2899 if (AddExportDynamic)
2900 CmdArgs.push_back("-export-dynamic");
2901 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002902}
2903
Reid Kleckner86ea7702015-02-04 23:45:07 +00002904static bool areOptimizationsEnabled(const ArgList &Args) {
2905 // Find the last -O arg and see if it is non-zero.
2906 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2907 return !A->getOption().matches(options::OPT_O0);
2908 // Defaults to -O0.
2909 return false;
2910}
2911
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002912static bool shouldUseFramePointerForTarget(const ArgList &Args,
2913 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002914 switch (Triple.getArch()) {
2915 case llvm::Triple::xcore:
2916 case llvm::Triple::wasm32:
2917 case llvm::Triple::wasm64:
2918 // XCore never wants frame pointers, regardless of OS.
2919 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002920 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002921 default:
2922 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002923 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002924
2925 if (Triple.isOSLinux()) {
2926 switch (Triple.getArch()) {
2927 // Don't use a frame pointer on linux if optimizing for certain targets.
2928 case llvm::Triple::mips64:
2929 case llvm::Triple::mips64el:
2930 case llvm::Triple::mips:
2931 case llvm::Triple::mipsel:
2932 case llvm::Triple::systemz:
2933 case llvm::Triple::x86:
2934 case llvm::Triple::x86_64:
2935 return !areOptimizationsEnabled(Args);
2936 default:
2937 return true;
2938 }
2939 }
2940
2941 if (Triple.isOSWindows()) {
2942 switch (Triple.getArch()) {
2943 case llvm::Triple::x86:
2944 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002945 case llvm::Triple::arm:
2946 case llvm::Triple::thumb:
2947 // Windows on ARM builds with FPO disabled to aid fast stack walking
2948 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002949 default:
2950 // All other supported Windows ISAs use xdata unwind information, so frame
2951 // pointers are not generally useful.
2952 return false;
2953 }
2954 }
2955
2956 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002957}
2958
Rafael Espindola224dd632011-12-14 21:02:23 +00002959static bool shouldUseFramePointer(const ArgList &Args,
2960 const llvm::Triple &Triple) {
2961 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2962 options::OPT_fomit_frame_pointer))
2963 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002964 if (Args.hasArg(options::OPT_pg))
2965 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002966
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002967 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002968}
2969
Eric Christopherb7d97e92013-04-03 01:58:53 +00002970static bool shouldUseLeafFramePointer(const ArgList &Args,
2971 const llvm::Triple &Triple) {
2972 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2973 options::OPT_momit_leaf_frame_pointer))
2974 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002975 if (Args.hasArg(options::OPT_pg))
2976 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002977
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002978 if (Triple.isPS4CPU())
2979 return false;
2980
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002981 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002982}
2983
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002984/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002985static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002986 SmallString<128> cwd;
2987 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002988 CmdArgs.push_back("-fdebug-compilation-dir");
2989 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002990 }
2991}
2992
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002993static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002994 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2995 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2996 SmallString<128> T(FinalOutput->getValue());
2997 llvm::sys::path::replace_extension(T, "dwo");
2998 return Args.MakeArgString(T);
2999 } else {
3000 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003001 SmallString<128> T(
3002 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003003 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003004 llvm::sys::path::replace_extension(F, "dwo");
3005 T += F;
3006 return Args.MakeArgString(F);
3007 }
3008}
3009
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003010static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3011 const JobAction &JA, const ArgList &Args,
3012 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003013 ArgStringList ExtractArgs;
3014 ExtractArgs.push_back("--extract-dwo");
3015
3016 ArgStringList StripArgs;
3017 StripArgs.push_back("--strip-dwo");
3018
3019 // Grabbing the output of the earlier compile step.
3020 StripArgs.push_back(Output.getFilename());
3021 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003022 ExtractArgs.push_back(OutFile);
3023
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003024 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003025 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003026
3027 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003028 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003029
3030 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003031 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003032}
3033
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003034/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003035/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3036static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003037 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003038 if (A->getOption().matches(options::OPT_O4) ||
3039 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003040 return true;
3041
3042 if (A->getOption().matches(options::OPT_O0))
3043 return false;
3044
3045 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3046
Rafael Espindola91780de2013-08-26 14:05:41 +00003047 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003048 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003049 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003050 return true;
3051
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003052 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003053 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003054 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003055
3056 unsigned OptLevel = 0;
3057 if (S.getAsInteger(10, OptLevel))
3058 return false;
3059
3060 return OptLevel > 1;
3061 }
3062
3063 return false;
3064}
3065
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003066/// Add -x lang to \p CmdArgs for \p Input.
3067static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3068 ArgStringList &CmdArgs) {
3069 // When using -verify-pch, we don't want to provide the type
3070 // 'precompiled-header' if it was inferred from the file extension
3071 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3072 return;
3073
3074 CmdArgs.push_back("-x");
3075 if (Args.hasArg(options::OPT_rewrite_objc))
3076 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3077 else
3078 CmdArgs.push_back(types::getTypeName(Input.getType()));
3079}
3080
David Majnemerc371ff02015-03-22 08:39:22 +00003081static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003082 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003083 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003084
3085 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003086 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003087
3088 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003089 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003090 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003091 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003092}
3093
Rafael Espindola577637a2015-01-03 00:06:04 +00003094// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003095// options that build systems might add but are unused when assembling or only
3096// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003097static void claimNoWarnArgs(const ArgList &Args) {
3098 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003099 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003100 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003101 Args.ClaimAllArgs(options::OPT_flto);
3102 Args.ClaimAllArgs(options::OPT_fno_lto);
3103}
3104
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003105static void appendUserToPath(SmallVectorImpl<char> &Result) {
3106#ifdef LLVM_ON_UNIX
3107 const char *Username = getenv("LOGNAME");
3108#else
3109 const char *Username = getenv("USERNAME");
3110#endif
3111 if (Username) {
3112 // Validate that LoginName can be used in a path, and get its length.
3113 size_t Len = 0;
3114 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003115 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003116 Username = nullptr;
3117 break;
3118 }
3119 }
3120
3121 if (Username && Len > 0) {
3122 Result.append(Username, Username + Len);
3123 return;
3124 }
3125 }
3126
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003127// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003128#ifdef LLVM_ON_UNIX
3129 std::string UID = llvm::utostr(getuid());
3130#else
3131 // FIXME: Windows seems to have an 'SID' that might work.
3132 std::string UID = "9999";
3133#endif
3134 Result.append(UID.begin(), UID.end());
3135}
3136
David Majnemere11d3732015-06-08 00:22:46 +00003137VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3138 const llvm::Triple &Triple,
3139 const llvm::opt::ArgList &Args,
3140 bool IsWindowsMSVC) {
3141 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3142 IsWindowsMSVC) ||
3143 Args.hasArg(options::OPT_fmsc_version) ||
3144 Args.hasArg(options::OPT_fms_compatibility_version)) {
3145 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3146 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003147 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003148
3149 if (MSCVersion && MSCompatibilityVersion) {
3150 if (D)
3151 D->Diag(diag::err_drv_argument_not_allowed_with)
3152 << MSCVersion->getAsString(Args)
3153 << MSCompatibilityVersion->getAsString(Args);
3154 return VersionTuple();
3155 }
3156
3157 if (MSCompatibilityVersion) {
3158 VersionTuple MSVT;
3159 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3160 D->Diag(diag::err_drv_invalid_value)
3161 << MSCompatibilityVersion->getAsString(Args)
3162 << MSCompatibilityVersion->getValue();
3163 return MSVT;
3164 }
3165
3166 if (MSCVersion) {
3167 unsigned Version = 0;
3168 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3169 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3170 << MSCVersion->getValue();
3171 return getMSCompatibilityVersion(Version);
3172 }
3173
3174 unsigned Major, Minor, Micro;
3175 Triple.getEnvironmentVersion(Major, Minor, Micro);
3176 if (Major || Minor || Micro)
3177 return VersionTuple(Major, Minor, Micro);
3178
3179 return VersionTuple(18);
3180 }
3181 return VersionTuple();
3182}
3183
Diego Novilloa0545962015-07-10 18:00:07 +00003184static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3185 const InputInfo &Output, const ArgList &Args,
3186 ArgStringList &CmdArgs) {
3187 auto *ProfileGenerateArg = Args.getLastArg(
3188 options::OPT_fprofile_instr_generate,
3189 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003190 options::OPT_fprofile_generate_EQ,
3191 options::OPT_fno_profile_instr_generate);
3192 if (ProfileGenerateArg &&
3193 ProfileGenerateArg->getOption().matches(
3194 options::OPT_fno_profile_instr_generate))
3195 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003196
3197 auto *ProfileUseArg = Args.getLastArg(
3198 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003199 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3200 options::OPT_fno_profile_instr_use);
3201 if (ProfileUseArg &&
3202 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3203 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003204
3205 if (ProfileGenerateArg && ProfileUseArg)
3206 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003207 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003208
Diego Novillo758f3f52015-08-05 21:49:51 +00003209 if (ProfileGenerateArg) {
3210 if (ProfileGenerateArg->getOption().matches(
3211 options::OPT_fprofile_instr_generate_EQ))
3212 ProfileGenerateArg->render(Args, CmdArgs);
3213 else if (ProfileGenerateArg->getOption().matches(
3214 options::OPT_fprofile_generate_EQ)) {
3215 SmallString<128> Path(ProfileGenerateArg->getValue());
3216 llvm::sys::path::append(Path, "default.profraw");
3217 CmdArgs.push_back(
3218 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3219 } else
3220 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3221 }
Diego Novilloa0545962015-07-10 18:00:07 +00003222
Diego Novillo758f3f52015-08-05 21:49:51 +00003223 if (ProfileUseArg) {
3224 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3225 ProfileUseArg->render(Args, CmdArgs);
3226 else if ((ProfileUseArg->getOption().matches(
3227 options::OPT_fprofile_use_EQ) ||
3228 ProfileUseArg->getOption().matches(
3229 options::OPT_fprofile_instr_use))) {
3230 SmallString<128> Path(
3231 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3232 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3233 llvm::sys::path::append(Path, "default.profdata");
3234 CmdArgs.push_back(
3235 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3236 }
Diego Novilloa0545962015-07-10 18:00:07 +00003237 }
3238
3239 if (Args.hasArg(options::OPT_ftest_coverage) ||
3240 Args.hasArg(options::OPT_coverage))
3241 CmdArgs.push_back("-femit-coverage-notes");
3242 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3243 false) ||
3244 Args.hasArg(options::OPT_coverage))
3245 CmdArgs.push_back("-femit-coverage-data");
3246
Diego Novilloc4b94da2015-08-05 23:27:40 +00003247 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3248 options::OPT_fno_coverage_mapping, false) &&
3249 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003250 D.Diag(diag::err_drv_argument_only_allowed_with)
3251 << "-fcoverage-mapping"
3252 << "-fprofile-instr-generate";
3253
Diego Novilloc4b94da2015-08-05 23:27:40 +00003254 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3255 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003256 CmdArgs.push_back("-fcoverage-mapping");
3257
3258 if (C.getArgs().hasArg(options::OPT_c) ||
3259 C.getArgs().hasArg(options::OPT_S)) {
3260 if (Output.isFilename()) {
3261 CmdArgs.push_back("-coverage-file");
3262 SmallString<128> CoverageFilename;
3263 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3264 CoverageFilename = FinalOutput->getValue();
3265 } else {
3266 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3267 }
3268 if (llvm::sys::path::is_relative(CoverageFilename)) {
3269 SmallString<128> Pwd;
3270 if (!llvm::sys::fs::current_path(Pwd)) {
3271 llvm::sys::path::append(Pwd, CoverageFilename);
3272 CoverageFilename.swap(Pwd);
3273 }
3274 }
3275 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3276 }
3277 }
3278}
3279
Paul Robinsond083b9a2015-12-16 17:25:27 +00003280static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3281 ArgStringList &CmdArgs) {
3282 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3283 false) ||
3284 Args.hasFlag(options::OPT_fprofile_generate,
3285 options::OPT_fno_profile_instr_generate, false) ||
3286 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3287 options::OPT_fno_profile_instr_generate, false) ||
3288 Args.hasFlag(options::OPT_fprofile_instr_generate,
3289 options::OPT_fno_profile_instr_generate, false) ||
3290 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3291 options::OPT_fno_profile_instr_generate, false) ||
3292 Args.hasArg(options::OPT_fcreate_profile) ||
3293 Args.hasArg(options::OPT_coverage)))
3294 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3295}
3296
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003297/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3298/// smooshes them together with platform defaults, to decide whether
3299/// this compile should be using PIC mode or not. Returns a tuple of
3300/// (RelocationModel, PICLevel, IsPIE).
3301static std::tuple<llvm::Reloc::Model, unsigned, bool>
3302ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3303 const ArgList &Args) {
3304 // FIXME: why does this code...and so much everywhere else, use both
3305 // ToolChain.getTriple() and Triple?
3306 bool PIE = ToolChain.isPIEDefault();
3307 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003308 // The Darwin/MachO default to use PIC does not apply when using -static.
3309 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3310 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003311 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003312 bool IsPICLevelTwo = PIC;
3313
3314 bool KernelOrKext =
3315 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3316
3317 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003318 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003319 switch (ToolChain.getArch()) {
3320 case llvm::Triple::arm:
3321 case llvm::Triple::armeb:
3322 case llvm::Triple::thumb:
3323 case llvm::Triple::thumbeb:
3324 case llvm::Triple::aarch64:
3325 case llvm::Triple::mips:
3326 case llvm::Triple::mipsel:
3327 case llvm::Triple::mips64:
3328 case llvm::Triple::mips64el:
3329 PIC = true; // "-fpic"
3330 break;
3331
3332 case llvm::Triple::x86:
3333 case llvm::Triple::x86_64:
3334 PIC = true; // "-fPIC"
3335 IsPICLevelTwo = true;
3336 break;
3337
3338 default:
3339 break;
3340 }
3341 }
3342
3343 // OpenBSD-specific defaults for PIE
3344 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3345 switch (ToolChain.getArch()) {
3346 case llvm::Triple::mips64:
3347 case llvm::Triple::mips64el:
3348 case llvm::Triple::sparcel:
3349 case llvm::Triple::x86:
3350 case llvm::Triple::x86_64:
3351 IsPICLevelTwo = false; // "-fpie"
3352 break;
3353
3354 case llvm::Triple::ppc:
3355 case llvm::Triple::sparc:
3356 case llvm::Triple::sparcv9:
3357 IsPICLevelTwo = true; // "-fPIE"
3358 break;
3359
3360 default:
3361 break;
3362 }
3363 }
3364
3365 // The last argument relating to either PIC or PIE wins, and no
3366 // other argument is used. If the last argument is any flavor of the
3367 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3368 // option implicitly enables PIC at the same level.
3369 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3370 options::OPT_fpic, options::OPT_fno_pic,
3371 options::OPT_fPIE, options::OPT_fno_PIE,
3372 options::OPT_fpie, options::OPT_fno_pie);
3373 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3374 // is forced, then neither PIC nor PIE flags will have no effect.
3375 if (!ToolChain.isPICDefaultForced()) {
3376 if (LastPICArg) {
3377 Option O = LastPICArg->getOption();
3378 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3379 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3380 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3381 PIC =
3382 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3383 IsPICLevelTwo =
3384 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3385 } else {
3386 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003387 if (Triple.isPS4CPU()) {
3388 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3389 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3390 if (Model != "kernel") {
3391 PIC = true;
3392 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3393 << LastPICArg->getSpelling();
3394 }
3395 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003396 }
3397 }
3398 }
3399
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003400 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3401 // PIC level would've been set to level 1, force it back to level 2 PIC
3402 // instead.
3403 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003404 IsPICLevelTwo |= ToolChain.isPICDefault();
3405
James Y Knightc4015d32015-08-21 04:14:55 +00003406 // This kernel flags are a trump-card: they will disable PIC/PIE
3407 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003408 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3409 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003410 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003411
3412 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3413 // This is a very special mode. It trumps the other modes, almost no one
3414 // uses it, and it isn't even valid on any OS but Darwin.
3415 if (!ToolChain.getTriple().isOSDarwin())
3416 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3417 << A->getSpelling() << ToolChain.getTriple().str();
3418
3419 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3420
3421 // Only a forced PIC mode can cause the actual compile to have PIC defines
3422 // etc., no flags are sufficient. This behavior was selected to closely
3423 // match that of llvm-gcc and Apple GCC before that.
3424 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3425
3426 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3427 }
3428
3429 if (PIC)
3430 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3431
3432 return std::make_tuple(llvm::Reloc::Static, 0, false);
3433}
3434
3435static const char *RelocationModelName(llvm::Reloc::Model Model) {
3436 switch (Model) {
3437 case llvm::Reloc::Default:
3438 return nullptr;
3439 case llvm::Reloc::Static:
3440 return "static";
3441 case llvm::Reloc::PIC_:
3442 return "pic";
3443 case llvm::Reloc::DynamicNoPIC:
3444 return "dynamic-no-pic";
3445 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003446 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003447}
3448
3449static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3450 ArgStringList &CmdArgs) {
3451 llvm::Reloc::Model RelocationModel;
3452 unsigned PICLevel;
3453 bool IsPIE;
3454 std::tie(RelocationModel, PICLevel, IsPIE) =
3455 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3456
3457 if (RelocationModel != llvm::Reloc::Static)
3458 CmdArgs.push_back("-KPIC");
3459}
3460
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003461void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003462 const InputInfo &Output, const InputInfoList &Inputs,
3463 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003464 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3465 const llvm::Triple Triple(TripleStr);
3466
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003467 bool KernelOrKext =
3468 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003469 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003470 ArgStringList CmdArgs;
3471
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003472 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003473 bool IsWindowsCygnus =
3474 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003475 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003476 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003477
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003478 // Check number of inputs for sanity. We need at least one input.
3479 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003480 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003481 // CUDA compilation may have multiple inputs (source file + results of
3482 // device-side compilations). All other jobs are expected to have exactly one
3483 // input.
3484 bool IsCuda = types::isCuda(Input.getType());
3485 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003486
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003487 // Invoke ourselves in -cc1 mode.
3488 //
3489 // FIXME: Implement custom jobs for internal actions.
3490 CmdArgs.push_back("-cc1");
3491
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003492 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003493 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003494 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003495
Artem Belevichfa11ab52015-11-17 22:28:46 +00003496 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003497 if (IsCuda) {
3498 // FIXME: We need a (better) way to pass information about
3499 // particular compilation pass we're constructing here. For now we
3500 // can check which toolchain we're using and pick the other one to
3501 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003502 if (&getToolChain() == C.getCudaDeviceToolChain())
3503 AuxToolChain = C.getCudaHostToolChain();
3504 else if (&getToolChain() == C.getCudaHostToolChain())
3505 AuxToolChain = C.getCudaDeviceToolChain();
3506 else
3507 llvm_unreachable("Can't figure out CUDA compilation mode.");
3508 assert(AuxToolChain != nullptr && "No aux toolchain.");
3509 CmdArgs.push_back("-aux-triple");
3510 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003511 CmdArgs.push_back("-fcuda-target-overloads");
3512 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003513 }
3514
James Y Knight2db38f32015-08-15 03:45:25 +00003515 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3516 Triple.getArch() == llvm::Triple::thumb)) {
3517 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003518 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003519 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003520 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003521 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003522 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003523 }
3524
Tim Northover336f1892014-03-29 13:16:12 +00003525 // Push all default warning arguments that are specific to
3526 // the given target. These come before user provided warning options
3527 // are provided.
3528 getToolChain().addClangWarningOptions(CmdArgs);
3529
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003530 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003531 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003532
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003533 if (isa<AnalyzeJobAction>(JA)) {
3534 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3535 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003536 } else if (isa<MigrateJobAction>(JA)) {
3537 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003538 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003539 if (Output.getType() == types::TY_Dependencies)
3540 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003541 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003542 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003543 if (Args.hasArg(options::OPT_rewrite_objc) &&
3544 !Args.hasArg(options::OPT_g_Group))
3545 CmdArgs.push_back("-P");
3546 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003547 } else if (isa<AssembleJobAction>(JA)) {
3548 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003549
David Blaikie9260ed62013-07-25 21:19:01 +00003550 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003551
3552 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003553 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003554 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003555 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003556 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003557
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003558 if (JA.getType() == types::TY_Nothing)
3559 CmdArgs.push_back("-fsyntax-only");
3560 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003561 CmdArgs.push_back("-emit-pch");
3562 else
3563 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003564 } else if (isa<VerifyPCHJobAction>(JA)) {
3565 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003566 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003567 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3568 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003569 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003570 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003571 } else if (JA.getType() == types::TY_LLVM_IR ||
3572 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003573 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003574 } else if (JA.getType() == types::TY_LLVM_BC ||
3575 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003576 CmdArgs.push_back("-emit-llvm-bc");
3577 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003578 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003579 } else if (JA.getType() == types::TY_AST) {
3580 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003581 } else if (JA.getType() == types::TY_ModuleFile) {
3582 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003583 } else if (JA.getType() == types::TY_RewrittenObjC) {
3584 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003585 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003586 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3587 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003588 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003589 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003590 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003591 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003592
3593 // Preserve use-list order by default when emitting bitcode, so that
3594 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3595 // same result as running passes here. For LTO, we don't need to preserve
3596 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003597 if (JA.getType() == types::TY_LLVM_BC)
3598 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003599
3600 if (D.isUsingLTO())
3601 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003602 }
3603
Teresa Johnsonaff22322015-12-07 19:21:34 +00003604 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3605 if (!types::isLLVMIR(Input.getType()))
3606 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3607 << "-x ir";
3608 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3609 }
3610
Justin Bognera88f0122014-06-20 22:59:50 +00003611 // We normally speed up the clang process a bit by skipping destructors at
3612 // exit, but when we're generating diagnostics we can rely on some of the
3613 // cleanup.
3614 if (!C.isForDiagnostics())
3615 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003616
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003617// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003618#ifdef NDEBUG
3619 CmdArgs.push_back("-disable-llvm-verifier");
3620#endif
3621
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003622 // Set the main file name, so that debug info works even with
3623 // -save-temps.
3624 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003625 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003626
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003627 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003628 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003629 if (Args.hasArg(options::OPT_static))
3630 CmdArgs.push_back("-static-define");
3631
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003632 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003633 // Enable region store model by default.
3634 CmdArgs.push_back("-analyzer-store=region");
3635
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003636 // Treat blocks as analysis entry points.
3637 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3638
Ted Kremenek49c79792011-03-24 00:28:47 +00003639 CmdArgs.push_back("-analyzer-eagerly-assume");
3640
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003641 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003642 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003643 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003644
Devin Coughlin65c77082016-01-21 20:09:49 +00003645 if (!IsWindowsMSVC) {
3646 CmdArgs.push_back("-analyzer-checker=unix");
3647 } else {
3648 // Enable "unix" checkers that also work on Windows.
3649 CmdArgs.push_back("-analyzer-checker=unix.API");
3650 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3651 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3652 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3653 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3654 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3655 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003656
Sean Evesonb38c32b2016-01-06 10:03:58 +00003657 // Disable some unix checkers for PS4.
3658 if (IsPS4CPU) {
3659 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3660 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3661 }
3662
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003663 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003664 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003665
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003666 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003667
Artem Belevichba558952015-05-06 18:20:23 +00003668 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003669 CmdArgs.push_back("-analyzer-checker=cplusplus");
3670
Sean Evesonb38c32b2016-01-06 10:03:58 +00003671 if (!IsPS4CPU) {
3672 CmdArgs.push_back(
3673 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3674 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3675 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3676 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3677 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3678 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3679 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003680
3681 // Default nullability checks.
3682 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3683 CmdArgs.push_back(
3684 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003685 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003686
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003687 // Set the output format. The default is plist, for (lame) historical
3688 // reasons.
3689 CmdArgs.push_back("-analyzer-output");
3690 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003691 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003692 else
3693 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003694
Ted Kremenekfe449a22010-03-22 22:32:05 +00003695 // Disable the presentation of standard compiler warnings when
3696 // using --analyze. We only want to show static analyzer diagnostics
3697 // or frontend errors.
3698 CmdArgs.push_back("-w");
3699
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003700 // Add -Xanalyzer arguments when running as analyzer.
3701 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003702 }
3703
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003704 CheckCodeGenerationOptions(D, Args);
3705
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003706 llvm::Reloc::Model RelocationModel;
3707 unsigned PICLevel;
3708 bool IsPIE;
3709 std::tie(RelocationModel, PICLevel, IsPIE) =
3710 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003711
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003712 const char *RMName = RelocationModelName(RelocationModel);
3713 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003714 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003715 CmdArgs.push_back(RMName);
3716 }
3717 if (PICLevel > 0) {
3718 CmdArgs.push_back("-pic-level");
3719 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3720 if (IsPIE) {
3721 CmdArgs.push_back("-pie-level");
3722 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003723 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003724 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003725
Renato Golin4854d802015-11-09 12:40:41 +00003726 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3727 CmdArgs.push_back("-meabi");
3728 CmdArgs.push_back(A->getValue());
3729 }
3730
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003731 CmdArgs.push_back("-mthread-model");
3732 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3733 CmdArgs.push_back(A->getValue());
3734 else
3735 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3736
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003737 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3738
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003739 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3740 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003741 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003742
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003743 // LLVM Code Generator Options.
3744
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003745 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3746 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003747 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3748 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003749 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003750 CmdArgs.push_back(A->getValue());
3751 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003752 }
3753 }
3754
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003755 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3756 StringRef v = A->getValue();
3757 CmdArgs.push_back("-mllvm");
3758 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3759 A->claim();
3760 }
3761
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003762 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3763 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003764 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003765 }
3766
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003767 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3768 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003769 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003770 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003771 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003772 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3773 CmdArgs.push_back("-fpcc-struct-return");
3774 } else {
3775 assert(A->getOption().matches(options::OPT_freg_struct_return));
3776 CmdArgs.push_back("-freg-struct-return");
3777 }
3778 }
3779
Roman Divacky65b88cd2011-03-01 17:40:53 +00003780 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3781 CmdArgs.push_back("-mrtd");
3782
Rafael Espindola224dd632011-12-14 21:02:23 +00003783 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003784 CmdArgs.push_back("-mdisable-fp-elim");
3785 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3786 options::OPT_fno_zero_initialized_in_bss))
3787 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003788
3789 bool OFastEnabled = isOptimizationLevelFast(Args);
3790 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3791 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003792 OptSpecifier StrictAliasingAliasOption =
3793 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003794 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3795 // doesn't do any TBAA.
3796 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003797 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003798 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003799 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003800 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3801 options::OPT_fno_struct_path_tbaa))
3802 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003803 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3804 false))
3805 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003806 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3807 options::OPT_fno_strict_vtable_pointers,
3808 false))
3809 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003810 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3811 options::OPT_fno_optimize_sibling_calls))
3812 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003813
Eric Christopher006208c2013-04-04 06:29:47 +00003814 // Handle segmented stacks.
3815 if (Args.hasArg(options::OPT_fsplit_stack))
3816 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003817
3818 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3819 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003820 OptSpecifier FastMathAliasOption =
3821 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3822
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003823 // Handle various floating point optimization flags, mapping them to the
3824 // appropriate LLVM code generation flags. The pattern for all of these is to
3825 // default off the codegen optimizations, and if any flag enables them and no
3826 // flag disables them after the flag enabling them, enable the codegen
3827 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003828 if (Arg *A = Args.getLastArg(
3829 options::OPT_ffast_math, FastMathAliasOption,
3830 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3831 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3832 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003833 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3834 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003835 A->getOption().getID() != options::OPT_fhonor_infinities)
3836 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003837 if (Arg *A = Args.getLastArg(
3838 options::OPT_ffast_math, FastMathAliasOption,
3839 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3840 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3841 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003842 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3843 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003844 A->getOption().getID() != options::OPT_fhonor_nans)
3845 CmdArgs.push_back("-menable-no-nans");
3846
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003847 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3848 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003849 if (Arg *A =
3850 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3851 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3852 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003853 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3854 // However, turning *off* -ffast_math merely restores the toolchain default
3855 // (which may be false).
3856 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3857 A->getOption().getID() == options::OPT_ffast_math ||
3858 A->getOption().getID() == options::OPT_Ofast)
3859 MathErrno = false;
3860 else if (A->getOption().getID() == options::OPT_fmath_errno)
3861 MathErrno = true;
3862 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003863 if (MathErrno)
3864 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003865
3866 // There are several flags which require disabling very specific
3867 // optimizations. Any of these being disabled forces us to turn off the
3868 // entire set of LLVM optimizations, so collect them through all the flag
3869 // madness.
3870 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003871 if (Arg *A = Args.getLastArg(
3872 options::OPT_ffast_math, FastMathAliasOption,
3873 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3874 options::OPT_fno_unsafe_math_optimizations,
3875 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003876 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3877 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003878 A->getOption().getID() != options::OPT_fno_associative_math)
3879 AssociativeMath = true;
3880 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003881 if (Arg *A = Args.getLastArg(
3882 options::OPT_ffast_math, FastMathAliasOption,
3883 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3884 options::OPT_fno_unsafe_math_optimizations,
3885 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003886 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3887 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003888 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3889 ReciprocalMath = true;
3890 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003891 if (Arg *A = Args.getLastArg(
3892 options::OPT_ffast_math, FastMathAliasOption,
3893 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3894 options::OPT_fno_unsafe_math_optimizations,
3895 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003896 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3897 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003898 A->getOption().getID() != options::OPT_fsigned_zeros)
3899 SignedZeros = false;
3900 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003901 if (Arg *A = Args.getLastArg(
3902 options::OPT_ffast_math, FastMathAliasOption,
3903 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3904 options::OPT_fno_unsafe_math_optimizations,
3905 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003906 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3907 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003908 A->getOption().getID() != options::OPT_ftrapping_math)
3909 TrappingMath = false;
3910 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3911 !TrappingMath)
3912 CmdArgs.push_back("-menable-unsafe-fp-math");
3913
Sanjay Patel76c9e092015-01-23 16:40:50 +00003914 if (!SignedZeros)
3915 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003916
Sanjay Patel359b1052015-04-09 15:03:23 +00003917 if (ReciprocalMath)
3918 CmdArgs.push_back("-freciprocal-math");
3919
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003920 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003921 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003922 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003923 options::OPT_ffp_contract)) {
3924 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003925 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003926 if (Val == "fast" || Val == "on" || Val == "off") {
3927 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3928 } else {
3929 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003930 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003931 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003932 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3933 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003934 // If fast-math is set then set the fp-contract mode to fast.
3935 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3936 }
3937 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003938
Sanjay Patel2987c292015-06-11 14:53:41 +00003939 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003940
Bob Wilson6a039162012-07-19 03:52:53 +00003941 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3942 // and if we find them, tell the frontend to provide the appropriate
3943 // preprocessor macros. This is distinct from enabling any optimizations as
3944 // these options induce language changes which must survive serialization
3945 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003946 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3947 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003948 if (!A->getOption().matches(options::OPT_fno_fast_math))
3949 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003950 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3951 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003952 if (A->getOption().matches(options::OPT_ffinite_math_only))
3953 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003954
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003955 // Decide whether to use verbose asm. Verbose assembly is the default on
3956 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003957 bool IsIntegratedAssemblerDefault =
3958 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003959 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003960 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003961 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003962 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003963
Rafael Espindolab8a12932015-05-22 20:44:03 +00003964 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3965 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003966 CmdArgs.push_back("-no-integrated-as");
3967
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003968 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3969 CmdArgs.push_back("-mdebug-pass");
3970 CmdArgs.push_back("Structure");
3971 }
3972 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3973 CmdArgs.push_back("-mdebug-pass");
3974 CmdArgs.push_back("Arguments");
3975 }
3976
John McCall8517abc2010-02-19 02:45:38 +00003977 // Enable -mconstructor-aliases except on darwin, where we have to
3978 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003979 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003980 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003981
John McCall7ef5cb32011-03-18 02:56:14 +00003982 // Darwin's kernel doesn't support guard variables; just die if we
3983 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003984 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003985 CmdArgs.push_back("-fforbid-guard-variables");
3986
Akira Hatanaka02028482015-11-12 17:21:22 +00003987 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3988 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003989 CmdArgs.push_back("-mms-bitfields");
3990 }
John McCall8517abc2010-02-19 02:45:38 +00003991
Daniel Dunbar306945d2009-09-16 06:17:29 +00003992 // This is a coarse approximation of what llvm-gcc actually does, both
3993 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3994 // complicated ways.
3995 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003996 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3997 options::OPT_fno_asynchronous_unwind_tables,
3998 (getToolChain().IsUnwindTablesDefault() ||
3999 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4000 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004001 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4002 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004003 CmdArgs.push_back("-munwind-tables");
4004
Chandler Carruth05fb5852012-11-21 23:40:23 +00004005 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004006
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004007 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4008 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004009 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004010 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004011
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004012 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004013 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004014
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004015 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004016 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004017 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004018 }
4019
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004020 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004021 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004022 if (!CPU.empty()) {
4023 CmdArgs.push_back("-target-cpu");
4024 CmdArgs.push_back(Args.MakeArgString(CPU));
4025 }
4026
Rafael Espindolaeb265472013-08-21 21:59:03 +00004027 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4028 CmdArgs.push_back("-mfpmath");
4029 CmdArgs.push_back(A->getValue());
4030 }
4031
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004032 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004033 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004034
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004035 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004036 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004037 default:
4038 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004039
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004040 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004041 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004042 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004043 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004044 // Use the effective triple, which takes into account the deployment target.
4045 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004046 break;
4047
Tim Northover573cbee2014-05-24 12:52:07 +00004048 case llvm::Triple::aarch64:
4049 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004050 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004051 break;
4052
Eric Christopher0b26a612010-03-02 02:41:08 +00004053 case llvm::Triple::mips:
4054 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004055 case llvm::Triple::mips64:
4056 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004057 AddMIPSTargetArgs(Args, CmdArgs);
4058 break;
4059
Ulrich Weigand8afad612014-07-28 13:17:52 +00004060 case llvm::Triple::ppc:
4061 case llvm::Triple::ppc64:
4062 case llvm::Triple::ppc64le:
4063 AddPPCTargetArgs(Args, CmdArgs);
4064 break;
4065
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004066 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004067 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004068 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004069 AddSparcTargetArgs(Args, CmdArgs);
4070 break;
4071
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004072 case llvm::Triple::x86:
4073 case llvm::Triple::x86_64:
4074 AddX86TargetArgs(Args, CmdArgs);
4075 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004076
4077 case llvm::Triple::hexagon:
4078 AddHexagonTargetArgs(Args, CmdArgs);
4079 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004080
4081 case llvm::Triple::wasm32:
4082 case llvm::Triple::wasm64:
4083 AddWebAssemblyTargetArgs(Args, CmdArgs);
4084 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004085 }
4086
Douglas Katzman3459ce22015-10-08 04:24:12 +00004087 // The 'g' groups options involve a somewhat intricate sequence of decisions
4088 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004089 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004090 // * what level of debug info to generate
4091 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004092 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004093 // This avoids having to monkey around further in cc1 other than to disable
4094 // codeview if not running in a Windows environment. Perhaps even that
4095 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004096 unsigned DwarfVersion = 0;
4097 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4098 // These two are potentially updated by AddClangCLArgs.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004099 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4100 CodeGenOptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004101 bool EmitCodeView = false;
4102
Hans Wennborg75958c42013-08-08 00:17:41 +00004103 // Add clang-cl arguments.
4104 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004105 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004106
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004107 // Pass the linker version in use.
4108 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4109 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004110 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004111 }
4112
Eric Christopherb7d97e92013-04-03 01:58:53 +00004113 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004114 CmdArgs.push_back("-momit-leaf-frame-pointer");
4115
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004116 // Explicitly error on some things we know we don't support and can't just
4117 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004118 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004119 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4120 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004121 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004122 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004123 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4124 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004125 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004126 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004127 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004128 }
4129
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004130 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004131 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004132 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004133 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004134 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4135 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004136 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004137 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004138 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004139
Chad Rosierbe10f982011-08-02 17:58:04 +00004140 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004141 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004142 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4143 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004144 }
4145
Rafael Espindola08a692a2010-03-07 04:46:18 +00004146 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004147 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004148 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004149 // If the last option explicitly specified a debug-info level, use it.
4150 if (A->getOption().matches(options::OPT_gN_Group)) {
4151 DebugInfoKind = DebugLevelToInfoKind(*A);
4152 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4153 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4154 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4155 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4156 A->getIndex() > SplitDwarfArg->getIndex())
4157 SplitDwarfArg = nullptr;
4158 } else
4159 // For any other 'g' option, use Limited.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004160 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004161 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004162
Paul Robinson0334a042015-12-19 19:41:48 +00004163 // If a debugger tuning argument appeared, remember it.
4164 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4165 options::OPT_ggdbN_Group)) {
4166 if (A->getOption().matches(options::OPT_glldb))
4167 DebuggerTuning = llvm::DebuggerKind::LLDB;
4168 else if (A->getOption().matches(options::OPT_gsce))
4169 DebuggerTuning = llvm::DebuggerKind::SCE;
4170 else
4171 DebuggerTuning = llvm::DebuggerKind::GDB;
4172 }
4173
4174 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004175 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004176 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004177 DwarfVersion = DwarfVersionNum(A->getSpelling());
4178
Reid Kleckner124955a2015-08-05 18:51:13 +00004179 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004180 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4181 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4182 // DwarfVersion remains at 0 if no explicit choice was made.
4183 CmdArgs.push_back("-gcodeview");
4184 } else if (DwarfVersion == 0 &&
4185 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4186 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4187 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004188
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004189 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4190 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004191
4192 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004193 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004194 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004195 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004196
Eric Christopher138c32b2013-09-13 22:37:55 +00004197 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004198 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004199 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004200 CmdArgs.push_back("-dwarf-ext-refs");
4201 CmdArgs.push_back("-fmodule-format=obj");
4202 }
4203
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004204 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4205 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004206 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004207 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004208 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004209 CmdArgs.push_back("-backend-option");
4210 CmdArgs.push_back("-split-dwarf=Enable");
4211 }
4212
Douglas Katzman3459ce22015-10-08 04:24:12 +00004213 // After we've dealt with all combinations of things that could
4214 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4215 // figure out if we need to "upgrade" it to standalone debug info.
4216 // We parse these two '-f' options whether or not they will be used,
4217 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4218 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4219 options::OPT_fno_standalone_debug,
4220 getToolChain().GetDefaultStandaloneDebug());
4221 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4222 DebugInfoKind = CodeGenOptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004223 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4224 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004225
Eric Christopher138c32b2013-09-13 22:37:55 +00004226 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4227 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4228 CmdArgs.push_back("-backend-option");
4229 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4230 }
Eric Christophereec89c22013-06-18 00:03:50 +00004231
Eric Christopher0d403d22014-02-14 01:27:03 +00004232 // -gdwarf-aranges turns on the emission of the aranges section in the
4233 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004234 // Always enabled on the PS4.
4235 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004236 CmdArgs.push_back("-backend-option");
4237 CmdArgs.push_back("-generate-arange-section");
4238 }
4239
David Blaikief36d9ba2014-01-27 18:52:43 +00004240 if (Args.hasFlag(options::OPT_fdebug_types_section,
4241 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004242 CmdArgs.push_back("-backend-option");
4243 CmdArgs.push_back("-generate-type-units");
4244 }
Eric Christophereec89c22013-06-18 00:03:50 +00004245
Dan Gohmana5b804b2016-01-07 00:50:27 +00004246 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4247 // default.
4248 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4249 Triple.getArch() == llvm::Triple::wasm32 ||
4250 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004251
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004252 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004253 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004254 CmdArgs.push_back("-ffunction-sections");
4255 }
4256
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004257 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4258 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004259 CmdArgs.push_back("-fdata-sections");
4260 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004261
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004262 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004263 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004264 CmdArgs.push_back("-fno-unique-section-names");
4265
Chris Lattner3c77a352010-06-22 00:03:40 +00004266 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4267
Diego Novilloa0545962015-07-10 18:00:07 +00004268 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004269
Paul Robinsond083b9a2015-12-16 17:25:27 +00004270 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4271 if (getToolChain().getTriple().isPS4CPU())
4272 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4273
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004274 // Pass options for controlling the default header search paths.
4275 if (Args.hasArg(options::OPT_nostdinc)) {
4276 CmdArgs.push_back("-nostdsysteminc");
4277 CmdArgs.push_back("-nobuiltininc");
4278 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004279 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004280 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004281 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4282 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4283 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004284
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004285 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004286 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004287 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004288
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004289 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4290
Ted Kremenekf7639e12012-03-06 20:06:33 +00004291 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004292 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004293 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004294 options::OPT_ccc_arcmt_modify,
4295 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004296 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004297 switch (A->getOption().getID()) {
4298 default:
4299 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004300 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004301 CmdArgs.push_back("-arcmt-check");
4302 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004303 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004304 CmdArgs.push_back("-arcmt-modify");
4305 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004306 case options::OPT_ccc_arcmt_migrate:
4307 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004308 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004309 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004310
4311 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4312 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004313 break;
John McCalld70fb982011-06-15 23:25:17 +00004314 }
4315 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004316 } else {
4317 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4318 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4319 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004320 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004321
Ted Kremenekf7639e12012-03-06 20:06:33 +00004322 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4323 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004324 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4325 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004326 }
4327 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004328 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004329
4330 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004331 options::OPT_objcmt_migrate_subscripting,
4332 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004333 // None specified, means enable them all.
4334 CmdArgs.push_back("-objcmt-migrate-literals");
4335 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004336 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004337 } else {
4338 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4339 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004340 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004341 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004342 } else {
4343 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4344 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4345 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4346 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4347 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4348 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004349 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004350 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4351 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4352 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4353 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4354 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4355 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4356 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004357 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004358 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004359 }
4360
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004361 // Add preprocessing options like -I, -D, etc. if we are using the
4362 // preprocessor.
4363 //
4364 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004365 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004366 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4367 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004368
Rafael Espindolaa7431922011-07-21 23:40:37 +00004369 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4370 // that "The compiler can only warn and ignore the option if not recognized".
4371 // When building with ccache, it will pass -D options to clang even on
4372 // preprocessed inputs and configure concludes that -fPIC is not supported.
4373 Args.ClaimAllArgs(options::OPT_D);
4374
Alp Toker7874bdc2013-11-15 20:40:58 +00004375 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004376 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4377 if (A->getOption().matches(options::OPT_O4)) {
4378 CmdArgs.push_back("-O3");
4379 D.Diag(diag::warn_O4_is_O3);
4380 } else {
4381 A->render(Args, CmdArgs);
4382 }
4383 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004384
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004385 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004386 for (const Arg *A :
4387 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4388 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004389 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004390 }
4391
Rafael Espindola577637a2015-01-03 00:06:04 +00004392 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004393
Richard Smith3be1cb22014-08-07 00:24:21 +00004394 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004395 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004396 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4397 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004398 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004399 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004400
4401 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004402 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004403 //
4404 // If a std is supplied, only add -trigraphs if it follows the
4405 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004406 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004407 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4408 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004409 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004410 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004411 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004412 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004413 else
4414 Std->render(Args, CmdArgs);
4415
Nico Weber00721502014-12-23 22:32:37 +00004416 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004417 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004418 options::OPT_ftrigraphs,
4419 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004420 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004421 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004422 } else {
4423 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004424 //
4425 // FIXME: Clang doesn't correctly handle -std= when the input language
4426 // doesn't match. For the time being just ignore this for C++ inputs;
4427 // eventually we want to do all the standard defaulting here instead of
4428 // splitting it between the driver and clang -cc1.
4429 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004430 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4431 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004432 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004433 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004434
Nico Weber00721502014-12-23 22:32:37 +00004435 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4436 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004437 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004438
Richard Smith282b4492013-09-04 22:50:31 +00004439 // GCC's behavior for -Wwrite-strings is a bit strange:
4440 // * In C, this "warning flag" changes the types of string literals from
4441 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4442 // for the discarded qualifier.
4443 // * In C++, this is just a normal warning flag.
4444 //
4445 // Implementing this warning correctly in C is hard, so we follow GCC's
4446 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4447 // a non-const char* in C, rather than using this crude hack.
4448 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004449 // FIXME: This should behave just like a warning flag, and thus should also
4450 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4451 Arg *WriteStrings =
4452 Args.getLastArg(options::OPT_Wwrite_strings,
4453 options::OPT_Wno_write_strings, options::OPT_w);
4454 if (WriteStrings &&
4455 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004456 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004457 }
4458
Chandler Carruth61fbf622011-04-23 09:27:53 +00004459 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004460 // during C++ compilation, which it is by default. GCC keeps this define even
4461 // in the presence of '-w', match this behavior bug-for-bug.
4462 if (types::isCXX(InputType) &&
4463 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4464 true)) {
4465 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004466 }
4467
Chandler Carruthe0391482010-05-22 02:21:53 +00004468 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4469 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4470 if (Asm->getOption().matches(options::OPT_fasm))
4471 CmdArgs.push_back("-fgnu-keywords");
4472 else
4473 CmdArgs.push_back("-fno-gnu-keywords");
4474 }
4475
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004476 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4477 CmdArgs.push_back("-fno-dwarf-directory-asm");
4478
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004479 if (ShouldDisableAutolink(Args, getToolChain()))
4480 CmdArgs.push_back("-fno-autolink");
4481
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004482 // Add in -fdebug-compilation-dir if necessary.
4483 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004484
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004485 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4486 StringRef Map = A->getValue();
4487 if (Map.find('=') == StringRef::npos)
4488 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4489 else
4490 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4491 A->claim();
4492 }
4493
Richard Smith9a568822011-11-21 19:36:32 +00004494 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4495 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004496 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004497 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004498 }
4499
Richard Smith79c927b2013-11-06 19:31:51 +00004500 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4501 CmdArgs.push_back("-foperator-arrow-depth");
4502 CmdArgs.push_back(A->getValue());
4503 }
4504
Richard Smith9a568822011-11-21 19:36:32 +00004505 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4506 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004507 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004508 }
4509
Richard Smitha3d3bd22013-05-08 02:12:03 +00004510 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4511 CmdArgs.push_back("-fconstexpr-steps");
4512 CmdArgs.push_back(A->getValue());
4513 }
4514
Richard Smithb3a14522013-02-22 01:59:51 +00004515 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4516 CmdArgs.push_back("-fbracket-depth");
4517 CmdArgs.push_back(A->getValue());
4518 }
4519
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004520 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4521 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004522 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004523 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004524 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4525 } else
4526 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004527 }
4528
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004529 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004530 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004531
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004532 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4533 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004534 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004535 }
David Chisnall5778fce2009-08-31 16:41:57 +00004536
Chris Lattnere23003d2010-01-09 21:54:33 +00004537 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4538 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004539 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004540 }
4541
Chris Lattnerb35583d2010-04-07 20:49:23 +00004542 CmdArgs.push_back("-ferror-limit");
4543 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004544 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004545 else
4546 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004547
Chandler Carrutha77a7272010-05-06 04:55:18 +00004548 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4549 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004550 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004551 }
4552
4553 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4554 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004555 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004556 }
4557
Richard Smithf6f003a2011-12-16 19:06:07 +00004558 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4559 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004560 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004561 }
4562
Nick Lewycky24653262014-12-16 21:39:02 +00004563 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4564 CmdArgs.push_back("-fspell-checking-limit");
4565 CmdArgs.push_back(A->getValue());
4566 }
4567
Daniel Dunbar2c978472009-11-04 06:24:47 +00004568 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004569 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004570 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004571 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004572 } else {
4573 // If -fmessage-length=N was not specified, determine whether this is a
4574 // terminal and, if so, implicitly define -fmessage-length appropriately.
4575 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004576 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004577 }
4578
John McCallb4a99d32013-02-19 01:57:35 +00004579 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4580 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4581 options::OPT_fvisibility_ms_compat)) {
4582 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4583 CmdArgs.push_back("-fvisibility");
4584 CmdArgs.push_back(A->getValue());
4585 } else {
4586 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4587 CmdArgs.push_back("-fvisibility");
4588 CmdArgs.push_back("hidden");
4589 CmdArgs.push_back("-ftype-visibility");
4590 CmdArgs.push_back("default");
4591 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004592 }
4593
Douglas Gregor08329632010-06-15 17:05:35 +00004594 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004595
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004596 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4597
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004598 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004599 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4600 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004601 CmdArgs.push_back("-ffreestanding");
4602
Daniel Dunbare357d562009-12-03 18:42:11 +00004603 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004604 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004605 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004606 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004607 // Emulated TLS is enabled by default on Android, and can be enabled manually
4608 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004609 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004610 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4611 EmulatedTLSDefault))
4612 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004613 // AltiVec-like language extensions aren't relevant for assembling.
4614 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004615 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004616 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4617 }
Richard Trieu91844232012-06-26 18:18:47 +00004618 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4619 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004620
Alexey Bataevdb390212015-05-20 04:24:19 +00004621 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004622 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4623 options::OPT_fno_openmp, false))
4624 switch (getOpenMPRuntime(getToolChain(), Args)) {
4625 case OMPRT_OMP:
4626 case OMPRT_IOMP5:
4627 // Clang can generate useful OpenMP code for these two runtime libraries.
4628 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004629
4630 // If no option regarding the use of TLS in OpenMP codegeneration is
4631 // given, decide a default based on the target. Otherwise rely on the
4632 // options and pass the right information to the frontend.
4633 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004634 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004635 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004636 break;
4637 default:
4638 // By default, if Clang doesn't know how to generate useful OpenMP code
4639 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4640 // down to the actual compilation.
4641 // FIXME: It would be better to have a mode which *only* omits IR
4642 // generation based on the OpenMP support so that we get consistent
4643 // semantic analysis, etc.
4644 break;
4645 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004646
Peter Collingbourne32701642013-11-01 18:16:25 +00004647 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004648 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004649
Eric Christopher459d2712013-02-19 06:16:53 +00004650 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004651 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4652 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4653 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4654 Arch == llvm::Triple::ppc64le))
4655 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4656 << "ppc/ppc64/ppc64le";
4657 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004658
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004659 // -fzvector is incompatible with -faltivec.
4660 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4661 if (Args.hasArg(options::OPT_faltivec))
4662 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4663 << "-faltivec";
4664
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004665 if (getToolChain().SupportsProfiling())
4666 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004667
4668 // -flax-vector-conversions is default.
4669 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4670 options::OPT_fno_lax_vector_conversions))
4671 CmdArgs.push_back("-fno-lax-vector-conversions");
4672
John Brawna7b4ec02015-08-10 11:11:28 +00004673 if (Args.getLastArg(options::OPT_fapple_kext) ||
4674 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004675 CmdArgs.push_back("-fapple-kext");
4676
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004677 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004678 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004679 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004680 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4681 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004682
4683 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4684 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004685 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004686 }
4687
Bob Wilson14adb362012-02-03 06:27:22 +00004688 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004689
Chandler Carruth6e501032011-03-27 00:04:55 +00004690 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4691 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004692 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004693 if (A->getOption().matches(options::OPT_fwrapv))
4694 CmdArgs.push_back("-fwrapv");
4695 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4696 options::OPT_fno_strict_overflow)) {
4697 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4698 CmdArgs.push_back("-fwrapv");
4699 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004700
4701 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4702 options::OPT_fno_reroll_loops))
4703 if (A->getOption().matches(options::OPT_freroll_loops))
4704 CmdArgs.push_back("-freroll-loops");
4705
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004706 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004707 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4708 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004709
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004710 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4711
Daniel Dunbar4930e332009-11-17 08:07:36 +00004712 // -stack-protector=0 is default.
4713 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004714 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4715 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4716 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4717 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4718 Args.ClaimAllArgs(options::OPT_fstack_protector);
4719 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004720 options::OPT_fstack_protector_all,
4721 options::OPT_fstack_protector_strong,
4722 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004723 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004724 StackProtectorLevel = std::max<unsigned>(
4725 LangOptions::SSPOn,
4726 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004727 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004728 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004729 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004730 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004731 } else {
4732 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004733 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004734 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004735 if (StackProtectorLevel) {
4736 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004737 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004738 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004739
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004740 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004741 for (const Arg *A : Args.filtered(options::OPT__param)) {
4742 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004743 if (Str.startswith("ssp-buffer-size=")) {
4744 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004745 CmdArgs.push_back("-stack-protector-buffer-size");
4746 // FIXME: Verify the argument is a valid integer.
4747 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004748 }
Sean Silva14facf32015-06-09 01:57:17 +00004749 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004750 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004751 }
4752
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004753 // Translate -mstackrealign
4754 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004755 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004756 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004757
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004758 if (Args.hasArg(options::OPT_mstack_alignment)) {
4759 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4760 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004761 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004762
Hans Wennborg77dc2362015-01-20 19:45:50 +00004763 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4764 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4765
4766 if (!Size.empty())
4767 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4768 else
4769 CmdArgs.push_back("-mstack-probe-size=0");
4770 }
4771
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004772 switch (getToolChain().getArch()) {
4773 case llvm::Triple::aarch64:
4774 case llvm::Triple::aarch64_be:
4775 case llvm::Triple::arm:
4776 case llvm::Triple::armeb:
4777 case llvm::Triple::thumb:
4778 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004779 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004780 break;
4781
4782 default:
4783 break;
4784 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004785
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004786 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4787 options::OPT_mno_restrict_it)) {
4788 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4789 CmdArgs.push_back("-backend-option");
4790 CmdArgs.push_back("-arm-restrict-it");
4791 } else {
4792 CmdArgs.push_back("-backend-option");
4793 CmdArgs.push_back("-arm-no-restrict-it");
4794 }
James Y Knight2db38f32015-08-15 03:45:25 +00004795 } else if (Triple.isOSWindows() &&
4796 (Triple.getArch() == llvm::Triple::arm ||
4797 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004798 // Windows on ARM expects restricted IT blocks
4799 CmdArgs.push_back("-backend-option");
4800 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004801 }
4802
Daniel Dunbard18049a2009-04-07 21:16:11 +00004803 // Forward -f options with positive and negative forms; we translate
4804 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004805 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4806 StringRef fname = A->getValue();
4807 if (!llvm::sys::fs::exists(fname))
4808 D.Diag(diag::err_drv_no_such_file) << fname;
4809 else
4810 A->render(Args, CmdArgs);
4811 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004812
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004813 // -fbuiltin is default unless -mkernel is used.
4814 bool UseBuiltins =
4815 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4816 !Args.hasArg(options::OPT_mkernel));
4817 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004818 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004819
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004820 // -ffreestanding implies -fno-builtin.
4821 if (Args.hasArg(options::OPT_ffreestanding))
4822 UseBuiltins = false;
4823
4824 // Process the -fno-builtin-* options.
4825 for (const auto &Arg : Args) {
4826 const Option &O = Arg->getOption();
4827 if (!O.matches(options::OPT_fno_builtin_))
4828 continue;
4829
4830 Arg->claim();
4831 // If -fno-builtin is specified, then there's no need to pass the option to
4832 // the frontend.
4833 if (!UseBuiltins)
4834 continue;
4835
4836 StringRef FuncName = Arg->getValue();
4837 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4838 }
4839
Nuno Lopes13c88c72009-12-16 16:59:22 +00004840 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4841 options::OPT_fno_assume_sane_operator_new))
4842 CmdArgs.push_back("-fno-assume-sane-operator-new");
4843
Daniel Dunbar4930e332009-11-17 08:07:36 +00004844 // -fblocks=0 is default.
4845 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004846 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004847 (Args.hasArg(options::OPT_fgnu_runtime) &&
4848 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4849 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004850 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004851
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004852 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004853 !getToolChain().hasBlocksRuntime())
4854 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004855 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004856
Richard Smith47972af2015-06-16 00:08:24 +00004857 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004858 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004859 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004860 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004861 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004862 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4863 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004864 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004865 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004866 HaveModules = true;
4867 }
4868 }
4869
Richard Smith47972af2015-06-16 00:08:24 +00004870 // -fmodule-maps enables implicit reading of module map files. By default,
4871 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004872 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4873 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004874 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004875 }
4876
Daniel Jasperac42b752013-10-21 06:34:34 +00004877 // -fmodules-decluse checks that modules used are declared so (off by
4878 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004879 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004880 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004881 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004882 }
4883
Daniel Jasper962b38e2014-04-11 11:47:45 +00004884 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4885 // all #included headers are part of modules.
4886 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004887 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004888 CmdArgs.push_back("-fmodules-strict-decluse");
4889 }
4890
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004891 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4892 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4893 options::OPT_fno_implicit_modules)) {
4894 CmdArgs.push_back("-fno-implicit-modules");
4895 }
4896
Daniel Jasperac42b752013-10-21 06:34:34 +00004897 // -fmodule-name specifies the module that is currently being built (or
4898 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004899 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004900
Richard Smith9887d792014-10-17 01:42:53 +00004901 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004902 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004903 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004904
Richard Smithe842a472014-10-22 02:05:46 +00004905 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004906 if (HaveModules)
4907 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4908 else
4909 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004910
4911 // -fmodule-cache-path specifies where our implicitly-built module files
4912 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004913 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004914 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004915 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004916 if (HaveModules) {
4917 if (C.isForDiagnostics()) {
4918 // When generating crash reports, we want to emit the modules along with
4919 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004920 Path = Output.getFilename();
4921 llvm::sys::path::replace_extension(Path, ".cache");
4922 llvm::sys::path::append(Path, "modules");
4923 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004924 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004925 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004926 llvm::sys::path::append(Path, "org.llvm.clang.");
4927 appendUserToPath(Path);
4928 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004929 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004930 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004931 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4932 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004933 }
4934
4935 // When building modules and generating crashdumps, we need to dump a module
4936 // dependency VFS alongside the output.
4937 if (HaveModules && C.isForDiagnostics()) {
4938 SmallString<128> VFSDir(Output.getFilename());
4939 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004940 // Add the cache directory as a temp so the crash diagnostics pick it up.
4941 C.addTempFile(Args.MakeArgString(VFSDir));
4942
Justin Bognera88f0122014-06-20 22:59:50 +00004943 llvm::sys::path::append(VFSDir, "vfs");
4944 CmdArgs.push_back("-module-dependency-dir");
4945 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004946 }
4947
Richard Smith9887d792014-10-17 01:42:53 +00004948 if (HaveModules)
4949 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004950
Douglas Gregor35b04d62013-02-07 19:01:24 +00004951 // Pass through all -fmodules-ignore-macro arguments.
4952 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004953 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4954 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004955
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004956 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4957
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004958 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4959 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4960 D.Diag(diag::err_drv_argument_not_allowed_with)
4961 << A->getAsString(Args) << "-fbuild-session-timestamp";
4962
4963 llvm::sys::fs::file_status Status;
4964 if (llvm::sys::fs::status(A->getValue(), Status))
4965 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004966 CmdArgs.push_back(Args.MakeArgString(
4967 "-fbuild-session-timestamp=" +
4968 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004969 }
4970
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004971 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004972 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4973 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004974 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4975
4976 Args.AddLastArg(CmdArgs,
4977 options::OPT_fmodules_validate_once_per_build_session);
4978 }
4979
Ben Langmuirdcf73862014-03-12 00:06:17 +00004980 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4981
John McCalldfea9982010-04-09 19:12:06 +00004982 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004983 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004984 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004985 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004986
Anders Carlssond470fef2010-11-21 00:09:52 +00004987 // -felide-constructors is the default.
4988 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004989 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004990 CmdArgs.push_back("-fno-elide-constructors");
4991
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004992 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004993
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004994 if (KernelOrKext || (types::isCXX(InputType) &&
4995 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4996 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004997 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004998
Tony Linthicum76329bf2011-12-12 21:14:55 +00004999 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005000 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5001 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005002 CmdArgs.push_back("-fshort-enums");
5003
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005004 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005005 if (Arg *A = Args.getLastArg(
5006 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5007 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5008 if (A->getOption().matches(options::OPT_funsigned_char) ||
5009 A->getOption().matches(options::OPT_fno_signed_char)) {
5010 CmdArgs.push_back("-fno-signed-char");
5011 }
5012 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005013 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005014 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005015
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005016 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005017 if (!Args.hasFlag(
5018 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5019 !IsWindowsCygnus && !IsWindowsGNU &&
5020 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5021 getToolChain().getArch() != llvm::Triple::hexagon &&
5022 getToolChain().getArch() != llvm::Triple::xcore &&
5023 ((getToolChain().getTriple().getVendor() !=
5024 llvm::Triple::MipsTechnologies) ||
5025 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005026 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005027 CmdArgs.push_back("-fno-use-cxa-atexit");
5028
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005029 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005030 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005031 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005032 CmdArgs.push_back("-fms-extensions");
5033
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005034 // -fno-use-line-directives is default.
5035 if (Args.hasFlag(options::OPT_fuse_line_directives,
5036 options::OPT_fno_use_line_directives, false))
5037 CmdArgs.push_back("-fuse-line-directives");
5038
Francois Pichet1b4f1632011-09-17 04:32:15 +00005039 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005040 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005041 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005042 (IsWindowsMSVC &&
5043 Args.hasFlag(options::OPT_fms_extensions,
5044 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005045 CmdArgs.push_back("-fms-compatibility");
5046
David Majnemerc371ff02015-03-22 08:39:22 +00005047 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005048 VersionTuple MSVT = visualstudio::getMSVCVersion(
5049 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5050 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005051 CmdArgs.push_back(
5052 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005053
David Majnemer8db91762015-05-18 04:49:30 +00005054 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5055 if (ImplyVCPPCXXVer) {
5056 if (IsMSVC2015Compatible)
5057 CmdArgs.push_back("-std=c++14");
5058 else
5059 CmdArgs.push_back("-std=c++11");
5060 }
5061
Eric Christopher5ecce122013-02-18 00:38:31 +00005062 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005063 if (Args.hasFlag(options::OPT_fborland_extensions,
5064 options::OPT_fno_borland_extensions, false))
5065 CmdArgs.push_back("-fborland-extensions");
5066
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005067 // -fno-declspec is default, except for PS4.
5068 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5069 getToolChain().getTriple().isPS4()))
5070 CmdArgs.push_back("-fdeclspec");
5071 else if (Args.hasArg(options::OPT_fno_declspec))
5072 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5073
David Majnemerc371ff02015-03-22 08:39:22 +00005074 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5075 // than 19.
5076 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5077 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005078 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005079 CmdArgs.push_back("-fno-threadsafe-statics");
5080
Francois Pichet02744872011-09-01 16:38:08 +00005081 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5082 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005083 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005084 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005085 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005086
Chandler Carruthe03aa552010-04-17 20:17:31 +00005087 // -fgnu-keywords default varies depending on language; only pass if
5088 // specified.
5089 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005090 options::OPT_fno_gnu_keywords))
5091 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005092
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005093 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005094 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005095 CmdArgs.push_back("-fgnu89-inline");
5096
Chad Rosier9c76d242012-03-15 22:31:42 +00005097 if (Args.hasArg(options::OPT_fno_inline))
5098 CmdArgs.push_back("-fno-inline");
5099
Chad Rosier64d6be92012-03-06 21:17:19 +00005100 if (Args.hasArg(options::OPT_fno_inline_functions))
5101 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005102
John McCall5fb5df92012-06-20 06:18:46 +00005103 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005104
John McCall5fb5df92012-06-20 06:18:46 +00005105 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005106 // legacy is the default. Except for deployment taget of 10.5,
5107 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5108 // gets ignored silently.
5109 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005110 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5111 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005112 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005113 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005114 if (getToolChain().UseObjCMixedDispatch())
5115 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5116 else
5117 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5118 }
5119 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005120
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005121 // When ObjectiveC legacy runtime is in effect on MacOSX,
5122 // turn on the option to do Array/Dictionary subscripting
5123 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005124 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005125 getToolChain().getTriple().isMacOSX() &&
5126 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5127 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005128 objcRuntime.isNeXTFamily())
5129 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005130
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005131 // -fencode-extended-block-signature=1 is default.
5132 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5133 CmdArgs.push_back("-fencode-extended-block-signature");
5134 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005135
John McCall24fc0de2011-07-06 00:26:06 +00005136 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5137 // NOTE: This logic is duplicated in ToolChains.cpp.
5138 bool ARC = isObjCAutoRefCount(Args);
5139 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005140 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005141
John McCall24fc0de2011-07-06 00:26:06 +00005142 CmdArgs.push_back("-fobjc-arc");
5143
Chandler Carruth491db322011-11-04 07:34:47 +00005144 // FIXME: It seems like this entire block, and several around it should be
5145 // wrapped in isObjC, but for now we just use it here as this is where it
5146 // was being used previously.
5147 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5148 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5149 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5150 else
5151 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5152 }
5153
John McCall24fc0de2011-07-06 00:26:06 +00005154 // Allow the user to enable full exceptions code emission.
5155 // We define off for Objective-CC, on for Objective-C++.
5156 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5157 options::OPT_fno_objc_arc_exceptions,
5158 /*default*/ types::isCXX(InputType)))
5159 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005160
John McCall24fc0de2011-07-06 00:26:06 +00005161 }
5162
5163 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5164 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005165 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005166 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005167
John McCall24fc0de2011-07-06 00:26:06 +00005168 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5169 // takes precedence.
5170 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5171 if (!GCArg)
5172 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5173 if (GCArg) {
5174 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005175 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005176 } else if (getToolChain().SupportsObjCGC()) {
5177 GCArg->render(Args, CmdArgs);
5178 } else {
5179 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005180 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005181 }
5182 }
5183
John McCallfbe5ed72015-11-05 19:19:56 +00005184 // Pass down -fobjc-weak or -fno-objc-weak if present.
5185 if (types::isObjC(InputType)) {
5186 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5187 options::OPT_fno_objc_weak);
5188 if (!WeakArg) {
5189 // nothing to do
5190 } else if (GCArg) {
5191 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5192 D.Diag(diag::err_objc_weak_with_gc);
5193 } else if (!objcRuntime.allowsWeak()) {
5194 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5195 D.Diag(diag::err_objc_weak_unsupported);
5196 } else {
5197 WeakArg->render(Args, CmdArgs);
5198 }
5199 }
5200
Bob Wilsonb111ec92015-03-02 19:01:14 +00005201 if (Args.hasFlag(options::OPT_fapplication_extension,
5202 options::OPT_fno_application_extension, false))
5203 CmdArgs.push_back("-fapplication-extension");
5204
Reid Klecknerc542d372014-06-27 17:02:02 +00005205 // Handle GCC-style exception args.
5206 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005207 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5208 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005209
Tim Northovere931f9f2015-10-30 16:30:41 +00005210 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005211 CmdArgs.push_back("-fsjlj-exceptions");
5212
5213 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005214 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5215 options::OPT_fno_assume_sane_operator_new))
5216 CmdArgs.push_back("-fno-assume-sane-operator-new");
5217
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005218 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5219 // most platforms.
5220 if (Args.hasFlag(options::OPT_fsized_deallocation,
5221 options::OPT_fno_sized_deallocation, false))
5222 CmdArgs.push_back("-fsized-deallocation");
5223
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005224 // -fconstant-cfstrings is default, and may be subject to argument translation
5225 // on Darwin.
5226 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5227 options::OPT_fno_constant_cfstrings) ||
5228 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5229 options::OPT_mno_constant_cfstrings))
5230 CmdArgs.push_back("-fno-constant-cfstrings");
5231
John Thompsoned4e2952009-11-05 20:14:16 +00005232 // -fshort-wchar default varies depending on platform; only
5233 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005234 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5235 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005236 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005237
Hans Wennborg28c96312013-07-31 23:39:13 +00005238 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005239 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005240 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005241 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005242
Daniel Dunbar096ed292011-10-05 21:04:55 +00005243 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5244 // -fno-pack-struct doesn't apply to -fpack-struct=.
5245 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005246 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005247 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005248 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005249 } else if (Args.hasFlag(options::OPT_fpack_struct,
5250 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005251 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005252 }
5253
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005254 // Handle -fmax-type-align=N and -fno-type-align
5255 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5256 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5257 if (!SkipMaxTypeAlign) {
5258 std::string MaxTypeAlignStr = "-fmax-type-align=";
5259 MaxTypeAlignStr += A->getValue();
5260 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5261 }
5262 } else if (getToolChain().getTriple().isOSDarwin()) {
5263 if (!SkipMaxTypeAlign) {
5264 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5265 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5266 }
5267 }
5268
John Brawna7b4ec02015-08-10 11:11:28 +00005269 // -fcommon is the default unless compiling kernel code or the target says so
5270 bool NoCommonDefault =
5271 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5272 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5273 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005274 CmdArgs.push_back("-fno-common");
5275
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005276 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005277 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005278 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005279 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005280 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005281 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005282
Daniel Dunbar6358d682010-10-15 22:30:42 +00005283 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005284 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005285 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005286 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005287
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005288 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005289 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5290 StringRef value = inputCharset->getValue();
5291 if (value != "UTF-8")
5292 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5293 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005294 }
5295
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005296 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005297 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5298 StringRef value = execCharset->getValue();
5299 if (value != "UTF-8")
5300 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5301 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005302 }
5303
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005304 // -fcaret-diagnostics is default.
5305 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5306 options::OPT_fno_caret_diagnostics, true))
5307 CmdArgs.push_back("-fno-caret-diagnostics");
5308
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005309 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005310 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005311 options::OPT_fno_diagnostics_fixit_info))
5312 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005313
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005314 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005315 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005316 options::OPT_fno_diagnostics_show_option))
5317 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005318
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005319 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005320 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005321 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005322 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005323 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005324
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005325 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005326 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005327 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005328 }
5329
Chandler Carruthb6766f02011-03-27 01:50:55 +00005330 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005331 options::OPT_fdiagnostics_show_note_include_stack,
5332 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005333 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005334 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005335 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5336 else
5337 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5338 }
5339
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005340 // Color diagnostics are the default, unless the terminal doesn't support
5341 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005342 // Support both clang's -f[no-]color-diagnostics and gcc's
5343 // -f[no-]diagnostics-colors[=never|always|auto].
5344 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005345 for (const auto &Arg : Args) {
5346 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005347 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5348 !O.matches(options::OPT_fdiagnostics_color) &&
5349 !O.matches(options::OPT_fno_color_diagnostics) &&
5350 !O.matches(options::OPT_fno_diagnostics_color) &&
5351 !O.matches(options::OPT_fdiagnostics_color_EQ))
5352 continue;
5353
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005354 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005355 if (O.matches(options::OPT_fcolor_diagnostics) ||
5356 O.matches(options::OPT_fdiagnostics_color)) {
5357 ShowColors = Colors_On;
5358 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5359 O.matches(options::OPT_fno_diagnostics_color)) {
5360 ShowColors = Colors_Off;
5361 } else {
5362 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005363 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005364 if (value == "always")
5365 ShowColors = Colors_On;
5366 else if (value == "never")
5367 ShowColors = Colors_Off;
5368 else if (value == "auto")
5369 ShowColors = Colors_Auto;
5370 else
5371 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005372 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005373 }
5374 }
5375 if (ShowColors == Colors_On ||
5376 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005377 CmdArgs.push_back("-fcolor-diagnostics");
5378
Nico Rieck7857d462013-09-11 00:38:02 +00005379 if (Args.hasArg(options::OPT_fansi_escape_codes))
5380 CmdArgs.push_back("-fansi-escape-codes");
5381
Daniel Dunbardb097022009-06-08 21:13:54 +00005382 if (!Args.hasFlag(options::OPT_fshow_source_location,
5383 options::OPT_fno_show_source_location))
5384 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005385
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005386 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005387 true))
5388 CmdArgs.push_back("-fno-show-column");
5389
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005390 if (!Args.hasFlag(options::OPT_fspell_checking,
5391 options::OPT_fno_spell_checking))
5392 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005393
Chad Rosierc8e56e82012-12-05 21:08:21 +00005394 // -fno-asm-blocks is default.
5395 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5396 false))
5397 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005398
Steven Wucb0d13f2015-01-16 23:05:28 +00005399 // -fgnu-inline-asm is default.
5400 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5401 options::OPT_fno_gnu_inline_asm, true))
5402 CmdArgs.push_back("-fno-gnu-inline-asm");
5403
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005404 // Enable vectorization per default according to the optimization level
5405 // selected. For optimization levels that want vectorization we use the alias
5406 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005407 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005408 OptSpecifier VectorizeAliasOption =
5409 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005410 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005411 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005412 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005413
Chad Rosier136d67d2014-04-28 19:30:57 +00005414 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005415 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005416 OptSpecifier SLPVectAliasOption =
5417 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005418 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005419 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005420 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005421
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005422 // -fno-slp-vectorize-aggressive is default.
5423 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005424 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005425 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005426
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005427 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5428 A->render(Args, CmdArgs);
5429
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005430 // -fdollars-in-identifiers default varies depending on platform and
5431 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005432 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005433 options::OPT_fno_dollars_in_identifiers)) {
5434 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005435 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005436 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005437 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005438 }
5439
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005440 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5441 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005442 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005443 options::OPT_fno_unit_at_a_time)) {
5444 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005445 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005446 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005447
Eli Friedman055c9702011-11-02 01:53:16 +00005448 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5449 options::OPT_fno_apple_pragma_pack, false))
5450 CmdArgs.push_back("-fapple-pragma-pack");
5451
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005452 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005453 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5454 // by default.
5455 if (getToolChain().getArch() == llvm::Triple::le32) {
5456 CmdArgs.push_back("-fno-math-builtin");
5457 }
5458
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005459// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5460//
5461// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005462#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005463 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005464 (getToolChain().getArch() == llvm::Triple::arm ||
5465 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005466 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5467 CmdArgs.push_back("-fno-builtin-strcat");
5468 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5469 CmdArgs.push_back("-fno-builtin-strcpy");
5470 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005471#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005472
Justin Bognera88f0122014-06-20 22:59:50 +00005473 // Enable rewrite includes if the user's asked for it or if we're generating
5474 // diagnostics.
5475 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5476 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005477 if (Args.hasFlag(options::OPT_frewrite_includes,
5478 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005479 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005480 CmdArgs.push_back("-frewrite-includes");
5481
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005482 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005483 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005484 options::OPT_traditional_cpp)) {
5485 if (isa<PreprocessJobAction>(JA))
5486 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005487 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005488 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005489 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005490
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005491 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005492 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005493
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005494 // Handle serialized diagnostics.
5495 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5496 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005497 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005498 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005499
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005500 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5501 CmdArgs.push_back("-fretain-comments-from-system-headers");
5502
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005503 // Forward -fcomment-block-commands to -cc1.
5504 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005505 // Forward -fparse-all-comments to -cc1.
5506 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005507
John Brawnad31ace2015-09-23 13:55:40 +00005508 // Turn -fplugin=name.so into -load name.so
5509 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5510 CmdArgs.push_back("-load");
5511 CmdArgs.push_back(A->getValue());
5512 A->claim();
5513 }
5514
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005515 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5516 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005517 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005518 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5519 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005520
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005521 // We translate this by hand to the -cc1 argument, since nightly test uses
5522 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005523 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005524 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005525 } else
Sean Silva14facf32015-06-09 01:57:17 +00005526 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005527 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005528
Bob Wilson23a55f12014-12-21 07:00:00 +00005529 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005530 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5531 // by the frontend.
5532 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5533 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005534
Daniel Dunbard67a3222009-03-30 06:36:42 +00005535 if (Output.getType() == types::TY_Dependencies) {
5536 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005537 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005538 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005539 CmdArgs.push_back(Output.getFilename());
5540 } else {
5541 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005542 }
5543
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005544 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005545
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005546 if (Input.isFilename())
5547 CmdArgs.push_back(Input.getFilename());
5548 else
5549 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005550
Chris Lattnere9d7d782009-11-03 19:50:27 +00005551 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5552
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005553 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005554
5555 // Optionally embed the -cc1 level arguments into the debug info, for build
5556 // analysis.
5557 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005558 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005559 for (const auto &Arg : Args)
5560 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005561
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005562 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005563 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005564 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005565 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005566 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005567 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005568 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005569 }
5570 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005571 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005572 }
5573
Eric Christopherd3804002013-02-22 20:12:52 +00005574 // Add the split debug info name to the command lines here so we
5575 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005576 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005577 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5578 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005579 const char *SplitDwarfOut;
5580 if (SplitDwarf) {
5581 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005582 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005583 CmdArgs.push_back(SplitDwarfOut);
5584 }
5585
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005586 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5587 // Include them with -fcuda-include-gpubinary.
5588 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005589 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005590 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005591 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005592 }
5593
Eric Christopherd3804002013-02-22 20:12:52 +00005594 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005595 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005596 Output.getType() == types::TY_Object &&
5597 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005598 auto CLCommand =
5599 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005600 C.addCommand(llvm::make_unique<FallbackCommand>(
5601 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005602 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005603 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005604 }
5605
Eric Christopherf1545832013-02-22 23:50:16 +00005606 // Handle the debug info splitting at object creation time if we're
5607 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005608 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005609 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005610 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005611
Roman Divacky178e01602011-02-10 16:52:03 +00005612 if (Arg *A = Args.getLastArg(options::OPT_pg))
5613 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005614 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5615 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005616
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005617 // Claim some arguments which clang supports automatically.
5618
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005619 // -fpch-preprocess is used with gcc to add a special marker in the output to
5620 // include the PCH file. Clang's PTH solution is completely transparent, so we
5621 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005622 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005623
Daniel Dunbar17731772009-03-23 19:03:36 +00005624 // Claim some arguments which clang doesn't support, but we don't
5625 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005626 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5627 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005628
Rafael Espindolab0092d72013-09-04 19:37:35 +00005629 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005630 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005631}
5632
John McCall5fb5df92012-06-20 06:18:46 +00005633/// Add options related to the Objective-C runtime/ABI.
5634///
5635/// Returns true if the runtime is non-fragile.
5636ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5637 ArgStringList &cmdArgs,
5638 RewriteKind rewriteKind) const {
5639 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005640 Arg *runtimeArg =
5641 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5642 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005643
5644 // Just forward -fobjc-runtime= to the frontend. This supercedes
5645 // options about fragility.
5646 if (runtimeArg &&
5647 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5648 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005649 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005650 if (runtime.tryParse(value)) {
5651 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005652 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005653 }
5654
5655 runtimeArg->render(args, cmdArgs);
5656 return runtime;
5657 }
5658
5659 // Otherwise, we'll need the ABI "version". Version numbers are
5660 // slightly confusing for historical reasons:
5661 // 1 - Traditional "fragile" ABI
5662 // 2 - Non-fragile ABI, version 1
5663 // 3 - Non-fragile ABI, version 2
5664 unsigned objcABIVersion = 1;
5665 // If -fobjc-abi-version= is present, use that to set the version.
5666 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005667 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005668 if (value == "1")
5669 objcABIVersion = 1;
5670 else if (value == "2")
5671 objcABIVersion = 2;
5672 else if (value == "3")
5673 objcABIVersion = 3;
5674 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005675 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005676 } else {
5677 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005678 bool nonFragileABIIsDefault =
5679 (rewriteKind == RK_NonFragile ||
5680 (rewriteKind == RK_None &&
5681 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005682 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5683 options::OPT_fno_objc_nonfragile_abi,
5684 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005685// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005686#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5687 unsigned nonFragileABIVersion = 1;
5688#else
5689 unsigned nonFragileABIVersion = 2;
5690#endif
5691
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005692 if (Arg *abiArg =
5693 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005694 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005695 if (value == "1")
5696 nonFragileABIVersion = 1;
5697 else if (value == "2")
5698 nonFragileABIVersion = 2;
5699 else
5700 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005701 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005702 }
5703
5704 objcABIVersion = 1 + nonFragileABIVersion;
5705 } else {
5706 objcABIVersion = 1;
5707 }
5708 }
5709
5710 // We don't actually care about the ABI version other than whether
5711 // it's non-fragile.
5712 bool isNonFragile = objcABIVersion != 1;
5713
5714 // If we have no runtime argument, ask the toolchain for its default runtime.
5715 // However, the rewriter only really supports the Mac runtime, so assume that.
5716 ObjCRuntime runtime;
5717 if (!runtimeArg) {
5718 switch (rewriteKind) {
5719 case RK_None:
5720 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5721 break;
5722 case RK_Fragile:
5723 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5724 break;
5725 case RK_NonFragile:
5726 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5727 break;
5728 }
5729
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005730 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005731 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5732 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005733 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005734 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5735
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005736 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005737 } else {
5738 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5739 }
5740
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005741 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005742 } else {
5743 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005744 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005745 // non-fragile mode or the GCC runtime in fragile mode.
5746 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005747 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005748 else
5749 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005750 }
5751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005752 cmdArgs.push_back(
5753 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005754 return runtime;
5755}
5756
Reid Klecknerc542d372014-06-27 17:02:02 +00005757static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5758 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5759 I += HaveDash;
5760 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005761}
Reid Klecknerc542d372014-06-27 17:02:02 +00005762
Benjamin Kramere003ca22015-10-28 13:54:16 +00005763namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005764struct EHFlags {
5765 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5766 bool Synch;
5767 bool Asynch;
5768 bool NoExceptC;
5769};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005770} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005771
5772/// /EH controls whether to run destructor cleanups when exceptions are
5773/// thrown. There are three modifiers:
5774/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5775/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5776/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5777/// - c: Assume that extern "C" functions are implicitly noexcept. This
5778/// modifier is an optimization, so we ignore it for now.
5779/// The default is /EHs-c-, meaning cleanups are disabled.
5780static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5781 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005782
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005783 std::vector<std::string> EHArgs =
5784 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005785 for (auto EHVal : EHArgs) {
5786 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5787 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005788 case 'a':
5789 EH.Asynch = maybeConsumeDash(EHVal, I);
5790 continue;
5791 case 'c':
5792 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5793 continue;
5794 case 's':
5795 EH.Synch = maybeConsumeDash(EHVal, I);
5796 continue;
5797 default:
5798 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005799 }
5800 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5801 break;
5802 }
5803 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005804
Reid Klecknerc542d372014-06-27 17:02:02 +00005805 return EH;
5806}
5807
Douglas Katzman3459ce22015-10-08 04:24:12 +00005808void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5809 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5810 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005811 unsigned RTOptionID = options::OPT__SLASH_MT;
5812
Hans Wennborgf1a74252013-09-10 20:18:04 +00005813 if (Args.hasArg(options::OPT__SLASH_LDd))
5814 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5815 // but defining _DEBUG is sticky.
5816 RTOptionID = options::OPT__SLASH_MTd;
5817
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005818 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005819 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005820
David Majnemere2afb472015-07-24 06:49:13 +00005821 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005822 switch (RTOptionID) {
5823 case options::OPT__SLASH_MD:
5824 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005825 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005826 CmdArgs.push_back("-D_MT");
5827 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005828 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005829 break;
5830 case options::OPT__SLASH_MDd:
5831 CmdArgs.push_back("-D_DEBUG");
5832 CmdArgs.push_back("-D_MT");
5833 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005834 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005835 break;
5836 case options::OPT__SLASH_MT:
5837 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005838 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005839 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005840 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005841 break;
5842 case options::OPT__SLASH_MTd:
5843 CmdArgs.push_back("-D_DEBUG");
5844 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005845 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005846 break;
5847 default:
5848 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005849 }
5850
David Majnemere2afb472015-07-24 06:49:13 +00005851 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5852 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5853 } else {
5854 CmdArgs.push_back(FlagForCRT.data());
5855
5856 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5857 // users want. The /Za flag to cl.exe turns this off, but it's not
5858 // implemented in clang.
5859 CmdArgs.push_back("--dependent-lib=oldnames");
5860 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005861
Hans Wennborg8858a032014-07-21 23:42:07 +00005862 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5863 // would produce interleaved output, so ignore /showIncludes in such cases.
5864 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5865 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5866 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005867
David Majnemerf6072342014-07-01 22:24:56 +00005868 // This controls whether or not we emit RTTI data for polymorphic types.
5869 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5870 /*default=*/false))
5871 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005872
Reid Kleckner124955a2015-08-05 18:51:13 +00005873 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005874 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005875 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5876 // If we are emitting CV but not DWARF, don't build information that LLVM
5877 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005878 if (*EmitCodeView && !EmitDwarf)
5879 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5880 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005881 CmdArgs.push_back("-gcodeview");
5882
Reid Klecknerc542d372014-06-27 17:02:02 +00005883 const Driver &D = getToolChain().getDriver();
5884 EHFlags EH = parseClangCLEHFlags(D, Args);
5885 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005886 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005887 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005888 CmdArgs.push_back("-fexceptions");
5889 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005890
Hans Wennborge50cec32014-06-13 20:59:54 +00005891 // /EP should expand to -E -P.
5892 if (Args.hasArg(options::OPT__SLASH_EP)) {
5893 CmdArgs.push_back("-E");
5894 CmdArgs.push_back("-P");
5895 }
5896
David Majnemera5b195a2015-02-14 01:35:12 +00005897 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005898 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5899 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005900 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5901 else
5902 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5903
5904 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5905 VolatileOptionID = A->getOption().getID();
5906
5907 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5908 CmdArgs.push_back("-fms-volatile");
5909
David Majnemer86c318f2014-02-11 21:05:00 +00005910 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5911 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5912 if (MostGeneralArg && BestCaseArg)
5913 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5914 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5915
5916 if (MostGeneralArg) {
5917 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5918 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5919 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5920
5921 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5922 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5923 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5924 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5925 << FirstConflict->getAsString(Args)
5926 << SecondConflict->getAsString(Args);
5927
5928 if (SingleArg)
5929 CmdArgs.push_back("-fms-memptr-rep=single");
5930 else if (MultipleArg)
5931 CmdArgs.push_back("-fms-memptr-rep=multiple");
5932 else
5933 CmdArgs.push_back("-fms-memptr-rep=virtual");
5934 }
5935
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005936 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5937 A->render(Args, CmdArgs);
5938
Hans Wennborg81f74482013-09-10 01:07:07 +00005939 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5940 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005941 if (Args.hasArg(options::OPT__SLASH_fallback))
5942 CmdArgs.push_back("msvc-fallback");
5943 else
5944 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005945 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005946}
5947
Douglas Katzman95354292015-06-23 20:42:09 +00005948visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005949 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005950 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005951 return CLFallback.get();
5952}
5953
Daniel Sanders7f933f42015-01-30 17:35:23 +00005954void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5955 ArgStringList &CmdArgs) const {
5956 StringRef CPUName;
5957 StringRef ABIName;
5958 const llvm::Triple &Triple = getToolChain().getTriple();
5959 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5960
5961 CmdArgs.push_back("-target-abi");
5962 CmdArgs.push_back(ABIName.data());
5963}
5964
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005965void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005966 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005967 const ArgList &Args,
5968 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005969 ArgStringList CmdArgs;
5970
5971 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5972 const InputInfo &Input = Inputs[0];
5973
James Y Knight2db38f32015-08-15 03:45:25 +00005974 std::string TripleStr =
5975 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5976 const llvm::Triple Triple(TripleStr);
5977
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005978 // Don't warn about "clang -w -c foo.s"
5979 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005980 // and "clang -emit-llvm -c foo.s"
5981 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005982
Rafael Espindola577637a2015-01-03 00:06:04 +00005983 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005984
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005985 // Invoke ourselves in -cc1as mode.
5986 //
5987 // FIXME: Implement custom jobs for internal actions.
5988 CmdArgs.push_back("-cc1as");
5989
5990 // Add the "effective" target triple.
5991 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005992 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5993
5994 // Set the output mode, we currently only expect to be used as a real
5995 // assembler.
5996 CmdArgs.push_back("-filetype");
5997 CmdArgs.push_back("obj");
5998
Eric Christopher45f2e712012-12-18 00:31:10 +00005999 // Set the main file name, so that debug info works even with
6000 // -save-temps or preprocessed assembly.
6001 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006002 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006003
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006004 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006005 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006006 if (!CPU.empty()) {
6007 CmdArgs.push_back("-target-cpu");
6008 CmdArgs.push_back(Args.MakeArgString(CPU));
6009 }
6010
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006011 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006012 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006013
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006014 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006015 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006016
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006017 // Pass along any -I options so we get proper .include search paths.
6018 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6019
Eric Christopherfc3ee562012-01-10 00:38:01 +00006020 // Determine the original source input.
6021 const Action *SourceAction = &JA;
6022 while (SourceAction->getKind() != Action::InputClass) {
6023 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6024 SourceAction = SourceAction->getInputs()[0];
6025 }
6026
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006027 // Forward -g and handle debug info related flags, assuming we are dealing
6028 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006029 if (SourceAction->getType() == types::TY_Asm ||
6030 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006031 bool WantDebug = false;
6032 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006033 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006034 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006035 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6036 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006037 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006038 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006039 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006040 if (DwarfVersion == 0)
6041 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006042 RenderDebugEnablingArgs(Args, CmdArgs,
6043 (WantDebug ? CodeGenOptions::LimitedDebugInfo
6044 : CodeGenOptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006045 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006046
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006047 // Add the -fdebug-compilation-dir flag if needed.
6048 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006049
6050 // Set the AT_producer to the clang version when using the integrated
6051 // assembler on assembly source files.
6052 CmdArgs.push_back("-dwarf-debug-producer");
6053 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006054
6055 // And pass along -I options
6056 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006057 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006058
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006059 // Handle -fPIC et al -- the relocation-model affects the assembler
6060 // for some targets.
6061 llvm::Reloc::Model RelocationModel;
6062 unsigned PICLevel;
6063 bool IsPIE;
6064 std::tie(RelocationModel, PICLevel, IsPIE) =
6065 ParsePICArgs(getToolChain(), Triple, Args);
6066
6067 const char *RMName = RelocationModelName(RelocationModel);
6068 if (RMName) {
6069 CmdArgs.push_back("-mrelocation-model");
6070 CmdArgs.push_back(RMName);
6071 }
6072
Kevin Enderby292dc082011-12-22 19:31:58 +00006073 // Optionally embed the -cc1as level arguments into the debug info, for build
6074 // analysis.
6075 if (getToolChain().UseDwarfDebugFlags()) {
6076 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006077 for (const auto &Arg : Args)
6078 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006079
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006080 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006081 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6082 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006083 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006084 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006085 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006086 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006087 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006088 }
6089 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006090 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006091 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006092
6093 // FIXME: Add -static support, once we have it.
6094
Daniel Sanders7f933f42015-01-30 17:35:23 +00006095 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006096 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006097 default:
6098 break;
6099
6100 case llvm::Triple::mips:
6101 case llvm::Triple::mipsel:
6102 case llvm::Triple::mips64:
6103 case llvm::Triple::mips64el:
6104 AddMIPSTargetArgs(Args, CmdArgs);
6105 break;
6106 }
6107
David Blaikie372d9502014-01-17 03:17:40 +00006108 // Consume all the warning flags. Usually this would be handled more
6109 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6110 // doesn't handle that so rather than warning about unused flags that are
6111 // actually used, we'll lie by omission instead.
6112 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006113 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006114
David Blaikie9260ed62013-07-25 21:19:01 +00006115 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6116 getToolChain().getDriver());
6117
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006118 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006119
6120 assert(Output.isFilename() && "Unexpected lipo output.");
6121 CmdArgs.push_back("-o");
6122 CmdArgs.push_back(Output.getFilename());
6123
Daniel Dunbarb440f562010-08-02 02:38:21 +00006124 assert(Input.isFilename() && "Invalid input.");
6125 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006126
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006127 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006128 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006129
6130 // Handle the debug info splitting at object creation time if we're
6131 // creating an object.
6132 // TODO: Currently only works on linux with newer objcopy.
6133 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006134 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006135 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006136 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006137}
6138
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006139void GnuTool::anchor() {}
6140
Daniel Dunbara3246a02009-03-18 08:07:30 +00006141void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006142 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006143 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006144 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006145 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006146 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006147
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006148 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006149 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006150 // It is unfortunate that we have to claim here, as this means
6151 // we will basically never report anything interesting for
6152 // platforms using a generic gcc, even if we are just using gcc
6153 // to get to the assembler.
6154 A->claim();
6155
Daniel Dunbar939c1212010-08-03 16:14:14 +00006156 // Don't forward any -g arguments to assembly steps.
6157 if (isa<AssembleJobAction>(JA) &&
6158 A->getOption().matches(options::OPT_g_Group))
6159 continue;
6160
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006161 // Don't forward any -W arguments to assembly and link steps.
6162 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6163 A->getOption().matches(options::OPT_W_Group))
6164 continue;
6165
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006166 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006167 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006168 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006169
Daniel Dunbar4e295052010-01-25 22:35:08 +00006170 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006171
6172 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006173 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006174 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006175 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006176 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006177 }
6178
Daniel Dunbar5716d872009-05-02 21:41:52 +00006179 // Try to force gcc to match the tool chain we want, if we recognize
6180 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006181 //
6182 // FIXME: The triple class should directly provide the information we want
6183 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006184 switch (getToolChain().getArch()) {
6185 default:
6186 break;
6187 case llvm::Triple::x86:
6188 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006189 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006190 break;
6191 case llvm::Triple::x86_64:
6192 case llvm::Triple::ppc64:
6193 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006194 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006195 break;
6196 case llvm::Triple::sparcel:
6197 CmdArgs.push_back("-EL");
6198 break;
6199 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006200
Daniel Dunbarb440f562010-08-02 02:38:21 +00006201 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006202 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006203 CmdArgs.push_back(Output.getFilename());
6204 } else {
6205 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006206 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006207 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006208
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006209 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006210
6211 // Only pass -x if gcc will understand it; otherwise hope gcc
6212 // understands the suffix correctly. The main use case this would go
6213 // wrong in is for linker inputs if they happened to have an odd
6214 // suffix; really the only way to get this to happen is a command
6215 // like '-x foobar a.c' which will treat a.c like a linker input.
6216 //
6217 // FIXME: For the linker case specifically, can we safely convert
6218 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006219 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006220 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006221 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006222 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006223 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006224 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006225 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006226 else if (II.getType() == types::TY_ModuleFile)
6227 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006228 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006229
Daniel Dunbara3246a02009-03-18 08:07:30 +00006230 if (types::canTypeBeUserSpecified(II.getType())) {
6231 CmdArgs.push_back("-x");
6232 CmdArgs.push_back(types::getTypeName(II.getType()));
6233 }
6234
Daniel Dunbarb440f562010-08-02 02:38:21 +00006235 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006236 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006237 else {
6238 const Arg &A = II.getInputArg();
6239
6240 // Reverse translate some rewritten options.
6241 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6242 CmdArgs.push_back("-lstdc++");
6243 continue;
6244 }
6245
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006246 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006247 A.render(Args, CmdArgs);
6248 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006249 }
6250
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006251 const std::string customGCCName = D.getCCCGenericGCCName();
6252 const char *GCCName;
6253 if (!customGCCName.empty())
6254 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006255 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006256 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006257 } else
6258 GCCName = "gcc";
6259
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006260 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006261 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006262}
6263
Douglas Katzman95354292015-06-23 20:42:09 +00006264void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6265 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006266 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006267}
6268
Douglas Katzman95354292015-06-23 20:42:09 +00006269void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6270 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006271 const Driver &D = getToolChain().getDriver();
6272
Eric Christophercc7ff502015-01-29 00:56:17 +00006273 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006274 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006275 case types::TY_LLVM_IR:
6276 case types::TY_LTO_IR:
6277 case types::TY_LLVM_BC:
6278 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006279 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006280 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006281 // We assume we've got an "integrated" assembler in that gcc will produce an
6282 // object file itself.
6283 case types::TY_Object:
6284 CmdArgs.push_back("-c");
6285 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006286 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006287 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006288 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006289 case types::TY_Nothing:
6290 CmdArgs.push_back("-fsyntax-only");
6291 break;
6292 default:
6293 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006294 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006295}
6296
Douglas Katzman95354292015-06-23 20:42:09 +00006297void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6298 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006299 // The types are (hopefully) good enough.
6300}
6301
Tony Linthicum76329bf2011-12-12 21:14:55 +00006302// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006303void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006304 ArgStringList &CmdArgs) const {
6305}
6306
Douglas Katzman95354292015-06-23 20:42:09 +00006307void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6308 const InputInfo &Output,
6309 const InputInfoList &Inputs,
6310 const ArgList &Args,
6311 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006312 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006313
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006314 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6315 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006316 ArgStringList CmdArgs;
6317
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006318 std::string MArchString = "-march=hexagon";
6319 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006320
6321 RenderExtraToolArgs(JA, CmdArgs);
6322
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006323 std::string AsName = "hexagon-llvm-mc";
6324 std::string MCpuString = "-mcpu=hexagon" +
6325 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6326 CmdArgs.push_back("-filetype=obj");
6327 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6328
Tony Linthicum76329bf2011-12-12 21:14:55 +00006329 if (Output.isFilename()) {
6330 CmdArgs.push_back("-o");
6331 CmdArgs.push_back(Output.getFilename());
6332 } else {
6333 assert(Output.isNothing() && "Unexpected output");
6334 CmdArgs.push_back("-fsyntax-only");
6335 }
6336
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006337 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6338 std::string N = llvm::utostr(G.getValue());
6339 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6340 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006341
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006342 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006343
Tony Linthicum76329bf2011-12-12 21:14:55 +00006344 // Only pass -x if gcc will understand it; otherwise hope gcc
6345 // understands the suffix correctly. The main use case this would go
6346 // wrong in is for linker inputs if they happened to have an odd
6347 // suffix; really the only way to get this to happen is a command
6348 // like '-x foobar a.c' which will treat a.c like a linker input.
6349 //
6350 // FIXME: For the linker case specifically, can we safely convert
6351 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006352 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006353 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006354 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006355 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006356 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006357 else if (II.getType() == types::TY_AST)
6358 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006359 << HTC.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)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006362 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006363
6364 if (II.isFilename())
6365 CmdArgs.push_back(II.getFilename());
6366 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006367 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006368 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006369 II.getInputArg().render(Args, CmdArgs);
6370 }
6371
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006372 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006373 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006374}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006375
Douglas Katzman95354292015-06-23 20:42:09 +00006376void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6377 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006378}
6379
Douglas Katzman54366072015-07-27 16:53:08 +00006380static void
6381constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006382 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006383 const InputInfo &Output, const InputInfoList &Inputs,
6384 const ArgList &Args, ArgStringList &CmdArgs,
6385 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006386
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006387 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006388
Matthew Curtise689b052012-12-06 15:46:07 +00006389 //----------------------------------------------------------------------------
6390 //
6391 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006392 bool IsStatic = Args.hasArg(options::OPT_static);
6393 bool IsShared = Args.hasArg(options::OPT_shared);
6394 bool IsPIE = Args.hasArg(options::OPT_pie);
6395 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6396 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6397 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6398 bool UseG0 = false;
6399 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006400
Matthew Curtise689b052012-12-06 15:46:07 +00006401 //----------------------------------------------------------------------------
6402 // Silence warnings for various options
6403 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006404 Args.ClaimAllArgs(options::OPT_g_Group);
6405 Args.ClaimAllArgs(options::OPT_emit_llvm);
6406 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6407 // handled somewhere else.
6408 Args.ClaimAllArgs(options::OPT_static_libgcc);
6409
6410 //----------------------------------------------------------------------------
6411 //
6412 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006413 if (Args.hasArg(options::OPT_s))
6414 CmdArgs.push_back("-s");
6415
6416 if (Args.hasArg(options::OPT_r))
6417 CmdArgs.push_back("-r");
6418
6419 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006420 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006421
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006422 CmdArgs.push_back("-march=hexagon");
6423 std::string CpuVer =
6424 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6425 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6426 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006427
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006428 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006429 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006430 // The following should be the default, but doing as hexagon-gcc does.
6431 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006432 }
6433
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006434 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006435 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006436
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006437 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006438 CmdArgs.push_back("-pie");
6439
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006440 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6441 std::string N = llvm::utostr(G.getValue());
6442 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6443 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006444 }
6445
Matthew Curtise689b052012-12-06 15:46:07 +00006446 //----------------------------------------------------------------------------
6447 //
6448 //----------------------------------------------------------------------------
6449 CmdArgs.push_back("-o");
6450 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006451
Matthew Curtise689b052012-12-06 15:46:07 +00006452 //----------------------------------------------------------------------------
6453 // moslib
6454 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006455 std::vector<std::string> OsLibs;
6456 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006457
Sean Silva14facf32015-06-09 01:57:17 +00006458 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6459 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006460 OsLibs.emplace_back(A->getValue());
6461 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006462 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006463 if (OsLibs.empty()) {
6464 OsLibs.push_back("standalone");
6465 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006466 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006467
Matthew Curtise689b052012-12-06 15:46:07 +00006468 //----------------------------------------------------------------------------
6469 // Start Files
6470 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006471 const std::string MCpuSuffix = "/" + CpuVer;
6472 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6473 const std::string RootDir =
6474 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6475 const std::string StartSubDir =
6476 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006477
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006478 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6479 const char *Name) -> std::string {
6480 std::string RelName = SubDir + Name;
6481 std::string P = HTC.GetFilePath(RelName.c_str());
6482 if (llvm::sys::fs::exists(P))
6483 return P;
6484 return RootDir + RelName;
6485 };
6486
6487 if (IncStdLib && IncStartFiles) {
6488 if (!IsShared) {
6489 if (HasStandalone) {
6490 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6491 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006492 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006493 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6494 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006495 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006496 std::string Init = UseShared
6497 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6498 : Find(RootDir, StartSubDir, "/init.o");
6499 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006500 }
6501
6502 //----------------------------------------------------------------------------
6503 // Library Search Paths
6504 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006505 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6506 for (const auto &LibPath : LibPaths)
6507 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006508
6509 //----------------------------------------------------------------------------
6510 //
6511 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006512 Args.AddAllArgs(CmdArgs,
6513 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6514 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006515
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006516 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006517
6518 //----------------------------------------------------------------------------
6519 // Libraries
6520 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006521 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006522 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006523 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006524 CmdArgs.push_back("-lm");
6525 }
6526
6527 CmdArgs.push_back("--start-group");
6528
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006529 if (!IsShared) {
6530 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006531 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006532 CmdArgs.push_back("-lc");
6533 }
6534 CmdArgs.push_back("-lgcc");
6535
6536 CmdArgs.push_back("--end-group");
6537 }
6538
6539 //----------------------------------------------------------------------------
6540 // End files
6541 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006542 if (IncStdLib && IncStartFiles) {
6543 std::string Fini = UseShared
6544 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6545 : Find(RootDir, StartSubDir, "/fini.o");
6546 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006547 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006548}
6549
Douglas Katzman95354292015-06-23 20:42:09 +00006550void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6551 const InputInfo &Output,
6552 const InputInfoList &Inputs,
6553 const ArgList &Args,
6554 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006555 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006556
6557 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006558 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006559 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006560
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006561 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006562 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006563 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006564}
6565// Hexagon tools end.
6566
Tom Stellard8fa33092015-07-18 01:49:05 +00006567void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6568 const InputInfo &Output,
6569 const InputInfoList &Inputs,
6570 const ArgList &Args,
6571 const char *LinkingOutput) const {
6572
6573 std::string Linker = getToolChain().GetProgramPath(getShortName());
6574 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006575 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6576 CmdArgs.push_back("-o");
6577 CmdArgs.push_back(Output.getFilename());
6578 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6579 CmdArgs, Inputs));
6580}
6581// AMDGPU tools end.
6582
Dan Gohman52816862015-12-16 23:30:41 +00006583wasm::Linker::Linker(const ToolChain &TC)
6584 : GnuTool("wasm::Linker", "lld", TC) {}
6585
6586bool wasm::Linker::isLinkJob() const {
6587 return true;
6588}
6589
6590bool wasm::Linker::hasIntegratedCPP() const {
6591 return false;
6592}
6593
6594void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6595 const InputInfo &Output,
6596 const InputInfoList &Inputs,
6597 const ArgList &Args,
6598 const char *LinkingOutput) const {
6599 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6600 ArgStringList CmdArgs;
6601 CmdArgs.push_back("-flavor");
6602 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006603
6604 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006605 // size is of particular importance. This is significantly facilitated by
6606 // the enabling of -ffunction-sections and -fdata-sections in
6607 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006608 if (areOptimizationsEnabled(Args))
6609 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006610
Dan Gohman52816862015-12-16 23:30:41 +00006611 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6612 CmdArgs.push_back("-o");
6613 CmdArgs.push_back(Output.getFilename());
6614 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6615}
6616
Renato Golin7c542b42015-07-27 23:44:45 +00006617const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006618 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006619 if (!Arch.empty())
6620 MArch = Arch;
6621 else
Bernard Ogden31561762013-12-12 13:27:11 +00006622 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006623 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006624
6625 // Handle -march=native.
6626 if (MArch == "native") {
6627 std::string CPU = llvm::sys::getHostCPUName();
6628 if (CPU != "generic") {
6629 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006630 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006631 // If there is no valid architecture suffix for this CPU we don't know how
6632 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006633 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006634 MArch = "";
6635 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006636 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006637 }
6638 }
6639
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006640 return MArch;
6641}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006642
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006643/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006644StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006645 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006646 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6647 // here means an -march=native that we can't handle, so instead return no CPU.
6648 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006649 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006650
John Brawna95c1a82015-05-08 12:52:18 +00006651 // We need to return an empty string here on invalid MArch values as the
6652 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006653 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006654}
6655
6656/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006657std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006658 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006659 // FIXME: Warn on inconsistent use of -mcpu and -march.
6660 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006661 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006662 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006663 // Handle -mcpu=native.
6664 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006665 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006666 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006667 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006668 }
6669
Renato Goline17c5802015-07-27 23:44:42 +00006670 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006671}
6672
6673/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006674/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006675// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006676StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6677 const llvm::Triple &Triple) {
6678 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006679 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006680 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006681 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006682 if (ArchKind == llvm::ARM::AK_INVALID)
6683 // In case of generic Arch, i.e. "arm",
6684 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006685 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006686 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006687 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6688 // armv7k triple if it's actually been specified via "-arch armv7k".
6689 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006690 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006691 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006692 }
Renato Golin3c007252015-05-28 15:05:53 +00006693 if (ArchKind == llvm::ARM::AK_INVALID)
6694 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006695 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006696}
6697
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006698void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006699 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006700 if (Args.hasArg(options::OPT_r))
6701 return;
6702
John Brawn94fd9632015-05-21 12:19:49 +00006703 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6704 // to generate BE-8 executables.
6705 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6706 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006707}
6708
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006709mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006710 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6711 // was first introduced in Release 3. However, other compilers have
6712 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006713 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6714 .Case("mips1", NanLegacy)
6715 .Case("mips2", NanLegacy)
6716 .Case("mips3", NanLegacy)
6717 .Case("mips4", NanLegacy)
6718 .Case("mips5", NanLegacy)
6719 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006720 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006721 .Case("mips32r3", NanLegacy | Nan2008)
6722 .Case("mips32r5", NanLegacy | Nan2008)
6723 .Case("mips32r6", Nan2008)
6724 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006725 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006726 .Case("mips64r3", NanLegacy | Nan2008)
6727 .Case("mips64r5", NanLegacy | Nan2008)
6728 .Case("mips64r6", Nan2008)
6729 .Default(NanLegacy);
6730}
6731
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006732bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6733 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6734 return A && (A->getValue() == StringRef(Value));
6735}
6736
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006737bool mips::isUCLibc(const ArgList &Args) {
6738 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006739 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006740}
6741
Daniel Sanders2bf13662014-07-10 14:40:57 +00006742bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006743 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6744 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006745 .Case("2008", true)
6746 .Case("legacy", false)
6747 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006748
6749 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006750 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006751 .Cases("mips32r6", "mips64r6", true)
6752 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006753
6754 return false;
6755}
6756
Daniel Sanders379d44b2014-07-16 11:52:23 +00006757bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006758 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006759 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006760 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006761 return false;
6762
6763 if (ABIName != "32")
6764 return false;
6765
Toma Tabacu94ea6862015-06-16 13:54:13 +00006766 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6767 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006768 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006769 return false;
6770
Daniel Sanders379d44b2014-07-16 11:52:23 +00006771 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006772 .Cases("mips2", "mips3", "mips4", "mips5", true)
6773 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6774 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6775 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006776}
6777
Toma Tabacu94ea6862015-06-16 13:54:13 +00006778bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6779 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006780 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006781 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6782
6783 // FPXX shouldn't be used if -msingle-float is present.
6784 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6785 options::OPT_mdouble_float))
6786 if (A->getOption().matches(options::OPT_msingle_float))
6787 UseFPXX = false;
6788
6789 return UseFPXX;
6790}
6791
Tim Northover157d9112014-01-16 08:48:16 +00006792llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006793 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6794 // archs which Darwin doesn't use.
6795
6796 // The matching this routine does is fairly pointless, since it is neither the
6797 // complete architecture list, nor a reasonable subset. The problem is that
6798 // historically the driver driver accepts this and also ties its -march=
6799 // handling to the architecture name, so we need to be careful before removing
6800 // support for it.
6801
6802 // This code must be kept in sync with Clang's Darwin specific argument
6803 // translation.
6804
6805 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006806 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6807 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6808 .Case("ppc64", llvm::Triple::ppc64)
6809 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6810 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6811 llvm::Triple::x86)
6812 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6813 // This is derived from the driver driver.
6814 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6815 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6816 .Cases("armv7s", "xscale", llvm::Triple::arm)
6817 .Case("arm64", llvm::Triple::aarch64)
6818 .Case("r600", llvm::Triple::r600)
6819 .Case("amdgcn", llvm::Triple::amdgcn)
6820 .Case("nvptx", llvm::Triple::nvptx)
6821 .Case("nvptx64", llvm::Triple::nvptx64)
6822 .Case("amdil", llvm::Triple::amdil)
6823 .Case("spir", llvm::Triple::spir)
6824 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006825}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006826
Tim Northover157d9112014-01-16 08:48:16 +00006827void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006828 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006829 T.setArch(Arch);
6830
6831 if (Str == "x86_64h")
6832 T.setArchName(Str);
6833 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6834 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006835 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006836 }
6837}
6838
Bob Wilsondecc03e2012-11-23 06:14:39 +00006839const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006840 const InputInfo &Input) {
6841 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006842}
6843
Bob Wilsondecc03e2012-11-23 06:14:39 +00006844const char *Clang::getBaseInputStem(const ArgList &Args,
6845 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006846 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006847
Chris Lattner906bb902011-01-16 08:14:11 +00006848 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006849 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006850
6851 return Str;
6852}
6853
Bob Wilsondecc03e2012-11-23 06:14:39 +00006854const char *Clang::getDependencyFileName(const ArgList &Args,
6855 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006856 // FIXME: Think about this more.
6857 std::string Res;
6858
6859 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006860 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006861 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006862 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006863 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006864 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006865 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006866}
6867
Douglas Katzman95354292015-06-23 20:42:09 +00006868void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6869 const InputInfo &Output,
6870 const InputInfoList &Inputs,
6871 const ArgList &Args,
6872 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006873 const ToolChain &ToolChain = getToolChain();
6874 const Driver &D = ToolChain.getDriver();
6875 ArgStringList CmdArgs;
6876
6877 // Silence warning for "clang -g foo.o -o foo"
6878 Args.ClaimAllArgs(options::OPT_g_Group);
6879 // and "clang -emit-llvm foo.o -o foo"
6880 Args.ClaimAllArgs(options::OPT_emit_llvm);
6881 // and for "clang -w foo.o -o foo". Other warning options are already
6882 // handled somewhere else.
6883 Args.ClaimAllArgs(options::OPT_w);
6884
6885 if (!D.SysRoot.empty())
6886 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6887
6888 // CloudABI only supports static linkage.
6889 CmdArgs.push_back("-Bstatic");
6890 CmdArgs.push_back("--eh-frame-hdr");
6891 CmdArgs.push_back("--gc-sections");
6892
6893 if (Output.isFilename()) {
6894 CmdArgs.push_back("-o");
6895 CmdArgs.push_back(Output.getFilename());
6896 } else {
6897 assert(Output.isNothing() && "Invalid output.");
6898 }
6899
Douglas Katzman78b37b02015-11-17 20:28:07 +00006900 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006901 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6902 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6903 }
6904
6905 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006906 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006907 Args.AddAllArgs(CmdArgs,
6908 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6909 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006910
Teresa Johnson945bc502015-10-15 20:35:53 +00006911 if (D.isUsingLTO())
6912 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006913
6914 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6915
Douglas Katzman78b37b02015-11-17 20:28:07 +00006916 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006917 if (D.CCCIsCXX())
6918 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6919 CmdArgs.push_back("-lc");
6920 CmdArgs.push_back("-lcompiler_rt");
6921 }
6922
Douglas Katzman78b37b02015-11-17 20:28:07 +00006923 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006924 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6925
6926 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006927 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006928}
6929
Douglas Katzman95354292015-06-23 20:42:09 +00006930void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6931 const InputInfo &Output,
6932 const InputInfoList &Inputs,
6933 const ArgList &Args,
6934 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006935 ArgStringList CmdArgs;
6936
6937 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6938 const InputInfo &Input = Inputs[0];
6939
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006940 // Determine the original source input.
6941 const Action *SourceAction = &JA;
6942 while (SourceAction->getKind() != Action::InputClass) {
6943 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6944 SourceAction = SourceAction->getInputs()[0];
6945 }
6946
Eric Christopherf5a8f492015-12-08 00:10:10 +00006947 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006948 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006949 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6950 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006951 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006952 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006953 const llvm::Triple &T(getToolChain().getTriple());
6954 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006955 CmdArgs.push_back("-Q");
6956 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006957
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006958 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006959 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006960 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006961 if (Args.hasArg(options::OPT_gstabs))
6962 CmdArgs.push_back("--gstabs");
6963 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006964 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006965 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006966
Daniel Dunbarbe220842009-03-20 16:06:39 +00006967 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006968 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006969
Daniel Dunbar6d484762010-07-22 01:47:22 +00006970 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006971 if (getToolChain().getArch() == llvm::Triple::x86 ||
6972 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006973 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6974 CmdArgs.push_back("-force_cpusubtype_ALL");
6975
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006976 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006977 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006978 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006979 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006980 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006981 CmdArgs.push_back("-static");
6982
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006983 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006984
6985 assert(Output.isFilename() && "Unexpected lipo output.");
6986 CmdArgs.push_back("-o");
6987 CmdArgs.push_back(Output.getFilename());
6988
Daniel Dunbarb440f562010-08-02 02:38:21 +00006989 assert(Input.isFilename() && "Invalid input.");
6990 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006991
6992 // asm_final spec is empty.
6993
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006994 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006995 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006996}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006997
Tim Northover157d9112014-01-16 08:48:16 +00006998void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006999
Tim Northover157d9112014-01-16 08:48:16 +00007000void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7001 ArgStringList &CmdArgs) const {
7002 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007003
Daniel Dunbarc1964212009-03-26 16:23:12 +00007004 // Derived from darwin_arch spec.
7005 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007006 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007007
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007008 // FIXME: Is this needed anymore?
7009 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007010 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007011}
7012
Douglas Katzman95354292015-06-23 20:42:09 +00007013bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007014 // We only need to generate a temp path for LTO if we aren't compiling object
7015 // files. When compiling source files, we run 'dsymutil' after linking. We
7016 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007017 for (const auto &Input : Inputs)
7018 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007019 return true;
7020
7021 return false;
7022}
7023
Douglas Katzman95354292015-06-23 20:42:09 +00007024void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7025 ArgStringList &CmdArgs,
7026 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007027 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007028 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007029
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007030 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007031 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7032 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007033 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7034 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007035 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007036 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007037 }
7038
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007039 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007040 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007041 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7042 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007043
Bob Wilson3d27dad2013-08-02 22:25:34 +00007044 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7045 CmdArgs.push_back("-export_dynamic");
7046
Bob Wilsonb111ec92015-03-02 19:01:14 +00007047 // If we are using App Extension restrictions, pass a flag to the linker
7048 // telling it that the compiled code has been audited.
7049 if (Args.hasFlag(options::OPT_fapplication_extension,
7050 options::OPT_fno_application_extension, false))
7051 CmdArgs.push_back("-application_extension");
7052
Teresa Johnson945bc502015-10-15 20:35:53 +00007053 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007054 // If we are using LTO, then automatically create a temporary file path for
7055 // the linker to use, so that it's lifetime will extend past a possible
7056 // dsymutil step.
7057 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7058 const char *TmpPath = C.getArgs().MakeArgString(
7059 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7060 C.addTempFile(TmpPath);
7061 CmdArgs.push_back("-object_path_lto");
7062 CmdArgs.push_back(TmpPath);
7063 }
7064
7065 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7066 // it in clang installed libraries. If not found, the option is not used
7067 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7068 if (Version[0] >= 133) {
7069 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7070 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7071 SmallString<128> LibLTOPath(P);
7072 llvm::sys::path::append(LibLTOPath, "lib");
7073 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7074 if (llvm::sys::fs::exists(LibLTOPath)) {
7075 CmdArgs.push_back("-lto_library");
7076 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7077 } else {
7078 D.Diag(diag::warn_drv_lto_libpath);
7079 }
7080 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007081 }
7082
Daniel Dunbarc1964212009-03-26 16:23:12 +00007083 // Derived from the "link" spec.
7084 Args.AddAllArgs(CmdArgs, options::OPT_static);
7085 if (!Args.hasArg(options::OPT_static))
7086 CmdArgs.push_back("-dynamic");
7087 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7088 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7089 // here. How do we wish to handle such things?
7090 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007091
Daniel Dunbarc1964212009-03-26 16:23:12 +00007092 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007093 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007094 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007095 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007096
7097 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7098 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7099 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7100
7101 Arg *A;
7102 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7103 (A = Args.getLastArg(options::OPT_current__version)) ||
7104 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007105 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7106 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007107
7108 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7109 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7110 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7111 } else {
7112 CmdArgs.push_back("-dylib");
7113
7114 Arg *A;
7115 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7116 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7117 (A = Args.getLastArg(options::OPT_client__name)) ||
7118 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7119 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7120 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007121 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7122 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007123
Daniel Dunbarc1964212009-03-26 16:23:12 +00007124 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7125 "-dylib_compatibility_version");
7126 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7127 "-dylib_current_version");
7128
Tim Northover157d9112014-01-16 08:48:16 +00007129 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007130
7131 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7132 "-dylib_install_name");
7133 }
7134
7135 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7136 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7137 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007138 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007139 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007140 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7141 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7142 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7143 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7144 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7145 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007146 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007147 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7148 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7149 Args.AddAllArgs(CmdArgs, options::OPT_init);
7150
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007151 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007152 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007153
Daniel Dunbarc1964212009-03-26 16:23:12 +00007154 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7155 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7156 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7157 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7158 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007159
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007160 if (const Arg *A =
7161 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7162 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007163 if (A->getOption().matches(options::OPT_fpie) ||
7164 A->getOption().matches(options::OPT_fPIE))
7165 CmdArgs.push_back("-pie");
7166 else
7167 CmdArgs.push_back("-no_pie");
7168 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007169
7170 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7171 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7172 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7173 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7174 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7175 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7176 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7177 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7178 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7179 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7180 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7181 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7182 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7183 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7184 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7185 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007186
Daniel Dunbar84384642011-05-02 21:03:47 +00007187 // Give --sysroot= preference, over the Apple specific behavior to also use
7188 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007189 StringRef sysroot = C.getSysRoot();
7190 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007191 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007192 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007193 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7194 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007195 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007196 }
7197
Daniel Dunbarc1964212009-03-26 16:23:12 +00007198 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7199 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7200 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7201 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7202 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007203 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007204 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7205 Args.AddAllArgs(CmdArgs, options::OPT_y);
7206 Args.AddLastArg(CmdArgs, options::OPT_w);
7207 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7208 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7209 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7210 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7211 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7212 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7213 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7214 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7215 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7216 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7217 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7218 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7219}
7220
Douglas Katzman95354292015-06-23 20:42:09 +00007221void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7222 const InputInfo &Output,
7223 const InputInfoList &Inputs,
7224 const ArgList &Args,
7225 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007226 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007227
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007228 // If the number of arguments surpasses the system limits, we will encode the
7229 // input files in a separate file, shortening the command line. To this end,
7230 // build a list of input file names that can be passed via a file with the
7231 // -filelist linker option.
7232 llvm::opt::ArgStringList InputFileList;
7233
Daniel Dunbarc1964212009-03-26 16:23:12 +00007234 // The logic here is derived from gcc's behavior; most of which
7235 // comes from specs (starting with link_command). Consult gcc for
7236 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007237 ArgStringList CmdArgs;
7238
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007239 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7240 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7241 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007242 for (const auto &Arg : Args)
7243 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007244 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007245 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007246 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007247 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007248 return;
7249 }
7250
Daniel Dunbarc1964212009-03-26 16:23:12 +00007251 // I'm not sure why this particular decomposition exists in gcc, but
7252 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007253 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007254
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007255 // It seems that the 'e' option is completely ignored for dynamic executables
7256 // (the default), and with static executables, the last one wins, as expected.
7257 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7258 options::OPT_Z_Flag, options::OPT_u_Group,
7259 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007260
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007261 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7262 // members of static archive libraries which implement Objective-C classes or
7263 // categories.
7264 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7265 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007266
Daniel Dunbarc1964212009-03-26 16:23:12 +00007267 CmdArgs.push_back("-o");
7268 CmdArgs.push_back(Output.getFilename());
7269
Douglas Katzman78b37b02015-11-17 20:28:07 +00007270 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007271 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007272
Peter Collingbournec4122c12015-06-15 21:08:13 +00007273 // SafeStack requires its own runtime libraries
7274 // These libraries should be linked first, to make sure the
7275 // __safestack_init constructor executes before everything else
7276 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7277 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7278 "libclang_rt.safestack_osx.a",
7279 /*AlwaysLink=*/true);
7280 }
7281
Daniel Dunbarc1964212009-03-26 16:23:12 +00007282 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007283
Douglas Gregor9295df02012-05-15 21:00:27 +00007284 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007285 // Build the input file for -filelist (list of linker input files) in case we
7286 // need it later
7287 for (const auto &II : Inputs) {
7288 if (!II.isFilename()) {
7289 // This is a linker input argument.
7290 // We cannot mix input arguments and file names in a -filelist input, thus
7291 // we prematurely stop our list (remaining files shall be passed as
7292 // arguments).
7293 if (InputFileList.size() > 0)
7294 break;
7295
7296 continue;
7297 }
7298
7299 InputFileList.push_back(II.getFilename());
7300 }
7301
Douglas Katzman78b37b02015-11-17 20:28:07 +00007302 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007303 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7304
Douglas Katzman78b37b02015-11-17 20:28:07 +00007305 if (isObjCRuntimeLinked(Args) &&
7306 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007307 // We use arclite library for both ARC and subscripting support.
7308 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7309
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007310 CmdArgs.push_back("-framework");
7311 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007312 // Link libobj.
7313 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007314 }
John McCall31168b02011-06-15 23:02:42 +00007315
Daniel Dunbarc1964212009-03-26 16:23:12 +00007316 if (LinkingOutput) {
7317 CmdArgs.push_back("-arch_multiple");
7318 CmdArgs.push_back("-final_output");
7319 CmdArgs.push_back(LinkingOutput);
7320 }
7321
Daniel Dunbarc1964212009-03-26 16:23:12 +00007322 if (Args.hasArg(options::OPT_fnested_functions))
7323 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007324
Justin Bognerc7701242015-05-12 05:44:36 +00007325 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7326
Douglas Katzman78b37b02015-11-17 20:28:07 +00007327 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007328 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007329 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007330
Daniel Dunbarc1964212009-03-26 16:23:12 +00007331 // link_ssp spec is empty.
7332
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007333 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007334 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007335 }
7336
Douglas Katzman78b37b02015-11-17 20:28:07 +00007337 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007338 // endfile_spec is empty.
7339 }
7340
7341 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7342 Args.AddAllArgs(CmdArgs, options::OPT_F);
7343
Steven Wu3ffb61b2015-02-06 18:08:29 +00007344 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007345 for (const Arg *A : Args.filtered(options::OPT_iframework))
7346 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007347
Douglas Katzman78b37b02015-11-17 20:28:07 +00007348 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007349 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7350 if (A->getValue() == StringRef("Accelerate")) {
7351 CmdArgs.push_back("-framework");
7352 CmdArgs.push_back("Accelerate");
7353 }
7354 }
7355 }
7356
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007357 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007358 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007359 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007360 Cmd->setInputFileList(std::move(InputFileList));
7361 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007362}
7363
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007364void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007365 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007366 const InputInfoList &Inputs,
7367 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007368 const char *LinkingOutput) const {
7369 ArgStringList CmdArgs;
7370
7371 CmdArgs.push_back("-create");
7372 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007373
7374 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007375 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007376
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007377 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007378 assert(II.isFilename() && "Unexpected lipo input.");
7379 CmdArgs.push_back(II.getFilename());
7380 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007381
7382 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007383 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007384}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007385
Daniel Dunbar88299622010-06-04 18:28:36 +00007386void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007387 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007388 const InputInfoList &Inputs,
7389 const ArgList &Args,
7390 const char *LinkingOutput) const {
7391 ArgStringList CmdArgs;
7392
Daniel Dunbareb86b042011-05-09 17:23:16 +00007393 CmdArgs.push_back("-o");
7394 CmdArgs.push_back(Output.getFilename());
7395
Daniel Dunbar88299622010-06-04 18:28:36 +00007396 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7397 const InputInfo &Input = Inputs[0];
7398 assert(Input.isFilename() && "Unexpected dsymutil input.");
7399 CmdArgs.push_back(Input.getFilename());
7400
Daniel Dunbar88299622010-06-04 18:28:36 +00007401 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007402 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007403 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007404}
7405
Eric Christopher551ef452011-08-23 17:56:55 +00007406void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007407 const InputInfo &Output,
7408 const InputInfoList &Inputs,
7409 const ArgList &Args,
7410 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007411 ArgStringList CmdArgs;
7412 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007413 CmdArgs.push_back("--debug-info");
7414 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007415 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007416
7417 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7418 const InputInfo &Input = Inputs[0];
7419 assert(Input.isFilename() && "Unexpected verify input");
7420
7421 // Grabbing the output of the earlier dsymutil run.
7422 CmdArgs.push_back(Input.getFilename());
7423
7424 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007425 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007426 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007427}
7428
Douglas Katzman95354292015-06-23 20:42:09 +00007429void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007430 const InputInfo &Output,
7431 const InputInfoList &Inputs,
7432 const ArgList &Args,
7433 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007434 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007435 ArgStringList CmdArgs;
7436
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007437 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007438
7439 CmdArgs.push_back("-o");
7440 CmdArgs.push_back(Output.getFilename());
7441
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007442 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007443 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007444
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007445 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007446 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007447}
7448
Douglas Katzman95354292015-06-23 20:42:09 +00007449void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7450 const InputInfo &Output,
7451 const InputInfoList &Inputs,
7452 const ArgList &Args,
7453 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007454 ArgStringList CmdArgs;
7455
David Chisnall272a0712012-02-29 15:06:12 +00007456 // Demangle C++ names in errors
7457 CmdArgs.push_back("-C");
7458
Douglas Katzman78b37b02015-11-17 20:28:07 +00007459 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007460 CmdArgs.push_back("-e");
7461 CmdArgs.push_back("_start");
7462 }
7463
7464 if (Args.hasArg(options::OPT_static)) {
7465 CmdArgs.push_back("-Bstatic");
7466 CmdArgs.push_back("-dn");
7467 } else {
7468 CmdArgs.push_back("-Bdynamic");
7469 if (Args.hasArg(options::OPT_shared)) {
7470 CmdArgs.push_back("-shared");
7471 } else {
7472 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007473 CmdArgs.push_back(
7474 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007475 }
7476 }
7477
7478 if (Output.isFilename()) {
7479 CmdArgs.push_back("-o");
7480 CmdArgs.push_back(Output.getFilename());
7481 } else {
7482 assert(Output.isNothing() && "Invalid output.");
7483 }
7484
Douglas Katzman78b37b02015-11-17 20:28:07 +00007485 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007486 if (!Args.hasArg(options::OPT_shared))
7487 CmdArgs.push_back(
7488 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7489
7490 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7491 CmdArgs.push_back(
7492 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7493 CmdArgs.push_back(
7494 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007495 }
7496
Douglas Katzman6059ef92015-11-17 17:41:23 +00007497 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007498
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007499 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7500 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007501
7502 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7503
Douglas Katzman78b37b02015-11-17 20:28:07 +00007504 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007505 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007506 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007507 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007508 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007509 if (!Args.hasArg(options::OPT_shared)) {
7510 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007511 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007512 }
David Chisnallf571cde2012-02-15 13:39:01 +00007513 }
7514
Douglas Katzman78b37b02015-11-17 20:28:07 +00007515 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007516 CmdArgs.push_back(
7517 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007518 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007519 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007520
Xinliang David Li69306c02015-10-22 06:15:31 +00007521 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007522
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007523 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007524 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007525}
7526
Douglas Katzman95354292015-06-23 20:42:09 +00007527void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7528 const InputInfo &Output,
7529 const InputInfoList &Inputs,
7530 const ArgList &Args,
7531 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007532 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007533 ArgStringList CmdArgs;
7534
Rafael Espindolacc126272014-02-28 01:55:21 +00007535 switch (getToolChain().getArch()) {
7536 case llvm::Triple::x86:
7537 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7538 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007539 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007540 break;
7541
7542 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007543 CmdArgs.push_back("-mppc");
7544 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007545 break;
7546
7547 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007548 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007549 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007550 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7551 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7552 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007553 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007554 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007555
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007556 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007557 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007558 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7559 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7560 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007561 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007562 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007563
7564 case llvm::Triple::mips64:
7565 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007566 StringRef CPUName;
7567 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007568 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007569
7570 CmdArgs.push_back("-mabi");
7571 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7572
7573 if (getToolChain().getArch() == llvm::Triple::mips64)
7574 CmdArgs.push_back("-EB");
7575 else
7576 CmdArgs.push_back("-EL");
7577
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007578 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007579 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007580 }
7581
Rafael Espindolacc126272014-02-28 01:55:21 +00007582 default:
7583 break;
7584 }
7585
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007586 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007587
7588 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007589 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007590
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007591 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007592 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007593
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007594 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007595 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007596}
7597
Douglas Katzman95354292015-06-23 20:42:09 +00007598void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7599 const InputInfo &Output,
7600 const InputInfoList &Inputs,
7601 const ArgList &Args,
7602 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007603 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007604 ArgStringList CmdArgs;
7605
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007606 // Silence warning for "clang -g foo.o -o foo"
7607 Args.ClaimAllArgs(options::OPT_g_Group);
7608 // and "clang -emit-llvm foo.o -o foo"
7609 Args.ClaimAllArgs(options::OPT_emit_llvm);
7610 // and for "clang -w foo.o -o foo". Other warning options are already
7611 // handled somewhere else.
7612 Args.ClaimAllArgs(options::OPT_w);
7613
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007614 if (getToolChain().getArch() == llvm::Triple::mips64)
7615 CmdArgs.push_back("-EB");
7616 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7617 CmdArgs.push_back("-EL");
7618
Douglas Katzman78b37b02015-11-17 20:28:07 +00007619 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007620 CmdArgs.push_back("-e");
7621 CmdArgs.push_back("__start");
7622 }
7623
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007624 if (Args.hasArg(options::OPT_static)) {
7625 CmdArgs.push_back("-Bstatic");
7626 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007627 if (Args.hasArg(options::OPT_rdynamic))
7628 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007629 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007630 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007631 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007632 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007633 } else {
7634 CmdArgs.push_back("-dynamic-linker");
7635 CmdArgs.push_back("/usr/libexec/ld.so");
7636 }
7637 }
7638
Rafael Espindola044f7832013-06-05 04:28:55 +00007639 if (Args.hasArg(options::OPT_nopie))
7640 CmdArgs.push_back("-nopie");
7641
Daniel Dunbarb440f562010-08-02 02:38:21 +00007642 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007643 CmdArgs.push_back("-o");
7644 CmdArgs.push_back(Output.getFilename());
7645 } else {
7646 assert(Output.isNothing() && "Invalid output.");
7647 }
7648
Douglas Katzman78b37b02015-11-17 20:28:07 +00007649 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007650 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007651 if (Args.hasArg(options::OPT_pg))
7652 CmdArgs.push_back(
7653 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007654 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007655 CmdArgs.push_back(
7656 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7657 CmdArgs.push_back(
7658 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007659 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007660 CmdArgs.push_back(
7661 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007662 }
7663 }
7664
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007665 std::string Triple = getToolChain().getTripleString();
7666 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007667 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007668 CmdArgs.push_back(
7669 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007670
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007671 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7672 options::OPT_e, options::OPT_s, options::OPT_t,
7673 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007674
Daniel Dunbar54423b22010-09-17 00:24:54 +00007675 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007676
Douglas Katzman78b37b02015-11-17 20:28:07 +00007677 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007678 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007679 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007680 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007681 CmdArgs.push_back("-lm_p");
7682 else
7683 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007684 }
7685
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007686 // FIXME: For some reason GCC passes -lgcc before adding
7687 // the default system libraries. Just mimic this for now.
7688 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007689
Eric Christopher17674ec2012-09-13 06:32:34 +00007690 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007691 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7692 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007693 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007694 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007695 }
7696
Chandler Carruth45661652011-12-17 22:32:42 +00007697 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007698 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007699 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007700 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007701 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007702 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007703
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007704 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007705 }
7706
Douglas Katzman78b37b02015-11-17 20:28:07 +00007707 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007708 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007709 CmdArgs.push_back(
7710 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007711 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007712 CmdArgs.push_back(
7713 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007714 }
7715
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007716 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007717 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007718}
Ed Schoutene33194b2009-04-02 19:13:12 +00007719
Douglas Katzman95354292015-06-23 20:42:09 +00007720void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7721 const InputInfo &Output,
7722 const InputInfoList &Inputs,
7723 const ArgList &Args,
7724 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007725 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007726 ArgStringList CmdArgs;
7727
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007728 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007729
7730 CmdArgs.push_back("-o");
7731 CmdArgs.push_back(Output.getFilename());
7732
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007733 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007734 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007735
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007736 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007737 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007738}
7739
Douglas Katzman95354292015-06-23 20:42:09 +00007740void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7741 const InputInfo &Output,
7742 const InputInfoList &Inputs,
7743 const ArgList &Args,
7744 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007745 const Driver &D = getToolChain().getDriver();
7746 ArgStringList CmdArgs;
7747
Douglas Katzman78b37b02015-11-17 20:28:07 +00007748 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007749 CmdArgs.push_back("-e");
7750 CmdArgs.push_back("__start");
7751 }
7752
7753 if (Args.hasArg(options::OPT_static)) {
7754 CmdArgs.push_back("-Bstatic");
7755 } else {
7756 if (Args.hasArg(options::OPT_rdynamic))
7757 CmdArgs.push_back("-export-dynamic");
7758 CmdArgs.push_back("--eh-frame-hdr");
7759 CmdArgs.push_back("-Bdynamic");
7760 if (Args.hasArg(options::OPT_shared)) {
7761 CmdArgs.push_back("-shared");
7762 } else {
7763 CmdArgs.push_back("-dynamic-linker");
7764 CmdArgs.push_back("/usr/libexec/ld.so");
7765 }
7766 }
7767
7768 if (Output.isFilename()) {
7769 CmdArgs.push_back("-o");
7770 CmdArgs.push_back(Output.getFilename());
7771 } else {
7772 assert(Output.isNothing() && "Invalid output.");
7773 }
7774
Douglas Katzman78b37b02015-11-17 20:28:07 +00007775 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007776 if (!Args.hasArg(options::OPT_shared)) {
7777 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007778 CmdArgs.push_back(
7779 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007780 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007781 CmdArgs.push_back(
7782 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7783 CmdArgs.push_back(
7784 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007785 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007786 CmdArgs.push_back(
7787 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007788 }
7789 }
7790
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007791 Args.AddAllArgs(CmdArgs,
7792 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007793
7794 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7795
Douglas Katzman78b37b02015-11-17 20:28:07 +00007796 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007797 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007798 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7799 if (Args.hasArg(options::OPT_pg))
7800 CmdArgs.push_back("-lm_p");
7801 else
7802 CmdArgs.push_back("-lm");
7803 }
7804
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007805 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007806 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007807 CmdArgs.push_back("-lpthread_p");
7808 else
7809 CmdArgs.push_back("-lpthread");
7810 }
7811
Eli Friedman9fa28852012-08-08 23:57:20 +00007812 if (!Args.hasArg(options::OPT_shared)) {
7813 if (Args.hasArg(options::OPT_pg))
7814 CmdArgs.push_back("-lc_p");
7815 else
7816 CmdArgs.push_back("-lc");
7817 }
7818
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007819 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007820 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007821 case llvm::Triple::arm:
7822 MyArch = "arm";
7823 break;
7824 case llvm::Triple::x86:
7825 MyArch = "i386";
7826 break;
7827 case llvm::Triple::x86_64:
7828 MyArch = "amd64";
7829 break;
7830 default:
7831 llvm_unreachable("Unsupported architecture");
7832 }
7833 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007834 }
7835
Douglas Katzman78b37b02015-11-17 20:28:07 +00007836 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007837 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007838 CmdArgs.push_back(
7839 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007840 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007841 CmdArgs.push_back(
7842 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007843 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007844
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007845 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007846 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007847}
7848
Douglas Katzman95354292015-06-23 20:42:09 +00007849void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7850 const InputInfo &Output,
7851 const InputInfoList &Inputs,
7852 const ArgList &Args,
7853 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007854 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007855 ArgStringList CmdArgs;
7856
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007857 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7858 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007859 switch (getToolChain().getArch()) {
7860 default:
7861 break;
7862 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007863 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007864 break;
7865 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007866 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007867 break;
7868 case llvm::Triple::mips:
7869 case llvm::Triple::mipsel:
7870 case llvm::Triple::mips64:
7871 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007872 StringRef CPUName;
7873 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007874 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007875
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007876 CmdArgs.push_back("-march");
7877 CmdArgs.push_back(CPUName.data());
7878
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007879 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007880 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007881
7882 if (getToolChain().getArch() == llvm::Triple::mips ||
7883 getToolChain().getArch() == llvm::Triple::mips64)
7884 CmdArgs.push_back("-EB");
7885 else
7886 CmdArgs.push_back("-EL");
7887
Dimitry Andric46f338c2015-12-27 10:36:44 +00007888 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7889 StringRef v = A->getValue();
7890 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7891 A->claim();
7892 }
7893
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007894 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007895 break;
7896 }
7897 case llvm::Triple::arm:
7898 case llvm::Triple::armeb:
7899 case llvm::Triple::thumb:
7900 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007901 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007902
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007903 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007904 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007905 else
Renato Golinf4421f72014-02-19 10:44:07 +00007906 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007907
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007908 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007909 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007910 case llvm::Triple::GNUEABI:
7911 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007912 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007913 break;
7914
7915 default:
7916 CmdArgs.push_back("-matpcs");
7917 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007918 break;
7919 }
7920 case llvm::Triple::sparc:
7921 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007922 case llvm::Triple::sparcv9: {
7923 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7924 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007925 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007926 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007927 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007928 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007929
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007930 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007931
7932 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007933 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007934
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007935 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007936 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007937
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007938 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007939 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007940}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007941
Douglas Katzman95354292015-06-23 20:42:09 +00007942void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7943 const InputInfo &Output,
7944 const InputInfoList &Inputs,
7945 const ArgList &Args,
7946 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007947 const toolchains::FreeBSD &ToolChain =
7948 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007949 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007950 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007951 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007952 !Args.hasArg(options::OPT_shared) &&
7953 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007954 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007955
7956 // Silence warning for "clang -g foo.o -o foo"
7957 Args.ClaimAllArgs(options::OPT_g_Group);
7958 // and "clang -emit-llvm foo.o -o foo"
7959 Args.ClaimAllArgs(options::OPT_emit_llvm);
7960 // and for "clang -w foo.o -o foo". Other warning options are already
7961 // handled somewhere else.
7962 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007963
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007964 if (!D.SysRoot.empty())
7965 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7966
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007967 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007968 CmdArgs.push_back("-pie");
7969
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007970 if (Args.hasArg(options::OPT_static)) {
7971 CmdArgs.push_back("-Bstatic");
7972 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007973 if (Args.hasArg(options::OPT_rdynamic))
7974 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007975 CmdArgs.push_back("--eh-frame-hdr");
7976 if (Args.hasArg(options::OPT_shared)) {
7977 CmdArgs.push_back("-Bshareable");
7978 } else {
7979 CmdArgs.push_back("-dynamic-linker");
7980 CmdArgs.push_back("/libexec/ld-elf.so.1");
7981 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007982 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007983 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7984 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7985 CmdArgs.push_back("--hash-style=both");
7986 }
7987 }
7988 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007989 }
7990
7991 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7992 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007993 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007994 CmdArgs.push_back("-m");
7995 CmdArgs.push_back("elf_i386_fbsd");
7996 }
7997
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007998 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007999 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008000 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008001 }
8002
Dimitry Andric904895f2015-12-27 06:47:09 +00008003 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8004 if (ToolChain.getArch() == llvm::Triple::mips ||
8005 ToolChain.getArch() == llvm::Triple::mipsel ||
8006 ToolChain.getArch() == llvm::Triple::mips64 ||
8007 ToolChain.getArch() == llvm::Triple::mips64el) {
8008 StringRef v = A->getValue();
8009 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8010 A->claim();
8011 }
8012 }
8013
Daniel Dunbarb440f562010-08-02 02:38:21 +00008014 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008015 CmdArgs.push_back("-o");
8016 CmdArgs.push_back(Output.getFilename());
8017 } else {
8018 assert(Output.isNothing() && "Invalid output.");
8019 }
8020
Douglas Katzman78b37b02015-11-17 20:28:07 +00008021 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008022 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008023 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008024 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008025 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008026 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008027 crt1 = "Scrt1.o";
8028 else
8029 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008030 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008031 if (crt1)
8032 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8033
8034 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8035
Craig Topper92fc2df2014-05-17 16:56:41 +00008036 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008037 if (Args.hasArg(options::OPT_static))
8038 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008039 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008040 crtbegin = "crtbeginS.o";
8041 else
8042 crtbegin = "crtbegin.o";
8043
8044 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008045 }
8046
8047 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008048 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008049 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8050 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008051 Args.AddAllArgs(CmdArgs, options::OPT_s);
8052 Args.AddAllArgs(CmdArgs, options::OPT_t);
8053 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8054 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008055
Teresa Johnson945bc502015-10-15 20:35:53 +00008056 if (D.isUsingLTO())
8057 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008058
Alexey Samsonov52550342014-09-15 19:58:40 +00008059 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008060 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008061
Douglas Katzman78b37b02015-11-17 20:28:07 +00008062 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008063 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008064 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008065 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008066 if (Args.hasArg(options::OPT_pg))
8067 CmdArgs.push_back("-lm_p");
8068 else
8069 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008070 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008071 if (NeedsSanitizerDeps)
8072 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008073 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8074 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008075 if (Args.hasArg(options::OPT_pg))
8076 CmdArgs.push_back("-lgcc_p");
8077 else
8078 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008079 if (Args.hasArg(options::OPT_static)) {
8080 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008081 } else if (Args.hasArg(options::OPT_pg)) {
8082 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008083 } else {
8084 CmdArgs.push_back("--as-needed");
8085 CmdArgs.push_back("-lgcc_s");
8086 CmdArgs.push_back("--no-as-needed");
8087 }
8088
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008089 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008090 if (Args.hasArg(options::OPT_pg))
8091 CmdArgs.push_back("-lpthread_p");
8092 else
8093 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008094 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008095
Roman Divacky66f22762011-02-10 16:59:40 +00008096 if (Args.hasArg(options::OPT_pg)) {
8097 if (Args.hasArg(options::OPT_shared))
8098 CmdArgs.push_back("-lc");
8099 else
8100 CmdArgs.push_back("-lc_p");
8101 CmdArgs.push_back("-lgcc_p");
8102 } else {
8103 CmdArgs.push_back("-lc");
8104 CmdArgs.push_back("-lgcc");
8105 }
8106
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008107 if (Args.hasArg(options::OPT_static)) {
8108 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008109 } else if (Args.hasArg(options::OPT_pg)) {
8110 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008111 } else {
8112 CmdArgs.push_back("--as-needed");
8113 CmdArgs.push_back("-lgcc_s");
8114 CmdArgs.push_back("--no-as-needed");
8115 }
8116 }
8117
Douglas Katzman78b37b02015-11-17 20:28:07 +00008118 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008119 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008120 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008121 else
8122 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008123 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008124 }
8125
Xinliang David Li69306c02015-10-22 06:15:31 +00008126 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008127
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008128 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008129 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008130}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008131
Douglas Katzman95354292015-06-23 20:42:09 +00008132void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008133 const InputInfo &Output,
8134 const InputInfoList &Inputs,
8135 const ArgList &Args,
8136 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008137 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008138 ArgStringList CmdArgs;
8139
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008140 // GNU as needs different flags for creating the correct output format
8141 // on architectures with different ABIs or optional feature sets.
8142 switch (getToolChain().getArch()) {
8143 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008144 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008145 break;
8146 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008147 case llvm::Triple::armeb:
8148 case llvm::Triple::thumb:
8149 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008150 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008151 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8152 std::string Arch =
8153 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008154 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008155 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008156 }
8157
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008158 case llvm::Triple::mips:
8159 case llvm::Triple::mipsel:
8160 case llvm::Triple::mips64:
8161 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008162 StringRef CPUName;
8163 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008164 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008165
8166 CmdArgs.push_back("-march");
8167 CmdArgs.push_back(CPUName.data());
8168
8169 CmdArgs.push_back("-mabi");
8170 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8171
8172 if (getToolChain().getArch() == llvm::Triple::mips ||
8173 getToolChain().getArch() == llvm::Triple::mips64)
8174 CmdArgs.push_back("-EB");
8175 else
8176 CmdArgs.push_back("-EL");
8177
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008178 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008179 break;
8180 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008181
8182 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008183 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008184 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008185 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8186 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008187 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008188 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008189 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008190
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008191 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008192 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008193 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8194 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008195 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008196 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008197 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008198
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008199 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008200 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008201 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008202
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008203 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008204
8205 CmdArgs.push_back("-o");
8206 CmdArgs.push_back(Output.getFilename());
8207
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008208 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008209 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008210
David Chisnallddbd68f2011-09-27 22:03:18 +00008211 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008212 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008213}
8214
Douglas Katzman95354292015-06-23 20:42:09 +00008215void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8216 const InputInfo &Output,
8217 const InputInfoList &Inputs,
8218 const ArgList &Args,
8219 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008220 const Driver &D = getToolChain().getDriver();
8221 ArgStringList CmdArgs;
8222
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008223 if (!D.SysRoot.empty())
8224 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8225
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008226 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008227 if (Args.hasArg(options::OPT_static)) {
8228 CmdArgs.push_back("-Bstatic");
8229 } else {
8230 if (Args.hasArg(options::OPT_rdynamic))
8231 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008232 if (Args.hasArg(options::OPT_shared)) {
8233 CmdArgs.push_back("-Bshareable");
8234 } else {
8235 CmdArgs.push_back("-dynamic-linker");
8236 CmdArgs.push_back("/libexec/ld.elf_so");
8237 }
8238 }
8239
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008240 // Many NetBSD architectures support more than one ABI.
8241 // Determine the correct emulation for ld.
8242 switch (getToolChain().getArch()) {
8243 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008244 CmdArgs.push_back("-m");
8245 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008246 break;
8247 case llvm::Triple::arm:
8248 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008249 CmdArgs.push_back("-m");
8250 switch (getToolChain().getTriple().getEnvironment()) {
8251 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008252 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008253 CmdArgs.push_back("armelf_nbsd_eabi");
8254 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008255 case llvm::Triple::EABIHF:
8256 case llvm::Triple::GNUEABIHF:
8257 CmdArgs.push_back("armelf_nbsd_eabihf");
8258 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008259 default:
8260 CmdArgs.push_back("armelf_nbsd");
8261 break;
8262 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008263 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008264 case llvm::Triple::armeb:
8265 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008266 arm::appendEBLinkFlags(
8267 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008268 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008269 CmdArgs.push_back("-m");
8270 switch (getToolChain().getTriple().getEnvironment()) {
8271 case llvm::Triple::EABI:
8272 case llvm::Triple::GNUEABI:
8273 CmdArgs.push_back("armelfb_nbsd_eabi");
8274 break;
8275 case llvm::Triple::EABIHF:
8276 case llvm::Triple::GNUEABIHF:
8277 CmdArgs.push_back("armelfb_nbsd_eabihf");
8278 break;
8279 default:
8280 CmdArgs.push_back("armelfb_nbsd");
8281 break;
8282 }
8283 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008284 case llvm::Triple::mips64:
8285 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008286 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008287 CmdArgs.push_back("-m");
8288 if (getToolChain().getArch() == llvm::Triple::mips64)
8289 CmdArgs.push_back("elf32btsmip");
8290 else
8291 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008292 } else if (mips::hasMipsAbiArg(Args, "64")) {
8293 CmdArgs.push_back("-m");
8294 if (getToolChain().getArch() == llvm::Triple::mips64)
8295 CmdArgs.push_back("elf64btsmip");
8296 else
8297 CmdArgs.push_back("elf64ltsmip");
8298 }
8299 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008300 case llvm::Triple::ppc:
8301 CmdArgs.push_back("-m");
8302 CmdArgs.push_back("elf32ppc_nbsd");
8303 break;
8304
8305 case llvm::Triple::ppc64:
8306 case llvm::Triple::ppc64le:
8307 CmdArgs.push_back("-m");
8308 CmdArgs.push_back("elf64ppc");
8309 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008310
8311 case llvm::Triple::sparc:
8312 CmdArgs.push_back("-m");
8313 CmdArgs.push_back("elf32_sparc");
8314 break;
8315
8316 case llvm::Triple::sparcv9:
8317 CmdArgs.push_back("-m");
8318 CmdArgs.push_back("elf64_sparc");
8319 break;
8320
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008321 default:
8322 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008323 }
8324
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008325 if (Output.isFilename()) {
8326 CmdArgs.push_back("-o");
8327 CmdArgs.push_back(Output.getFilename());
8328 } else {
8329 assert(Output.isNothing() && "Invalid output.");
8330 }
8331
Douglas Katzman78b37b02015-11-17 20:28:07 +00008332 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008333 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008334 CmdArgs.push_back(
8335 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8336 CmdArgs.push_back(
8337 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8338 CmdArgs.push_back(
8339 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008340 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008341 CmdArgs.push_back(
8342 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8343 CmdArgs.push_back(
8344 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008345 }
8346 }
8347
8348 Args.AddAllArgs(CmdArgs, options::OPT_L);
8349 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8350 Args.AddAllArgs(CmdArgs, options::OPT_e);
8351 Args.AddAllArgs(CmdArgs, options::OPT_s);
8352 Args.AddAllArgs(CmdArgs, options::OPT_t);
8353 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8354 Args.AddAllArgs(CmdArgs, options::OPT_r);
8355
8356 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8357
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008358 unsigned Major, Minor, Micro;
8359 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8360 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008361 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008362 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008363 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008364 case llvm::Triple::arm:
8365 case llvm::Triple::armeb:
8366 case llvm::Triple::thumb:
8367 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008368 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008369 case llvm::Triple::ppc64:
8370 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008371 case llvm::Triple::x86:
8372 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008373 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008374 break;
8375 default:
8376 break;
8377 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008378 }
8379
Douglas Katzman78b37b02015-11-17 20:28:07 +00008380 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008381 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008382 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008383 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8384 CmdArgs.push_back("-lm");
8385 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008386 if (Args.hasArg(options::OPT_pthread))
8387 CmdArgs.push_back("-lpthread");
8388 CmdArgs.push_back("-lc");
8389
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008390 if (useLibgcc) {
8391 if (Args.hasArg(options::OPT_static)) {
8392 // libgcc_eh depends on libc, so resolve as much as possible,
8393 // pull in any new requirements from libc and then get the rest
8394 // of libgcc.
8395 CmdArgs.push_back("-lgcc_eh");
8396 CmdArgs.push_back("-lc");
8397 CmdArgs.push_back("-lgcc");
8398 } else {
8399 CmdArgs.push_back("-lgcc");
8400 CmdArgs.push_back("--as-needed");
8401 CmdArgs.push_back("-lgcc_s");
8402 CmdArgs.push_back("--no-as-needed");
8403 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008404 }
8405 }
8406
Douglas Katzman78b37b02015-11-17 20:28:07 +00008407 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008408 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008409 CmdArgs.push_back(
8410 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008411 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008412 CmdArgs.push_back(
8413 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8414 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008415 }
8416
Xinliang David Li69306c02015-10-22 06:15:31 +00008417 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008418
Logan Chieneb9162f2014-06-26 14:23:45 +00008419 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008420 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008421}
8422
Douglas Katzman95354292015-06-23 20:42:09 +00008423void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8424 const InputInfo &Output,
8425 const InputInfoList &Inputs,
8426 const ArgList &Args,
8427 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008428 claimNoWarnArgs(Args);
8429
James Y Knight2db38f32015-08-15 03:45:25 +00008430 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8431 llvm::Triple Triple = llvm::Triple(TripleStr);
8432
Rafael Espindola92b00932010-08-10 00:25:48 +00008433 ArgStringList CmdArgs;
8434
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008435 llvm::Reloc::Model RelocationModel;
8436 unsigned PICLevel;
8437 bool IsPIE;
8438 std::tie(RelocationModel, PICLevel, IsPIE) =
8439 ParsePICArgs(getToolChain(), Triple, Args);
8440
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008441 switch (getToolChain().getArch()) {
8442 default:
8443 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008444 // Add --32/--64 to make sure we get the format we want.
8445 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008446 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008447 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008448 break;
8449 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008450 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8451 CmdArgs.push_back("--x32");
8452 else
8453 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008454 break;
8455 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008456 CmdArgs.push_back("-a32");
8457 CmdArgs.push_back("-mppc");
8458 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008459 break;
8460 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008461 CmdArgs.push_back("-a64");
8462 CmdArgs.push_back("-mppc64");
8463 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008464 break;
8465 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008466 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008467 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008468 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008469 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008470 break;
8471 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008472 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008473 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008474 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8475 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8476 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008477 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008478 }
8479 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008480 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008481 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8482 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8483 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008484 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008485 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008486 case llvm::Triple::arm:
8487 case llvm::Triple::armeb:
8488 case llvm::Triple::thumb:
8489 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008490 const llvm::Triple &Triple2 = getToolChain().getTriple();
8491 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008492 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008493 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008494 break;
8495 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008496 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008497 break;
8498 default:
8499 break;
8500 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008501
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008502 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008503 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8504 case arm::FloatABI::Soft:
8505 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8506 break;
8507 case arm::FloatABI::SoftFP:
8508 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8509 break;
8510 case arm::FloatABI::Hard:
8511 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8512 break;
8513 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008514
8515 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008516
8517 // FIXME: remove krait check when GNU tools support krait cpu
8518 // for now replace it with -march=armv7-a to avoid a lower
8519 // march from being picked in the absence of a cpu flag.
8520 Arg *A;
8521 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008522 StringRef(A->getValue()).lower() == "krait")
8523 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008524 else
8525 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008526 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008527 break;
8528 }
8529 case llvm::Triple::mips:
8530 case llvm::Triple::mipsel:
8531 case llvm::Triple::mips64:
8532 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008533 StringRef CPUName;
8534 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008535 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008536 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008537
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008538 CmdArgs.push_back("-march");
8539 CmdArgs.push_back(CPUName.data());
8540
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008541 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008542 CmdArgs.push_back(ABIName.data());
8543
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008544 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8545 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008546 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008547 CmdArgs.push_back("-mno-shared");
8548
Daniel Sanders379d44b2014-07-16 11:52:23 +00008549 // LLVM doesn't support -mplt yet and acts as if it is always given.
8550 // However, -mplt has no effect with the N64 ABI.
8551 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008552
8553 if (getToolChain().getArch() == llvm::Triple::mips ||
8554 getToolChain().getArch() == llvm::Triple::mips64)
8555 CmdArgs.push_back("-EB");
8556 else
8557 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008558
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008559 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8560 if (StringRef(A->getValue()) == "2008")
8561 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8562 }
8563
Daniel Sanders379d44b2014-07-16 11:52:23 +00008564 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8565 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8566 options::OPT_mfp64)) {
8567 A->claim();
8568 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008569 } else if (mips::shouldUseFPXX(
8570 Args, getToolChain().getTriple(), CPUName, ABIName,
8571 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008572 CmdArgs.push_back("-mfpxx");
8573
8574 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8575 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008576 if (Arg *A =
8577 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008578 if (A->getOption().matches(options::OPT_mips16)) {
8579 A->claim();
8580 A->render(Args, CmdArgs);
8581 } else {
8582 A->claim();
8583 CmdArgs.push_back("-no-mips16");
8584 }
8585 }
8586
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008587 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8588 options::OPT_mno_micromips);
8589 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8590 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8591
Simon Atanasyanbd986632013-11-26 11:58:04 +00008592 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8593 // Do not use AddLastArg because not all versions of MIPS assembler
8594 // support -mmsa / -mno-msa options.
8595 if (A->getOption().matches(options::OPT_mmsa))
8596 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8597 }
8598
Daniel Sanders379d44b2014-07-16 11:52:23 +00008599 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8600 options::OPT_msoft_float);
8601
Toma Tabacub36d6102015-06-11 12:13:18 +00008602 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8603 options::OPT_msingle_float);
8604
Daniel Sanders379d44b2014-07-16 11:52:23 +00008605 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8606 options::OPT_mno_odd_spreg);
8607
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008608 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008609 break;
8610 }
8611 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008612 // Always pass an -march option, since our default of z10 is later
8613 // than the GNU assembler's default.
8614 StringRef CPUName = getSystemZTargetCPU(Args);
8615 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008616 break;
8617 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008618 }
8619
Renato Golina74bbc72015-07-22 15:32:36 +00008620 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008621 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008622
8623 CmdArgs.push_back("-o");
8624 CmdArgs.push_back(Output.getFilename());
8625
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008626 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008627 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008628
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008629 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008630 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008631
8632 // Handle the debug info splitting at object creation time if we're
8633 // creating an object.
8634 // TODO: Currently only works on linux with newer objcopy.
8635 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008636 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008637 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008638 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008639}
8640
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008641static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008642 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008643 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008644 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008645 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8646 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008647 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008648 CmdArgs.push_back("-lgcc");
8649
Logan Chien3d3373c2012-11-19 12:04:11 +00008650 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008651 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008652 CmdArgs.push_back("-lgcc");
8653 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008654 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008655 CmdArgs.push_back("--as-needed");
8656 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008657 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008658 CmdArgs.push_back("--no-as-needed");
8659 }
8660
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008661 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008662 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008663 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008664 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008665
8666 // According to Android ABI, we have to link with libdl if we are
8667 // linking with non-static libgcc.
8668 //
8669 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8670 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8671 if (isAndroid && !StaticLibgcc)
8672 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008673}
8674
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008675static std::string getLinuxDynamicLinker(const ArgList &Args,
8676 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008677 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8678
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008679 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008680 if (ToolChain.getTriple().isArch64Bit())
8681 return "/system/bin/linker64";
8682 else
8683 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008684 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8685 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008686 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008687 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008688 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008689 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008690 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008691 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008692 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008693 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008694 return "/lib/ld-linux-armhf.so.3";
8695 else
8696 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008697 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8698 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008699 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008700 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008701 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008702 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008703 return "/lib/ld-linux.so.3";
8704 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8705 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008706 std::string LibDir =
8707 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008708 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008709 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008710 if (mips::isUCLibc(Args))
8711 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008712 else if (!ToolChain.getTriple().hasEnvironment()) {
8713 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8714 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8715 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8716 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008717 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008718
8719 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008720 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008721 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008722 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008723 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8724 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008725 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008726 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008727 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8728 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008729 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008730 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008731 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008732 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008733 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008734 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008735 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8736 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008737 else
8738 return "/lib64/ld-linux-x86-64.so.2";
8739}
8740
Renato Golinc4b49242014-02-13 10:01:16 +00008741static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008742 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008743 // Make use of compiler-rt if --rtlib option is used
8744 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8745
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008746 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008747 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008748 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008749 default:
8750 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008751 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008752 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008753 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008754 break;
8755 }
Renato Golinc4b49242014-02-13 10:01:16 +00008756 break;
8757 case ToolChain::RLT_Libgcc:
8758 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8759 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008760 }
8761}
8762
Rafael Espindola1e085772014-08-15 17:14:35 +00008763static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8764 switch (T.getArch()) {
8765 case llvm::Triple::x86:
8766 return "elf_i386";
8767 case llvm::Triple::aarch64:
8768 return "aarch64linux";
8769 case llvm::Triple::aarch64_be:
8770 return "aarch64_be_linux";
8771 case llvm::Triple::arm:
8772 case llvm::Triple::thumb:
8773 return "armelf_linux_eabi";
8774 case llvm::Triple::armeb:
8775 case llvm::Triple::thumbeb:
8776 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8777 case llvm::Triple::ppc:
8778 return "elf32ppclinux";
8779 case llvm::Triple::ppc64:
8780 return "elf64ppc";
8781 case llvm::Triple::ppc64le:
8782 return "elf64lppc";
8783 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008784 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008785 return "elf32_sparc";
8786 case llvm::Triple::sparcv9:
8787 return "elf64_sparc";
8788 case llvm::Triple::mips:
8789 return "elf32btsmip";
8790 case llvm::Triple::mipsel:
8791 return "elf32ltsmip";
8792 case llvm::Triple::mips64:
8793 if (mips::hasMipsAbiArg(Args, "n32"))
8794 return "elf32btsmipn32";
8795 return "elf64btsmip";
8796 case llvm::Triple::mips64el:
8797 if (mips::hasMipsAbiArg(Args, "n32"))
8798 return "elf32ltsmipn32";
8799 return "elf64ltsmip";
8800 case llvm::Triple::systemz:
8801 return "elf64_s390";
8802 case llvm::Triple::x86_64:
8803 if (T.getEnvironment() == llvm::Triple::GNUX32)
8804 return "elf32_x86_64";
8805 return "elf_x86_64";
8806 default:
8807 llvm_unreachable("Unexpected arch");
8808 }
8809}
8810
Douglas Katzman95354292015-06-23 20:42:09 +00008811void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8812 const InputInfo &Output,
8813 const InputInfoList &Inputs,
8814 const ArgList &Args,
8815 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008816 const toolchains::Linux &ToolChain =
8817 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008818 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008819
8820 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8821 llvm::Triple Triple = llvm::Triple(TripleStr);
8822
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008823 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008824 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008825 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008826 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8827 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008828 const bool HasCRTBeginEndFiles =
8829 ToolChain.getTriple().hasEnvironment() ||
8830 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008831
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008832 ArgStringList CmdArgs;
8833
Rafael Espindolad1002f62010-11-15 18:28:16 +00008834 // Silence warning for "clang -g foo.o -o foo"
8835 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008836 // and "clang -emit-llvm foo.o -o foo"
8837 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008838 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008839 // handled somewhere else.
8840 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008841
Peter Collingbourne39719a72015-11-20 20:49:39 +00008842 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8843 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008844 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008845 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008846 CmdArgs.push_back("-target");
8847 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8848 }
8849
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008850 if (!D.SysRoot.empty())
8851 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008852
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008853 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008854 CmdArgs.push_back("-pie");
8855
Rafael Espindola1c76c592010-11-07 22:57:16 +00008856 if (Args.hasArg(options::OPT_rdynamic))
8857 CmdArgs.push_back("-export-dynamic");
8858
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008859 if (Args.hasArg(options::OPT_s))
8860 CmdArgs.push_back("-s");
8861
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008862 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008863 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008864
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008865 for (const auto &Opt : ToolChain.ExtraOpts)
8866 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008867
8868 if (!Args.hasArg(options::OPT_static)) {
8869 CmdArgs.push_back("--eh-frame-hdr");
8870 }
8871
8872 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008873 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008874
8875 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008876 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8877 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008878 CmdArgs.push_back("-Bstatic");
8879 else
8880 CmdArgs.push_back("-static");
8881 } else if (Args.hasArg(options::OPT_shared)) {
8882 CmdArgs.push_back("-shared");
8883 }
8884
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008885 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8886 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008887 (!Args.hasArg(options::OPT_static) &&
8888 !Args.hasArg(options::OPT_shared))) {
8889 CmdArgs.push_back("-dynamic-linker");
8890 CmdArgs.push_back(Args.MakeArgString(
8891 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8892 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008893
8894 CmdArgs.push_back("-o");
8895 CmdArgs.push_back(Output.getFilename());
8896
Douglas Katzman78b37b02015-11-17 20:28:07 +00008897 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008898 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008899 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008900 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008901 if (Args.hasArg(options::OPT_pg))
8902 crt1 = "gcrt1.o";
8903 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008904 crt1 = "Scrt1.o";
8905 else
8906 crt1 = "crt1.o";
8907 }
8908 if (crt1)
8909 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008910
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008911 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8912 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008913
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008914 const char *crtbegin;
8915 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008916 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008917 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008918 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008919 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008920 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008921 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008922 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008923
8924 if (HasCRTBeginEndFiles)
8925 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008926
8927 // Add crtfastmath.o if available and fast math is enabled.
8928 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008929 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008930
8931 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008932 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008933
Douglas Katzman6059ef92015-11-17 17:41:23 +00008934 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008935
Teresa Johnson945bc502015-10-15 20:35:53 +00008936 if (D.isUsingLTO())
8937 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008938
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008939 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8940 CmdArgs.push_back("--no-demangle");
8941
Alexey Samsonov52550342014-09-15 19:58:40 +00008942 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008943 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008944 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008945 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008946
Douglas Katzman78b37b02015-11-17 20:28:07 +00008947 if (D.CCCIsCXX() &&
8948 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008949 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008950 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008951 if (OnlyLibstdcxxStatic)
8952 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008953 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008954 if (OnlyLibstdcxxStatic)
8955 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008956 CmdArgs.push_back("-lm");
8957 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008958 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8959 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008960
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008961 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008962 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8963 if (Args.hasArg(options::OPT_static))
8964 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008965
Alexey Samsonov52550342014-09-15 19:58:40 +00008966 if (NeedsSanitizerDeps)
8967 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8968
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008969 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8970 Args.hasArg(options::OPT_pthreads);
8971
8972 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8973 options::OPT_fno_openmp, false)) {
8974 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8975 // FIXME: Does this really make sense for all GNU toolchains?
8976 WantPthread = true;
8977
8978 // Also link the particular OpenMP runtimes.
8979 switch (getOpenMPRuntime(ToolChain, Args)) {
8980 case OMPRT_OMP:
8981 CmdArgs.push_back("-lomp");
8982 break;
8983 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008984 CmdArgs.push_back("-lgomp");
8985
8986 // FIXME: Exclude this for platforms with libgomp that don't require
8987 // librt. Most modern Linux platforms require it, but some may not.
8988 CmdArgs.push_back("-lrt");
8989 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008990 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008991 CmdArgs.push_back("-liomp5");
8992 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008993 case OMPRT_Unknown:
8994 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008995 break;
8996 }
Chandler Carruth01538002013-01-17 13:19:29 +00008997 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008998
Renato Golinc4b49242014-02-13 10:01:16 +00008999 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009000
Richard Smith31d1de22015-05-20 22:48:44 +00009001 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009002 CmdArgs.push_back("-lpthread");
9003
Rafael Espindolab17bc532016-01-25 18:29:16 +00009004 if (Args.hasArg(options::OPT_fsplit_stack))
9005 CmdArgs.push_back("--wrap=pthread_create");
9006
Chandler Carruth94a32012012-05-14 18:31:18 +00009007 CmdArgs.push_back("-lc");
9008
9009 if (Args.hasArg(options::OPT_static))
9010 CmdArgs.push_back("--end-group");
9011 else
Renato Golinc4b49242014-02-13 10:01:16 +00009012 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009013 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009014
Rafael Espindola81937ec2010-12-01 01:52:43 +00009015 if (!Args.hasArg(options::OPT_nostartfiles)) {
9016 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009017 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009018 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009019 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009020 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009021 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009022 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009023
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009024 if (HasCRTBeginEndFiles)
9025 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009026 if (!isAndroid)
9027 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009028 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009029 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009030
Peter Collingbourne39719a72015-11-20 20:49:39 +00009031 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009032}
9033
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009034// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9035// for the various SFI requirements like register masking. The assembly tool
9036// inserts the file containing the macros as an input into all the assembly
9037// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009038void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9039 const InputInfo &Output,
9040 const InputInfoList &Inputs,
9041 const ArgList &Args,
9042 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009043 const toolchains::NaClToolChain &ToolChain =
9044 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009045 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009046 "nacl-arm-macros.s");
9047 InputInfoList NewInputs;
9048 NewInputs.push_back(NaClMacros);
9049 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009050 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9051 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009052}
9053
Douglas Katzman750cfc52015-06-29 18:42:16 +00009054// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009055// we use static by default, do not yet support sanitizers or LTO, and a few
9056// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009057// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009058void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9059 const InputInfo &Output,
9060 const InputInfoList &Inputs,
9061 const ArgList &Args,
9062 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009063
Douglas Katzman54366072015-07-27 16:53:08 +00009064 const toolchains::NaClToolChain &ToolChain =
9065 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009066 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009067 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009068 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009069 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009070
9071 ArgStringList CmdArgs;
9072
9073 // Silence warning for "clang -g foo.o -o foo"
9074 Args.ClaimAllArgs(options::OPT_g_Group);
9075 // and "clang -emit-llvm foo.o -o foo"
9076 Args.ClaimAllArgs(options::OPT_emit_llvm);
9077 // and for "clang -w foo.o -o foo". Other warning options are already
9078 // handled somewhere else.
9079 Args.ClaimAllArgs(options::OPT_w);
9080
9081 if (!D.SysRoot.empty())
9082 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9083
9084 if (Args.hasArg(options::OPT_rdynamic))
9085 CmdArgs.push_back("-export-dynamic");
9086
9087 if (Args.hasArg(options::OPT_s))
9088 CmdArgs.push_back("-s");
9089
Douglas Katzman54366072015-07-27 16:53:08 +00009090 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9091 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009092 CmdArgs.push_back("--build-id");
9093
9094 if (!IsStatic)
9095 CmdArgs.push_back("--eh-frame-hdr");
9096
9097 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009098 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009099 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009100 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009101 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009102 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009103 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009104 else if (Arch == llvm::Triple::mipsel)
9105 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009106 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009107 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9108 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009109
9110 if (IsStatic)
9111 CmdArgs.push_back("-static");
9112 else if (Args.hasArg(options::OPT_shared))
9113 CmdArgs.push_back("-shared");
9114
9115 CmdArgs.push_back("-o");
9116 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009117 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009118 if (!Args.hasArg(options::OPT_shared))
9119 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9120 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9121
9122 const char *crtbegin;
9123 if (IsStatic)
9124 crtbegin = "crtbeginT.o";
9125 else if (Args.hasArg(options::OPT_shared))
9126 crtbegin = "crtbeginS.o";
9127 else
9128 crtbegin = "crtbegin.o";
9129 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9130 }
9131
9132 Args.AddAllArgs(CmdArgs, options::OPT_L);
9133 Args.AddAllArgs(CmdArgs, options::OPT_u);
9134
Douglas Katzman6059ef92015-11-17 17:41:23 +00009135 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009136
9137 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9138 CmdArgs.push_back("--no-demangle");
9139
9140 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9141
Douglas Katzman78b37b02015-11-17 20:28:07 +00009142 if (D.CCCIsCXX() &&
9143 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009144 bool OnlyLibstdcxxStatic =
9145 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009146 if (OnlyLibstdcxxStatic)
9147 CmdArgs.push_back("-Bstatic");
9148 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9149 if (OnlyLibstdcxxStatic)
9150 CmdArgs.push_back("-Bdynamic");
9151 CmdArgs.push_back("-lm");
9152 }
9153
9154 if (!Args.hasArg(options::OPT_nostdlib)) {
9155 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9156 // Always use groups, since it has no effect on dynamic libraries.
9157 CmdArgs.push_back("--start-group");
9158 CmdArgs.push_back("-lc");
9159 // NaCl's libc++ currently requires libpthread, so just always include it
9160 // in the group for C++.
9161 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009162 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009163 // Gold, used by Mips, handles nested groups differently than ld, and
9164 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9165 // which is not a desired behaviour here.
9166 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9167 if (getToolChain().getArch() == llvm::Triple::mipsel)
9168 CmdArgs.push_back("-lnacl");
9169
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009170 CmdArgs.push_back("-lpthread");
9171 }
9172
9173 CmdArgs.push_back("-lgcc");
9174 CmdArgs.push_back("--as-needed");
9175 if (IsStatic)
9176 CmdArgs.push_back("-lgcc_eh");
9177 else
9178 CmdArgs.push_back("-lgcc_s");
9179 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009180
9181 // Mips needs to create and use pnacl_legacy library that contains
9182 // definitions from bitcode/pnaclmm.c and definitions for
9183 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9184 if (getToolChain().getArch() == llvm::Triple::mipsel)
9185 CmdArgs.push_back("-lpnacl_legacy");
9186
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009187 CmdArgs.push_back("--end-group");
9188 }
9189
9190 if (!Args.hasArg(options::OPT_nostartfiles)) {
9191 const char *crtend;
9192 if (Args.hasArg(options::OPT_shared))
9193 crtend = "crtendS.o";
9194 else
9195 crtend = "crtend.o";
9196
9197 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9198 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9199 }
9200 }
9201
Peter Collingbourne39719a72015-11-20 20:49:39 +00009202 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9203 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009204}
9205
Douglas Katzman95354292015-06-23 20:42:09 +00009206void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9207 const InputInfo &Output,
9208 const InputInfoList &Inputs,
9209 const ArgList &Args,
9210 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009211 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009212 ArgStringList CmdArgs;
9213
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009214 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009215
9216 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009217 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009218
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009219 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009220 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009221
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009222 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009223 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009224}
9225
Douglas Katzman95354292015-06-23 20:42:09 +00009226void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9227 const InputInfo &Output,
9228 const InputInfoList &Inputs,
9229 const ArgList &Args,
9230 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009231 const Driver &D = getToolChain().getDriver();
9232 ArgStringList CmdArgs;
9233
Daniel Dunbarb440f562010-08-02 02:38:21 +00009234 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009235 CmdArgs.push_back("-o");
9236 CmdArgs.push_back(Output.getFilename());
9237 } else {
9238 assert(Output.isNothing() && "Invalid output.");
9239 }
9240
Douglas Katzman78b37b02015-11-17 20:28:07 +00009241 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009242 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9243 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9244 CmdArgs.push_back(
9245 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9246 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009247 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009248
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009249 Args.AddAllArgs(CmdArgs,
9250 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009251
Daniel Dunbar54423b22010-09-17 00:24:54 +00009252 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009253
Xinliang David Li69306c02015-10-22 06:15:31 +00009254 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009255
Douglas Katzman78b37b02015-11-17 20:28:07 +00009256 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009257 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009258 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009259 CmdArgs.push_back("-lm");
9260 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009261 }
9262
Douglas Katzman78b37b02015-11-17 20:28:07 +00009263 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009264 if (Args.hasArg(options::OPT_pthread))
9265 CmdArgs.push_back("-lpthread");
9266 CmdArgs.push_back("-lc");
9267 CmdArgs.push_back("-lCompilerRT-Generic");
9268 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9269 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009270 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009271 }
9272
Logan Chieneb9162f2014-06-26 14:23:45 +00009273 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009274 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009275}
9276
Daniel Dunbarcc912342009-05-02 18:28:39 +00009277/// DragonFly Tools
9278
9279// For now, DragonFly Assemble does just about the same as for
9280// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009281void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9282 const InputInfo &Output,
9283 const InputInfoList &Inputs,
9284 const ArgList &Args,
9285 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009286 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009287 ArgStringList CmdArgs;
9288
9289 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9290 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009291 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009292 CmdArgs.push_back("--32");
9293
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009294 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009295
9296 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009297 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009298
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009299 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009300 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009301
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009302 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009303 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009304}
9305
Douglas Katzman95354292015-06-23 20:42:09 +00009306void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9307 const InputInfo &Output,
9308 const InputInfoList &Inputs,
9309 const ArgList &Args,
9310 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009311 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009312 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009313
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009314 if (!D.SysRoot.empty())
9315 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9316
John McCall65b8da02013-04-11 22:55:55 +00009317 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009318 if (Args.hasArg(options::OPT_static)) {
9319 CmdArgs.push_back("-Bstatic");
9320 } else {
John McCall65b8da02013-04-11 22:55:55 +00009321 if (Args.hasArg(options::OPT_rdynamic))
9322 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009323 if (Args.hasArg(options::OPT_shared))
9324 CmdArgs.push_back("-Bshareable");
9325 else {
9326 CmdArgs.push_back("-dynamic-linker");
9327 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9328 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009329 CmdArgs.push_back("--hash-style=gnu");
9330 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009331 }
9332
9333 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9334 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009335 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009336 CmdArgs.push_back("-m");
9337 CmdArgs.push_back("elf_i386");
9338 }
9339
Daniel Dunbarb440f562010-08-02 02:38:21 +00009340 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009341 CmdArgs.push_back("-o");
9342 CmdArgs.push_back(Output.getFilename());
9343 } else {
9344 assert(Output.isNothing() && "Invalid output.");
9345 }
9346
Douglas Katzman78b37b02015-11-17 20:28:07 +00009347 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009348 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009349 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009350 CmdArgs.push_back(
9351 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009352 else {
9353 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009354 CmdArgs.push_back(
9355 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009356 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009357 CmdArgs.push_back(
9358 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009359 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009360 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009361 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009362 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009363 CmdArgs.push_back(
9364 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009365 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009366 CmdArgs.push_back(
9367 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009368 }
9369
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009370 Args.AddAllArgs(CmdArgs,
9371 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009372
Daniel Dunbar54423b22010-09-17 00:24:54 +00009373 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009374
Douglas Katzman78b37b02015-11-17 20:28:07 +00009375 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009376 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009377
9378 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009379 CmdArgs.push_back("-rpath");
9380 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009381 }
9382
Hans Wennborg70850d82013-07-18 20:29:38 +00009383 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009384 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009385 CmdArgs.push_back("-lm");
9386 }
9387
Daniel Dunbarcc912342009-05-02 18:28:39 +00009388 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009389 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009390
9391 if (!Args.hasArg(options::OPT_nolibc)) {
9392 CmdArgs.push_back("-lc");
9393 }
9394
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009395 if (Args.hasArg(options::OPT_static) ||
9396 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009397 CmdArgs.push_back("-lgcc");
9398 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009399 } else {
9400 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009401 CmdArgs.push_back("-lgcc_pic");
9402 if (!Args.hasArg(options::OPT_shared))
9403 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009404 } else {
John McCall65b8da02013-04-11 22:55:55 +00009405 CmdArgs.push_back("-lgcc");
9406 CmdArgs.push_back("--as-needed");
9407 CmdArgs.push_back("-lgcc_pic");
9408 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009409 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009410 }
9411 }
9412
Douglas Katzman78b37b02015-11-17 20:28:07 +00009413 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009414 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009415 CmdArgs.push_back(
9416 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009417 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009418 CmdArgs.push_back(
9419 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9420 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009421 }
9422
Xinliang David Li69306c02015-10-22 06:15:31 +00009423 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009424
Logan Chieneb9162f2014-06-26 14:23:45 +00009425 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009426 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009427}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009428
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009429// Try to find Exe from a Visual Studio distribution. This first tries to find
9430// an installed copy of Visual Studio and, failing that, looks in the PATH,
9431// making sure that whatever executable that's found is not a same-named exe
9432// from clang itself to prevent clang from falling back to itself.
9433static std::string FindVisualStudioExecutable(const ToolChain &TC,
9434 const char *Exe,
9435 const char *ClangProgramPath) {
9436 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9437 std::string visualStudioBinDir;
9438 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9439 visualStudioBinDir)) {
9440 SmallString<128> FilePath(visualStudioBinDir);
9441 llvm::sys::path::append(FilePath, Exe);
9442 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9443 return FilePath.str();
9444 }
9445
9446 return Exe;
9447}
9448
Douglas Katzman95354292015-06-23 20:42:09 +00009449void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9450 const InputInfo &Output,
9451 const InputInfoList &Inputs,
9452 const ArgList &Args,
9453 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009454 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009455 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009456
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009457 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9458 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009459 CmdArgs.push_back(
9460 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009461
Douglas Katzman78b37b02015-11-17 20:28:07 +00009462 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9463 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009464 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009465
Zachary Turner10d75b22014-10-22 20:40:43 +00009466 if (!llvm::sys::Process::GetEnv("LIB")) {
9467 // If the VC environment hasn't been configured (perhaps because the user
9468 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009469 // the environment variable is set however, assume the user knows what
9470 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009471 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009472 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009473 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9474 SmallString<128> LibDir(VisualStudioDir);
9475 llvm::sys::path::append(LibDir, "VC", "lib");
9476 switch (MSVC.getArch()) {
9477 case llvm::Triple::x86:
9478 // x86 just puts the libraries directly in lib
9479 break;
9480 case llvm::Triple::x86_64:
9481 llvm::sys::path::append(LibDir, "amd64");
9482 break;
9483 case llvm::Triple::arm:
9484 llvm::sys::path::append(LibDir, "arm");
9485 break;
9486 default:
9487 break;
9488 }
9489 CmdArgs.push_back(
9490 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009491
9492 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9493 std::string UniversalCRTLibPath;
9494 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9495 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9496 UniversalCRTLibPath.c_str()));
9497 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009498 }
9499
9500 std::string WindowsSdkLibPath;
9501 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9502 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9503 WindowsSdkLibPath.c_str()));
9504 }
9505
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009506 CmdArgs.push_back("-nologo");
9507
Reid Kleckner124955a2015-08-05 18:51:13 +00009508 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009509 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009510
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009511 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009512 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009513 if (DLL) {
9514 CmdArgs.push_back(Args.MakeArgString("-dll"));
9515
9516 SmallString<128> ImplibName(Output.getFilename());
9517 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009518 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009519 }
9520
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009521 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009522 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009523 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009524 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009525 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9526 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009527 // Make sure the dynamic runtime thunk is not optimized out at link time
9528 // to ensure proper SEH handling.
9529 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009530 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009531 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009532 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009533 for (const auto &Lib : {"asan", "asan_cxx"})
9534 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009535 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009536 }
9537
Hans Wennborg2e274592013-08-13 23:38:57 +00009538 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009539
Alexey Bataevc7e84352015-08-19 04:49:01 +00009540 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9541 options::OPT_fno_openmp, false)) {
9542 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9543 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9544 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9545 TC.getDriver().Dir + "/../lib"));
9546 switch (getOpenMPRuntime(getToolChain(), Args)) {
9547 case OMPRT_OMP:
9548 CmdArgs.push_back("-defaultlib:libomp.lib");
9549 break;
9550 case OMPRT_IOMP5:
9551 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9552 break;
9553 case OMPRT_GOMP:
9554 break;
9555 case OMPRT_Unknown:
9556 // Already diagnosed.
9557 break;
9558 }
9559 }
9560
Reid Kleckner337188f2014-09-16 19:22:00 +00009561 // Add filenames, libraries, and other linker inputs.
9562 for (const auto &Input : Inputs) {
9563 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009564 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009565 continue;
9566 }
9567
9568 const Arg &A = Input.getInputArg();
9569
9570 // Render -l options differently for the MSVC linker.
9571 if (A.getOption().matches(options::OPT_l)) {
9572 StringRef Lib = A.getValue();
9573 const char *LinkLibArg;
9574 if (Lib.endswith(".lib"))
9575 LinkLibArg = Args.MakeArgString(Lib);
9576 else
9577 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9578 CmdArgs.push_back(LinkLibArg);
9579 continue;
9580 }
9581
9582 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9583 // or -L. Render it, even if MSVC doesn't understand it.
9584 A.renderAsInput(Args, CmdArgs);
9585 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009586
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009587 TC.addProfileRTLibs(Args, CmdArgs);
9588
Zachary Turner719f58c2014-12-01 23:06:47 +00009589 // We need to special case some linker paths. In the case of lld, we need to
9590 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9591 // linker, we need to use a special search algorithm.
9592 llvm::SmallString<128> linkPath;
9593 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9594 if (Linker.equals_lower("lld"))
9595 Linker = "lld-link";
9596
9597 if (Linker.equals_lower("link")) {
9598 // If we're using the MSVC linker, it's not sufficient to just use link
9599 // from the program PATH, because other environments like GnuWin32 install
9600 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009601 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009602 C.getDriver().getClangProgramPath());
9603 } else {
9604 linkPath = Linker;
9605 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009606 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009607 }
9608
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009609 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009610 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009611}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009612
Douglas Katzman95354292015-06-23 20:42:09 +00009613void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9614 const InputInfo &Output,
9615 const InputInfoList &Inputs,
9616 const ArgList &Args,
9617 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009618 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9619}
9620
Douglas Katzman95354292015-06-23 20:42:09 +00009621std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009622 Compilation &C, const JobAction &JA, const InputInfo &Output,
9623 const InputInfoList &Inputs, const ArgList &Args,
9624 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009625 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009626 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009627 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009628 CmdArgs.push_back("/W0"); // No warnings.
9629
9630 // The goal is to be able to invoke this tool correctly based on
9631 // any flag accepted by clang-cl.
9632
9633 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009634 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009635
9636 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009637 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9638 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9639 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009640 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9641 if (A->getOption().getID() == options::OPT_O0) {
9642 CmdArgs.push_back("/Od");
9643 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009644 CmdArgs.push_back("/Og");
9645
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009646 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009647 if (OptLevel == "s" || OptLevel == "z")
9648 CmdArgs.push_back("/Os");
9649 else
9650 CmdArgs.push_back("/Ot");
9651
9652 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009653 }
9654 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009655 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9656 options::OPT_fno_omit_frame_pointer))
9657 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9658 ? "/Oy"
9659 : "/Oy-");
9660 if (!Args.hasArg(options::OPT_fwritable_strings))
9661 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009662
Nico Weber3f8dafb2015-03-12 19:37:10 +00009663 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009664 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9665
David Majnemerf6072342014-07-01 22:24:56 +00009666 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9667 /*default=*/false))
9668 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009669 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9670 options::OPT_fno_function_sections))
9671 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9672 ? "/Gy"
9673 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009674 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9675 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009676 CmdArgs.push_back(
9677 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009678 if (Args.hasArg(options::OPT_fsyntax_only))
9679 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009680 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9681 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009682 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009683
Nico Weber3f8dafb2015-03-12 19:37:10 +00009684 std::vector<std::string> Includes =
9685 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009686 for (const auto &Include : Includes)
9687 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009688
Hans Wennborg87cfa712013-09-19 20:32:16 +00009689 // Flags that can simply be passed through.
9690 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9691 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009692 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009693 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009694
9695 // The order of these flags is relevant, so pick the last one.
9696 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9697 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9698 A->render(Args, CmdArgs);
9699
Hans Wennborg87cfa712013-09-19 20:32:16 +00009700 // Input filename.
9701 assert(Inputs.size() == 1);
9702 const InputInfo &II = Inputs[0];
9703 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9704 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9705 if (II.isFilename())
9706 CmdArgs.push_back(II.getFilename());
9707 else
9708 II.getInputArg().renderAsInput(Args, CmdArgs);
9709
9710 // Output filename.
9711 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009712 const char *Fo =
9713 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009714 CmdArgs.push_back(Fo);
9715
Hans Wennborg188382e2013-09-20 18:16:35 +00009716 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009717 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9718 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009719 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009720 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009721}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009722
Yaron Keren1c0070c2015-07-02 04:45:27 +00009723/// MinGW Tools
9724void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9725 const InputInfo &Output,
9726 const InputInfoList &Inputs,
9727 const ArgList &Args,
9728 const char *LinkingOutput) const {
9729 claimNoWarnArgs(Args);
9730 ArgStringList CmdArgs;
9731
9732 if (getToolChain().getArch() == llvm::Triple::x86) {
9733 CmdArgs.push_back("--32");
9734 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9735 CmdArgs.push_back("--64");
9736 }
9737
9738 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9739
9740 CmdArgs.push_back("-o");
9741 CmdArgs.push_back(Output.getFilename());
9742
9743 for (const auto &II : Inputs)
9744 CmdArgs.push_back(II.getFilename());
9745
9746 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009747 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009748
9749 if (Args.hasArg(options::OPT_gsplit_dwarf))
9750 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9751 SplitDebugName(Args, Inputs[0]));
9752}
9753
9754void MinGW::Linker::AddLibGCC(const ArgList &Args,
9755 ArgStringList &CmdArgs) const {
9756 if (Args.hasArg(options::OPT_mthreads))
9757 CmdArgs.push_back("-lmingwthrd");
9758 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009759
Yaron Kerenaa281332015-08-09 00:24:07 +00009760 // Make use of compiler-rt if --rtlib option is used
9761 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9762 if (RLT == ToolChain::RLT_Libgcc) {
9763 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9764 Args.hasArg(options::OPT_static);
9765 bool Shared = Args.hasArg(options::OPT_shared);
9766 bool CXX = getToolChain().getDriver().CCCIsCXX();
9767
9768 if (Static || (!CXX && !Shared)) {
9769 CmdArgs.push_back("-lgcc");
9770 CmdArgs.push_back("-lgcc_eh");
9771 } else {
9772 CmdArgs.push_back("-lgcc_s");
9773 CmdArgs.push_back("-lgcc");
9774 }
9775 } else {
9776 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9777 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009778
Yaron Keren1c0070c2015-07-02 04:45:27 +00009779 CmdArgs.push_back("-lmoldname");
9780 CmdArgs.push_back("-lmingwex");
9781 CmdArgs.push_back("-lmsvcrt");
9782}
9783
9784void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9785 const InputInfo &Output,
9786 const InputInfoList &Inputs,
9787 const ArgList &Args,
9788 const char *LinkingOutput) const {
9789 const ToolChain &TC = getToolChain();
9790 const Driver &D = TC.getDriver();
9791 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9792
9793 ArgStringList CmdArgs;
9794
9795 // Silence warning for "clang -g foo.o -o foo"
9796 Args.ClaimAllArgs(options::OPT_g_Group);
9797 // and "clang -emit-llvm foo.o -o foo"
9798 Args.ClaimAllArgs(options::OPT_emit_llvm);
9799 // and for "clang -w foo.o -o foo". Other warning options are already
9800 // handled somewhere else.
9801 Args.ClaimAllArgs(options::OPT_w);
9802
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009803 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9804 if (LinkerName.equals_lower("lld")) {
9805 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009806 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009807 } else if (!LinkerName.equals_lower("ld")) {
9808 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009809 }
9810
Yaron Keren1c0070c2015-07-02 04:45:27 +00009811 if (!D.SysRoot.empty())
9812 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9813
9814 if (Args.hasArg(options::OPT_s))
9815 CmdArgs.push_back("-s");
9816
9817 CmdArgs.push_back("-m");
9818 if (TC.getArch() == llvm::Triple::x86)
9819 CmdArgs.push_back("i386pe");
9820 if (TC.getArch() == llvm::Triple::x86_64)
9821 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009822 if (TC.getArch() == llvm::Triple::arm)
9823 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009824
9825 if (Args.hasArg(options::OPT_mwindows)) {
9826 CmdArgs.push_back("--subsystem");
9827 CmdArgs.push_back("windows");
9828 } else if (Args.hasArg(options::OPT_mconsole)) {
9829 CmdArgs.push_back("--subsystem");
9830 CmdArgs.push_back("console");
9831 }
9832
9833 if (Args.hasArg(options::OPT_static))
9834 CmdArgs.push_back("-Bstatic");
9835 else {
9836 if (Args.hasArg(options::OPT_mdll))
9837 CmdArgs.push_back("--dll");
9838 else if (Args.hasArg(options::OPT_shared))
9839 CmdArgs.push_back("--shared");
9840 CmdArgs.push_back("-Bdynamic");
9841 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9842 CmdArgs.push_back("-e");
9843 if (TC.getArch() == llvm::Triple::x86)
9844 CmdArgs.push_back("_DllMainCRTStartup@12");
9845 else
9846 CmdArgs.push_back("DllMainCRTStartup");
9847 CmdArgs.push_back("--enable-auto-image-base");
9848 }
9849 }
9850
9851 CmdArgs.push_back("-o");
9852 CmdArgs.push_back(Output.getFilename());
9853
9854 Args.AddAllArgs(CmdArgs, options::OPT_e);
9855 // FIXME: add -N, -n flags
9856 Args.AddLastArg(CmdArgs, options::OPT_r);
9857 Args.AddLastArg(CmdArgs, options::OPT_s);
9858 Args.AddLastArg(CmdArgs, options::OPT_t);
9859 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9860 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9861
Douglas Katzman78b37b02015-11-17 20:28:07 +00009862 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009863 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9864 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9865 } else {
9866 if (Args.hasArg(options::OPT_municode))
9867 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9868 else
9869 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9870 }
9871 if (Args.hasArg(options::OPT_pg))
9872 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9873 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9874 }
9875
9876 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009877 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009878 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9879
9880 // TODO: Add ASan stuff here
9881
9882 // TODO: Add profile stuff here
9883
Douglas Katzman78b37b02015-11-17 20:28:07 +00009884 if (D.CCCIsCXX() &&
9885 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009886 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9887 !Args.hasArg(options::OPT_static);
9888 if (OnlyLibstdcxxStatic)
9889 CmdArgs.push_back("-Bstatic");
9890 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9891 if (OnlyLibstdcxxStatic)
9892 CmdArgs.push_back("-Bdynamic");
9893 }
9894
9895 if (!Args.hasArg(options::OPT_nostdlib)) {
9896 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9897 if (Args.hasArg(options::OPT_static))
9898 CmdArgs.push_back("--start-group");
9899
9900 if (Args.hasArg(options::OPT_fstack_protector) ||
9901 Args.hasArg(options::OPT_fstack_protector_strong) ||
9902 Args.hasArg(options::OPT_fstack_protector_all)) {
9903 CmdArgs.push_back("-lssp_nonshared");
9904 CmdArgs.push_back("-lssp");
9905 }
9906 if (Args.hasArg(options::OPT_fopenmp))
9907 CmdArgs.push_back("-lgomp");
9908
9909 AddLibGCC(Args, CmdArgs);
9910
9911 if (Args.hasArg(options::OPT_pg))
9912 CmdArgs.push_back("-lgmon");
9913
Yaron Kerenadce68e2015-07-06 18:52:19 +00009914 if (Args.hasArg(options::OPT_pthread))
9915 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009916
9917 // add system libraries
9918 if (Args.hasArg(options::OPT_mwindows)) {
9919 CmdArgs.push_back("-lgdi32");
9920 CmdArgs.push_back("-lcomdlg32");
9921 }
9922 CmdArgs.push_back("-ladvapi32");
9923 CmdArgs.push_back("-lshell32");
9924 CmdArgs.push_back("-luser32");
9925 CmdArgs.push_back("-lkernel32");
9926
9927 if (Args.hasArg(options::OPT_static))
9928 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009929 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009930 AddLibGCC(Args, CmdArgs);
9931 }
9932
9933 if (!Args.hasArg(options::OPT_nostartfiles)) {
9934 // Add crtfastmath.o if available and fast math is enabled.
9935 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9936
9937 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9938 }
9939 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009940 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009941 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009942}
9943
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009944/// XCore Tools
9945// We pass assemble and link construction to the xcc tool.
9946
Douglas Katzman95354292015-06-23 20:42:09 +00009947void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9948 const InputInfo &Output,
9949 const InputInfoList &Inputs,
9950 const ArgList &Args,
9951 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009952 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009953 ArgStringList CmdArgs;
9954
9955 CmdArgs.push_back("-o");
9956 CmdArgs.push_back(Output.getFilename());
9957
9958 CmdArgs.push_back("-c");
9959
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009960 if (Args.hasArg(options::OPT_v))
9961 CmdArgs.push_back("-v");
9962
Robert Lytton894d25c2014-05-02 09:33:25 +00009963 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9964 if (!A->getOption().matches(options::OPT_g0))
9965 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009966
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009967 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9968 false))
9969 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009970
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009971 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009972
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009973 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009974 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009975
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009976 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009977 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009978}
9979
Douglas Katzman95354292015-06-23 20:42:09 +00009980void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9981 const InputInfo &Output,
9982 const InputInfoList &Inputs,
9983 const ArgList &Args,
9984 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009985 ArgStringList CmdArgs;
9986
9987 if (Output.isFilename()) {
9988 CmdArgs.push_back("-o");
9989 CmdArgs.push_back(Output.getFilename());
9990 } else {
9991 assert(Output.isNothing() && "Invalid output.");
9992 }
9993
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009994 if (Args.hasArg(options::OPT_v))
9995 CmdArgs.push_back("-v");
9996
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009997 // Pass -fexceptions through to the linker if it was present.
9998 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9999 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010000 CmdArgs.push_back("-fexceptions");
10001
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010002 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10003
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010004 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010005 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010006}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010007
Douglas Katzman95354292015-06-23 20:42:09 +000010008void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10009 const InputInfo &Output,
10010 const InputInfoList &Inputs,
10011 const ArgList &Args,
10012 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010013 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010014 const auto &TC =
10015 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10016 ArgStringList CmdArgs;
10017 const char *Exec;
10018
10019 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010020 default:
10021 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010022 case llvm::Triple::arm:
10023 case llvm::Triple::thumb:
10024 break;
10025 case llvm::Triple::x86:
10026 CmdArgs.push_back("--32");
10027 break;
10028 case llvm::Triple::x86_64:
10029 CmdArgs.push_back("--64");
10030 break;
10031 }
10032
10033 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10034
10035 CmdArgs.push_back("-o");
10036 CmdArgs.push_back(Output.getFilename());
10037
10038 for (const auto &Input : Inputs)
10039 CmdArgs.push_back(Input.getFilename());
10040
10041 const std::string Assembler = TC.GetProgramPath("as");
10042 Exec = Args.MakeArgString(Assembler);
10043
Justin Bognerd3371d82015-07-17 03:35:54 +000010044 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010045}
10046
Douglas Katzman95354292015-06-23 20:42:09 +000010047void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10048 const InputInfo &Output,
10049 const InputInfoList &Inputs,
10050 const ArgList &Args,
10051 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010052 const auto &TC =
10053 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10054 const llvm::Triple &T = TC.getTriple();
10055 const Driver &D = TC.getDriver();
10056 SmallString<128> EntryPoint;
10057 ArgStringList CmdArgs;
10058 const char *Exec;
10059
10060 // Silence warning for "clang -g foo.o -o foo"
10061 Args.ClaimAllArgs(options::OPT_g_Group);
10062 // and "clang -emit-llvm foo.o -o foo"
10063 Args.ClaimAllArgs(options::OPT_emit_llvm);
10064 // and for "clang -w foo.o -o foo"
10065 Args.ClaimAllArgs(options::OPT_w);
10066 // Other warning options are already handled somewhere else.
10067
10068 if (!D.SysRoot.empty())
10069 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10070
10071 if (Args.hasArg(options::OPT_pie))
10072 CmdArgs.push_back("-pie");
10073 if (Args.hasArg(options::OPT_rdynamic))
10074 CmdArgs.push_back("-export-dynamic");
10075 if (Args.hasArg(options::OPT_s))
10076 CmdArgs.push_back("--strip-all");
10077
10078 CmdArgs.push_back("-m");
10079 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010080 default:
10081 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010082 case llvm::Triple::arm:
10083 case llvm::Triple::thumb:
10084 // FIXME: this is incorrect for WinCE
10085 CmdArgs.push_back("thumb2pe");
10086 break;
10087 case llvm::Triple::x86:
10088 CmdArgs.push_back("i386pe");
10089 EntryPoint.append("_");
10090 break;
10091 case llvm::Triple::x86_64:
10092 CmdArgs.push_back("i386pep");
10093 break;
10094 }
10095
10096 if (Args.hasArg(options::OPT_shared)) {
10097 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010098 default:
10099 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010100 case llvm::Triple::arm:
10101 case llvm::Triple::thumb:
10102 case llvm::Triple::x86_64:
10103 EntryPoint.append("_DllMainCRTStartup");
10104 break;
10105 case llvm::Triple::x86:
10106 EntryPoint.append("_DllMainCRTStartup@12");
10107 break;
10108 }
10109
10110 CmdArgs.push_back("-shared");
10111 CmdArgs.push_back("-Bdynamic");
10112
10113 CmdArgs.push_back("--enable-auto-image-base");
10114
10115 CmdArgs.push_back("--entry");
10116 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10117 } else {
10118 EntryPoint.append("mainCRTStartup");
10119
10120 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10121 : "-Bdynamic");
10122
Douglas Katzman78b37b02015-11-17 20:28:07 +000010123 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010124 CmdArgs.push_back("--entry");
10125 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10126 }
10127
10128 // FIXME: handle subsystem
10129 }
10130
10131 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010132 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010133
10134 CmdArgs.push_back("-o");
10135 CmdArgs.push_back(Output.getFilename());
10136
10137 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10138 SmallString<261> ImpLib(Output.getFilename());
10139 llvm::sys::path::replace_extension(ImpLib, ".lib");
10140
10141 CmdArgs.push_back("--out-implib");
10142 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10143 }
10144
Douglas Katzman78b37b02015-11-17 20:28:07 +000010145 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010146 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10147 const char *CRTBegin;
10148
10149 CRTBegin =
10150 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10151 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10152 }
10153
10154 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010155 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010156 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10157
10158 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10159 !Args.hasArg(options::OPT_nodefaultlibs)) {
10160 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10161 !Args.hasArg(options::OPT_static);
10162 if (StaticCXX)
10163 CmdArgs.push_back("-Bstatic");
10164 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10165 if (StaticCXX)
10166 CmdArgs.push_back("-Bdynamic");
10167 }
10168
10169 if (!Args.hasArg(options::OPT_nostdlib)) {
10170 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10171 // TODO handle /MT[d] /MD[d]
10172 CmdArgs.push_back("-lmsvcrt");
10173 AddRunTimeLibs(TC, D, CmdArgs, Args);
10174 }
10175 }
10176
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010177 if (TC.getSanitizerArgs().needsAsanRt()) {
10178 // TODO handle /MT[d] /MD[d]
10179 if (Args.hasArg(options::OPT_shared)) {
10180 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10181 } else {
10182 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10183 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10184 // Make sure the dynamic runtime thunk is not optimized out at link time
10185 // to ensure proper SEH handling.
10186 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10187 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10188 ? "___asan_seh_interceptor"
10189 : "__asan_seh_interceptor"));
10190 }
10191 }
10192
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010193 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010194
Justin Bognerd3371d82015-07-17 03:35:54 +000010195 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010196}
Douglas Katzman84a75642015-06-19 14:55:19 +000010197
Douglas Katzman95354292015-06-23 20:42:09 +000010198void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10199 const InputInfo &Output,
10200 const InputInfoList &Inputs,
10201 const ArgList &Args,
10202 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010203 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010204 assert(Inputs.size() == 1);
10205 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010206 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10207 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010208
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010209 if (JA.getKind() == Action::PreprocessJobClass) {
10210 Args.ClaimAllArgs();
10211 CmdArgs.push_back("-E");
10212 } else {
10213 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10214 CmdArgs.push_back("-S");
10215 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10216 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010217 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010218 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010219
Douglas Katzmanf6071112015-08-03 14:34:22 +000010220 // Append all -I, -iquote, -isystem paths, defines/undefines,
10221 // 'f' flags, optimize flags, and warning options.
10222 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010223 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010224 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010225 options::OPT_f_Group, options::OPT_f_clang_Group,
10226 options::OPT_g_Group, options::OPT_M_Group,
10227 options::OPT_O_Group, options::OPT_W_Group});
10228
10229 // If we're producing a dependency file, and assembly is the final action,
10230 // then the name of the target in the dependency file should be the '.o'
10231 // file, not the '.s' file produced by this step. For example, instead of
10232 // /tmp/mumble.s: mumble.c .../someheader.h
10233 // the filename on the lefthand side should be "mumble.o"
10234 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10235 C.getActions().size() == 1 &&
10236 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10237 Arg *A = Args.getLastArg(options::OPT_o);
10238 if (A) {
10239 CmdArgs.push_back("-MT");
10240 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10241 }
10242 }
10243
Douglas Katzman84a75642015-06-19 14:55:19 +000010244 CmdArgs.push_back(II.getFilename());
10245 CmdArgs.push_back("-o");
10246 CmdArgs.push_back(Output.getFilename());
10247
10248 std::string Exec =
10249 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010250 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10251 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010252}
10253
Douglas Katzman95354292015-06-23 20:42:09 +000010254void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10255 const InputInfo &Output,
10256 const InputInfoList &Inputs,
10257 const ArgList &Args,
10258 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010259 ArgStringList CmdArgs;
10260
10261 assert(Inputs.size() == 1);
10262 const InputInfo &II = Inputs[0];
10263 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10264 assert(Output.getType() == types::TY_Object);
10265
10266 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010267 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010268 CmdArgs.push_back("-noSPrefixing");
10269 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010270 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10271 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10272 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010273 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010274 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010275 }
10276 CmdArgs.push_back("-elf"); // Output format.
10277 CmdArgs.push_back(II.getFilename());
10278 CmdArgs.push_back(
10279 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10280
10281 std::string Exec =
10282 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010283 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10284 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010285}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010286
10287void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10288 const InputInfo &Output,
10289 const InputInfoList &Inputs,
10290 const ArgList &Args,
10291 const char *LinkingOutput) const {
10292 const auto &TC =
10293 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10294 const llvm::Triple &T = TC.getTriple();
10295 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010296 bool UseStartfiles =
10297 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010298 bool UseDefaultLibs =
10299 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010300
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010301 if (T.getArch() == llvm::Triple::sparc)
10302 CmdArgs.push_back("-EB");
10303 else // SHAVE assumes little-endian, and sparcel is expressly so.
10304 CmdArgs.push_back("-EL");
10305
10306 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10307 // but we never pass through a --sysroot option and various other bits.
10308 // For example, there are no sanitizers (yet) nor gold linker.
10309
10310 // Eat some arguments that may be present but have no effect.
10311 Args.ClaimAllArgs(options::OPT_g_Group);
10312 Args.ClaimAllArgs(options::OPT_w);
10313 Args.ClaimAllArgs(options::OPT_static_libgcc);
10314
10315 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10316 CmdArgs.push_back("-s");
10317
10318 CmdArgs.push_back("-o");
10319 CmdArgs.push_back(Output.getFilename());
10320
10321 if (UseStartfiles) {
10322 // If you want startfiles, it means you want the builtin crti and crtbegin,
10323 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010324 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10325 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010326 }
10327
10328 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10329 options::OPT_e, options::OPT_s, options::OPT_t,
10330 options::OPT_Z_Flag, options::OPT_r});
10331
Douglas Katzman674a3122015-11-18 16:24:46 +000010332 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010333
10334 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10335
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010336 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010337 if (C.getDriver().CCCIsCXX())
10338 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010339 if (T.getOS() == llvm::Triple::RTEMS) {
10340 CmdArgs.push_back("--start-group");
10341 CmdArgs.push_back("-lc");
10342 // You must provide your own "-L" option to enable finding these.
10343 CmdArgs.push_back("-lrtemscpu");
10344 CmdArgs.push_back("-lrtemsbsp");
10345 CmdArgs.push_back("--end-group");
10346 } else {
10347 CmdArgs.push_back("-lc");
10348 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010349 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010350 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010351 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010352 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10353 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010354 }
10355
10356 std::string Exec =
10357 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10358 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10359 CmdArgs, Inputs));
10360}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010361
10362void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10363 const InputInfo &Output,
10364 const InputInfoList &Inputs,
10365 const ArgList &Args,
10366 const char *LinkingOutput) const {
10367 claimNoWarnArgs(Args);
10368 ArgStringList CmdArgs;
10369
10370 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10371
10372 CmdArgs.push_back("-o");
10373 CmdArgs.push_back(Output.getFilename());
10374
10375 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10376 const InputInfo &Input = Inputs[0];
10377 assert(Input.isFilename() && "Invalid input.");
10378 CmdArgs.push_back(Input.getFilename());
10379
10380 const char *Exec =
10381 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10382 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10383}
10384
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010385static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10386 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10387 if (SanArgs.needsUbsanRt()) {
10388 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10389 }
10390 if (SanArgs.needsAsanRt()) {
10391 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10392 }
10393}
10394
10395static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10396 const JobAction &JA, const InputInfo &Output,
10397 const InputInfoList &Inputs,
10398 const ArgList &Args,
10399 const char *LinkingOutput) {
10400 const toolchains::FreeBSD &ToolChain =
10401 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10402 const Driver &D = ToolChain.getDriver();
10403 ArgStringList CmdArgs;
10404
10405 // Silence warning for "clang -g foo.o -o foo"
10406 Args.ClaimAllArgs(options::OPT_g_Group);
10407 // and "clang -emit-llvm foo.o -o foo"
10408 Args.ClaimAllArgs(options::OPT_emit_llvm);
10409 // and for "clang -w foo.o -o foo". Other warning options are already
10410 // handled somewhere else.
10411 Args.ClaimAllArgs(options::OPT_w);
10412
10413 if (!D.SysRoot.empty())
10414 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10415
10416 if (Args.hasArg(options::OPT_pie))
10417 CmdArgs.push_back("-pie");
10418
10419 if (Args.hasArg(options::OPT_rdynamic))
10420 CmdArgs.push_back("-export-dynamic");
10421 if (Args.hasArg(options::OPT_shared))
10422 CmdArgs.push_back("--oformat=so");
10423
10424 if (Output.isFilename()) {
10425 CmdArgs.push_back("-o");
10426 CmdArgs.push_back(Output.getFilename());
10427 } else {
10428 assert(Output.isNothing() && "Invalid output.");
10429 }
10430
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010431 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10432
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010433 Args.AddAllArgs(CmdArgs, options::OPT_L);
10434 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10435 Args.AddAllArgs(CmdArgs, options::OPT_e);
10436 Args.AddAllArgs(CmdArgs, options::OPT_s);
10437 Args.AddAllArgs(CmdArgs, options::OPT_t);
10438 Args.AddAllArgs(CmdArgs, options::OPT_r);
10439
10440 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10441 CmdArgs.push_back("--no-demangle");
10442
10443 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10444
10445 if (Args.hasArg(options::OPT_pthread)) {
10446 CmdArgs.push_back("-lpthread");
10447 }
10448
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010449 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10450
10451 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10452}
10453
10454static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10455 const JobAction &JA, const InputInfo &Output,
10456 const InputInfoList &Inputs,
10457 const ArgList &Args,
10458 const char *LinkingOutput) {
10459 const toolchains::FreeBSD &ToolChain =
10460 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10461 const Driver &D = ToolChain.getDriver();
10462 ArgStringList CmdArgs;
10463
10464 // Silence warning for "clang -g foo.o -o foo"
10465 Args.ClaimAllArgs(options::OPT_g_Group);
10466 // and "clang -emit-llvm foo.o -o foo"
10467 Args.ClaimAllArgs(options::OPT_emit_llvm);
10468 // and for "clang -w foo.o -o foo". Other warning options are already
10469 // handled somewhere else.
10470 Args.ClaimAllArgs(options::OPT_w);
10471
10472 if (!D.SysRoot.empty())
10473 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10474
10475 if (Args.hasArg(options::OPT_pie))
10476 CmdArgs.push_back("-pie");
10477
10478 if (Args.hasArg(options::OPT_static)) {
10479 CmdArgs.push_back("-Bstatic");
10480 } else {
10481 if (Args.hasArg(options::OPT_rdynamic))
10482 CmdArgs.push_back("-export-dynamic");
10483 CmdArgs.push_back("--eh-frame-hdr");
10484 if (Args.hasArg(options::OPT_shared)) {
10485 CmdArgs.push_back("-Bshareable");
10486 } else {
10487 CmdArgs.push_back("-dynamic-linker");
10488 CmdArgs.push_back("/libexec/ld-elf.so.1");
10489 }
10490 CmdArgs.push_back("--enable-new-dtags");
10491 }
10492
10493 if (Output.isFilename()) {
10494 CmdArgs.push_back("-o");
10495 CmdArgs.push_back(Output.getFilename());
10496 } else {
10497 assert(Output.isNothing() && "Invalid output.");
10498 }
10499
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010500 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10501
Douglas Katzman78b37b02015-11-17 20:28:07 +000010502 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010503 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010504 if (!Args.hasArg(options::OPT_shared)) {
10505 if (Args.hasArg(options::OPT_pg))
10506 crt1 = "gcrt1.o";
10507 else if (Args.hasArg(options::OPT_pie))
10508 crt1 = "Scrt1.o";
10509 else
10510 crt1 = "crt1.o";
10511 }
10512 if (crt1)
10513 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10514
10515 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10516
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010517 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010518 if (Args.hasArg(options::OPT_static))
10519 crtbegin = "crtbeginT.o";
10520 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10521 crtbegin = "crtbeginS.o";
10522 else
10523 crtbegin = "crtbegin.o";
10524
10525 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10526 }
10527
10528 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010529 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010530 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10531 Args.AddAllArgs(CmdArgs, options::OPT_e);
10532 Args.AddAllArgs(CmdArgs, options::OPT_s);
10533 Args.AddAllArgs(CmdArgs, options::OPT_t);
10534 Args.AddAllArgs(CmdArgs, options::OPT_r);
10535
10536 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10537 CmdArgs.push_back("--no-demangle");
10538
10539 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10540
Douglas Katzman78b37b02015-11-17 20:28:07 +000010541 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010542 // For PS4, we always want to pass libm, libstdc++ and libkernel
10543 // libraries for both C and C++ compilations.
10544 CmdArgs.push_back("-lkernel");
10545 if (D.CCCIsCXX()) {
10546 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10547 if (Args.hasArg(options::OPT_pg))
10548 CmdArgs.push_back("-lm_p");
10549 else
10550 CmdArgs.push_back("-lm");
10551 }
10552 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10553 // the default system libraries. Just mimic this for now.
10554 if (Args.hasArg(options::OPT_pg))
10555 CmdArgs.push_back("-lgcc_p");
10556 else
10557 CmdArgs.push_back("-lcompiler_rt");
10558 if (Args.hasArg(options::OPT_static)) {
10559 CmdArgs.push_back("-lstdc++");
10560 } else if (Args.hasArg(options::OPT_pg)) {
10561 CmdArgs.push_back("-lgcc_eh_p");
10562 } else {
10563 CmdArgs.push_back("--as-needed");
10564 CmdArgs.push_back("-lstdc++");
10565 CmdArgs.push_back("--no-as-needed");
10566 }
10567
10568 if (Args.hasArg(options::OPT_pthread)) {
10569 if (Args.hasArg(options::OPT_pg))
10570 CmdArgs.push_back("-lpthread_p");
10571 else
10572 CmdArgs.push_back("-lpthread");
10573 }
10574
10575 if (Args.hasArg(options::OPT_pg)) {
10576 if (Args.hasArg(options::OPT_shared))
10577 CmdArgs.push_back("-lc");
10578 else {
10579 if (Args.hasArg(options::OPT_static)) {
10580 CmdArgs.push_back("--start-group");
10581 CmdArgs.push_back("-lc_p");
10582 CmdArgs.push_back("-lpthread_p");
10583 CmdArgs.push_back("--end-group");
10584 } else {
10585 CmdArgs.push_back("-lc_p");
10586 }
10587 }
10588 CmdArgs.push_back("-lgcc_p");
10589 } else {
10590 if (Args.hasArg(options::OPT_static)) {
10591 CmdArgs.push_back("--start-group");
10592 CmdArgs.push_back("-lc");
10593 CmdArgs.push_back("-lpthread");
10594 CmdArgs.push_back("--end-group");
10595 } else {
10596 CmdArgs.push_back("-lc");
10597 }
10598 CmdArgs.push_back("-lcompiler_rt");
10599 }
10600
10601 if (Args.hasArg(options::OPT_static)) {
10602 CmdArgs.push_back("-lstdc++");
10603 } else if (Args.hasArg(options::OPT_pg)) {
10604 CmdArgs.push_back("-lgcc_eh_p");
10605 } else {
10606 CmdArgs.push_back("--as-needed");
10607 CmdArgs.push_back("-lstdc++");
10608 CmdArgs.push_back("--no-as-needed");
10609 }
10610 }
10611
Douglas Katzman78b37b02015-11-17 20:28:07 +000010612 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010613 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10614 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10615 else
10616 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10617 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10618 }
10619
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010620 const char *Exec =
10621#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010622 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010623#else
10624 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10625#endif
10626
10627 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10628}
10629
10630void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10631 const InputInfo &Output,
10632 const InputInfoList &Inputs,
10633 const ArgList &Args,
10634 const char *LinkingOutput) const {
10635 const toolchains::FreeBSD &ToolChain =
10636 static_cast<const toolchains::FreeBSD &>(getToolChain());
10637 const Driver &D = ToolChain.getDriver();
10638 bool PS4Linker;
10639 StringRef LinkerOptName;
10640 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10641 LinkerOptName = A->getValue();
10642 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10643 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10644 }
10645
10646 if (LinkerOptName == "gold")
10647 PS4Linker = false;
10648 else if (LinkerOptName == "ps4")
10649 PS4Linker = true;
10650 else
10651 PS4Linker = !Args.hasArg(options::OPT_shared);
10652
10653 if (PS4Linker)
10654 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10655 else
10656 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10657}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010658
10659void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10660 const InputInfo &Output,
10661 const InputInfoList &Inputs,
10662 const ArgList &Args,
10663 const char *LinkingOutput) const {
10664 const auto &TC =
10665 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010666 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010667
10668 std::vector<std::string> gpu_archs =
10669 Args.getAllArgValues(options::OPT_march_EQ);
10670 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10671 const std::string& gpu_arch = gpu_archs[0];
10672
10673
10674 ArgStringList CmdArgs;
10675 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
10676
Justin Lebar2836dcd2016-01-19 19:52:21 +000010677 // Map the -O we received to -O{0,1,2,3}.
10678 //
10679 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's default,
10680 // so it may correspond more closely to the spirit of clang -O2.
10681 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10682 // -O3 seems like the least-bad option when -Osomething is specified to
10683 // clang but it isn't handled below.
10684 StringRef OOpt = "3";
10685 if (A->getOption().matches(options::OPT_O4) ||
10686 A->getOption().matches(options::OPT_Ofast))
10687 OOpt = "3";
10688 else if (A->getOption().matches(options::OPT_O0))
10689 OOpt = "0";
10690 else if (A->getOption().matches(options::OPT_O)) {
10691 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10692 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10693 .Case("1", "1")
10694 .Case("2", "2")
10695 .Case("3", "3")
10696 .Case("s", "2")
10697 .Case("z", "2")
10698 .Default("2");
10699 }
10700 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10701 } else {
10702 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10703 // to no optimizations, but ptxas's default is -O3.
10704 CmdArgs.push_back("-O0");
10705 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010706
10707 // Don't bother passing -g to ptxas: It's enabled by default at -O0, and
10708 // not supported at other optimization levels.
10709
10710 CmdArgs.push_back("--gpu-name");
10711 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10712 CmdArgs.push_back("--output-file");
10713 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10714 for (const auto& II : Inputs)
10715 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10716
10717 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10718 CmdArgs.push_back(Args.MakeArgString(A));
10719
10720 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10721 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10722}
10723
10724// All inputs to this linker must be from CudaDeviceActions, as we need to look
10725// at the Inputs' Actions in order to figure out which GPU architecture they
10726// correspond to.
10727void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10728 const InputInfo &Output,
10729 const InputInfoList &Inputs,
10730 const ArgList &Args,
10731 const char *LinkingOutput) const {
10732 const auto &TC =
10733 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010734 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010735
10736 ArgStringList CmdArgs;
10737 CmdArgs.push_back("--cuda");
10738 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10739 CmdArgs.push_back(Args.MakeArgString("--create"));
10740 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10741
10742 for (const auto& II : Inputs) {
10743 auto* A = cast<const CudaDeviceAction>(II.getAction());
10744 // We need to pass an Arch of the form "sm_XX" for cubin files and
10745 // "compute_XX" for ptx.
10746 const char *Arch = (II.getType() == types::TY_PP_Asm)
10747 ? A->getComputeArchName()
10748 : A->getGpuArchName();
10749 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10750 Arch + ",file=" + II.getFilename()));
10751 }
10752
10753 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10754 CmdArgs.push_back(Args.MakeArgString(A));
10755
10756 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10757 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10758}