blob: a8f4afaa149ae4add0f07cbaeaf038b3f30687b2 [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
Davide Italiano18799ff2015-12-30 13:53:25 +0000941 // The kext and FreeBSD linkers don't know how to deal with movw/movt.
942 if (KernelOrKext || Triple.isOSFreeBSD())
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
Kevin Qin110db6f2014-07-18 07:03:22 +00002072// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002073static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002074 std::vector<const char *> &Features) {
2075 SmallVector<StringRef, 8> Split;
2076 text.split(Split, StringRef("+"), -1, false);
2077
Benjamin Kramer72e64312015-09-24 14:48:49 +00002078 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002079 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002080 .Case("fp", "+fp-armv8")
2081 .Case("simd", "+neon")
2082 .Case("crc", "+crc")
2083 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002084 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002085 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002086 .Case("nofp", "-fp-armv8")
2087 .Case("nosimd", "-neon")
2088 .Case("nocrc", "-crc")
2089 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002090 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002091 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002092 .Default(nullptr);
2093 if (result)
2094 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002095 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002096 D.Diag(diag::err_drv_no_neon_modifier);
2097 else
2098 return false;
2099 }
2100 return true;
2101}
2102
2103// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2104// decode CPU and feature.
2105static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2106 std::vector<const char *> &Features) {
2107 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2108 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002109 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
MinSeong Kim50d9c152016-01-05 12:53:24 +00002110 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002111 Features.push_back("+neon");
2112 Features.push_back("+crc");
2113 Features.push_back("+crypto");
2114 } else if (CPU == "generic") {
2115 Features.push_back("+neon");
2116 } else {
2117 return false;
2118 }
2119
2120 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2121 return false;
2122
2123 return true;
2124}
2125
2126static bool
2127getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2128 const ArgList &Args,
2129 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002130 std::string MarchLowerCase = March.lower();
2131 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002132
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002133 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002134 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002135 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002136 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002137 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2138 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002139 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002140 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002141 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002142
2143 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2144 return false;
2145
2146 return true;
2147}
2148
2149static bool
2150getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2151 const ArgList &Args,
2152 std::vector<const char *> &Features) {
2153 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002154 std::string McpuLowerCase = Mcpu.lower();
2155 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002156 return false;
2157
2158 return true;
2159}
2160
2161static bool
2162getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2163 const ArgList &Args,
2164 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002165 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002166 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002167 if (MtuneLowerCase == "native")
2168 MtuneLowerCase = llvm::sys::getHostCPUName();
2169 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002170 Features.push_back("+zcm");
2171 Features.push_back("+zcz");
2172 }
2173 return true;
2174}
2175
2176static bool
2177getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2178 const ArgList &Args,
2179 std::vector<const char *> &Features) {
2180 StringRef CPU;
2181 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002182 std::string McpuLowerCase = Mcpu.lower();
2183 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002184 return false;
2185
2186 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2187}
2188
Justin Bognerf9052562015-11-13 23:07:31 +00002189static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002190 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002191 Arg *A;
2192 bool success = true;
2193 // Enable NEON by default.
2194 Features.push_back("+neon");
2195 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2196 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2197 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2198 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002199 else if (Args.hasArg(options::OPT_arch))
2200 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2201 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002202
2203 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2204 success =
2205 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2206 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2207 success =
2208 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002209 else if (Args.hasArg(options::OPT_arch))
2210 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2211 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002212
2213 if (!success)
2214 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002215
2216 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2217 Features.push_back("-fp-armv8");
2218 Features.push_back("-crypto");
2219 Features.push_back("-neon");
2220 }
Bradley Smith418c5932014-05-02 15:17:51 +00002221
2222 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002223 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002224 if (A->getOption().matches(options::OPT_mcrc))
2225 Features.push_back("+crc");
2226 else
2227 Features.push_back("-crc");
2228 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002229
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002230 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2231 options::OPT_munaligned_access))
2232 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2233 Features.push_back("+strict-align");
2234
Justin Bognerf9052562015-11-13 23:07:31 +00002235 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002236 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002237}
2238
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002239static void getHexagonTargetFeatures(const ArgList &Args,
2240 std::vector<const char *> &Features) {
2241 bool HasHVX = false, HasHVXD = false;
2242
Eric Christopher49062a52015-12-22 03:12:34 +00002243 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2244 // doing dependent option handling here rather than in initFeatureMap or a
2245 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002246 for (auto &A : Args) {
2247 auto &Opt = A->getOption();
2248 if (Opt.matches(options::OPT_mhexagon_hvx))
2249 HasHVX = true;
2250 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2251 HasHVXD = HasHVX = false;
2252 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2253 HasHVXD = HasHVX = true;
2254 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2255 HasHVXD = false;
2256 else
2257 continue;
2258 A->claim();
2259 }
2260
2261 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2262 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2263}
2264
Dan Gohmanc2853072015-09-03 22:51:53 +00002265static void getWebAssemblyTargetFeatures(const ArgList &Args,
2266 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002267 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002268}
2269
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002270static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002271 const ArgList &Args, ArgStringList &CmdArgs,
2272 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002273 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002274 std::vector<const char *> Features;
2275 switch (Triple.getArch()) {
2276 default:
2277 break;
2278 case llvm::Triple::mips:
2279 case llvm::Triple::mipsel:
2280 case llvm::Triple::mips64:
2281 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002282 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002283 break;
2284
2285 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002286 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002287 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002288 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002289 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002290 break;
2291
2292 case llvm::Triple::ppc:
2293 case llvm::Triple::ppc64:
2294 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002295 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002296 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002297 case llvm::Triple::systemz:
2298 getSystemZTargetFeatures(Args, Features);
2299 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002300 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002301 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002302 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002303 break;
2304 case llvm::Triple::x86:
2305 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002306 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002307 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002308 case llvm::Triple::hexagon:
2309 getHexagonTargetFeatures(Args, Features);
2310 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002311 case llvm::Triple::wasm32:
2312 case llvm::Triple::wasm64:
2313 getWebAssemblyTargetFeatures(Args, Features);
2314 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002315 }
Rafael Espindola43964802013-08-21 17:34:32 +00002316
2317 // Find the last of each feature.
2318 llvm::StringMap<unsigned> LastOpt;
2319 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2320 const char *Name = Features[I];
2321 assert(Name[0] == '-' || Name[0] == '+');
2322 LastOpt[Name + 1] = I;
2323 }
2324
2325 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2326 // If this feature was overridden, ignore it.
2327 const char *Name = Features[I];
2328 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2329 assert(LastI != LastOpt.end());
2330 unsigned Last = LastI->second;
2331 if (Last != I)
2332 continue;
2333
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002334 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002335 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002336 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002337}
2338
David Majnemerae394812014-12-09 00:12:30 +00002339static bool
2340shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2341 const llvm::Triple &Triple) {
2342 // We use the zero-cost exception tables for Objective-C if the non-fragile
2343 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2344 // later.
2345 if (runtime.isNonFragile())
2346 return true;
2347
2348 if (!Triple.isMacOSX())
2349 return false;
2350
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002351 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002352 (Triple.getArch() == llvm::Triple::x86_64 ||
2353 Triple.getArch() == llvm::Triple::arm));
2354}
2355
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002356/// Adds exception related arguments to the driver command arguments. There's a
2357/// master flag, -fexceptions and also language specific flags to enable/disable
2358/// C++ and Objective-C exceptions. This makes it possible to for example
2359/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002360static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002361 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002362 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002363 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002364 const Driver &D = TC.getDriver();
2365 const llvm::Triple &Triple = TC.getTriple();
2366
Chad Rosier4fab82c2012-03-26 22:04:46 +00002367 if (KernelOrKext) {
2368 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2369 // arguments now to avoid warnings about unused arguments.
2370 Args.ClaimAllArgs(options::OPT_fexceptions);
2371 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2372 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2373 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2374 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2375 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002376 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002377 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002378
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002379 // See if the user explicitly enabled exceptions.
2380 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2381 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002382
David Majnemerae394812014-12-09 00:12:30 +00002383 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2384 // is not necessarily sensible, but follows GCC.
2385 if (types::isObjC(InputType) &&
2386 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002387 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002388 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002389
David Majnemerae394812014-12-09 00:12:30 +00002390 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002391 }
2392
2393 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002394 // Disable C++ EH by default on XCore, PS4, and MSVC.
2395 // FIXME: Remove MSVC from this list once things work.
2396 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2397 !Triple.isPS4CPU() &&
2398 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002399 Arg *ExceptionArg = Args.getLastArg(
2400 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2401 options::OPT_fexceptions, options::OPT_fno_exceptions);
2402 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002403 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002404 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2405 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002406
2407 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002408 if (Triple.isPS4CPU()) {
2409 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2410 assert(ExceptionArg &&
2411 "On the PS4 exceptions should only be enabled if passing "
2412 "an argument");
2413 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2414 const Arg *RTTIArg = TC.getRTTIArg();
2415 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2416 D.Diag(diag::err_drv_argument_not_allowed_with)
2417 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2418 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2419 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2420 } else
2421 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2422
Anders Carlssone96ab552011-02-28 02:27:16 +00002423 CmdArgs.push_back("-fcxx-exceptions");
2424
David Majnemer8de68642014-12-05 08:11:58 +00002425 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002426 }
2427 }
2428
David Majnemer8de68642014-12-05 08:11:58 +00002429 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002430 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002431}
2432
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002433static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002434 bool Default = true;
2435 if (TC.getTriple().isOSDarwin()) {
2436 // The native darwin assembler doesn't support the linker_option directives,
2437 // so we disable them if we think the .s file will be passed to it.
2438 Default = TC.useIntegratedAs();
2439 }
2440 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2441 Default);
2442}
2443
Ted Kremenek62093662013-03-12 17:02:12 +00002444static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2445 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002446 bool UseDwarfDirectory =
2447 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2448 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002449 return !UseDwarfDirectory;
2450}
2451
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002452/// \brief Check whether the given input tree contains any compilation actions.
2453static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002454 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002455 return true;
2456
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002457 for (const auto &Act : *A)
2458 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002459 return true;
2460
2461 return false;
2462}
2463
2464/// \brief Check if -relax-all should be passed to the internal assembler.
2465/// This is done by default when compiling non-assembler source with -O0.
2466static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2467 bool RelaxDefault = true;
2468
2469 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2470 RelaxDefault = A->getOption().matches(options::OPT_O0);
2471
2472 if (RelaxDefault) {
2473 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002474 for (const auto &Act : C.getActions()) {
2475 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002476 RelaxDefault = true;
2477 break;
2478 }
2479 }
2480 }
2481
2482 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002483 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002484}
2485
Paul Robinson0334a042015-12-19 19:41:48 +00002486// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2487// to the corresponding DebugInfoKind.
2488static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
2489 assert(A.getOption().matches(options::OPT_gN_Group) &&
2490 "Not a -g option that specifies a debug-info level");
2491 if (A.getOption().matches(options::OPT_g0) ||
2492 A.getOption().matches(options::OPT_ggdb0))
2493 return CodeGenOptions::NoDebugInfo;
2494 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2495 A.getOption().matches(options::OPT_ggdb1))
2496 return CodeGenOptions::DebugLineTablesOnly;
2497 return CodeGenOptions::LimitedDebugInfo;
2498}
2499
Douglas Katzman3459ce22015-10-08 04:24:12 +00002500// Extract the integer N from a string spelled "-dwarf-N", returning 0
2501// on mismatch. The StringRef input (rather than an Arg) allows
2502// for use by the "-Xassembler" option parser.
2503static unsigned DwarfVersionNum(StringRef ArgValue) {
2504 return llvm::StringSwitch<unsigned>(ArgValue)
2505 .Case("-gdwarf-2", 2)
2506 .Case("-gdwarf-3", 3)
2507 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002508 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002509 .Default(0);
2510}
2511
2512static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2513 CodeGenOptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002514 unsigned DwarfVersion,
2515 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002516 switch (DebugInfoKind) {
2517 case CodeGenOptions::DebugLineTablesOnly:
2518 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2519 break;
2520 case CodeGenOptions::LimitedDebugInfo:
2521 CmdArgs.push_back("-debug-info-kind=limited");
2522 break;
2523 case CodeGenOptions::FullDebugInfo:
2524 CmdArgs.push_back("-debug-info-kind=standalone");
2525 break;
2526 default:
2527 break;
2528 }
2529 if (DwarfVersion > 0)
2530 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002531 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002532 switch (DebuggerTuning) {
2533 case llvm::DebuggerKind::GDB:
2534 CmdArgs.push_back("-debugger-tuning=gdb");
2535 break;
2536 case llvm::DebuggerKind::LLDB:
2537 CmdArgs.push_back("-debugger-tuning=lldb");
2538 break;
2539 case llvm::DebuggerKind::SCE:
2540 CmdArgs.push_back("-debugger-tuning=sce");
2541 break;
2542 default:
2543 break;
2544 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002545}
2546
David Blaikie9260ed62013-07-25 21:19:01 +00002547static void CollectArgsForIntegratedAssembler(Compilation &C,
2548 const ArgList &Args,
2549 ArgStringList &CmdArgs,
2550 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002551 if (UseRelaxAll(C, Args))
2552 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002553
David Majnemer2b9349d2015-12-21 22:09:34 +00002554 // Only default to -mincremental-linker-compatible if we think we are
2555 // targeting the MSVC linker.
2556 bool DefaultIncrementalLinkerCompatible =
2557 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2558 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2559 options::OPT_mno_incremental_linker_compatible,
2560 DefaultIncrementalLinkerCompatible))
2561 CmdArgs.push_back("-mincremental-linker-compatible");
2562
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002563 // When passing -I arguments to the assembler we sometimes need to
2564 // unconditionally take the next argument. For example, when parsing
2565 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2566 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2567 // arg after parsing the '-I' arg.
2568 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002569
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002570 // When using an integrated assembler, translate -Wa, and -Xassembler
2571 // options.
2572 bool CompressDebugSections = false;
2573 for (const Arg *A :
2574 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2575 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002576
Benjamin Kramer72e64312015-09-24 14:48:49 +00002577 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002578 if (TakeNextArg) {
2579 CmdArgs.push_back(Value.data());
2580 TakeNextArg = false;
2581 continue;
2582 }
David Blaikie9260ed62013-07-25 21:19:01 +00002583
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002584 switch (C.getDefaultToolChain().getArch()) {
2585 default:
2586 break;
2587 case llvm::Triple::mips:
2588 case llvm::Triple::mipsel:
2589 case llvm::Triple::mips64:
2590 case llvm::Triple::mips64el:
2591 if (Value == "--trap") {
2592 CmdArgs.push_back("-target-feature");
2593 CmdArgs.push_back("+use-tcc-in-div");
2594 continue;
2595 }
2596 if (Value == "--break") {
2597 CmdArgs.push_back("-target-feature");
2598 CmdArgs.push_back("-use-tcc-in-div");
2599 continue;
2600 }
2601 if (Value.startswith("-msoft-float")) {
2602 CmdArgs.push_back("-target-feature");
2603 CmdArgs.push_back("+soft-float");
2604 continue;
2605 }
2606 if (Value.startswith("-mhard-float")) {
2607 CmdArgs.push_back("-target-feature");
2608 CmdArgs.push_back("-soft-float");
2609 continue;
2610 }
2611 break;
2612 }
2613
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002614 if (Value == "-force_cpusubtype_ALL") {
2615 // Do nothing, this is the default and we don't support anything else.
2616 } else if (Value == "-L") {
2617 CmdArgs.push_back("-msave-temp-labels");
2618 } else if (Value == "--fatal-warnings") {
2619 CmdArgs.push_back("-massembler-fatal-warnings");
2620 } else if (Value == "--noexecstack") {
2621 CmdArgs.push_back("-mnoexecstack");
2622 } else if (Value == "-compress-debug-sections" ||
2623 Value == "--compress-debug-sections") {
2624 CompressDebugSections = true;
2625 } else if (Value == "-nocompress-debug-sections" ||
2626 Value == "--nocompress-debug-sections") {
2627 CompressDebugSections = false;
2628 } else if (Value.startswith("-I")) {
2629 CmdArgs.push_back(Value.data());
2630 // We need to consume the next argument if the current arg is a plain
2631 // -I. The next arg will be the include directory.
2632 if (Value == "-I")
2633 TakeNextArg = true;
2634 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002635 // "-gdwarf-N" options are not cc1as options.
2636 unsigned DwarfVersion = DwarfVersionNum(Value);
2637 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2638 CmdArgs.push_back(Value.data());
2639 } else {
2640 RenderDebugEnablingArgs(
Paul Robinson0334a042015-12-19 19:41:48 +00002641 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
2642 llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002643 }
Renato Golin7c542b42015-07-27 23:44:45 +00002644 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2645 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2646 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002647 } else {
2648 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002649 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002650 }
2651 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002652 }
2653 if (CompressDebugSections) {
2654 if (llvm::zlib::isAvailable())
2655 CmdArgs.push_back("-compress-debug-sections");
2656 else
2657 D.Diag(diag::warn_debug_compression_unavailable);
2658 }
David Blaikie9260ed62013-07-25 21:19:01 +00002659}
2660
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002661// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002662// FIXME: Make sure we can also emit shared objects if they're requested
2663// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002664static void addClangRT(const ToolChain &TC, const ArgList &Args,
2665 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002666 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002667}
2668
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002669namespace {
2670enum OpenMPRuntimeKind {
2671 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2672 /// without knowing what runtime to target.
2673 OMPRT_Unknown,
2674
2675 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2676 /// the default for Clang.
2677 OMPRT_OMP,
2678
2679 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2680 /// this runtime but can swallow the pragmas, and find and link against the
2681 /// runtime library itself.
2682 OMPRT_GOMP,
2683
Chandler Carruthc6625c62015-05-28 21:10:31 +00002684 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002685 /// OpenMP runtime. We support this mode for users with existing dependencies
2686 /// on this runtime library name.
2687 OMPRT_IOMP5
2688};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002689}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002690
2691/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002692static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2693 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002694 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2695
2696 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2697 if (A)
2698 RuntimeName = A->getValue();
2699
2700 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002701 .Case("libomp", OMPRT_OMP)
2702 .Case("libgomp", OMPRT_GOMP)
2703 .Case("libiomp5", OMPRT_IOMP5)
2704 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002705
2706 if (RT == OMPRT_Unknown) {
2707 if (A)
2708 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002709 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002710 else
2711 // FIXME: We could use a nicer diagnostic here.
2712 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2713 }
2714
2715 return RT;
2716}
2717
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002718static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2719 const ArgList &Args) {
2720 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2721 options::OPT_fno_openmp, false))
2722 return;
2723
2724 switch (getOpenMPRuntime(TC, Args)) {
2725 case OMPRT_OMP:
2726 CmdArgs.push_back("-lomp");
2727 break;
2728 case OMPRT_GOMP:
2729 CmdArgs.push_back("-lgomp");
2730 break;
2731 case OMPRT_IOMP5:
2732 CmdArgs.push_back("-liomp5");
2733 break;
2734 case OMPRT_Unknown:
2735 // Already diagnosed.
2736 break;
2737 }
2738}
2739
Alexey Samsonov52550342014-09-15 19:58:40 +00002740static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2741 ArgStringList &CmdArgs, StringRef Sanitizer,
2742 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002743 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002744 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002745 if (!IsShared) CmdArgs.push_back("-whole-archive");
2746 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2747 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002748}
2749
Alexey Samsonov52550342014-09-15 19:58:40 +00002750// Tries to use a file with the list of dynamic symbols that need to be exported
2751// from the runtime library. Returns true if the file was found.
2752static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2753 ArgStringList &CmdArgs,
2754 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002755 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002756 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2757 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002758 return true;
2759 }
2760 return false;
2761}
2762
2763static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2764 ArgStringList &CmdArgs) {
2765 // Force linking against the system libraries sanitizers depends on
2766 // (see PR15823 why this is necessary).
2767 CmdArgs.push_back("--no-as-needed");
2768 CmdArgs.push_back("-lpthread");
2769 CmdArgs.push_back("-lrt");
2770 CmdArgs.push_back("-lm");
2771 // There's no libdl on FreeBSD.
2772 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2773 CmdArgs.push_back("-ldl");
2774}
2775
2776static void
2777collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2778 SmallVectorImpl<StringRef> &SharedRuntimes,
2779 SmallVectorImpl<StringRef> &StaticRuntimes,
2780 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2781 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2782 // Collect shared runtimes.
2783 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2784 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002785 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002786
Alexey Samsonov52550342014-09-15 19:58:40 +00002787 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002788 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002789 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002790 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002791 }
2792 if (SanArgs.needsAsanRt()) {
2793 if (SanArgs.needsSharedAsanRt()) {
2794 HelperStaticRuntimes.push_back("asan-preinit");
2795 } else {
2796 StaticRuntimes.push_back("asan");
2797 if (SanArgs.linkCXXRuntimes())
2798 StaticRuntimes.push_back("asan_cxx");
2799 }
2800 }
2801 if (SanArgs.needsDfsanRt())
2802 StaticRuntimes.push_back("dfsan");
2803 if (SanArgs.needsLsanRt())
2804 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002805 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002806 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002807 if (SanArgs.linkCXXRuntimes())
2808 StaticRuntimes.push_back("msan_cxx");
2809 }
2810 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002811 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002812 if (SanArgs.linkCXXRuntimes())
2813 StaticRuntimes.push_back("tsan_cxx");
2814 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002815 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002816 StaticRuntimes.push_back("ubsan_standalone");
2817 if (SanArgs.linkCXXRuntimes())
2818 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002819 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002820 if (SanArgs.needsSafeStackRt())
2821 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002822 if (SanArgs.needsCfiRt())
2823 StaticRuntimes.push_back("cfi");
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002824 if (SanArgs.needsCfiDiagRt())
2825 StaticRuntimes.push_back("cfi_diag");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002826}
2827
Alexey Samsonov52550342014-09-15 19:58:40 +00002828// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2829// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2830static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002831 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002832 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2833 HelperStaticRuntimes;
2834 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2835 HelperStaticRuntimes);
2836 for (auto RT : SharedRuntimes)
2837 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2838 for (auto RT : HelperStaticRuntimes)
2839 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2840 bool AddExportDynamic = false;
2841 for (auto RT : StaticRuntimes) {
2842 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2843 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2844 }
2845 // If there is a static runtime with no dynamic list, force all the symbols
2846 // to be dynamic to be sure we export sanitizer interface functions.
2847 if (AddExportDynamic)
2848 CmdArgs.push_back("-export-dynamic");
2849 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002850}
2851
Reid Kleckner86ea7702015-02-04 23:45:07 +00002852static bool areOptimizationsEnabled(const ArgList &Args) {
2853 // Find the last -O arg and see if it is non-zero.
2854 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2855 return !A->getOption().matches(options::OPT_O0);
2856 // Defaults to -O0.
2857 return false;
2858}
2859
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002860static bool shouldUseFramePointerForTarget(const ArgList &Args,
2861 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002862 switch (Triple.getArch()) {
2863 case llvm::Triple::xcore:
2864 case llvm::Triple::wasm32:
2865 case llvm::Triple::wasm64:
2866 // XCore never wants frame pointers, regardless of OS.
2867 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002868 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002869 default:
2870 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002871 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002872
2873 if (Triple.isOSLinux()) {
2874 switch (Triple.getArch()) {
2875 // Don't use a frame pointer on linux if optimizing for certain targets.
2876 case llvm::Triple::mips64:
2877 case llvm::Triple::mips64el:
2878 case llvm::Triple::mips:
2879 case llvm::Triple::mipsel:
2880 case llvm::Triple::systemz:
2881 case llvm::Triple::x86:
2882 case llvm::Triple::x86_64:
2883 return !areOptimizationsEnabled(Args);
2884 default:
2885 return true;
2886 }
2887 }
2888
2889 if (Triple.isOSWindows()) {
2890 switch (Triple.getArch()) {
2891 case llvm::Triple::x86:
2892 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002893 case llvm::Triple::arm:
2894 case llvm::Triple::thumb:
2895 // Windows on ARM builds with FPO disabled to aid fast stack walking
2896 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002897 default:
2898 // All other supported Windows ISAs use xdata unwind information, so frame
2899 // pointers are not generally useful.
2900 return false;
2901 }
2902 }
2903
2904 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002905}
2906
Rafael Espindola224dd632011-12-14 21:02:23 +00002907static bool shouldUseFramePointer(const ArgList &Args,
2908 const llvm::Triple &Triple) {
2909 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2910 options::OPT_fomit_frame_pointer))
2911 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002912 if (Args.hasArg(options::OPT_pg))
2913 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002914
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002915 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002916}
2917
Eric Christopherb7d97e92013-04-03 01:58:53 +00002918static bool shouldUseLeafFramePointer(const ArgList &Args,
2919 const llvm::Triple &Triple) {
2920 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2921 options::OPT_momit_leaf_frame_pointer))
2922 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002923 if (Args.hasArg(options::OPT_pg))
2924 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002925
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002926 if (Triple.isPS4CPU())
2927 return false;
2928
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002929 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002930}
2931
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002932/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002933static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002934 SmallString<128> cwd;
2935 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002936 CmdArgs.push_back("-fdebug-compilation-dir");
2937 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002938 }
2939}
2940
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002941static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002942 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2943 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2944 SmallString<128> T(FinalOutput->getValue());
2945 llvm::sys::path::replace_extension(T, "dwo");
2946 return Args.MakeArgString(T);
2947 } else {
2948 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002949 SmallString<128> T(
2950 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002951 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002952 llvm::sys::path::replace_extension(F, "dwo");
2953 T += F;
2954 return Args.MakeArgString(F);
2955 }
2956}
2957
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002958static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2959 const JobAction &JA, const ArgList &Args,
2960 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002961 ArgStringList ExtractArgs;
2962 ExtractArgs.push_back("--extract-dwo");
2963
2964 ArgStringList StripArgs;
2965 StripArgs.push_back("--strip-dwo");
2966
2967 // Grabbing the output of the earlier compile step.
2968 StripArgs.push_back(Output.getFilename());
2969 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002970 ExtractArgs.push_back(OutFile);
2971
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002972 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002973 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002974
2975 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002976 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002977
2978 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002979 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002980}
2981
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002982/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002983/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2984static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002985 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002986 if (A->getOption().matches(options::OPT_O4) ||
2987 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002988 return true;
2989
2990 if (A->getOption().matches(options::OPT_O0))
2991 return false;
2992
2993 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2994
Rafael Espindola91780de2013-08-26 14:05:41 +00002995 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002996 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002997 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002998 return true;
2999
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003000 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003001 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003002 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003003
3004 unsigned OptLevel = 0;
3005 if (S.getAsInteger(10, OptLevel))
3006 return false;
3007
3008 return OptLevel > 1;
3009 }
3010
3011 return false;
3012}
3013
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003014/// Add -x lang to \p CmdArgs for \p Input.
3015static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3016 ArgStringList &CmdArgs) {
3017 // When using -verify-pch, we don't want to provide the type
3018 // 'precompiled-header' if it was inferred from the file extension
3019 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3020 return;
3021
3022 CmdArgs.push_back("-x");
3023 if (Args.hasArg(options::OPT_rewrite_objc))
3024 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3025 else
3026 CmdArgs.push_back(types::getTypeName(Input.getType()));
3027}
3028
David Majnemerc371ff02015-03-22 08:39:22 +00003029static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003030 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003031 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003032
3033 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003034 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003035
3036 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003037 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003038 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003039 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003040}
3041
Rafael Espindola577637a2015-01-03 00:06:04 +00003042// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003043// options that build systems might add but are unused when assembling or only
3044// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003045static void claimNoWarnArgs(const ArgList &Args) {
3046 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003047 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003048 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003049 Args.ClaimAllArgs(options::OPT_flto);
3050 Args.ClaimAllArgs(options::OPT_fno_lto);
3051}
3052
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003053static void appendUserToPath(SmallVectorImpl<char> &Result) {
3054#ifdef LLVM_ON_UNIX
3055 const char *Username = getenv("LOGNAME");
3056#else
3057 const char *Username = getenv("USERNAME");
3058#endif
3059 if (Username) {
3060 // Validate that LoginName can be used in a path, and get its length.
3061 size_t Len = 0;
3062 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003063 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003064 Username = nullptr;
3065 break;
3066 }
3067 }
3068
3069 if (Username && Len > 0) {
3070 Result.append(Username, Username + Len);
3071 return;
3072 }
3073 }
3074
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003075// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003076#ifdef LLVM_ON_UNIX
3077 std::string UID = llvm::utostr(getuid());
3078#else
3079 // FIXME: Windows seems to have an 'SID' that might work.
3080 std::string UID = "9999";
3081#endif
3082 Result.append(UID.begin(), UID.end());
3083}
3084
David Majnemere11d3732015-06-08 00:22:46 +00003085VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3086 const llvm::Triple &Triple,
3087 const llvm::opt::ArgList &Args,
3088 bool IsWindowsMSVC) {
3089 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3090 IsWindowsMSVC) ||
3091 Args.hasArg(options::OPT_fmsc_version) ||
3092 Args.hasArg(options::OPT_fms_compatibility_version)) {
3093 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3094 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003095 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003096
3097 if (MSCVersion && MSCompatibilityVersion) {
3098 if (D)
3099 D->Diag(diag::err_drv_argument_not_allowed_with)
3100 << MSCVersion->getAsString(Args)
3101 << MSCompatibilityVersion->getAsString(Args);
3102 return VersionTuple();
3103 }
3104
3105 if (MSCompatibilityVersion) {
3106 VersionTuple MSVT;
3107 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3108 D->Diag(diag::err_drv_invalid_value)
3109 << MSCompatibilityVersion->getAsString(Args)
3110 << MSCompatibilityVersion->getValue();
3111 return MSVT;
3112 }
3113
3114 if (MSCVersion) {
3115 unsigned Version = 0;
3116 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3117 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3118 << MSCVersion->getValue();
3119 return getMSCompatibilityVersion(Version);
3120 }
3121
3122 unsigned Major, Minor, Micro;
3123 Triple.getEnvironmentVersion(Major, Minor, Micro);
3124 if (Major || Minor || Micro)
3125 return VersionTuple(Major, Minor, Micro);
3126
3127 return VersionTuple(18);
3128 }
3129 return VersionTuple();
3130}
3131
Diego Novilloa0545962015-07-10 18:00:07 +00003132static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3133 const InputInfo &Output, const ArgList &Args,
3134 ArgStringList &CmdArgs) {
3135 auto *ProfileGenerateArg = Args.getLastArg(
3136 options::OPT_fprofile_instr_generate,
3137 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003138 options::OPT_fprofile_generate_EQ,
3139 options::OPT_fno_profile_instr_generate);
3140 if (ProfileGenerateArg &&
3141 ProfileGenerateArg->getOption().matches(
3142 options::OPT_fno_profile_instr_generate))
3143 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003144
3145 auto *ProfileUseArg = Args.getLastArg(
3146 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003147 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3148 options::OPT_fno_profile_instr_use);
3149 if (ProfileUseArg &&
3150 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3151 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003152
3153 if (ProfileGenerateArg && ProfileUseArg)
3154 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003155 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003156
Diego Novillo758f3f52015-08-05 21:49:51 +00003157 if (ProfileGenerateArg) {
3158 if (ProfileGenerateArg->getOption().matches(
3159 options::OPT_fprofile_instr_generate_EQ))
3160 ProfileGenerateArg->render(Args, CmdArgs);
3161 else if (ProfileGenerateArg->getOption().matches(
3162 options::OPT_fprofile_generate_EQ)) {
3163 SmallString<128> Path(ProfileGenerateArg->getValue());
3164 llvm::sys::path::append(Path, "default.profraw");
3165 CmdArgs.push_back(
3166 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3167 } else
3168 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3169 }
Diego Novilloa0545962015-07-10 18:00:07 +00003170
Diego Novillo758f3f52015-08-05 21:49:51 +00003171 if (ProfileUseArg) {
3172 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3173 ProfileUseArg->render(Args, CmdArgs);
3174 else if ((ProfileUseArg->getOption().matches(
3175 options::OPT_fprofile_use_EQ) ||
3176 ProfileUseArg->getOption().matches(
3177 options::OPT_fprofile_instr_use))) {
3178 SmallString<128> Path(
3179 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3180 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3181 llvm::sys::path::append(Path, "default.profdata");
3182 CmdArgs.push_back(
3183 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3184 }
Diego Novilloa0545962015-07-10 18:00:07 +00003185 }
3186
3187 if (Args.hasArg(options::OPT_ftest_coverage) ||
3188 Args.hasArg(options::OPT_coverage))
3189 CmdArgs.push_back("-femit-coverage-notes");
3190 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3191 false) ||
3192 Args.hasArg(options::OPT_coverage))
3193 CmdArgs.push_back("-femit-coverage-data");
3194
Diego Novilloc4b94da2015-08-05 23:27:40 +00003195 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3196 options::OPT_fno_coverage_mapping, false) &&
3197 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003198 D.Diag(diag::err_drv_argument_only_allowed_with)
3199 << "-fcoverage-mapping"
3200 << "-fprofile-instr-generate";
3201
Diego Novilloc4b94da2015-08-05 23:27:40 +00003202 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3203 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003204 CmdArgs.push_back("-fcoverage-mapping");
3205
3206 if (C.getArgs().hasArg(options::OPT_c) ||
3207 C.getArgs().hasArg(options::OPT_S)) {
3208 if (Output.isFilename()) {
3209 CmdArgs.push_back("-coverage-file");
3210 SmallString<128> CoverageFilename;
3211 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3212 CoverageFilename = FinalOutput->getValue();
3213 } else {
3214 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3215 }
3216 if (llvm::sys::path::is_relative(CoverageFilename)) {
3217 SmallString<128> Pwd;
3218 if (!llvm::sys::fs::current_path(Pwd)) {
3219 llvm::sys::path::append(Pwd, CoverageFilename);
3220 CoverageFilename.swap(Pwd);
3221 }
3222 }
3223 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3224 }
3225 }
3226}
3227
Paul Robinsond083b9a2015-12-16 17:25:27 +00003228static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3229 ArgStringList &CmdArgs) {
3230 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3231 false) ||
3232 Args.hasFlag(options::OPT_fprofile_generate,
3233 options::OPT_fno_profile_instr_generate, false) ||
3234 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3235 options::OPT_fno_profile_instr_generate, false) ||
3236 Args.hasFlag(options::OPT_fprofile_instr_generate,
3237 options::OPT_fno_profile_instr_generate, false) ||
3238 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3239 options::OPT_fno_profile_instr_generate, false) ||
3240 Args.hasArg(options::OPT_fcreate_profile) ||
3241 Args.hasArg(options::OPT_coverage)))
3242 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3243}
3244
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003245/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3246/// smooshes them together with platform defaults, to decide whether
3247/// this compile should be using PIC mode or not. Returns a tuple of
3248/// (RelocationModel, PICLevel, IsPIE).
3249static std::tuple<llvm::Reloc::Model, unsigned, bool>
3250ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3251 const ArgList &Args) {
3252 // FIXME: why does this code...and so much everywhere else, use both
3253 // ToolChain.getTriple() and Triple?
3254 bool PIE = ToolChain.isPIEDefault();
3255 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003256 // The Darwin default to use PIC does not apply when using -static.
3257 if (ToolChain.getTriple().isOSDarwin() && Args.hasArg(options::OPT_static))
3258 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003259 bool IsPICLevelTwo = PIC;
3260
3261 bool KernelOrKext =
3262 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3263
3264 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003265 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003266 switch (ToolChain.getArch()) {
3267 case llvm::Triple::arm:
3268 case llvm::Triple::armeb:
3269 case llvm::Triple::thumb:
3270 case llvm::Triple::thumbeb:
3271 case llvm::Triple::aarch64:
3272 case llvm::Triple::mips:
3273 case llvm::Triple::mipsel:
3274 case llvm::Triple::mips64:
3275 case llvm::Triple::mips64el:
3276 PIC = true; // "-fpic"
3277 break;
3278
3279 case llvm::Triple::x86:
3280 case llvm::Triple::x86_64:
3281 PIC = true; // "-fPIC"
3282 IsPICLevelTwo = true;
3283 break;
3284
3285 default:
3286 break;
3287 }
3288 }
3289
3290 // OpenBSD-specific defaults for PIE
3291 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3292 switch (ToolChain.getArch()) {
3293 case llvm::Triple::mips64:
3294 case llvm::Triple::mips64el:
3295 case llvm::Triple::sparcel:
3296 case llvm::Triple::x86:
3297 case llvm::Triple::x86_64:
3298 IsPICLevelTwo = false; // "-fpie"
3299 break;
3300
3301 case llvm::Triple::ppc:
3302 case llvm::Triple::sparc:
3303 case llvm::Triple::sparcv9:
3304 IsPICLevelTwo = true; // "-fPIE"
3305 break;
3306
3307 default:
3308 break;
3309 }
3310 }
3311
3312 // The last argument relating to either PIC or PIE wins, and no
3313 // other argument is used. If the last argument is any flavor of the
3314 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3315 // option implicitly enables PIC at the same level.
3316 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3317 options::OPT_fpic, options::OPT_fno_pic,
3318 options::OPT_fPIE, options::OPT_fno_PIE,
3319 options::OPT_fpie, options::OPT_fno_pie);
3320 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3321 // is forced, then neither PIC nor PIE flags will have no effect.
3322 if (!ToolChain.isPICDefaultForced()) {
3323 if (LastPICArg) {
3324 Option O = LastPICArg->getOption();
3325 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3326 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3327 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3328 PIC =
3329 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3330 IsPICLevelTwo =
3331 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3332 } else {
3333 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003334 if (Triple.isPS4CPU()) {
3335 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3336 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3337 if (Model != "kernel") {
3338 PIC = true;
3339 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3340 << LastPICArg->getSpelling();
3341 }
3342 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003343 }
3344 }
3345 }
3346
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003347 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3348 // PIC level would've been set to level 1, force it back to level 2 PIC
3349 // instead.
3350 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003351 IsPICLevelTwo |= ToolChain.isPICDefault();
3352
James Y Knightc4015d32015-08-21 04:14:55 +00003353 // This kernel flags are a trump-card: they will disable PIC/PIE
3354 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003355 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3356 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003357 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003358
3359 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3360 // This is a very special mode. It trumps the other modes, almost no one
3361 // uses it, and it isn't even valid on any OS but Darwin.
3362 if (!ToolChain.getTriple().isOSDarwin())
3363 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3364 << A->getSpelling() << ToolChain.getTriple().str();
3365
3366 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3367
3368 // Only a forced PIC mode can cause the actual compile to have PIC defines
3369 // etc., no flags are sufficient. This behavior was selected to closely
3370 // match that of llvm-gcc and Apple GCC before that.
3371 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3372
3373 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3374 }
3375
3376 if (PIC)
3377 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3378
3379 return std::make_tuple(llvm::Reloc::Static, 0, false);
3380}
3381
3382static const char *RelocationModelName(llvm::Reloc::Model Model) {
3383 switch (Model) {
3384 case llvm::Reloc::Default:
3385 return nullptr;
3386 case llvm::Reloc::Static:
3387 return "static";
3388 case llvm::Reloc::PIC_:
3389 return "pic";
3390 case llvm::Reloc::DynamicNoPIC:
3391 return "dynamic-no-pic";
3392 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003393 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003394}
3395
3396static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3397 ArgStringList &CmdArgs) {
3398 llvm::Reloc::Model RelocationModel;
3399 unsigned PICLevel;
3400 bool IsPIE;
3401 std::tie(RelocationModel, PICLevel, IsPIE) =
3402 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3403
3404 if (RelocationModel != llvm::Reloc::Static)
3405 CmdArgs.push_back("-KPIC");
3406}
3407
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003408void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003409 const InputInfo &Output, const InputInfoList &Inputs,
3410 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003411 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3412 const llvm::Triple Triple(TripleStr);
3413
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003414 bool KernelOrKext =
3415 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003416 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003417 ArgStringList CmdArgs;
3418
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003419 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003420 bool IsWindowsCygnus =
3421 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003422 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003423 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003424
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003425 // Check number of inputs for sanity. We need at least one input.
3426 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003427 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003428 // CUDA compilation may have multiple inputs (source file + results of
3429 // device-side compilations). All other jobs are expected to have exactly one
3430 // input.
3431 bool IsCuda = types::isCuda(Input.getType());
3432 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003433
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003434 // Invoke ourselves in -cc1 mode.
3435 //
3436 // FIXME: Implement custom jobs for internal actions.
3437 CmdArgs.push_back("-cc1");
3438
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003439 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003440 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003441 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003442
Artem Belevichfa11ab52015-11-17 22:28:46 +00003443 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003444 if (IsCuda) {
3445 // FIXME: We need a (better) way to pass information about
3446 // particular compilation pass we're constructing here. For now we
3447 // can check which toolchain we're using and pick the other one to
3448 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003449 if (&getToolChain() == C.getCudaDeviceToolChain())
3450 AuxToolChain = C.getCudaHostToolChain();
3451 else if (&getToolChain() == C.getCudaHostToolChain())
3452 AuxToolChain = C.getCudaDeviceToolChain();
3453 else
3454 llvm_unreachable("Can't figure out CUDA compilation mode.");
3455 assert(AuxToolChain != nullptr && "No aux toolchain.");
3456 CmdArgs.push_back("-aux-triple");
3457 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003458 CmdArgs.push_back("-fcuda-target-overloads");
3459 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003460 }
3461
James Y Knight2db38f32015-08-15 03:45:25 +00003462 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3463 Triple.getArch() == llvm::Triple::thumb)) {
3464 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003465 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003466 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003467 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003468 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003469 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003470 }
3471
Tim Northover336f1892014-03-29 13:16:12 +00003472 // Push all default warning arguments that are specific to
3473 // the given target. These come before user provided warning options
3474 // are provided.
3475 getToolChain().addClangWarningOptions(CmdArgs);
3476
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003477 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003478 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003479
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003480 if (isa<AnalyzeJobAction>(JA)) {
3481 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3482 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003483 } else if (isa<MigrateJobAction>(JA)) {
3484 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003485 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003486 if (Output.getType() == types::TY_Dependencies)
3487 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003488 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003489 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003490 if (Args.hasArg(options::OPT_rewrite_objc) &&
3491 !Args.hasArg(options::OPT_g_Group))
3492 CmdArgs.push_back("-P");
3493 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003494 } else if (isa<AssembleJobAction>(JA)) {
3495 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003496
David Blaikie9260ed62013-07-25 21:19:01 +00003497 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003498
3499 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003500 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003501 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003502 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003503 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003504
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003505 if (JA.getType() == types::TY_Nothing)
3506 CmdArgs.push_back("-fsyntax-only");
3507 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003508 CmdArgs.push_back("-emit-pch");
3509 else
3510 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003511 } else if (isa<VerifyPCHJobAction>(JA)) {
3512 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003513 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003514 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3515 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003516 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003517 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003518 } else if (JA.getType() == types::TY_LLVM_IR ||
3519 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003520 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003521 } else if (JA.getType() == types::TY_LLVM_BC ||
3522 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003523 CmdArgs.push_back("-emit-llvm-bc");
3524 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003525 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003526 } else if (JA.getType() == types::TY_AST) {
3527 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003528 } else if (JA.getType() == types::TY_ModuleFile) {
3529 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003530 } else if (JA.getType() == types::TY_RewrittenObjC) {
3531 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003532 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003533 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3534 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003535 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003536 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003537 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003538 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003539
3540 // Preserve use-list order by default when emitting bitcode, so that
3541 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3542 // same result as running passes here. For LTO, we don't need to preserve
3543 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003544 if (JA.getType() == types::TY_LLVM_BC)
3545 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003546
3547 if (D.isUsingLTO())
3548 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003549 }
3550
Teresa Johnsonaff22322015-12-07 19:21:34 +00003551 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3552 if (!types::isLLVMIR(Input.getType()))
3553 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3554 << "-x ir";
3555 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3556 }
3557
Justin Bognera88f0122014-06-20 22:59:50 +00003558 // We normally speed up the clang process a bit by skipping destructors at
3559 // exit, but when we're generating diagnostics we can rely on some of the
3560 // cleanup.
3561 if (!C.isForDiagnostics())
3562 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003563
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003564// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003565#ifdef NDEBUG
3566 CmdArgs.push_back("-disable-llvm-verifier");
3567#endif
3568
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003569 // Set the main file name, so that debug info works even with
3570 // -save-temps.
3571 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003572 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003573
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003574 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003575 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003576 if (Args.hasArg(options::OPT_static))
3577 CmdArgs.push_back("-static-define");
3578
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003579 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003580 // Enable region store model by default.
3581 CmdArgs.push_back("-analyzer-store=region");
3582
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003583 // Treat blocks as analysis entry points.
3584 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3585
Ted Kremenek49c79792011-03-24 00:28:47 +00003586 CmdArgs.push_back("-analyzer-eagerly-assume");
3587
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003588 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003589 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003590 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003591
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003592 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003593 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003594
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003595 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003596 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003597
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003598 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003599
Artem Belevichba558952015-05-06 18:20:23 +00003600 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003601 CmdArgs.push_back("-analyzer-checker=cplusplus");
3602
Nico Webere8e53112014-05-11 01:04:02 +00003603 // Enable the following experimental checkers for testing.
3604 CmdArgs.push_back(
3605 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003606 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3607 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003608 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3610 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003611
3612 // Default nullability checks.
3613 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3614 CmdArgs.push_back(
3615 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003616 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003617
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003618 // Set the output format. The default is plist, for (lame) historical
3619 // reasons.
3620 CmdArgs.push_back("-analyzer-output");
3621 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003622 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003623 else
3624 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003625
Ted Kremenekfe449a22010-03-22 22:32:05 +00003626 // Disable the presentation of standard compiler warnings when
3627 // using --analyze. We only want to show static analyzer diagnostics
3628 // or frontend errors.
3629 CmdArgs.push_back("-w");
3630
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003631 // Add -Xanalyzer arguments when running as analyzer.
3632 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003633 }
3634
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003635 CheckCodeGenerationOptions(D, Args);
3636
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003637 llvm::Reloc::Model RelocationModel;
3638 unsigned PICLevel;
3639 bool IsPIE;
3640 std::tie(RelocationModel, PICLevel, IsPIE) =
3641 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003642
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003643 const char *RMName = RelocationModelName(RelocationModel);
3644 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003645 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003646 CmdArgs.push_back(RMName);
3647 }
3648 if (PICLevel > 0) {
3649 CmdArgs.push_back("-pic-level");
3650 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3651 if (IsPIE) {
3652 CmdArgs.push_back("-pie-level");
3653 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003654 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003655 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003656
Renato Golin4854d802015-11-09 12:40:41 +00003657 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3658 CmdArgs.push_back("-meabi");
3659 CmdArgs.push_back(A->getValue());
3660 }
3661
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003662 CmdArgs.push_back("-mthread-model");
3663 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3664 CmdArgs.push_back(A->getValue());
3665 else
3666 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3667
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003668 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3669
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003670 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3671 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003672 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003673
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003674 // LLVM Code Generator Options.
3675
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003676 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3677 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003678 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3679 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003680 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003681 CmdArgs.push_back(A->getValue());
3682 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003683 }
3684 }
3685
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003686 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3687 StringRef v = A->getValue();
3688 CmdArgs.push_back("-mllvm");
3689 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3690 A->claim();
3691 }
3692
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003693 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3694 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003695 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003696 }
3697
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003698 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3699 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003700 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003701 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003702 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003703 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3704 CmdArgs.push_back("-fpcc-struct-return");
3705 } else {
3706 assert(A->getOption().matches(options::OPT_freg_struct_return));
3707 CmdArgs.push_back("-freg-struct-return");
3708 }
3709 }
3710
Roman Divacky65b88cd2011-03-01 17:40:53 +00003711 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3712 CmdArgs.push_back("-mrtd");
3713
Rafael Espindola224dd632011-12-14 21:02:23 +00003714 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003715 CmdArgs.push_back("-mdisable-fp-elim");
3716 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3717 options::OPT_fno_zero_initialized_in_bss))
3718 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003719
3720 bool OFastEnabled = isOptimizationLevelFast(Args);
3721 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3722 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003723 OptSpecifier StrictAliasingAliasOption =
3724 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003725 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3726 // doesn't do any TBAA.
3727 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003728 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003729 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003730 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003731 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3732 options::OPT_fno_struct_path_tbaa))
3733 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003734 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3735 false))
3736 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003737 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3738 options::OPT_fno_strict_vtable_pointers,
3739 false))
3740 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003741 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3742 options::OPT_fno_optimize_sibling_calls))
3743 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003744
Eric Christopher006208c2013-04-04 06:29:47 +00003745 // Handle segmented stacks.
3746 if (Args.hasArg(options::OPT_fsplit_stack))
3747 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003748
3749 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3750 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003751 OptSpecifier FastMathAliasOption =
3752 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3753
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003754 // Handle various floating point optimization flags, mapping them to the
3755 // appropriate LLVM code generation flags. The pattern for all of these is to
3756 // default off the codegen optimizations, and if any flag enables them and no
3757 // flag disables them after the flag enabling them, enable the codegen
3758 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003759 if (Arg *A = Args.getLastArg(
3760 options::OPT_ffast_math, FastMathAliasOption,
3761 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3762 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3763 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003764 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3765 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003766 A->getOption().getID() != options::OPT_fhonor_infinities)
3767 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003768 if (Arg *A = Args.getLastArg(
3769 options::OPT_ffast_math, FastMathAliasOption,
3770 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3771 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3772 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003773 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3774 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003775 A->getOption().getID() != options::OPT_fhonor_nans)
3776 CmdArgs.push_back("-menable-no-nans");
3777
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003778 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3779 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003780 if (Arg *A =
3781 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3782 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3783 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003784 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3785 // However, turning *off* -ffast_math merely restores the toolchain default
3786 // (which may be false).
3787 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3788 A->getOption().getID() == options::OPT_ffast_math ||
3789 A->getOption().getID() == options::OPT_Ofast)
3790 MathErrno = false;
3791 else if (A->getOption().getID() == options::OPT_fmath_errno)
3792 MathErrno = true;
3793 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003794 if (MathErrno)
3795 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003796
3797 // There are several flags which require disabling very specific
3798 // optimizations. Any of these being disabled forces us to turn off the
3799 // entire set of LLVM optimizations, so collect them through all the flag
3800 // madness.
3801 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003802 if (Arg *A = Args.getLastArg(
3803 options::OPT_ffast_math, FastMathAliasOption,
3804 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3805 options::OPT_fno_unsafe_math_optimizations,
3806 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003807 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3808 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003809 A->getOption().getID() != options::OPT_fno_associative_math)
3810 AssociativeMath = true;
3811 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003812 if (Arg *A = Args.getLastArg(
3813 options::OPT_ffast_math, FastMathAliasOption,
3814 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3815 options::OPT_fno_unsafe_math_optimizations,
3816 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003817 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3818 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003819 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3820 ReciprocalMath = true;
3821 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003822 if (Arg *A = Args.getLastArg(
3823 options::OPT_ffast_math, FastMathAliasOption,
3824 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3825 options::OPT_fno_unsafe_math_optimizations,
3826 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003827 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3828 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003829 A->getOption().getID() != options::OPT_fsigned_zeros)
3830 SignedZeros = false;
3831 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003832 if (Arg *A = Args.getLastArg(
3833 options::OPT_ffast_math, FastMathAliasOption,
3834 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3835 options::OPT_fno_unsafe_math_optimizations,
3836 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003837 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3838 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003839 A->getOption().getID() != options::OPT_ftrapping_math)
3840 TrappingMath = false;
3841 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3842 !TrappingMath)
3843 CmdArgs.push_back("-menable-unsafe-fp-math");
3844
Sanjay Patel76c9e092015-01-23 16:40:50 +00003845 if (!SignedZeros)
3846 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003847
Sanjay Patel359b1052015-04-09 15:03:23 +00003848 if (ReciprocalMath)
3849 CmdArgs.push_back("-freciprocal-math");
3850
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003851 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003852 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003853 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003854 options::OPT_ffp_contract)) {
3855 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003856 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003857 if (Val == "fast" || Val == "on" || Val == "off") {
3858 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3859 } else {
3860 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003861 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003862 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003863 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3864 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003865 // If fast-math is set then set the fp-contract mode to fast.
3866 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3867 }
3868 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003869
Sanjay Patel2987c292015-06-11 14:53:41 +00003870 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003871
Bob Wilson6a039162012-07-19 03:52:53 +00003872 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3873 // and if we find them, tell the frontend to provide the appropriate
3874 // preprocessor macros. This is distinct from enabling any optimizations as
3875 // these options induce language changes which must survive serialization
3876 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003877 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3878 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003879 if (!A->getOption().matches(options::OPT_fno_fast_math))
3880 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003881 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3882 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003883 if (A->getOption().matches(options::OPT_ffinite_math_only))
3884 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003885
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003886 // Decide whether to use verbose asm. Verbose assembly is the default on
3887 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003888 bool IsIntegratedAssemblerDefault =
3889 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003890 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003891 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003892 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003893 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003894
Rafael Espindolab8a12932015-05-22 20:44:03 +00003895 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3896 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003897 CmdArgs.push_back("-no-integrated-as");
3898
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003899 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3900 CmdArgs.push_back("-mdebug-pass");
3901 CmdArgs.push_back("Structure");
3902 }
3903 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3904 CmdArgs.push_back("-mdebug-pass");
3905 CmdArgs.push_back("Arguments");
3906 }
3907
John McCall8517abc2010-02-19 02:45:38 +00003908 // Enable -mconstructor-aliases except on darwin, where we have to
3909 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003910 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003911 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003912
John McCall7ef5cb32011-03-18 02:56:14 +00003913 // Darwin's kernel doesn't support guard variables; just die if we
3914 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003915 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003916 CmdArgs.push_back("-fforbid-guard-variables");
3917
Akira Hatanaka02028482015-11-12 17:21:22 +00003918 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3919 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003920 CmdArgs.push_back("-mms-bitfields");
3921 }
John McCall8517abc2010-02-19 02:45:38 +00003922
Daniel Dunbar306945d2009-09-16 06:17:29 +00003923 // This is a coarse approximation of what llvm-gcc actually does, both
3924 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3925 // complicated ways.
3926 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003927 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3928 options::OPT_fno_asynchronous_unwind_tables,
3929 (getToolChain().IsUnwindTablesDefault() ||
3930 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3931 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003932 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3933 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003934 CmdArgs.push_back("-munwind-tables");
3935
Chandler Carruth05fb5852012-11-21 23:40:23 +00003936 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003937
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003938 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3939 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003940 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003941 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003942
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003943 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003944 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003945
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003946 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003947 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003948 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003949 }
3950
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003951 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003952 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003953 if (!CPU.empty()) {
3954 CmdArgs.push_back("-target-cpu");
3955 CmdArgs.push_back(Args.MakeArgString(CPU));
3956 }
3957
Rafael Espindolaeb265472013-08-21 21:59:03 +00003958 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3959 CmdArgs.push_back("-mfpmath");
3960 CmdArgs.push_back(A->getValue());
3961 }
3962
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003963 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003964 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003965
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003966 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003967 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003968 default:
3969 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003970
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003971 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003972 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003973 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003974 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003975 // Use the effective triple, which takes into account the deployment target.
3976 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003977 break;
3978
Tim Northover573cbee2014-05-24 12:52:07 +00003979 case llvm::Triple::aarch64:
3980 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003981 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003982 break;
3983
Eric Christopher0b26a612010-03-02 02:41:08 +00003984 case llvm::Triple::mips:
3985 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003986 case llvm::Triple::mips64:
3987 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003988 AddMIPSTargetArgs(Args, CmdArgs);
3989 break;
3990
Ulrich Weigand8afad612014-07-28 13:17:52 +00003991 case llvm::Triple::ppc:
3992 case llvm::Triple::ppc64:
3993 case llvm::Triple::ppc64le:
3994 AddPPCTargetArgs(Args, CmdArgs);
3995 break;
3996
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003997 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003998 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003999 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004000 AddSparcTargetArgs(Args, CmdArgs);
4001 break;
4002
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004003 case llvm::Triple::x86:
4004 case llvm::Triple::x86_64:
4005 AddX86TargetArgs(Args, CmdArgs);
4006 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004007
4008 case llvm::Triple::hexagon:
4009 AddHexagonTargetArgs(Args, CmdArgs);
4010 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004011 }
4012
Douglas Katzman3459ce22015-10-08 04:24:12 +00004013 // The 'g' groups options involve a somewhat intricate sequence of decisions
4014 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004015 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004016 // * what level of debug info to generate
4017 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004018 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004019 // This avoids having to monkey around further in cc1 other than to disable
4020 // codeview if not running in a Windows environment. Perhaps even that
4021 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004022 unsigned DwarfVersion = 0;
4023 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4024 // These two are potentially updated by AddClangCLArgs.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004025 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4026 CodeGenOptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004027 bool EmitCodeView = false;
4028
Hans Wennborg75958c42013-08-08 00:17:41 +00004029 // Add clang-cl arguments.
4030 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004031 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004032
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004033 // Pass the linker version in use.
4034 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4035 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004036 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004037 }
4038
Eric Christopherb7d97e92013-04-03 01:58:53 +00004039 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004040 CmdArgs.push_back("-momit-leaf-frame-pointer");
4041
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004042 // Explicitly error on some things we know we don't support and can't just
4043 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004044 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004045 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4046 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004047 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004048 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004049 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4050 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004051 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004052 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004053 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004054 }
4055
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004056 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004057 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004058 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004059 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004060 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4061 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004062 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004063 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004064 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004065
Chad Rosierbe10f982011-08-02 17:58:04 +00004066 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004067 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004068 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4069 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004070 }
4071
Rafael Espindola08a692a2010-03-07 04:46:18 +00004072 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004073 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004074 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004075 // If the last option explicitly specified a debug-info level, use it.
4076 if (A->getOption().matches(options::OPT_gN_Group)) {
4077 DebugInfoKind = DebugLevelToInfoKind(*A);
4078 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4079 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4080 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4081 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4082 A->getIndex() > SplitDwarfArg->getIndex())
4083 SplitDwarfArg = nullptr;
4084 } else
4085 // For any other 'g' option, use Limited.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004086 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004087 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004088
Paul Robinson0334a042015-12-19 19:41:48 +00004089 // If a debugger tuning argument appeared, remember it.
4090 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4091 options::OPT_ggdbN_Group)) {
4092 if (A->getOption().matches(options::OPT_glldb))
4093 DebuggerTuning = llvm::DebuggerKind::LLDB;
4094 else if (A->getOption().matches(options::OPT_gsce))
4095 DebuggerTuning = llvm::DebuggerKind::SCE;
4096 else
4097 DebuggerTuning = llvm::DebuggerKind::GDB;
4098 }
4099
4100 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004101 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004102 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004103 DwarfVersion = DwarfVersionNum(A->getSpelling());
4104
Reid Kleckner124955a2015-08-05 18:51:13 +00004105 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004106 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4107 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4108 // DwarfVersion remains at 0 if no explicit choice was made.
4109 CmdArgs.push_back("-gcodeview");
4110 } else if (DwarfVersion == 0 &&
4111 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4112 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4113 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004114
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004115 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4116 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004117
4118 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004119 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004120 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004121 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004122
Eric Christopher138c32b2013-09-13 22:37:55 +00004123 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004124 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004125 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004126 CmdArgs.push_back("-dwarf-ext-refs");
4127 CmdArgs.push_back("-fmodule-format=obj");
4128 }
4129
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004130 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4131 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004132 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004133 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004134 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004135 CmdArgs.push_back("-backend-option");
4136 CmdArgs.push_back("-split-dwarf=Enable");
4137 }
4138
Douglas Katzman3459ce22015-10-08 04:24:12 +00004139 // After we've dealt with all combinations of things that could
4140 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4141 // figure out if we need to "upgrade" it to standalone debug info.
4142 // We parse these two '-f' options whether or not they will be used,
4143 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4144 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4145 options::OPT_fno_standalone_debug,
4146 getToolChain().GetDefaultStandaloneDebug());
4147 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4148 DebugInfoKind = CodeGenOptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004149 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4150 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004151
Eric Christopher138c32b2013-09-13 22:37:55 +00004152 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4153 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4154 CmdArgs.push_back("-backend-option");
4155 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4156 }
Eric Christophereec89c22013-06-18 00:03:50 +00004157
Eric Christopher0d403d22014-02-14 01:27:03 +00004158 // -gdwarf-aranges turns on the emission of the aranges section in the
4159 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004160 // Always enabled on the PS4.
4161 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004162 CmdArgs.push_back("-backend-option");
4163 CmdArgs.push_back("-generate-arange-section");
4164 }
4165
David Blaikief36d9ba2014-01-27 18:52:43 +00004166 if (Args.hasFlag(options::OPT_fdebug_types_section,
4167 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004168 CmdArgs.push_back("-backend-option");
4169 CmdArgs.push_back("-generate-type-units");
4170 }
Eric Christophereec89c22013-06-18 00:03:50 +00004171
Ed Schouten6e576152015-03-26 17:50:28 +00004172 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4173 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4174
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004175 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004176 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004177 CmdArgs.push_back("-ffunction-sections");
4178 }
4179
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004180 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4181 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004182 CmdArgs.push_back("-fdata-sections");
4183 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004184
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004185 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004186 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004187 CmdArgs.push_back("-fno-unique-section-names");
4188
Chris Lattner3c77a352010-06-22 00:03:40 +00004189 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4190
Diego Novilloa0545962015-07-10 18:00:07 +00004191 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004192
Paul Robinsond083b9a2015-12-16 17:25:27 +00004193 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4194 if (getToolChain().getTriple().isPS4CPU())
4195 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4196
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004197 // Pass options for controlling the default header search paths.
4198 if (Args.hasArg(options::OPT_nostdinc)) {
4199 CmdArgs.push_back("-nostdsysteminc");
4200 CmdArgs.push_back("-nobuiltininc");
4201 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004202 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004203 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004204 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4205 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4206 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004207
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004208 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004209 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004210 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004211
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004212 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4213
Ted Kremenekf7639e12012-03-06 20:06:33 +00004214 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004215 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004216 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004217 options::OPT_ccc_arcmt_modify,
4218 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004219 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004220 switch (A->getOption().getID()) {
4221 default:
4222 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004223 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004224 CmdArgs.push_back("-arcmt-check");
4225 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004226 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004227 CmdArgs.push_back("-arcmt-modify");
4228 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004229 case options::OPT_ccc_arcmt_migrate:
4230 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004231 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004232 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004233
4234 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4235 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004236 break;
John McCalld70fb982011-06-15 23:25:17 +00004237 }
4238 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004239 } else {
4240 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4241 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4242 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004243 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004244
Ted Kremenekf7639e12012-03-06 20:06:33 +00004245 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4246 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004247 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4248 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004249 }
4250 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004251 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004252
4253 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004254 options::OPT_objcmt_migrate_subscripting,
4255 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004256 // None specified, means enable them all.
4257 CmdArgs.push_back("-objcmt-migrate-literals");
4258 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004259 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004260 } else {
4261 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4262 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004263 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004264 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004265 } else {
4266 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4267 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4268 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4269 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4270 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4271 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004272 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004273 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4274 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4275 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4276 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4277 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4278 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4279 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004280 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004281 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004282 }
4283
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004284 // Add preprocessing options like -I, -D, etc. if we are using the
4285 // preprocessor.
4286 //
4287 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004288 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004289 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4290 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004291
Rafael Espindolaa7431922011-07-21 23:40:37 +00004292 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4293 // that "The compiler can only warn and ignore the option if not recognized".
4294 // When building with ccache, it will pass -D options to clang even on
4295 // preprocessed inputs and configure concludes that -fPIC is not supported.
4296 Args.ClaimAllArgs(options::OPT_D);
4297
Alp Toker7874bdc2013-11-15 20:40:58 +00004298 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004299 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4300 if (A->getOption().matches(options::OPT_O4)) {
4301 CmdArgs.push_back("-O3");
4302 D.Diag(diag::warn_O4_is_O3);
4303 } else {
4304 A->render(Args, CmdArgs);
4305 }
4306 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004307
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004308 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004309 for (const Arg *A :
4310 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4311 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004312 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004313 }
4314
Rafael Espindola577637a2015-01-03 00:06:04 +00004315 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004316
Richard Smith3be1cb22014-08-07 00:24:21 +00004317 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004318 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004319 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4320 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004321 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004322 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004323
4324 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004325 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004326 //
4327 // If a std is supplied, only add -trigraphs if it follows the
4328 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004329 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004330 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4331 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004332 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004333 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004334 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004335 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004336 else
4337 Std->render(Args, CmdArgs);
4338
Nico Weber00721502014-12-23 22:32:37 +00004339 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004340 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004341 options::OPT_ftrigraphs,
4342 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004343 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004344 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004345 } else {
4346 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004347 //
4348 // FIXME: Clang doesn't correctly handle -std= when the input language
4349 // doesn't match. For the time being just ignore this for C++ inputs;
4350 // eventually we want to do all the standard defaulting here instead of
4351 // splitting it between the driver and clang -cc1.
4352 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004353 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4354 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004355 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004356 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004357
Nico Weber00721502014-12-23 22:32:37 +00004358 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4359 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004360 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004361
Richard Smith282b4492013-09-04 22:50:31 +00004362 // GCC's behavior for -Wwrite-strings is a bit strange:
4363 // * In C, this "warning flag" changes the types of string literals from
4364 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4365 // for the discarded qualifier.
4366 // * In C++, this is just a normal warning flag.
4367 //
4368 // Implementing this warning correctly in C is hard, so we follow GCC's
4369 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4370 // a non-const char* in C, rather than using this crude hack.
4371 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004372 // FIXME: This should behave just like a warning flag, and thus should also
4373 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4374 Arg *WriteStrings =
4375 Args.getLastArg(options::OPT_Wwrite_strings,
4376 options::OPT_Wno_write_strings, options::OPT_w);
4377 if (WriteStrings &&
4378 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004379 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004380 }
4381
Chandler Carruth61fbf622011-04-23 09:27:53 +00004382 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004383 // during C++ compilation, which it is by default. GCC keeps this define even
4384 // in the presence of '-w', match this behavior bug-for-bug.
4385 if (types::isCXX(InputType) &&
4386 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4387 true)) {
4388 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004389 }
4390
Chandler Carruthe0391482010-05-22 02:21:53 +00004391 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4392 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4393 if (Asm->getOption().matches(options::OPT_fasm))
4394 CmdArgs.push_back("-fgnu-keywords");
4395 else
4396 CmdArgs.push_back("-fno-gnu-keywords");
4397 }
4398
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004399 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4400 CmdArgs.push_back("-fno-dwarf-directory-asm");
4401
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004402 if (ShouldDisableAutolink(Args, getToolChain()))
4403 CmdArgs.push_back("-fno-autolink");
4404
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004405 // Add in -fdebug-compilation-dir if necessary.
4406 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004407
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004408 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4409 StringRef Map = A->getValue();
4410 if (Map.find('=') == StringRef::npos)
4411 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4412 else
4413 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4414 A->claim();
4415 }
4416
Richard Smith9a568822011-11-21 19:36:32 +00004417 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4418 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004419 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004420 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004421 }
4422
Richard Smith79c927b2013-11-06 19:31:51 +00004423 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4424 CmdArgs.push_back("-foperator-arrow-depth");
4425 CmdArgs.push_back(A->getValue());
4426 }
4427
Richard Smith9a568822011-11-21 19:36:32 +00004428 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4429 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004430 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004431 }
4432
Richard Smitha3d3bd22013-05-08 02:12:03 +00004433 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4434 CmdArgs.push_back("-fconstexpr-steps");
4435 CmdArgs.push_back(A->getValue());
4436 }
4437
Richard Smithb3a14522013-02-22 01:59:51 +00004438 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4439 CmdArgs.push_back("-fbracket-depth");
4440 CmdArgs.push_back(A->getValue());
4441 }
4442
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004443 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4444 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004445 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004446 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004447 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4448 } else
4449 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004450 }
4451
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004452 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004453 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004454
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004455 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4456 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004457 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004458 }
David Chisnall5778fce2009-08-31 16:41:57 +00004459
Chris Lattnere23003d2010-01-09 21:54:33 +00004460 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4461 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004462 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004463 }
4464
Chris Lattnerb35583d2010-04-07 20:49:23 +00004465 CmdArgs.push_back("-ferror-limit");
4466 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004467 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004468 else
4469 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004470
Chandler Carrutha77a7272010-05-06 04:55:18 +00004471 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4472 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004473 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004474 }
4475
4476 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4477 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004478 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004479 }
4480
Richard Smithf6f003a2011-12-16 19:06:07 +00004481 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4482 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004483 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004484 }
4485
Nick Lewycky24653262014-12-16 21:39:02 +00004486 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4487 CmdArgs.push_back("-fspell-checking-limit");
4488 CmdArgs.push_back(A->getValue());
4489 }
4490
Daniel Dunbar2c978472009-11-04 06:24:47 +00004491 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004492 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004493 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004494 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004495 } else {
4496 // If -fmessage-length=N was not specified, determine whether this is a
4497 // terminal and, if so, implicitly define -fmessage-length appropriately.
4498 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004499 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004500 }
4501
John McCallb4a99d32013-02-19 01:57:35 +00004502 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4503 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4504 options::OPT_fvisibility_ms_compat)) {
4505 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4506 CmdArgs.push_back("-fvisibility");
4507 CmdArgs.push_back(A->getValue());
4508 } else {
4509 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4510 CmdArgs.push_back("-fvisibility");
4511 CmdArgs.push_back("hidden");
4512 CmdArgs.push_back("-ftype-visibility");
4513 CmdArgs.push_back("default");
4514 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004515 }
4516
Douglas Gregor08329632010-06-15 17:05:35 +00004517 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004518
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004519 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4520
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004521 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004522 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4523 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004524 CmdArgs.push_back("-ffreestanding");
4525
Daniel Dunbare357d562009-12-03 18:42:11 +00004526 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004527 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004528 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004529 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004530 // Emulated TLS is enabled by default on Android, and can be enabled manually
4531 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004532 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004533 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4534 EmulatedTLSDefault))
4535 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004536 // AltiVec-like language extensions aren't relevant for assembling.
4537 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004538 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004539 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4540 }
Richard Trieu91844232012-06-26 18:18:47 +00004541 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4542 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004543
Alexey Bataevdb390212015-05-20 04:24:19 +00004544 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004545 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4546 options::OPT_fno_openmp, false))
4547 switch (getOpenMPRuntime(getToolChain(), Args)) {
4548 case OMPRT_OMP:
4549 case OMPRT_IOMP5:
4550 // Clang can generate useful OpenMP code for these two runtime libraries.
4551 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004552
4553 // If no option regarding the use of TLS in OpenMP codegeneration is
4554 // given, decide a default based on the target. Otherwise rely on the
4555 // options and pass the right information to the frontend.
4556 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004557 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004558 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004559 break;
4560 default:
4561 // By default, if Clang doesn't know how to generate useful OpenMP code
4562 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4563 // down to the actual compilation.
4564 // FIXME: It would be better to have a mode which *only* omits IR
4565 // generation based on the OpenMP support so that we get consistent
4566 // semantic analysis, etc.
4567 break;
4568 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004569
Peter Collingbourne32701642013-11-01 18:16:25 +00004570 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004571 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004572
Eric Christopher459d2712013-02-19 06:16:53 +00004573 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004574 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4575 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4576 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4577 Arch == llvm::Triple::ppc64le))
4578 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4579 << "ppc/ppc64/ppc64le";
4580 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004581
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004582 // -fzvector is incompatible with -faltivec.
4583 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4584 if (Args.hasArg(options::OPT_faltivec))
4585 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4586 << "-faltivec";
4587
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004588 if (getToolChain().SupportsProfiling())
4589 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004590
4591 // -flax-vector-conversions is default.
4592 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4593 options::OPT_fno_lax_vector_conversions))
4594 CmdArgs.push_back("-fno-lax-vector-conversions");
4595
John Brawna7b4ec02015-08-10 11:11:28 +00004596 if (Args.getLastArg(options::OPT_fapple_kext) ||
4597 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004598 CmdArgs.push_back("-fapple-kext");
4599
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004600 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004601 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004602 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004603 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4604 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004605
4606 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4607 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004608 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004609 }
4610
Bob Wilson14adb362012-02-03 06:27:22 +00004611 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004612
Chandler Carruth6e501032011-03-27 00:04:55 +00004613 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4614 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004615 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004616 if (A->getOption().matches(options::OPT_fwrapv))
4617 CmdArgs.push_back("-fwrapv");
4618 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4619 options::OPT_fno_strict_overflow)) {
4620 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4621 CmdArgs.push_back("-fwrapv");
4622 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004623
4624 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4625 options::OPT_fno_reroll_loops))
4626 if (A->getOption().matches(options::OPT_freroll_loops))
4627 CmdArgs.push_back("-freroll-loops");
4628
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004629 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004630 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4631 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004632
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004633 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4634
Daniel Dunbar4930e332009-11-17 08:07:36 +00004635 // -stack-protector=0 is default.
4636 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004637 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4638 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4639 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4640 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4641 Args.ClaimAllArgs(options::OPT_fstack_protector);
4642 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004643 options::OPT_fstack_protector_all,
4644 options::OPT_fstack_protector_strong,
4645 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004646 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004647 StackProtectorLevel = std::max<unsigned>(
4648 LangOptions::SSPOn,
4649 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004650 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004651 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004652 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004653 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004654 } else {
4655 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004656 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004657 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004658 if (StackProtectorLevel) {
4659 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004660 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004661 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004662
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004663 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004664 for (const Arg *A : Args.filtered(options::OPT__param)) {
4665 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004666 if (Str.startswith("ssp-buffer-size=")) {
4667 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004668 CmdArgs.push_back("-stack-protector-buffer-size");
4669 // FIXME: Verify the argument is a valid integer.
4670 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004671 }
Sean Silva14facf32015-06-09 01:57:17 +00004672 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004673 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004674 }
4675
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004676 // Translate -mstackrealign
4677 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004678 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004679 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004680
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004681 if (Args.hasArg(options::OPT_mstack_alignment)) {
4682 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4683 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004684 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004685
Hans Wennborg77dc2362015-01-20 19:45:50 +00004686 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4687 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4688
4689 if (!Size.empty())
4690 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4691 else
4692 CmdArgs.push_back("-mstack-probe-size=0");
4693 }
4694
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004695 switch (getToolChain().getArch()) {
4696 case llvm::Triple::aarch64:
4697 case llvm::Triple::aarch64_be:
4698 case llvm::Triple::arm:
4699 case llvm::Triple::armeb:
4700 case llvm::Triple::thumb:
4701 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004702 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004703 break;
4704
4705 default:
4706 break;
4707 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004708
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004709 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4710 options::OPT_mno_restrict_it)) {
4711 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4712 CmdArgs.push_back("-backend-option");
4713 CmdArgs.push_back("-arm-restrict-it");
4714 } else {
4715 CmdArgs.push_back("-backend-option");
4716 CmdArgs.push_back("-arm-no-restrict-it");
4717 }
James Y Knight2db38f32015-08-15 03:45:25 +00004718 } else if (Triple.isOSWindows() &&
4719 (Triple.getArch() == llvm::Triple::arm ||
4720 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004721 // Windows on ARM expects restricted IT blocks
4722 CmdArgs.push_back("-backend-option");
4723 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004724 }
4725
Daniel Dunbard18049a2009-04-07 21:16:11 +00004726 // Forward -f options with positive and negative forms; we translate
4727 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004728 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4729 StringRef fname = A->getValue();
4730 if (!llvm::sys::fs::exists(fname))
4731 D.Diag(diag::err_drv_no_such_file) << fname;
4732 else
4733 A->render(Args, CmdArgs);
4734 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004735
John Brawna7b4ec02015-08-10 11:11:28 +00004736 // -fbuiltin is default unless -mkernel is used
4737 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4738 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004739 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004740
Nuno Lopes13c88c72009-12-16 16:59:22 +00004741 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4742 options::OPT_fno_assume_sane_operator_new))
4743 CmdArgs.push_back("-fno-assume-sane-operator-new");
4744
Daniel Dunbar4930e332009-11-17 08:07:36 +00004745 // -fblocks=0 is default.
4746 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004747 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004748 (Args.hasArg(options::OPT_fgnu_runtime) &&
4749 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4750 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004751 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004752
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004753 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004754 !getToolChain().hasBlocksRuntime())
4755 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004756 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004757
Richard Smith47972af2015-06-16 00:08:24 +00004758 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004759 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004760 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004761 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004762 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004763 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4764 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004765 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004766 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004767 HaveModules = true;
4768 }
4769 }
4770
Richard Smith47972af2015-06-16 00:08:24 +00004771 // -fmodule-maps enables implicit reading of module map files. By default,
4772 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004773 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4774 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004775 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004776 }
4777
Daniel Jasperac42b752013-10-21 06:34:34 +00004778 // -fmodules-decluse checks that modules used are declared so (off by
4779 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004780 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004781 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004782 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004783 }
4784
Daniel Jasper962b38e2014-04-11 11:47:45 +00004785 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4786 // all #included headers are part of modules.
4787 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004788 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004789 CmdArgs.push_back("-fmodules-strict-decluse");
4790 }
4791
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004792 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4793 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4794 options::OPT_fno_implicit_modules)) {
4795 CmdArgs.push_back("-fno-implicit-modules");
4796 }
4797
Daniel Jasperac42b752013-10-21 06:34:34 +00004798 // -fmodule-name specifies the module that is currently being built (or
4799 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004800 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004801
Richard Smith9887d792014-10-17 01:42:53 +00004802 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004803 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004804 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004805
Richard Smithe842a472014-10-22 02:05:46 +00004806 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004807 if (HaveModules)
4808 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4809 else
4810 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004811
4812 // -fmodule-cache-path specifies where our implicitly-built module files
4813 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004814 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004815 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004816 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004817 if (HaveModules) {
4818 if (C.isForDiagnostics()) {
4819 // When generating crash reports, we want to emit the modules along with
4820 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004821 Path = Output.getFilename();
4822 llvm::sys::path::replace_extension(Path, ".cache");
4823 llvm::sys::path::append(Path, "modules");
4824 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004825 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004826 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004827 llvm::sys::path::append(Path, "org.llvm.clang.");
4828 appendUserToPath(Path);
4829 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004830 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004831 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004832 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4833 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004834 }
4835
4836 // When building modules and generating crashdumps, we need to dump a module
4837 // dependency VFS alongside the output.
4838 if (HaveModules && C.isForDiagnostics()) {
4839 SmallString<128> VFSDir(Output.getFilename());
4840 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004841 // Add the cache directory as a temp so the crash diagnostics pick it up.
4842 C.addTempFile(Args.MakeArgString(VFSDir));
4843
Justin Bognera88f0122014-06-20 22:59:50 +00004844 llvm::sys::path::append(VFSDir, "vfs");
4845 CmdArgs.push_back("-module-dependency-dir");
4846 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004847 }
4848
Richard Smith9887d792014-10-17 01:42:53 +00004849 if (HaveModules)
4850 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004851
Douglas Gregor35b04d62013-02-07 19:01:24 +00004852 // Pass through all -fmodules-ignore-macro arguments.
4853 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004854 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4855 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004856
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004857 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4858
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004859 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4860 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4861 D.Diag(diag::err_drv_argument_not_allowed_with)
4862 << A->getAsString(Args) << "-fbuild-session-timestamp";
4863
4864 llvm::sys::fs::file_status Status;
4865 if (llvm::sys::fs::status(A->getValue(), Status))
4866 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004867 CmdArgs.push_back(Args.MakeArgString(
4868 "-fbuild-session-timestamp=" +
4869 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004870 }
4871
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004872 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004873 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4874 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004875 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4876
4877 Args.AddLastArg(CmdArgs,
4878 options::OPT_fmodules_validate_once_per_build_session);
4879 }
4880
Ben Langmuirdcf73862014-03-12 00:06:17 +00004881 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4882
John McCalldfea9982010-04-09 19:12:06 +00004883 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004884 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004885 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004886 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004887
Anders Carlssond470fef2010-11-21 00:09:52 +00004888 // -felide-constructors is the default.
4889 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004890 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004891 CmdArgs.push_back("-fno-elide-constructors");
4892
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004893 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004894
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004895 if (KernelOrKext || (types::isCXX(InputType) &&
4896 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4897 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004898 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004899
Tony Linthicum76329bf2011-12-12 21:14:55 +00004900 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004901 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4902 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004903 CmdArgs.push_back("-fshort-enums");
4904
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004905 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004906 if (Arg *A = Args.getLastArg(
4907 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4908 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4909 if (A->getOption().matches(options::OPT_funsigned_char) ||
4910 A->getOption().matches(options::OPT_fno_signed_char)) {
4911 CmdArgs.push_back("-fno-signed-char");
4912 }
4913 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004914 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004915 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004916
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004917 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004918 if (!Args.hasFlag(
4919 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4920 !IsWindowsCygnus && !IsWindowsGNU &&
4921 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4922 getToolChain().getArch() != llvm::Triple::hexagon &&
4923 getToolChain().getArch() != llvm::Triple::xcore &&
4924 ((getToolChain().getTriple().getVendor() !=
4925 llvm::Triple::MipsTechnologies) ||
4926 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004927 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004928 CmdArgs.push_back("-fno-use-cxa-atexit");
4929
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004930 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004931 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004932 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004933 CmdArgs.push_back("-fms-extensions");
4934
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004935 // -fno-use-line-directives is default.
4936 if (Args.hasFlag(options::OPT_fuse_line_directives,
4937 options::OPT_fno_use_line_directives, false))
4938 CmdArgs.push_back("-fuse-line-directives");
4939
Francois Pichet1b4f1632011-09-17 04:32:15 +00004940 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004941 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004942 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004943 (IsWindowsMSVC &&
4944 Args.hasFlag(options::OPT_fms_extensions,
4945 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004946 CmdArgs.push_back("-fms-compatibility");
4947
David Majnemerc371ff02015-03-22 08:39:22 +00004948 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004949 VersionTuple MSVT = visualstudio::getMSVCVersion(
4950 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4951 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004952 CmdArgs.push_back(
4953 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004954
David Majnemer8db91762015-05-18 04:49:30 +00004955 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4956 if (ImplyVCPPCXXVer) {
4957 if (IsMSVC2015Compatible)
4958 CmdArgs.push_back("-std=c++14");
4959 else
4960 CmdArgs.push_back("-std=c++11");
4961 }
4962
Eric Christopher5ecce122013-02-18 00:38:31 +00004963 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004964 if (Args.hasFlag(options::OPT_fborland_extensions,
4965 options::OPT_fno_borland_extensions, false))
4966 CmdArgs.push_back("-fborland-extensions");
4967
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004968 // -fno-declspec is default, except for PS4.
4969 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4970 getToolChain().getTriple().isPS4()))
4971 CmdArgs.push_back("-fdeclspec");
4972 else if (Args.hasArg(options::OPT_fno_declspec))
4973 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4974
David Majnemerc371ff02015-03-22 08:39:22 +00004975 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4976 // than 19.
4977 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4978 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004979 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004980 CmdArgs.push_back("-fno-threadsafe-statics");
4981
Francois Pichet02744872011-09-01 16:38:08 +00004982 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4983 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004984 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004985 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004986 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004987
Chandler Carruthe03aa552010-04-17 20:17:31 +00004988 // -fgnu-keywords default varies depending on language; only pass if
4989 // specified.
4990 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004991 options::OPT_fno_gnu_keywords))
4992 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004993
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004994 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004995 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004996 CmdArgs.push_back("-fgnu89-inline");
4997
Chad Rosier9c76d242012-03-15 22:31:42 +00004998 if (Args.hasArg(options::OPT_fno_inline))
4999 CmdArgs.push_back("-fno-inline");
5000
Chad Rosier64d6be92012-03-06 21:17:19 +00005001 if (Args.hasArg(options::OPT_fno_inline_functions))
5002 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005003
John McCall5fb5df92012-06-20 06:18:46 +00005004 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005005
John McCall5fb5df92012-06-20 06:18:46 +00005006 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005007 // legacy is the default. Except for deployment taget of 10.5,
5008 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5009 // gets ignored silently.
5010 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005011 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5012 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005013 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005014 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005015 if (getToolChain().UseObjCMixedDispatch())
5016 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5017 else
5018 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5019 }
5020 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005021
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005022 // When ObjectiveC legacy runtime is in effect on MacOSX,
5023 // turn on the option to do Array/Dictionary subscripting
5024 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005025 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005026 getToolChain().getTriple().isMacOSX() &&
5027 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5028 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005029 objcRuntime.isNeXTFamily())
5030 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005031
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005032 // -fencode-extended-block-signature=1 is default.
5033 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5034 CmdArgs.push_back("-fencode-extended-block-signature");
5035 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005036
John McCall24fc0de2011-07-06 00:26:06 +00005037 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5038 // NOTE: This logic is duplicated in ToolChains.cpp.
5039 bool ARC = isObjCAutoRefCount(Args);
5040 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005041 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005042
John McCall24fc0de2011-07-06 00:26:06 +00005043 CmdArgs.push_back("-fobjc-arc");
5044
Chandler Carruth491db322011-11-04 07:34:47 +00005045 // FIXME: It seems like this entire block, and several around it should be
5046 // wrapped in isObjC, but for now we just use it here as this is where it
5047 // was being used previously.
5048 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5049 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5050 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5051 else
5052 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5053 }
5054
John McCall24fc0de2011-07-06 00:26:06 +00005055 // Allow the user to enable full exceptions code emission.
5056 // We define off for Objective-CC, on for Objective-C++.
5057 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5058 options::OPT_fno_objc_arc_exceptions,
5059 /*default*/ types::isCXX(InputType)))
5060 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005061
John McCall24fc0de2011-07-06 00:26:06 +00005062 }
5063
5064 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5065 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005066 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005067 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005068
John McCall24fc0de2011-07-06 00:26:06 +00005069 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5070 // takes precedence.
5071 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5072 if (!GCArg)
5073 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5074 if (GCArg) {
5075 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005076 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005077 } else if (getToolChain().SupportsObjCGC()) {
5078 GCArg->render(Args, CmdArgs);
5079 } else {
5080 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005081 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005082 }
5083 }
5084
John McCallfbe5ed72015-11-05 19:19:56 +00005085 // Pass down -fobjc-weak or -fno-objc-weak if present.
5086 if (types::isObjC(InputType)) {
5087 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5088 options::OPT_fno_objc_weak);
5089 if (!WeakArg) {
5090 // nothing to do
5091 } else if (GCArg) {
5092 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5093 D.Diag(diag::err_objc_weak_with_gc);
5094 } else if (!objcRuntime.allowsWeak()) {
5095 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5096 D.Diag(diag::err_objc_weak_unsupported);
5097 } else {
5098 WeakArg->render(Args, CmdArgs);
5099 }
5100 }
5101
Bob Wilsonb111ec92015-03-02 19:01:14 +00005102 if (Args.hasFlag(options::OPT_fapplication_extension,
5103 options::OPT_fno_application_extension, false))
5104 CmdArgs.push_back("-fapplication-extension");
5105
Reid Klecknerc542d372014-06-27 17:02:02 +00005106 // Handle GCC-style exception args.
5107 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005108 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5109 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005110
Tim Northovere931f9f2015-10-30 16:30:41 +00005111 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005112 CmdArgs.push_back("-fsjlj-exceptions");
5113
5114 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005115 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5116 options::OPT_fno_assume_sane_operator_new))
5117 CmdArgs.push_back("-fno-assume-sane-operator-new");
5118
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005119 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5120 // most platforms.
5121 if (Args.hasFlag(options::OPT_fsized_deallocation,
5122 options::OPT_fno_sized_deallocation, false))
5123 CmdArgs.push_back("-fsized-deallocation");
5124
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005125 // -fconstant-cfstrings is default, and may be subject to argument translation
5126 // on Darwin.
5127 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5128 options::OPT_fno_constant_cfstrings) ||
5129 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5130 options::OPT_mno_constant_cfstrings))
5131 CmdArgs.push_back("-fno-constant-cfstrings");
5132
John Thompsoned4e2952009-11-05 20:14:16 +00005133 // -fshort-wchar default varies depending on platform; only
5134 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005135 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5136 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005137 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005138
Hans Wennborg28c96312013-07-31 23:39:13 +00005139 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005140 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005141 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005142 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005143
Daniel Dunbar096ed292011-10-05 21:04:55 +00005144 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5145 // -fno-pack-struct doesn't apply to -fpack-struct=.
5146 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005147 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005148 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005149 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005150 } else if (Args.hasFlag(options::OPT_fpack_struct,
5151 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005152 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005153 }
5154
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005155 // Handle -fmax-type-align=N and -fno-type-align
5156 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5157 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5158 if (!SkipMaxTypeAlign) {
5159 std::string MaxTypeAlignStr = "-fmax-type-align=";
5160 MaxTypeAlignStr += A->getValue();
5161 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5162 }
5163 } else if (getToolChain().getTriple().isOSDarwin()) {
5164 if (!SkipMaxTypeAlign) {
5165 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5166 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5167 }
5168 }
5169
John Brawna7b4ec02015-08-10 11:11:28 +00005170 // -fcommon is the default unless compiling kernel code or the target says so
5171 bool NoCommonDefault =
5172 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5173 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5174 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005175 CmdArgs.push_back("-fno-common");
5176
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005177 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005178 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005179 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005180 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005181 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005182 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005183
Daniel Dunbar6358d682010-10-15 22:30:42 +00005184 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005185 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005186 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005187 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005188
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005189 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005190 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5191 StringRef value = inputCharset->getValue();
5192 if (value != "UTF-8")
5193 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5194 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005195 }
5196
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005197 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005198 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5199 StringRef value = execCharset->getValue();
5200 if (value != "UTF-8")
5201 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5202 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005203 }
5204
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005205 // -fcaret-diagnostics is default.
5206 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5207 options::OPT_fno_caret_diagnostics, true))
5208 CmdArgs.push_back("-fno-caret-diagnostics");
5209
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005210 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005211 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005212 options::OPT_fno_diagnostics_fixit_info))
5213 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005214
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005215 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005216 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005217 options::OPT_fno_diagnostics_show_option))
5218 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005219
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005220 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005221 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005222 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005223 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005224 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005225
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005226 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005227 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005228 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005229 }
5230
Chandler Carruthb6766f02011-03-27 01:50:55 +00005231 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005232 options::OPT_fdiagnostics_show_note_include_stack,
5233 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005234 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005235 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005236 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5237 else
5238 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5239 }
5240
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005241 // Color diagnostics are the default, unless the terminal doesn't support
5242 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005243 // Support both clang's -f[no-]color-diagnostics and gcc's
5244 // -f[no-]diagnostics-colors[=never|always|auto].
5245 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005246 for (const auto &Arg : Args) {
5247 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005248 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5249 !O.matches(options::OPT_fdiagnostics_color) &&
5250 !O.matches(options::OPT_fno_color_diagnostics) &&
5251 !O.matches(options::OPT_fno_diagnostics_color) &&
5252 !O.matches(options::OPT_fdiagnostics_color_EQ))
5253 continue;
5254
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005255 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005256 if (O.matches(options::OPT_fcolor_diagnostics) ||
5257 O.matches(options::OPT_fdiagnostics_color)) {
5258 ShowColors = Colors_On;
5259 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5260 O.matches(options::OPT_fno_diagnostics_color)) {
5261 ShowColors = Colors_Off;
5262 } else {
5263 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005264 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005265 if (value == "always")
5266 ShowColors = Colors_On;
5267 else if (value == "never")
5268 ShowColors = Colors_Off;
5269 else if (value == "auto")
5270 ShowColors = Colors_Auto;
5271 else
5272 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005273 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005274 }
5275 }
5276 if (ShowColors == Colors_On ||
5277 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005278 CmdArgs.push_back("-fcolor-diagnostics");
5279
Nico Rieck7857d462013-09-11 00:38:02 +00005280 if (Args.hasArg(options::OPT_fansi_escape_codes))
5281 CmdArgs.push_back("-fansi-escape-codes");
5282
Daniel Dunbardb097022009-06-08 21:13:54 +00005283 if (!Args.hasFlag(options::OPT_fshow_source_location,
5284 options::OPT_fno_show_source_location))
5285 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005286
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005287 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005288 true))
5289 CmdArgs.push_back("-fno-show-column");
5290
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005291 if (!Args.hasFlag(options::OPT_fspell_checking,
5292 options::OPT_fno_spell_checking))
5293 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005294
Chad Rosierc8e56e82012-12-05 21:08:21 +00005295 // -fno-asm-blocks is default.
5296 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5297 false))
5298 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005299
Steven Wucb0d13f2015-01-16 23:05:28 +00005300 // -fgnu-inline-asm is default.
5301 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5302 options::OPT_fno_gnu_inline_asm, true))
5303 CmdArgs.push_back("-fno-gnu-inline-asm");
5304
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005305 // Enable vectorization per default according to the optimization level
5306 // selected. For optimization levels that want vectorization we use the alias
5307 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005308 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005309 OptSpecifier VectorizeAliasOption =
5310 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005311 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005312 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005313 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005314
Chad Rosier136d67d2014-04-28 19:30:57 +00005315 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005316 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005317 OptSpecifier SLPVectAliasOption =
5318 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005319 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005320 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005321 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005322
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005323 // -fno-slp-vectorize-aggressive is default.
5324 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005325 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005326 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005327
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005328 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5329 A->render(Args, CmdArgs);
5330
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005331 // -fdollars-in-identifiers default varies depending on platform and
5332 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005333 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005334 options::OPT_fno_dollars_in_identifiers)) {
5335 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005336 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005337 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005338 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005339 }
5340
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005341 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5342 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005343 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005344 options::OPT_fno_unit_at_a_time)) {
5345 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005346 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005347 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005348
Eli Friedman055c9702011-11-02 01:53:16 +00005349 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5350 options::OPT_fno_apple_pragma_pack, false))
5351 CmdArgs.push_back("-fapple-pragma-pack");
5352
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005353 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005354 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5355 // by default.
5356 if (getToolChain().getArch() == llvm::Triple::le32) {
5357 CmdArgs.push_back("-fno-math-builtin");
5358 }
5359
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005360// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5361//
5362// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005363#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005364 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005365 (getToolChain().getArch() == llvm::Triple::arm ||
5366 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005367 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5368 CmdArgs.push_back("-fno-builtin-strcat");
5369 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5370 CmdArgs.push_back("-fno-builtin-strcpy");
5371 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005372#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005373
Justin Bognera88f0122014-06-20 22:59:50 +00005374 // Enable rewrite includes if the user's asked for it or if we're generating
5375 // diagnostics.
5376 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5377 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005378 if (Args.hasFlag(options::OPT_frewrite_includes,
5379 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005380 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005381 CmdArgs.push_back("-frewrite-includes");
5382
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005383 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005384 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005385 options::OPT_traditional_cpp)) {
5386 if (isa<PreprocessJobAction>(JA))
5387 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005388 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005389 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005390 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005391
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005392 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005393 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005394
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005395 // Handle serialized diagnostics.
5396 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5397 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005398 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005399 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005400
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005401 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5402 CmdArgs.push_back("-fretain-comments-from-system-headers");
5403
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005404 // Forward -fcomment-block-commands to -cc1.
5405 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005406 // Forward -fparse-all-comments to -cc1.
5407 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005408
John Brawnad31ace2015-09-23 13:55:40 +00005409 // Turn -fplugin=name.so into -load name.so
5410 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5411 CmdArgs.push_back("-load");
5412 CmdArgs.push_back(A->getValue());
5413 A->claim();
5414 }
5415
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005416 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5417 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005418 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005419 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5420 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005421
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005422 // We translate this by hand to the -cc1 argument, since nightly test uses
5423 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005424 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005425 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005426 } else
Sean Silva14facf32015-06-09 01:57:17 +00005427 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005428 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005429
Bob Wilson23a55f12014-12-21 07:00:00 +00005430 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005431 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5432 // by the frontend.
5433 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5434 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005435
Daniel Dunbard67a3222009-03-30 06:36:42 +00005436 if (Output.getType() == types::TY_Dependencies) {
5437 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005438 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005439 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005440 CmdArgs.push_back(Output.getFilename());
5441 } else {
5442 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005443 }
5444
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005445 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005446
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005447 if (Input.isFilename())
5448 CmdArgs.push_back(Input.getFilename());
5449 else
5450 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005451
Chris Lattnere9d7d782009-11-03 19:50:27 +00005452 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5453
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005454 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005455
5456 // Optionally embed the -cc1 level arguments into the debug info, for build
5457 // analysis.
5458 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005459 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005460 for (const auto &Arg : Args)
5461 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005462
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005463 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005464 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005465 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005466 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005467 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005468 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005469 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005470 }
5471 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005472 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005473 }
5474
Eric Christopherd3804002013-02-22 20:12:52 +00005475 // Add the split debug info name to the command lines here so we
5476 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005477 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005478 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5479 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005480 const char *SplitDwarfOut;
5481 if (SplitDwarf) {
5482 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005483 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005484 CmdArgs.push_back(SplitDwarfOut);
5485 }
5486
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005487 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5488 // Include them with -fcuda-include-gpubinary.
5489 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005490 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005491 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005492 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005493 }
5494
Eric Christopherd3804002013-02-22 20:12:52 +00005495 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005496 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005497 Output.getType() == types::TY_Object &&
5498 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005499 auto CLCommand =
5500 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005501 C.addCommand(llvm::make_unique<FallbackCommand>(
5502 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005503 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005504 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005505 }
5506
Eric Christopherf1545832013-02-22 23:50:16 +00005507 // Handle the debug info splitting at object creation time if we're
5508 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005509 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005510 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005511 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005512
Roman Divacky178e01602011-02-10 16:52:03 +00005513 if (Arg *A = Args.getLastArg(options::OPT_pg))
5514 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005515 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5516 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005517
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005518 // Claim some arguments which clang supports automatically.
5519
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005520 // -fpch-preprocess is used with gcc to add a special marker in the output to
5521 // include the PCH file. Clang's PTH solution is completely transparent, so we
5522 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005523 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005524
Daniel Dunbar17731772009-03-23 19:03:36 +00005525 // Claim some arguments which clang doesn't support, but we don't
5526 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005527 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5528 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005529
Rafael Espindolab0092d72013-09-04 19:37:35 +00005530 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005531 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005532}
5533
John McCall5fb5df92012-06-20 06:18:46 +00005534/// Add options related to the Objective-C runtime/ABI.
5535///
5536/// Returns true if the runtime is non-fragile.
5537ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5538 ArgStringList &cmdArgs,
5539 RewriteKind rewriteKind) const {
5540 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005541 Arg *runtimeArg =
5542 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5543 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005544
5545 // Just forward -fobjc-runtime= to the frontend. This supercedes
5546 // options about fragility.
5547 if (runtimeArg &&
5548 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5549 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005550 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005551 if (runtime.tryParse(value)) {
5552 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005553 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005554 }
5555
5556 runtimeArg->render(args, cmdArgs);
5557 return runtime;
5558 }
5559
5560 // Otherwise, we'll need the ABI "version". Version numbers are
5561 // slightly confusing for historical reasons:
5562 // 1 - Traditional "fragile" ABI
5563 // 2 - Non-fragile ABI, version 1
5564 // 3 - Non-fragile ABI, version 2
5565 unsigned objcABIVersion = 1;
5566 // If -fobjc-abi-version= is present, use that to set the version.
5567 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005568 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005569 if (value == "1")
5570 objcABIVersion = 1;
5571 else if (value == "2")
5572 objcABIVersion = 2;
5573 else if (value == "3")
5574 objcABIVersion = 3;
5575 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005576 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005577 } else {
5578 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005579 bool nonFragileABIIsDefault =
5580 (rewriteKind == RK_NonFragile ||
5581 (rewriteKind == RK_None &&
5582 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005583 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5584 options::OPT_fno_objc_nonfragile_abi,
5585 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005586// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005587#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5588 unsigned nonFragileABIVersion = 1;
5589#else
5590 unsigned nonFragileABIVersion = 2;
5591#endif
5592
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005593 if (Arg *abiArg =
5594 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005595 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005596 if (value == "1")
5597 nonFragileABIVersion = 1;
5598 else if (value == "2")
5599 nonFragileABIVersion = 2;
5600 else
5601 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005602 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005603 }
5604
5605 objcABIVersion = 1 + nonFragileABIVersion;
5606 } else {
5607 objcABIVersion = 1;
5608 }
5609 }
5610
5611 // We don't actually care about the ABI version other than whether
5612 // it's non-fragile.
5613 bool isNonFragile = objcABIVersion != 1;
5614
5615 // If we have no runtime argument, ask the toolchain for its default runtime.
5616 // However, the rewriter only really supports the Mac runtime, so assume that.
5617 ObjCRuntime runtime;
5618 if (!runtimeArg) {
5619 switch (rewriteKind) {
5620 case RK_None:
5621 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5622 break;
5623 case RK_Fragile:
5624 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5625 break;
5626 case RK_NonFragile:
5627 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5628 break;
5629 }
5630
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005631 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005632 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5633 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005634 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005635 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5636
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005637 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005638 } else {
5639 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5640 }
5641
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005642 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005643 } else {
5644 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005645 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005646 // non-fragile mode or the GCC runtime in fragile mode.
5647 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005648 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005649 else
5650 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005651 }
5652
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005653 cmdArgs.push_back(
5654 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005655 return runtime;
5656}
5657
Reid Klecknerc542d372014-06-27 17:02:02 +00005658static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5659 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5660 I += HaveDash;
5661 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005662}
Reid Klecknerc542d372014-06-27 17:02:02 +00005663
Benjamin Kramere003ca22015-10-28 13:54:16 +00005664namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005665struct EHFlags {
5666 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5667 bool Synch;
5668 bool Asynch;
5669 bool NoExceptC;
5670};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005671} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005672
5673/// /EH controls whether to run destructor cleanups when exceptions are
5674/// thrown. There are three modifiers:
5675/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5676/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5677/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5678/// - c: Assume that extern "C" functions are implicitly noexcept. This
5679/// modifier is an optimization, so we ignore it for now.
5680/// The default is /EHs-c-, meaning cleanups are disabled.
5681static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5682 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005683
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005684 std::vector<std::string> EHArgs =
5685 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005686 for (auto EHVal : EHArgs) {
5687 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5688 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005689 case 'a':
5690 EH.Asynch = maybeConsumeDash(EHVal, I);
5691 continue;
5692 case 'c':
5693 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5694 continue;
5695 case 's':
5696 EH.Synch = maybeConsumeDash(EHVal, I);
5697 continue;
5698 default:
5699 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005700 }
5701 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5702 break;
5703 }
5704 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005705
Reid Klecknerc542d372014-06-27 17:02:02 +00005706 return EH;
5707}
5708
Douglas Katzman3459ce22015-10-08 04:24:12 +00005709void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5710 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5711 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005712 unsigned RTOptionID = options::OPT__SLASH_MT;
5713
Hans Wennborgf1a74252013-09-10 20:18:04 +00005714 if (Args.hasArg(options::OPT__SLASH_LDd))
5715 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5716 // but defining _DEBUG is sticky.
5717 RTOptionID = options::OPT__SLASH_MTd;
5718
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005719 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005720 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005721
David Majnemere2afb472015-07-24 06:49:13 +00005722 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005723 switch (RTOptionID) {
5724 case options::OPT__SLASH_MD:
5725 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005726 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005727 CmdArgs.push_back("-D_MT");
5728 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005729 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005730 break;
5731 case options::OPT__SLASH_MDd:
5732 CmdArgs.push_back("-D_DEBUG");
5733 CmdArgs.push_back("-D_MT");
5734 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005735 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005736 break;
5737 case options::OPT__SLASH_MT:
5738 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005739 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005740 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005741 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005742 break;
5743 case options::OPT__SLASH_MTd:
5744 CmdArgs.push_back("-D_DEBUG");
5745 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005746 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005747 break;
5748 default:
5749 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005750 }
5751
David Majnemere2afb472015-07-24 06:49:13 +00005752 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5753 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5754 } else {
5755 CmdArgs.push_back(FlagForCRT.data());
5756
5757 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5758 // users want. The /Za flag to cl.exe turns this off, but it's not
5759 // implemented in clang.
5760 CmdArgs.push_back("--dependent-lib=oldnames");
5761 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005762
Hans Wennborg8858a032014-07-21 23:42:07 +00005763 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5764 // would produce interleaved output, so ignore /showIncludes in such cases.
5765 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5766 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5767 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005768
David Majnemerf6072342014-07-01 22:24:56 +00005769 // This controls whether or not we emit RTTI data for polymorphic types.
5770 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5771 /*default=*/false))
5772 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005773
Reid Kleckner124955a2015-08-05 18:51:13 +00005774 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005775 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005776 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5777 // If we are emitting CV but not DWARF, don't build information that LLVM
5778 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005779 if (*EmitCodeView && !EmitDwarf)
5780 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5781 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005782 CmdArgs.push_back("-gcodeview");
5783
Reid Klecknerc542d372014-06-27 17:02:02 +00005784 const Driver &D = getToolChain().getDriver();
5785 EHFlags EH = parseClangCLEHFlags(D, Args);
5786 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005787 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005788 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005789 CmdArgs.push_back("-fexceptions");
5790 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005791
Hans Wennborge50cec32014-06-13 20:59:54 +00005792 // /EP should expand to -E -P.
5793 if (Args.hasArg(options::OPT__SLASH_EP)) {
5794 CmdArgs.push_back("-E");
5795 CmdArgs.push_back("-P");
5796 }
5797
David Majnemera5b195a2015-02-14 01:35:12 +00005798 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005799 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5800 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005801 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5802 else
5803 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5804
5805 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5806 VolatileOptionID = A->getOption().getID();
5807
5808 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5809 CmdArgs.push_back("-fms-volatile");
5810
David Majnemer86c318f2014-02-11 21:05:00 +00005811 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5812 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5813 if (MostGeneralArg && BestCaseArg)
5814 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5815 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5816
5817 if (MostGeneralArg) {
5818 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5819 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5820 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5821
5822 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5823 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5824 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5825 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5826 << FirstConflict->getAsString(Args)
5827 << SecondConflict->getAsString(Args);
5828
5829 if (SingleArg)
5830 CmdArgs.push_back("-fms-memptr-rep=single");
5831 else if (MultipleArg)
5832 CmdArgs.push_back("-fms-memptr-rep=multiple");
5833 else
5834 CmdArgs.push_back("-fms-memptr-rep=virtual");
5835 }
5836
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005837 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5838 A->render(Args, CmdArgs);
5839
Hans Wennborg81f74482013-09-10 01:07:07 +00005840 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5841 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005842 if (Args.hasArg(options::OPT__SLASH_fallback))
5843 CmdArgs.push_back("msvc-fallback");
5844 else
5845 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005846 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005847}
5848
Douglas Katzman95354292015-06-23 20:42:09 +00005849visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005850 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005851 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005852 return CLFallback.get();
5853}
5854
Daniel Sanders7f933f42015-01-30 17:35:23 +00005855void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5856 ArgStringList &CmdArgs) const {
5857 StringRef CPUName;
5858 StringRef ABIName;
5859 const llvm::Triple &Triple = getToolChain().getTriple();
5860 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5861
5862 CmdArgs.push_back("-target-abi");
5863 CmdArgs.push_back(ABIName.data());
5864}
5865
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005866void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005867 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005868 const ArgList &Args,
5869 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005870 ArgStringList CmdArgs;
5871
5872 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5873 const InputInfo &Input = Inputs[0];
5874
James Y Knight2db38f32015-08-15 03:45:25 +00005875 std::string TripleStr =
5876 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5877 const llvm::Triple Triple(TripleStr);
5878
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005879 // Don't warn about "clang -w -c foo.s"
5880 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005881 // and "clang -emit-llvm -c foo.s"
5882 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005883
Rafael Espindola577637a2015-01-03 00:06:04 +00005884 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005885
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005886 // Invoke ourselves in -cc1as mode.
5887 //
5888 // FIXME: Implement custom jobs for internal actions.
5889 CmdArgs.push_back("-cc1as");
5890
5891 // Add the "effective" target triple.
5892 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005893 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5894
5895 // Set the output mode, we currently only expect to be used as a real
5896 // assembler.
5897 CmdArgs.push_back("-filetype");
5898 CmdArgs.push_back("obj");
5899
Eric Christopher45f2e712012-12-18 00:31:10 +00005900 // Set the main file name, so that debug info works even with
5901 // -save-temps or preprocessed assembly.
5902 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005903 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005904
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005905 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005906 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005907 if (!CPU.empty()) {
5908 CmdArgs.push_back("-target-cpu");
5909 CmdArgs.push_back(Args.MakeArgString(CPU));
5910 }
5911
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005912 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005913 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005914
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005915 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005916 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005917
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005918 // Pass along any -I options so we get proper .include search paths.
5919 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5920
Eric Christopherfc3ee562012-01-10 00:38:01 +00005921 // Determine the original source input.
5922 const Action *SourceAction = &JA;
5923 while (SourceAction->getKind() != Action::InputClass) {
5924 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5925 SourceAction = SourceAction->getInputs()[0];
5926 }
5927
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005928 // Forward -g and handle debug info related flags, assuming we are dealing
5929 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005930 if (SourceAction->getType() == types::TY_Asm ||
5931 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005932 bool WantDebug = false;
5933 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005934 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005935 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00005936 WantDebug = !A->getOption().matches(options::OPT_g0) &&
5937 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005938 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005939 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005940 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005941 if (DwarfVersion == 0)
5942 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005943 RenderDebugEnablingArgs(Args, CmdArgs,
5944 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5945 : CodeGenOptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00005946 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005947
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005948 // Add the -fdebug-compilation-dir flag if needed.
5949 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005950
5951 // Set the AT_producer to the clang version when using the integrated
5952 // assembler on assembly source files.
5953 CmdArgs.push_back("-dwarf-debug-producer");
5954 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005955
5956 // And pass along -I options
5957 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005958 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005959
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005960 // Handle -fPIC et al -- the relocation-model affects the assembler
5961 // for some targets.
5962 llvm::Reloc::Model RelocationModel;
5963 unsigned PICLevel;
5964 bool IsPIE;
5965 std::tie(RelocationModel, PICLevel, IsPIE) =
5966 ParsePICArgs(getToolChain(), Triple, Args);
5967
5968 const char *RMName = RelocationModelName(RelocationModel);
5969 if (RMName) {
5970 CmdArgs.push_back("-mrelocation-model");
5971 CmdArgs.push_back(RMName);
5972 }
5973
Kevin Enderby292dc082011-12-22 19:31:58 +00005974 // Optionally embed the -cc1as level arguments into the debug info, for build
5975 // analysis.
5976 if (getToolChain().UseDwarfDebugFlags()) {
5977 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005978 for (const auto &Arg : Args)
5979 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005980
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005981 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005982 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5983 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005984 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005985 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005986 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005987 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005988 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005989 }
5990 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005991 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005992 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005993
5994 // FIXME: Add -static support, once we have it.
5995
Daniel Sanders7f933f42015-01-30 17:35:23 +00005996 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005997 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005998 default:
5999 break;
6000
6001 case llvm::Triple::mips:
6002 case llvm::Triple::mipsel:
6003 case llvm::Triple::mips64:
6004 case llvm::Triple::mips64el:
6005 AddMIPSTargetArgs(Args, CmdArgs);
6006 break;
6007 }
6008
David Blaikie372d9502014-01-17 03:17:40 +00006009 // Consume all the warning flags. Usually this would be handled more
6010 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6011 // doesn't handle that so rather than warning about unused flags that are
6012 // actually used, we'll lie by omission instead.
6013 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00006014 for (const Arg *A : Args.filtered(options::OPT_W_Group))
6015 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00006016
David Blaikie9260ed62013-07-25 21:19:01 +00006017 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6018 getToolChain().getDriver());
6019
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006020 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006021
6022 assert(Output.isFilename() && "Unexpected lipo output.");
6023 CmdArgs.push_back("-o");
6024 CmdArgs.push_back(Output.getFilename());
6025
Daniel Dunbarb440f562010-08-02 02:38:21 +00006026 assert(Input.isFilename() && "Invalid input.");
6027 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006028
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006029 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006030 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006031
6032 // Handle the debug info splitting at object creation time if we're
6033 // creating an object.
6034 // TODO: Currently only works on linux with newer objcopy.
6035 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006036 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006037 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006038 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006039}
6040
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006041void GnuTool::anchor() {}
6042
Daniel Dunbara3246a02009-03-18 08:07:30 +00006043void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006044 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006045 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006046 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006047 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006048 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006049
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006050 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006051 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00006052 // Don't forward any -g arguments to assembly steps.
6053 if (isa<AssembleJobAction>(JA) &&
6054 A->getOption().matches(options::OPT_g_Group))
6055 continue;
6056
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006057 // Don't forward any -W arguments to assembly and link steps.
6058 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6059 A->getOption().matches(options::OPT_W_Group))
6060 continue;
6061
Daniel Dunbar2da02722009-03-19 07:55:12 +00006062 // It is unfortunate that we have to claim here, as this means
6063 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00006064 // platforms using a generic gcc, even if we are just using gcc
6065 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00006066 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006067 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006068 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006069 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006070
Daniel Dunbar4e295052010-01-25 22:35:08 +00006071 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006072
6073 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006074 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006075 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006076 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006077 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006078 }
6079
Daniel Dunbar5716d872009-05-02 21:41:52 +00006080 // Try to force gcc to match the tool chain we want, if we recognize
6081 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006082 //
6083 // FIXME: The triple class should directly provide the information we want
6084 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006085 switch (getToolChain().getArch()) {
6086 default:
6087 break;
6088 case llvm::Triple::x86:
6089 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006090 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006091 break;
6092 case llvm::Triple::x86_64:
6093 case llvm::Triple::ppc64:
6094 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006095 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006096 break;
6097 case llvm::Triple::sparcel:
6098 CmdArgs.push_back("-EL");
6099 break;
6100 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006101
Daniel Dunbarb440f562010-08-02 02:38:21 +00006102 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006103 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006104 CmdArgs.push_back(Output.getFilename());
6105 } else {
6106 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006107 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006108 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006109
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006110 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006111
6112 // Only pass -x if gcc will understand it; otherwise hope gcc
6113 // understands the suffix correctly. The main use case this would go
6114 // wrong in is for linker inputs if they happened to have an odd
6115 // suffix; really the only way to get this to happen is a command
6116 // like '-x foobar a.c' which will treat a.c like a linker input.
6117 //
6118 // FIXME: For the linker case specifically, can we safely convert
6119 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006120 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006121 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006122 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006123 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006124 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006125 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006126 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006127 else if (II.getType() == types::TY_ModuleFile)
6128 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006129 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006130
Daniel Dunbara3246a02009-03-18 08:07:30 +00006131 if (types::canTypeBeUserSpecified(II.getType())) {
6132 CmdArgs.push_back("-x");
6133 CmdArgs.push_back(types::getTypeName(II.getType()));
6134 }
6135
Daniel Dunbarb440f562010-08-02 02:38:21 +00006136 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006137 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006138 else {
6139 const Arg &A = II.getInputArg();
6140
6141 // Reverse translate some rewritten options.
6142 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6143 CmdArgs.push_back("-lstdc++");
6144 continue;
6145 }
6146
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006147 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006148 A.render(Args, CmdArgs);
6149 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006150 }
6151
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006152 const std::string customGCCName = D.getCCCGenericGCCName();
6153 const char *GCCName;
6154 if (!customGCCName.empty())
6155 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006156 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006157 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006158 } else
6159 GCCName = "gcc";
6160
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006161 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006162 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006163}
6164
Douglas Katzman95354292015-06-23 20:42:09 +00006165void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6166 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006167 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006168}
6169
Douglas Katzman95354292015-06-23 20:42:09 +00006170void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6171 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006172 const Driver &D = getToolChain().getDriver();
6173
Eric Christophercc7ff502015-01-29 00:56:17 +00006174 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006175 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006176 case types::TY_LLVM_IR:
6177 case types::TY_LTO_IR:
6178 case types::TY_LLVM_BC:
6179 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006180 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006181 break;
6182 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006183 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006184 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006185 case types::TY_Nothing:
6186 CmdArgs.push_back("-fsyntax-only");
6187 break;
6188 default:
6189 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006190 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006191}
6192
Douglas Katzman95354292015-06-23 20:42:09 +00006193void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6194 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006195 // The types are (hopefully) good enough.
6196}
6197
Tony Linthicum76329bf2011-12-12 21:14:55 +00006198// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006199void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006200 ArgStringList &CmdArgs) const {
6201}
6202
Douglas Katzman95354292015-06-23 20:42:09 +00006203void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6204 const InputInfo &Output,
6205 const InputInfoList &Inputs,
6206 const ArgList &Args,
6207 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006208 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006209
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006210 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6211 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006212 ArgStringList CmdArgs;
6213
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006214 std::string MArchString = "-march=hexagon";
6215 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006216
6217 RenderExtraToolArgs(JA, CmdArgs);
6218
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006219 std::string AsName = "hexagon-llvm-mc";
6220 std::string MCpuString = "-mcpu=hexagon" +
6221 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6222 CmdArgs.push_back("-filetype=obj");
6223 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6224
Tony Linthicum76329bf2011-12-12 21:14:55 +00006225 if (Output.isFilename()) {
6226 CmdArgs.push_back("-o");
6227 CmdArgs.push_back(Output.getFilename());
6228 } else {
6229 assert(Output.isNothing() && "Unexpected output");
6230 CmdArgs.push_back("-fsyntax-only");
6231 }
6232
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006233 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6234 std::string N = llvm::utostr(G.getValue());
6235 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6236 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006237
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006238 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006239
Tony Linthicum76329bf2011-12-12 21:14:55 +00006240 // Only pass -x if gcc will understand it; otherwise hope gcc
6241 // understands the suffix correctly. The main use case this would go
6242 // wrong in is for linker inputs if they happened to have an odd
6243 // suffix; really the only way to get this to happen is a command
6244 // like '-x foobar a.c' which will treat a.c like a linker input.
6245 //
6246 // FIXME: For the linker case specifically, can we safely convert
6247 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006248 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006249 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006250 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006251 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006252 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006253 else if (II.getType() == types::TY_AST)
6254 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006255 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006256 else if (II.getType() == types::TY_ModuleFile)
6257 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006258 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006259
6260 if (II.isFilename())
6261 CmdArgs.push_back(II.getFilename());
6262 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006263 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006264 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006265 II.getInputArg().render(Args, CmdArgs);
6266 }
6267
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006268 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006269 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006270}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006271
Douglas Katzman95354292015-06-23 20:42:09 +00006272void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6273 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006274}
6275
Douglas Katzman54366072015-07-27 16:53:08 +00006276static void
6277constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006278 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006279 const InputInfo &Output, const InputInfoList &Inputs,
6280 const ArgList &Args, ArgStringList &CmdArgs,
6281 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006282
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006283 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006284
Matthew Curtise689b052012-12-06 15:46:07 +00006285 //----------------------------------------------------------------------------
6286 //
6287 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006288 bool IsStatic = Args.hasArg(options::OPT_static);
6289 bool IsShared = Args.hasArg(options::OPT_shared);
6290 bool IsPIE = Args.hasArg(options::OPT_pie);
6291 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6292 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6293 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6294 bool UseG0 = false;
6295 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006296
Matthew Curtise689b052012-12-06 15:46:07 +00006297 //----------------------------------------------------------------------------
6298 // Silence warnings for various options
6299 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006300 Args.ClaimAllArgs(options::OPT_g_Group);
6301 Args.ClaimAllArgs(options::OPT_emit_llvm);
6302 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6303 // handled somewhere else.
6304 Args.ClaimAllArgs(options::OPT_static_libgcc);
6305
6306 //----------------------------------------------------------------------------
6307 //
6308 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006309 if (Args.hasArg(options::OPT_s))
6310 CmdArgs.push_back("-s");
6311
6312 if (Args.hasArg(options::OPT_r))
6313 CmdArgs.push_back("-r");
6314
6315 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006316 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006317
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006318 CmdArgs.push_back("-march=hexagon");
6319 std::string CpuVer =
6320 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6321 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6322 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006323
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006324 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006325 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006326 // The following should be the default, but doing as hexagon-gcc does.
6327 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006328 }
6329
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006330 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006331 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006332
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006333 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006334 CmdArgs.push_back("-pie");
6335
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006336 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6337 std::string N = llvm::utostr(G.getValue());
6338 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6339 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006340 }
6341
Matthew Curtise689b052012-12-06 15:46:07 +00006342 //----------------------------------------------------------------------------
6343 //
6344 //----------------------------------------------------------------------------
6345 CmdArgs.push_back("-o");
6346 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006347
Matthew Curtise689b052012-12-06 15:46:07 +00006348 //----------------------------------------------------------------------------
6349 // moslib
6350 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006351 std::vector<std::string> OsLibs;
6352 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006353
Sean Silva14facf32015-06-09 01:57:17 +00006354 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6355 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006356 OsLibs.emplace_back(A->getValue());
6357 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006358 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006359 if (OsLibs.empty()) {
6360 OsLibs.push_back("standalone");
6361 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006362 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006363
Matthew Curtise689b052012-12-06 15:46:07 +00006364 //----------------------------------------------------------------------------
6365 // Start Files
6366 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006367 const std::string MCpuSuffix = "/" + CpuVer;
6368 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6369 const std::string RootDir =
6370 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6371 const std::string StartSubDir =
6372 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006373
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006374 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6375 const char *Name) -> std::string {
6376 std::string RelName = SubDir + Name;
6377 std::string P = HTC.GetFilePath(RelName.c_str());
6378 if (llvm::sys::fs::exists(P))
6379 return P;
6380 return RootDir + RelName;
6381 };
6382
6383 if (IncStdLib && IncStartFiles) {
6384 if (!IsShared) {
6385 if (HasStandalone) {
6386 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6387 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006388 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006389 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6390 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006391 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006392 std::string Init = UseShared
6393 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6394 : Find(RootDir, StartSubDir, "/init.o");
6395 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006396 }
6397
6398 //----------------------------------------------------------------------------
6399 // Library Search Paths
6400 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006401 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6402 for (const auto &LibPath : LibPaths)
6403 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006404
6405 //----------------------------------------------------------------------------
6406 //
6407 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006408 Args.AddAllArgs(CmdArgs,
6409 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6410 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006411
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006412 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006413
6414 //----------------------------------------------------------------------------
6415 // Libraries
6416 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006417 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006418 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006419 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006420 CmdArgs.push_back("-lm");
6421 }
6422
6423 CmdArgs.push_back("--start-group");
6424
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006425 if (!IsShared) {
6426 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006427 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006428 CmdArgs.push_back("-lc");
6429 }
6430 CmdArgs.push_back("-lgcc");
6431
6432 CmdArgs.push_back("--end-group");
6433 }
6434
6435 //----------------------------------------------------------------------------
6436 // End files
6437 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006438 if (IncStdLib && IncStartFiles) {
6439 std::string Fini = UseShared
6440 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6441 : Find(RootDir, StartSubDir, "/fini.o");
6442 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006443 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006444}
6445
Douglas Katzman95354292015-06-23 20:42:09 +00006446void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6447 const InputInfo &Output,
6448 const InputInfoList &Inputs,
6449 const ArgList &Args,
6450 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006451 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006452
6453 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006454 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006455 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006456
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006457 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006458 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006459 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006460}
6461// Hexagon tools end.
6462
Tom Stellard8fa33092015-07-18 01:49:05 +00006463void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6464 const InputInfo &Output,
6465 const InputInfoList &Inputs,
6466 const ArgList &Args,
6467 const char *LinkingOutput) const {
6468
6469 std::string Linker = getToolChain().GetProgramPath(getShortName());
6470 ArgStringList CmdArgs;
6471 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006472 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006473 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006474 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006475 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6476 CmdArgs.push_back("-o");
6477 CmdArgs.push_back(Output.getFilename());
6478 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6479 CmdArgs, Inputs));
6480}
6481// AMDGPU tools end.
6482
Dan Gohman52816862015-12-16 23:30:41 +00006483wasm::Linker::Linker(const ToolChain &TC)
6484 : GnuTool("wasm::Linker", "lld", TC) {}
6485
6486bool wasm::Linker::isLinkJob() const {
6487 return true;
6488}
6489
6490bool wasm::Linker::hasIntegratedCPP() const {
6491 return false;
6492}
6493
6494void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6495 const InputInfo &Output,
6496 const InputInfoList &Inputs,
6497 const ArgList &Args,
6498 const char *LinkingOutput) const {
6499 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6500 ArgStringList CmdArgs;
6501 CmdArgs.push_back("-flavor");
6502 CmdArgs.push_back("ld");
Dan Gohman52816862015-12-16 23:30:41 +00006503 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6504 CmdArgs.push_back("-o");
6505 CmdArgs.push_back(Output.getFilename());
6506 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6507}
6508
Renato Golin7c542b42015-07-27 23:44:45 +00006509const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006510 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006511 if (!Arch.empty())
6512 MArch = Arch;
6513 else
Bernard Ogden31561762013-12-12 13:27:11 +00006514 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006515 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006516
6517 // Handle -march=native.
6518 if (MArch == "native") {
6519 std::string CPU = llvm::sys::getHostCPUName();
6520 if (CPU != "generic") {
6521 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006522 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006523 // If there is no valid architecture suffix for this CPU we don't know how
6524 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006525 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006526 MArch = "";
6527 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006528 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006529 }
6530 }
6531
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006532 return MArch;
6533}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006534
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006535/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006536StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006537 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006538 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6539 // here means an -march=native that we can't handle, so instead return no CPU.
6540 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006541 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006542
John Brawna95c1a82015-05-08 12:52:18 +00006543 // We need to return an empty string here on invalid MArch values as the
6544 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006545 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006546}
6547
6548/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006549std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006550 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006551 // FIXME: Warn on inconsistent use of -mcpu and -march.
6552 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006553 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006554 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006555 // Handle -mcpu=native.
6556 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006557 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006558 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006559 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006560 }
6561
Renato Goline17c5802015-07-27 23:44:42 +00006562 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006563}
6564
6565/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006566/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006567// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006568StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6569 const llvm::Triple &Triple) {
6570 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006571 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006572 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006573 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006574 if (ArchKind == llvm::ARM::AK_INVALID)
6575 // In case of generic Arch, i.e. "arm",
6576 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006577 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006578 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006579 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6580 // armv7k triple if it's actually been specified via "-arch armv7k".
6581 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006582 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006583 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006584 }
Renato Golin3c007252015-05-28 15:05:53 +00006585 if (ArchKind == llvm::ARM::AK_INVALID)
6586 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006587 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006588}
6589
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006590void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006591 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006592 if (Args.hasArg(options::OPT_r))
6593 return;
6594
John Brawn94fd9632015-05-21 12:19:49 +00006595 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6596 // to generate BE-8 executables.
6597 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6598 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006599}
6600
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006601mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006602 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6603 // was first introduced in Release 3. However, other compilers have
6604 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006605 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6606 .Case("mips1", NanLegacy)
6607 .Case("mips2", NanLegacy)
6608 .Case("mips3", NanLegacy)
6609 .Case("mips4", NanLegacy)
6610 .Case("mips5", NanLegacy)
6611 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006612 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006613 .Case("mips32r3", NanLegacy | Nan2008)
6614 .Case("mips32r5", NanLegacy | Nan2008)
6615 .Case("mips32r6", Nan2008)
6616 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006617 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006618 .Case("mips64r3", NanLegacy | Nan2008)
6619 .Case("mips64r5", NanLegacy | Nan2008)
6620 .Case("mips64r6", Nan2008)
6621 .Default(NanLegacy);
6622}
6623
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006624bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6625 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6626 return A && (A->getValue() == StringRef(Value));
6627}
6628
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006629bool mips::isUCLibc(const ArgList &Args) {
6630 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006631 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006632}
6633
Daniel Sanders2bf13662014-07-10 14:40:57 +00006634bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006635 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6636 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006637 .Case("2008", true)
6638 .Case("legacy", false)
6639 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006640
6641 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006642 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006643 .Cases("mips32r6", "mips64r6", true)
6644 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006645
6646 return false;
6647}
6648
Daniel Sanders379d44b2014-07-16 11:52:23 +00006649bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006650 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006651 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006652 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006653 return false;
6654
6655 if (ABIName != "32")
6656 return false;
6657
Toma Tabacu94ea6862015-06-16 13:54:13 +00006658 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6659 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006660 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006661 return false;
6662
Daniel Sanders379d44b2014-07-16 11:52:23 +00006663 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006664 .Cases("mips2", "mips3", "mips4", "mips5", true)
6665 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6666 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6667 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006668}
6669
Toma Tabacu94ea6862015-06-16 13:54:13 +00006670bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6671 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006672 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006673 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6674
6675 // FPXX shouldn't be used if -msingle-float is present.
6676 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6677 options::OPT_mdouble_float))
6678 if (A->getOption().matches(options::OPT_msingle_float))
6679 UseFPXX = false;
6680
6681 return UseFPXX;
6682}
6683
Tim Northover157d9112014-01-16 08:48:16 +00006684llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006685 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6686 // archs which Darwin doesn't use.
6687
6688 // The matching this routine does is fairly pointless, since it is neither the
6689 // complete architecture list, nor a reasonable subset. The problem is that
6690 // historically the driver driver accepts this and also ties its -march=
6691 // handling to the architecture name, so we need to be careful before removing
6692 // support for it.
6693
6694 // This code must be kept in sync with Clang's Darwin specific argument
6695 // translation.
6696
6697 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006698 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6699 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6700 .Case("ppc64", llvm::Triple::ppc64)
6701 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6702 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6703 llvm::Triple::x86)
6704 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6705 // This is derived from the driver driver.
6706 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6707 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6708 .Cases("armv7s", "xscale", llvm::Triple::arm)
6709 .Case("arm64", llvm::Triple::aarch64)
6710 .Case("r600", llvm::Triple::r600)
6711 .Case("amdgcn", llvm::Triple::amdgcn)
6712 .Case("nvptx", llvm::Triple::nvptx)
6713 .Case("nvptx64", llvm::Triple::nvptx64)
6714 .Case("amdil", llvm::Triple::amdil)
6715 .Case("spir", llvm::Triple::spir)
6716 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006717}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006718
Tim Northover157d9112014-01-16 08:48:16 +00006719void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006720 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006721 T.setArch(Arch);
6722
6723 if (Str == "x86_64h")
6724 T.setArchName(Str);
6725 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6726 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006727 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006728 }
6729}
6730
Bob Wilsondecc03e2012-11-23 06:14:39 +00006731const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006732 const InputInfo &Input) {
6733 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006734}
6735
Bob Wilsondecc03e2012-11-23 06:14:39 +00006736const char *Clang::getBaseInputStem(const ArgList &Args,
6737 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006738 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006739
Chris Lattner906bb902011-01-16 08:14:11 +00006740 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006741 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006742
6743 return Str;
6744}
6745
Bob Wilsondecc03e2012-11-23 06:14:39 +00006746const char *Clang::getDependencyFileName(const ArgList &Args,
6747 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006748 // FIXME: Think about this more.
6749 std::string Res;
6750
6751 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006752 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006753 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006754 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006755 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006756 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006757 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006758}
6759
Douglas Katzman95354292015-06-23 20:42:09 +00006760void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6761 const InputInfo &Output,
6762 const InputInfoList &Inputs,
6763 const ArgList &Args,
6764 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006765 const ToolChain &ToolChain = getToolChain();
6766 const Driver &D = ToolChain.getDriver();
6767 ArgStringList CmdArgs;
6768
6769 // Silence warning for "clang -g foo.o -o foo"
6770 Args.ClaimAllArgs(options::OPT_g_Group);
6771 // and "clang -emit-llvm foo.o -o foo"
6772 Args.ClaimAllArgs(options::OPT_emit_llvm);
6773 // and for "clang -w foo.o -o foo". Other warning options are already
6774 // handled somewhere else.
6775 Args.ClaimAllArgs(options::OPT_w);
6776
6777 if (!D.SysRoot.empty())
6778 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6779
6780 // CloudABI only supports static linkage.
6781 CmdArgs.push_back("-Bstatic");
6782 CmdArgs.push_back("--eh-frame-hdr");
6783 CmdArgs.push_back("--gc-sections");
6784
6785 if (Output.isFilename()) {
6786 CmdArgs.push_back("-o");
6787 CmdArgs.push_back(Output.getFilename());
6788 } else {
6789 assert(Output.isNothing() && "Invalid output.");
6790 }
6791
Douglas Katzman78b37b02015-11-17 20:28:07 +00006792 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006793 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6794 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6795 }
6796
6797 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006798 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006799 Args.AddAllArgs(CmdArgs,
6800 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6801 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006802
Teresa Johnson945bc502015-10-15 20:35:53 +00006803 if (D.isUsingLTO())
6804 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006805
6806 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6807
Douglas Katzman78b37b02015-11-17 20:28:07 +00006808 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006809 if (D.CCCIsCXX())
6810 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6811 CmdArgs.push_back("-lc");
6812 CmdArgs.push_back("-lcompiler_rt");
6813 }
6814
Douglas Katzman78b37b02015-11-17 20:28:07 +00006815 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006816 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6817
6818 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006819 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006820}
6821
Douglas Katzman95354292015-06-23 20:42:09 +00006822void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6823 const InputInfo &Output,
6824 const InputInfoList &Inputs,
6825 const ArgList &Args,
6826 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006827 ArgStringList CmdArgs;
6828
6829 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6830 const InputInfo &Input = Inputs[0];
6831
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006832 // Determine the original source input.
6833 const Action *SourceAction = &JA;
6834 while (SourceAction->getKind() != Action::InputClass) {
6835 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6836 SourceAction = SourceAction->getInputs()[0];
6837 }
6838
Eric Christopherf5a8f492015-12-08 00:10:10 +00006839 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006840 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006841 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6842 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006843 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006844 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006845 const llvm::Triple &T(getToolChain().getTriple());
6846 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006847 CmdArgs.push_back("-Q");
6848 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006849
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006850 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006851 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006852 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006853 if (Args.hasArg(options::OPT_gstabs))
6854 CmdArgs.push_back("--gstabs");
6855 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006856 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006857 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006858
Daniel Dunbarbe220842009-03-20 16:06:39 +00006859 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006860 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006861
Daniel Dunbar6d484762010-07-22 01:47:22 +00006862 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006863 if (getToolChain().getArch() == llvm::Triple::x86 ||
6864 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006865 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6866 CmdArgs.push_back("-force_cpusubtype_ALL");
6867
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006868 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006869 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006870 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006871 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006872 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006873 CmdArgs.push_back("-static");
6874
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006875 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006876
6877 assert(Output.isFilename() && "Unexpected lipo output.");
6878 CmdArgs.push_back("-o");
6879 CmdArgs.push_back(Output.getFilename());
6880
Daniel Dunbarb440f562010-08-02 02:38:21 +00006881 assert(Input.isFilename() && "Invalid input.");
6882 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006883
6884 // asm_final spec is empty.
6885
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006886 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006887 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006888}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006889
Tim Northover157d9112014-01-16 08:48:16 +00006890void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006891
Tim Northover157d9112014-01-16 08:48:16 +00006892void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6893 ArgStringList &CmdArgs) const {
6894 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006895
Daniel Dunbarc1964212009-03-26 16:23:12 +00006896 // Derived from darwin_arch spec.
6897 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006898 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006899
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006900 // FIXME: Is this needed anymore?
6901 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006902 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006903}
6904
Douglas Katzman95354292015-06-23 20:42:09 +00006905bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006906 // We only need to generate a temp path for LTO if we aren't compiling object
6907 // files. When compiling source files, we run 'dsymutil' after linking. We
6908 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006909 for (const auto &Input : Inputs)
6910 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006911 return true;
6912
6913 return false;
6914}
6915
Douglas Katzman95354292015-06-23 20:42:09 +00006916void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6917 ArgStringList &CmdArgs,
6918 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006919 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006920 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006921
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006922 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006923 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6924 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006925 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6926 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006927 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006928 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006929 }
6930
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006931 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006932 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006933 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6934 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006935
Bob Wilson3d27dad2013-08-02 22:25:34 +00006936 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6937 CmdArgs.push_back("-export_dynamic");
6938
Bob Wilsonb111ec92015-03-02 19:01:14 +00006939 // If we are using App Extension restrictions, pass a flag to the linker
6940 // telling it that the compiled code has been audited.
6941 if (Args.hasFlag(options::OPT_fapplication_extension,
6942 options::OPT_fno_application_extension, false))
6943 CmdArgs.push_back("-application_extension");
6944
Teresa Johnson945bc502015-10-15 20:35:53 +00006945 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006946 // If we are using LTO, then automatically create a temporary file path for
6947 // the linker to use, so that it's lifetime will extend past a possible
6948 // dsymutil step.
6949 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6950 const char *TmpPath = C.getArgs().MakeArgString(
6951 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6952 C.addTempFile(TmpPath);
6953 CmdArgs.push_back("-object_path_lto");
6954 CmdArgs.push_back(TmpPath);
6955 }
6956
6957 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6958 // it in clang installed libraries. If not found, the option is not used
6959 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6960 if (Version[0] >= 133) {
6961 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6962 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6963 SmallString<128> LibLTOPath(P);
6964 llvm::sys::path::append(LibLTOPath, "lib");
6965 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6966 if (llvm::sys::fs::exists(LibLTOPath)) {
6967 CmdArgs.push_back("-lto_library");
6968 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6969 } else {
6970 D.Diag(diag::warn_drv_lto_libpath);
6971 }
6972 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006973 }
6974
Daniel Dunbarc1964212009-03-26 16:23:12 +00006975 // Derived from the "link" spec.
6976 Args.AddAllArgs(CmdArgs, options::OPT_static);
6977 if (!Args.hasArg(options::OPT_static))
6978 CmdArgs.push_back("-dynamic");
6979 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6980 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6981 // here. How do we wish to handle such things?
6982 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006983
Daniel Dunbarc1964212009-03-26 16:23:12 +00006984 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006985 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006986 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006987 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006988
6989 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6990 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6991 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6992
6993 Arg *A;
6994 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6995 (A = Args.getLastArg(options::OPT_current__version)) ||
6996 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006997 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6998 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006999
7000 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7001 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7002 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7003 } else {
7004 CmdArgs.push_back("-dylib");
7005
7006 Arg *A;
7007 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7008 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7009 (A = Args.getLastArg(options::OPT_client__name)) ||
7010 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7011 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7012 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007013 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7014 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007015
Daniel Dunbarc1964212009-03-26 16:23:12 +00007016 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7017 "-dylib_compatibility_version");
7018 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7019 "-dylib_current_version");
7020
Tim Northover157d9112014-01-16 08:48:16 +00007021 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007022
7023 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7024 "-dylib_install_name");
7025 }
7026
7027 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7028 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7029 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007030 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007031 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007032 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7033 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7034 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7035 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7036 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7037 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007038 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007039 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7040 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7041 Args.AddAllArgs(CmdArgs, options::OPT_init);
7042
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007043 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007044 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007045
Daniel Dunbarc1964212009-03-26 16:23:12 +00007046 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7047 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7048 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7049 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7050 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007051
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007052 if (const Arg *A =
7053 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7054 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007055 if (A->getOption().matches(options::OPT_fpie) ||
7056 A->getOption().matches(options::OPT_fPIE))
7057 CmdArgs.push_back("-pie");
7058 else
7059 CmdArgs.push_back("-no_pie");
7060 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007061
7062 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7063 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7064 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7065 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7066 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7067 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7068 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7069 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7070 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7071 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7072 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7073 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7074 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7075 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7076 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7077 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007078
Daniel Dunbar84384642011-05-02 21:03:47 +00007079 // Give --sysroot= preference, over the Apple specific behavior to also use
7080 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007081 StringRef sysroot = C.getSysRoot();
7082 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007083 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007084 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007085 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7086 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007087 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007088 }
7089
Daniel Dunbarc1964212009-03-26 16:23:12 +00007090 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7091 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7092 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7093 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7094 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007095 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007096 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7097 Args.AddAllArgs(CmdArgs, options::OPT_y);
7098 Args.AddLastArg(CmdArgs, options::OPT_w);
7099 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7100 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7101 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7102 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7103 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7104 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7105 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7106 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7107 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7108 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7109 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7110 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7111}
7112
Douglas Katzman95354292015-06-23 20:42:09 +00007113void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7114 const InputInfo &Output,
7115 const InputInfoList &Inputs,
7116 const ArgList &Args,
7117 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007118 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007119
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007120 // If the number of arguments surpasses the system limits, we will encode the
7121 // input files in a separate file, shortening the command line. To this end,
7122 // build a list of input file names that can be passed via a file with the
7123 // -filelist linker option.
7124 llvm::opt::ArgStringList InputFileList;
7125
Daniel Dunbarc1964212009-03-26 16:23:12 +00007126 // The logic here is derived from gcc's behavior; most of which
7127 // comes from specs (starting with link_command). Consult gcc for
7128 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007129 ArgStringList CmdArgs;
7130
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007131 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7132 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7133 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007134 for (const auto &Arg : Args)
7135 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007136 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007137 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007138 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007139 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007140 return;
7141 }
7142
Daniel Dunbarc1964212009-03-26 16:23:12 +00007143 // I'm not sure why this particular decomposition exists in gcc, but
7144 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007145 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007146
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007147 // It seems that the 'e' option is completely ignored for dynamic executables
7148 // (the default), and with static executables, the last one wins, as expected.
7149 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7150 options::OPT_Z_Flag, options::OPT_u_Group,
7151 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007152
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007153 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7154 // members of static archive libraries which implement Objective-C classes or
7155 // categories.
7156 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7157 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007158
Daniel Dunbarc1964212009-03-26 16:23:12 +00007159 CmdArgs.push_back("-o");
7160 CmdArgs.push_back(Output.getFilename());
7161
Douglas Katzman78b37b02015-11-17 20:28:07 +00007162 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007163 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007164
Peter Collingbournec4122c12015-06-15 21:08:13 +00007165 // SafeStack requires its own runtime libraries
7166 // These libraries should be linked first, to make sure the
7167 // __safestack_init constructor executes before everything else
7168 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7169 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7170 "libclang_rt.safestack_osx.a",
7171 /*AlwaysLink=*/true);
7172 }
7173
Daniel Dunbarc1964212009-03-26 16:23:12 +00007174 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007175
Douglas Gregor9295df02012-05-15 21:00:27 +00007176 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007177 // Build the input file for -filelist (list of linker input files) in case we
7178 // need it later
7179 for (const auto &II : Inputs) {
7180 if (!II.isFilename()) {
7181 // This is a linker input argument.
7182 // We cannot mix input arguments and file names in a -filelist input, thus
7183 // we prematurely stop our list (remaining files shall be passed as
7184 // arguments).
7185 if (InputFileList.size() > 0)
7186 break;
7187
7188 continue;
7189 }
7190
7191 InputFileList.push_back(II.getFilename());
7192 }
7193
Douglas Katzman78b37b02015-11-17 20:28:07 +00007194 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007195 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7196
Douglas Katzman78b37b02015-11-17 20:28:07 +00007197 if (isObjCRuntimeLinked(Args) &&
7198 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007199 // We use arclite library for both ARC and subscripting support.
7200 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7201
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007202 CmdArgs.push_back("-framework");
7203 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007204 // Link libobj.
7205 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007206 }
John McCall31168b02011-06-15 23:02:42 +00007207
Daniel Dunbarc1964212009-03-26 16:23:12 +00007208 if (LinkingOutput) {
7209 CmdArgs.push_back("-arch_multiple");
7210 CmdArgs.push_back("-final_output");
7211 CmdArgs.push_back(LinkingOutput);
7212 }
7213
Daniel Dunbarc1964212009-03-26 16:23:12 +00007214 if (Args.hasArg(options::OPT_fnested_functions))
7215 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007216
Justin Bognerc7701242015-05-12 05:44:36 +00007217 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7218
Douglas Katzman78b37b02015-11-17 20:28:07 +00007219 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007220 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007221 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007222
Daniel Dunbarc1964212009-03-26 16:23:12 +00007223 // link_ssp spec is empty.
7224
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007225 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007226 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007227 }
7228
Douglas Katzman78b37b02015-11-17 20:28:07 +00007229 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007230 // endfile_spec is empty.
7231 }
7232
7233 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7234 Args.AddAllArgs(CmdArgs, options::OPT_F);
7235
Steven Wu3ffb61b2015-02-06 18:08:29 +00007236 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007237 for (const Arg *A : Args.filtered(options::OPT_iframework))
7238 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007239
Douglas Katzman78b37b02015-11-17 20:28:07 +00007240 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007241 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7242 if (A->getValue() == StringRef("Accelerate")) {
7243 CmdArgs.push_back("-framework");
7244 CmdArgs.push_back("Accelerate");
7245 }
7246 }
7247 }
7248
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007249 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007250 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007251 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007252 Cmd->setInputFileList(std::move(InputFileList));
7253 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007254}
7255
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007256void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007257 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007258 const InputInfoList &Inputs,
7259 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007260 const char *LinkingOutput) const {
7261 ArgStringList CmdArgs;
7262
7263 CmdArgs.push_back("-create");
7264 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007265
7266 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007267 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007268
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007269 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007270 assert(II.isFilename() && "Unexpected lipo input.");
7271 CmdArgs.push_back(II.getFilename());
7272 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007273
7274 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007275 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007276}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007277
Daniel Dunbar88299622010-06-04 18:28:36 +00007278void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007279 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007280 const InputInfoList &Inputs,
7281 const ArgList &Args,
7282 const char *LinkingOutput) const {
7283 ArgStringList CmdArgs;
7284
Daniel Dunbareb86b042011-05-09 17:23:16 +00007285 CmdArgs.push_back("-o");
7286 CmdArgs.push_back(Output.getFilename());
7287
Daniel Dunbar88299622010-06-04 18:28:36 +00007288 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7289 const InputInfo &Input = Inputs[0];
7290 assert(Input.isFilename() && "Unexpected dsymutil input.");
7291 CmdArgs.push_back(Input.getFilename());
7292
Daniel Dunbar88299622010-06-04 18:28:36 +00007293 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007294 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007295 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007296}
7297
Eric Christopher551ef452011-08-23 17:56:55 +00007298void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007299 const InputInfo &Output,
7300 const InputInfoList &Inputs,
7301 const ArgList &Args,
7302 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007303 ArgStringList CmdArgs;
7304 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007305 CmdArgs.push_back("--debug-info");
7306 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007307 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007308
7309 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7310 const InputInfo &Input = Inputs[0];
7311 assert(Input.isFilename() && "Unexpected verify input");
7312
7313 // Grabbing the output of the earlier dsymutil run.
7314 CmdArgs.push_back(Input.getFilename());
7315
7316 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007317 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007318 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007319}
7320
Douglas Katzman95354292015-06-23 20:42:09 +00007321void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007322 const InputInfo &Output,
7323 const InputInfoList &Inputs,
7324 const ArgList &Args,
7325 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007326 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007327 ArgStringList CmdArgs;
7328
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007329 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007330
7331 CmdArgs.push_back("-o");
7332 CmdArgs.push_back(Output.getFilename());
7333
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007334 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007335 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007336
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007337 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007338 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007339}
7340
Douglas Katzman95354292015-06-23 20:42:09 +00007341void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7342 const InputInfo &Output,
7343 const InputInfoList &Inputs,
7344 const ArgList &Args,
7345 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007346 ArgStringList CmdArgs;
7347
David Chisnall272a0712012-02-29 15:06:12 +00007348 // Demangle C++ names in errors
7349 CmdArgs.push_back("-C");
7350
Douglas Katzman78b37b02015-11-17 20:28:07 +00007351 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007352 CmdArgs.push_back("-e");
7353 CmdArgs.push_back("_start");
7354 }
7355
7356 if (Args.hasArg(options::OPT_static)) {
7357 CmdArgs.push_back("-Bstatic");
7358 CmdArgs.push_back("-dn");
7359 } else {
7360 CmdArgs.push_back("-Bdynamic");
7361 if (Args.hasArg(options::OPT_shared)) {
7362 CmdArgs.push_back("-shared");
7363 } else {
7364 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007365 CmdArgs.push_back(
7366 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007367 }
7368 }
7369
7370 if (Output.isFilename()) {
7371 CmdArgs.push_back("-o");
7372 CmdArgs.push_back(Output.getFilename());
7373 } else {
7374 assert(Output.isNothing() && "Invalid output.");
7375 }
7376
Douglas Katzman78b37b02015-11-17 20:28:07 +00007377 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007378 if (!Args.hasArg(options::OPT_shared))
7379 CmdArgs.push_back(
7380 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7381
7382 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7383 CmdArgs.push_back(
7384 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7385 CmdArgs.push_back(
7386 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007387 }
7388
Douglas Katzman6059ef92015-11-17 17:41:23 +00007389 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007390
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007391 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7392 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007393
7394 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7395
Douglas Katzman78b37b02015-11-17 20:28:07 +00007396 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007397 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007398 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007399 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007400 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007401 if (!Args.hasArg(options::OPT_shared)) {
7402 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007403 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007404 }
David Chisnallf571cde2012-02-15 13:39:01 +00007405 }
7406
Douglas Katzman78b37b02015-11-17 20:28:07 +00007407 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007408 CmdArgs.push_back(
7409 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007410 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007411 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007412
Xinliang David Li69306c02015-10-22 06:15:31 +00007413 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007414
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007415 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007416 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007417}
7418
Douglas Katzman95354292015-06-23 20:42:09 +00007419void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7420 const InputInfo &Output,
7421 const InputInfoList &Inputs,
7422 const ArgList &Args,
7423 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007424 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007425 ArgStringList CmdArgs;
7426
Rafael Espindolacc126272014-02-28 01:55:21 +00007427 switch (getToolChain().getArch()) {
7428 case llvm::Triple::x86:
7429 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7430 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007431 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007432 break;
7433
7434 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007435 CmdArgs.push_back("-mppc");
7436 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007437 break;
7438
7439 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007440 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007441 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007442 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7443 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7444 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007445 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007446 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007447
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007448 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007449 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007450 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7451 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7452 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007453 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007454 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007455
7456 case llvm::Triple::mips64:
7457 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007458 StringRef CPUName;
7459 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007460 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007461
7462 CmdArgs.push_back("-mabi");
7463 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7464
7465 if (getToolChain().getArch() == llvm::Triple::mips64)
7466 CmdArgs.push_back("-EB");
7467 else
7468 CmdArgs.push_back("-EL");
7469
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007470 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007471 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007472 }
7473
Rafael Espindolacc126272014-02-28 01:55:21 +00007474 default:
7475 break;
7476 }
7477
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007478 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007479
7480 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007481 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007482
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007483 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007484 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007485
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007486 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007487 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007488}
7489
Douglas Katzman95354292015-06-23 20:42:09 +00007490void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7491 const InputInfo &Output,
7492 const InputInfoList &Inputs,
7493 const ArgList &Args,
7494 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007495 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007496 ArgStringList CmdArgs;
7497
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007498 // Silence warning for "clang -g foo.o -o foo"
7499 Args.ClaimAllArgs(options::OPT_g_Group);
7500 // and "clang -emit-llvm foo.o -o foo"
7501 Args.ClaimAllArgs(options::OPT_emit_llvm);
7502 // and for "clang -w foo.o -o foo". Other warning options are already
7503 // handled somewhere else.
7504 Args.ClaimAllArgs(options::OPT_w);
7505
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007506 if (getToolChain().getArch() == llvm::Triple::mips64)
7507 CmdArgs.push_back("-EB");
7508 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7509 CmdArgs.push_back("-EL");
7510
Douglas Katzman78b37b02015-11-17 20:28:07 +00007511 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007512 CmdArgs.push_back("-e");
7513 CmdArgs.push_back("__start");
7514 }
7515
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007516 if (Args.hasArg(options::OPT_static)) {
7517 CmdArgs.push_back("-Bstatic");
7518 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007519 if (Args.hasArg(options::OPT_rdynamic))
7520 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007521 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007522 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007523 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007524 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007525 } else {
7526 CmdArgs.push_back("-dynamic-linker");
7527 CmdArgs.push_back("/usr/libexec/ld.so");
7528 }
7529 }
7530
Rafael Espindola044f7832013-06-05 04:28:55 +00007531 if (Args.hasArg(options::OPT_nopie))
7532 CmdArgs.push_back("-nopie");
7533
Daniel Dunbarb440f562010-08-02 02:38:21 +00007534 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007535 CmdArgs.push_back("-o");
7536 CmdArgs.push_back(Output.getFilename());
7537 } else {
7538 assert(Output.isNothing() && "Invalid output.");
7539 }
7540
Douglas Katzman78b37b02015-11-17 20:28:07 +00007541 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007542 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007543 if (Args.hasArg(options::OPT_pg))
7544 CmdArgs.push_back(
7545 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007546 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007547 CmdArgs.push_back(
7548 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7549 CmdArgs.push_back(
7550 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007551 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007552 CmdArgs.push_back(
7553 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007554 }
7555 }
7556
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007557 std::string Triple = getToolChain().getTripleString();
7558 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007559 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007560 CmdArgs.push_back(
7561 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007562
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007563 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7564 options::OPT_e, options::OPT_s, options::OPT_t,
7565 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007566
Daniel Dunbar54423b22010-09-17 00:24:54 +00007567 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007568
Douglas Katzman78b37b02015-11-17 20:28:07 +00007569 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007570 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007571 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007572 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007573 CmdArgs.push_back("-lm_p");
7574 else
7575 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007576 }
7577
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007578 // FIXME: For some reason GCC passes -lgcc before adding
7579 // the default system libraries. Just mimic this for now.
7580 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007581
Eric Christopher17674ec2012-09-13 06:32:34 +00007582 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007583 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7584 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007585 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007586 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007587 }
7588
Chandler Carruth45661652011-12-17 22:32:42 +00007589 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007590 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007591 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007592 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007593 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007594 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007595
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007596 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007597 }
7598
Douglas Katzman78b37b02015-11-17 20:28:07 +00007599 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007600 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007601 CmdArgs.push_back(
7602 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007603 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007604 CmdArgs.push_back(
7605 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007606 }
7607
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007608 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007609 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007610}
Ed Schoutene33194b2009-04-02 19:13:12 +00007611
Douglas Katzman95354292015-06-23 20:42:09 +00007612void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7613 const InputInfo &Output,
7614 const InputInfoList &Inputs,
7615 const ArgList &Args,
7616 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007617 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007618 ArgStringList CmdArgs;
7619
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007620 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007621
7622 CmdArgs.push_back("-o");
7623 CmdArgs.push_back(Output.getFilename());
7624
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007625 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007626 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007627
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007628 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007629 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007630}
7631
Douglas Katzman95354292015-06-23 20:42:09 +00007632void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7633 const InputInfo &Output,
7634 const InputInfoList &Inputs,
7635 const ArgList &Args,
7636 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007637 const Driver &D = getToolChain().getDriver();
7638 ArgStringList CmdArgs;
7639
Douglas Katzman78b37b02015-11-17 20:28:07 +00007640 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007641 CmdArgs.push_back("-e");
7642 CmdArgs.push_back("__start");
7643 }
7644
7645 if (Args.hasArg(options::OPT_static)) {
7646 CmdArgs.push_back("-Bstatic");
7647 } else {
7648 if (Args.hasArg(options::OPT_rdynamic))
7649 CmdArgs.push_back("-export-dynamic");
7650 CmdArgs.push_back("--eh-frame-hdr");
7651 CmdArgs.push_back("-Bdynamic");
7652 if (Args.hasArg(options::OPT_shared)) {
7653 CmdArgs.push_back("-shared");
7654 } else {
7655 CmdArgs.push_back("-dynamic-linker");
7656 CmdArgs.push_back("/usr/libexec/ld.so");
7657 }
7658 }
7659
7660 if (Output.isFilename()) {
7661 CmdArgs.push_back("-o");
7662 CmdArgs.push_back(Output.getFilename());
7663 } else {
7664 assert(Output.isNothing() && "Invalid output.");
7665 }
7666
Douglas Katzman78b37b02015-11-17 20:28:07 +00007667 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007668 if (!Args.hasArg(options::OPT_shared)) {
7669 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007670 CmdArgs.push_back(
7671 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007672 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007673 CmdArgs.push_back(
7674 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7675 CmdArgs.push_back(
7676 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007677 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007678 CmdArgs.push_back(
7679 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007680 }
7681 }
7682
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007683 Args.AddAllArgs(CmdArgs,
7684 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007685
7686 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7687
Douglas Katzman78b37b02015-11-17 20:28:07 +00007688 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007689 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007690 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7691 if (Args.hasArg(options::OPT_pg))
7692 CmdArgs.push_back("-lm_p");
7693 else
7694 CmdArgs.push_back("-lm");
7695 }
7696
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007697 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007698 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007699 CmdArgs.push_back("-lpthread_p");
7700 else
7701 CmdArgs.push_back("-lpthread");
7702 }
7703
Eli Friedman9fa28852012-08-08 23:57:20 +00007704 if (!Args.hasArg(options::OPT_shared)) {
7705 if (Args.hasArg(options::OPT_pg))
7706 CmdArgs.push_back("-lc_p");
7707 else
7708 CmdArgs.push_back("-lc");
7709 }
7710
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007711 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007712 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007713 case llvm::Triple::arm:
7714 MyArch = "arm";
7715 break;
7716 case llvm::Triple::x86:
7717 MyArch = "i386";
7718 break;
7719 case llvm::Triple::x86_64:
7720 MyArch = "amd64";
7721 break;
7722 default:
7723 llvm_unreachable("Unsupported architecture");
7724 }
7725 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007726 }
7727
Douglas Katzman78b37b02015-11-17 20:28:07 +00007728 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007729 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007730 CmdArgs.push_back(
7731 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007732 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007733 CmdArgs.push_back(
7734 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007735 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007736
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007737 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007738 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007739}
7740
Douglas Katzman95354292015-06-23 20:42:09 +00007741void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7742 const InputInfo &Output,
7743 const InputInfoList &Inputs,
7744 const ArgList &Args,
7745 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007746 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007747 ArgStringList CmdArgs;
7748
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007749 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7750 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007751 switch (getToolChain().getArch()) {
7752 default:
7753 break;
7754 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007755 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007756 break;
7757 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007758 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007759 break;
7760 case llvm::Triple::mips:
7761 case llvm::Triple::mipsel:
7762 case llvm::Triple::mips64:
7763 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007764 StringRef CPUName;
7765 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007766 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007767
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007768 CmdArgs.push_back("-march");
7769 CmdArgs.push_back(CPUName.data());
7770
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007771 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007772 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007773
7774 if (getToolChain().getArch() == llvm::Triple::mips ||
7775 getToolChain().getArch() == llvm::Triple::mips64)
7776 CmdArgs.push_back("-EB");
7777 else
7778 CmdArgs.push_back("-EL");
7779
Dimitry Andric46f338c2015-12-27 10:36:44 +00007780 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7781 StringRef v = A->getValue();
7782 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7783 A->claim();
7784 }
7785
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007786 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007787 break;
7788 }
7789 case llvm::Triple::arm:
7790 case llvm::Triple::armeb:
7791 case llvm::Triple::thumb:
7792 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007793 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007794
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007795 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007796 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007797 else
Renato Golinf4421f72014-02-19 10:44:07 +00007798 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007799
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007800 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007801 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007802 case llvm::Triple::GNUEABI:
7803 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007804 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007805 break;
7806
7807 default:
7808 CmdArgs.push_back("-matpcs");
7809 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007810 break;
7811 }
7812 case llvm::Triple::sparc:
7813 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007814 case llvm::Triple::sparcv9: {
7815 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7816 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007817 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007818 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007819 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007820 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007821
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007822 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007823
7824 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007825 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007826
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007827 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007828 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007829
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007830 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007831 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007832}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007833
Douglas Katzman95354292015-06-23 20:42:09 +00007834void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7835 const InputInfo &Output,
7836 const InputInfoList &Inputs,
7837 const ArgList &Args,
7838 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007839 const toolchains::FreeBSD &ToolChain =
7840 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007841 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007842 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007843 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007844 !Args.hasArg(options::OPT_shared) &&
7845 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007846 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007847
7848 // Silence warning for "clang -g foo.o -o foo"
7849 Args.ClaimAllArgs(options::OPT_g_Group);
7850 // and "clang -emit-llvm foo.o -o foo"
7851 Args.ClaimAllArgs(options::OPT_emit_llvm);
7852 // and for "clang -w foo.o -o foo". Other warning options are already
7853 // handled somewhere else.
7854 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007855
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007856 if (!D.SysRoot.empty())
7857 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7858
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007859 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007860 CmdArgs.push_back("-pie");
7861
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007862 if (Args.hasArg(options::OPT_static)) {
7863 CmdArgs.push_back("-Bstatic");
7864 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007865 if (Args.hasArg(options::OPT_rdynamic))
7866 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007867 CmdArgs.push_back("--eh-frame-hdr");
7868 if (Args.hasArg(options::OPT_shared)) {
7869 CmdArgs.push_back("-Bshareable");
7870 } else {
7871 CmdArgs.push_back("-dynamic-linker");
7872 CmdArgs.push_back("/libexec/ld-elf.so.1");
7873 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007874 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007875 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7876 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7877 CmdArgs.push_back("--hash-style=both");
7878 }
7879 }
7880 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007881 }
7882
7883 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7884 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007885 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007886 CmdArgs.push_back("-m");
7887 CmdArgs.push_back("elf_i386_fbsd");
7888 }
7889
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007890 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007891 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007892 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007893 }
7894
Dimitry Andric904895f2015-12-27 06:47:09 +00007895 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7896 if (ToolChain.getArch() == llvm::Triple::mips ||
7897 ToolChain.getArch() == llvm::Triple::mipsel ||
7898 ToolChain.getArch() == llvm::Triple::mips64 ||
7899 ToolChain.getArch() == llvm::Triple::mips64el) {
7900 StringRef v = A->getValue();
7901 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7902 A->claim();
7903 }
7904 }
7905
Daniel Dunbarb440f562010-08-02 02:38:21 +00007906 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007907 CmdArgs.push_back("-o");
7908 CmdArgs.push_back(Output.getFilename());
7909 } else {
7910 assert(Output.isNothing() && "Invalid output.");
7911 }
7912
Douglas Katzman78b37b02015-11-17 20:28:07 +00007913 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007914 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007915 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007916 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007917 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007918 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007919 crt1 = "Scrt1.o";
7920 else
7921 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007922 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007923 if (crt1)
7924 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7925
7926 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7927
Craig Topper92fc2df2014-05-17 16:56:41 +00007928 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007929 if (Args.hasArg(options::OPT_static))
7930 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007931 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007932 crtbegin = "crtbeginS.o";
7933 else
7934 crtbegin = "crtbegin.o";
7935
7936 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007937 }
7938
7939 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007940 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007941 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7942 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007943 Args.AddAllArgs(CmdArgs, options::OPT_s);
7944 Args.AddAllArgs(CmdArgs, options::OPT_t);
7945 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7946 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007947
Teresa Johnson945bc502015-10-15 20:35:53 +00007948 if (D.isUsingLTO())
7949 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007950
Alexey Samsonov52550342014-09-15 19:58:40 +00007951 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007952 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007953
Douglas Katzman78b37b02015-11-17 20:28:07 +00007954 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007955 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007956 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007957 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007958 if (Args.hasArg(options::OPT_pg))
7959 CmdArgs.push_back("-lm_p");
7960 else
7961 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007962 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007963 if (NeedsSanitizerDeps)
7964 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007965 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7966 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007967 if (Args.hasArg(options::OPT_pg))
7968 CmdArgs.push_back("-lgcc_p");
7969 else
7970 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007971 if (Args.hasArg(options::OPT_static)) {
7972 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007973 } else if (Args.hasArg(options::OPT_pg)) {
7974 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007975 } else {
7976 CmdArgs.push_back("--as-needed");
7977 CmdArgs.push_back("-lgcc_s");
7978 CmdArgs.push_back("--no-as-needed");
7979 }
7980
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007981 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007982 if (Args.hasArg(options::OPT_pg))
7983 CmdArgs.push_back("-lpthread_p");
7984 else
7985 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007986 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007987
Roman Divacky66f22762011-02-10 16:59:40 +00007988 if (Args.hasArg(options::OPT_pg)) {
7989 if (Args.hasArg(options::OPT_shared))
7990 CmdArgs.push_back("-lc");
7991 else
7992 CmdArgs.push_back("-lc_p");
7993 CmdArgs.push_back("-lgcc_p");
7994 } else {
7995 CmdArgs.push_back("-lc");
7996 CmdArgs.push_back("-lgcc");
7997 }
7998
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007999 if (Args.hasArg(options::OPT_static)) {
8000 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008001 } else if (Args.hasArg(options::OPT_pg)) {
8002 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008003 } else {
8004 CmdArgs.push_back("--as-needed");
8005 CmdArgs.push_back("-lgcc_s");
8006 CmdArgs.push_back("--no-as-needed");
8007 }
8008 }
8009
Douglas Katzman78b37b02015-11-17 20:28:07 +00008010 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008011 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008012 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008013 else
8014 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008015 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008016 }
8017
Xinliang David Li69306c02015-10-22 06:15:31 +00008018 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008019
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008020 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008021 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008022}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008023
Douglas Katzman95354292015-06-23 20:42:09 +00008024void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008025 const InputInfo &Output,
8026 const InputInfoList &Inputs,
8027 const ArgList &Args,
8028 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008029 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008030 ArgStringList CmdArgs;
8031
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008032 // GNU as needs different flags for creating the correct output format
8033 // on architectures with different ABIs or optional feature sets.
8034 switch (getToolChain().getArch()) {
8035 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008036 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008037 break;
8038 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008039 case llvm::Triple::armeb:
8040 case llvm::Triple::thumb:
8041 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008042 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008043 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8044 std::string Arch =
8045 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008046 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008047 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008048 }
8049
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008050 case llvm::Triple::mips:
8051 case llvm::Triple::mipsel:
8052 case llvm::Triple::mips64:
8053 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008054 StringRef CPUName;
8055 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008056 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008057
8058 CmdArgs.push_back("-march");
8059 CmdArgs.push_back(CPUName.data());
8060
8061 CmdArgs.push_back("-mabi");
8062 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8063
8064 if (getToolChain().getArch() == llvm::Triple::mips ||
8065 getToolChain().getArch() == llvm::Triple::mips64)
8066 CmdArgs.push_back("-EB");
8067 else
8068 CmdArgs.push_back("-EL");
8069
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008070 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008071 break;
8072 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008073
8074 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008075 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008076 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008077 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8078 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008079 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008080 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008081 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008082
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008083 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008084 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008085 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8086 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008087 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008088 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008089 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008090
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008091 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008092 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008093 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008094
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008095 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008096
8097 CmdArgs.push_back("-o");
8098 CmdArgs.push_back(Output.getFilename());
8099
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008100 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008101 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008102
David Chisnallddbd68f2011-09-27 22:03:18 +00008103 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008104 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008105}
8106
Douglas Katzman95354292015-06-23 20:42:09 +00008107void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8108 const InputInfo &Output,
8109 const InputInfoList &Inputs,
8110 const ArgList &Args,
8111 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008112 const Driver &D = getToolChain().getDriver();
8113 ArgStringList CmdArgs;
8114
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008115 if (!D.SysRoot.empty())
8116 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8117
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008118 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008119 if (Args.hasArg(options::OPT_static)) {
8120 CmdArgs.push_back("-Bstatic");
8121 } else {
8122 if (Args.hasArg(options::OPT_rdynamic))
8123 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008124 if (Args.hasArg(options::OPT_shared)) {
8125 CmdArgs.push_back("-Bshareable");
8126 } else {
8127 CmdArgs.push_back("-dynamic-linker");
8128 CmdArgs.push_back("/libexec/ld.elf_so");
8129 }
8130 }
8131
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008132 // Many NetBSD architectures support more than one ABI.
8133 // Determine the correct emulation for ld.
8134 switch (getToolChain().getArch()) {
8135 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008136 CmdArgs.push_back("-m");
8137 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008138 break;
8139 case llvm::Triple::arm:
8140 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008141 CmdArgs.push_back("-m");
8142 switch (getToolChain().getTriple().getEnvironment()) {
8143 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008144 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008145 CmdArgs.push_back("armelf_nbsd_eabi");
8146 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008147 case llvm::Triple::EABIHF:
8148 case llvm::Triple::GNUEABIHF:
8149 CmdArgs.push_back("armelf_nbsd_eabihf");
8150 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008151 default:
8152 CmdArgs.push_back("armelf_nbsd");
8153 break;
8154 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008155 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008156 case llvm::Triple::armeb:
8157 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008158 arm::appendEBLinkFlags(
8159 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008160 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008161 CmdArgs.push_back("-m");
8162 switch (getToolChain().getTriple().getEnvironment()) {
8163 case llvm::Triple::EABI:
8164 case llvm::Triple::GNUEABI:
8165 CmdArgs.push_back("armelfb_nbsd_eabi");
8166 break;
8167 case llvm::Triple::EABIHF:
8168 case llvm::Triple::GNUEABIHF:
8169 CmdArgs.push_back("armelfb_nbsd_eabihf");
8170 break;
8171 default:
8172 CmdArgs.push_back("armelfb_nbsd");
8173 break;
8174 }
8175 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008176 case llvm::Triple::mips64:
8177 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008178 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008179 CmdArgs.push_back("-m");
8180 if (getToolChain().getArch() == llvm::Triple::mips64)
8181 CmdArgs.push_back("elf32btsmip");
8182 else
8183 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008184 } else if (mips::hasMipsAbiArg(Args, "64")) {
8185 CmdArgs.push_back("-m");
8186 if (getToolChain().getArch() == llvm::Triple::mips64)
8187 CmdArgs.push_back("elf64btsmip");
8188 else
8189 CmdArgs.push_back("elf64ltsmip");
8190 }
8191 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008192 case llvm::Triple::ppc:
8193 CmdArgs.push_back("-m");
8194 CmdArgs.push_back("elf32ppc_nbsd");
8195 break;
8196
8197 case llvm::Triple::ppc64:
8198 case llvm::Triple::ppc64le:
8199 CmdArgs.push_back("-m");
8200 CmdArgs.push_back("elf64ppc");
8201 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008202
8203 case llvm::Triple::sparc:
8204 CmdArgs.push_back("-m");
8205 CmdArgs.push_back("elf32_sparc");
8206 break;
8207
8208 case llvm::Triple::sparcv9:
8209 CmdArgs.push_back("-m");
8210 CmdArgs.push_back("elf64_sparc");
8211 break;
8212
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008213 default:
8214 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008215 }
8216
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008217 if (Output.isFilename()) {
8218 CmdArgs.push_back("-o");
8219 CmdArgs.push_back(Output.getFilename());
8220 } else {
8221 assert(Output.isNothing() && "Invalid output.");
8222 }
8223
Douglas Katzman78b37b02015-11-17 20:28:07 +00008224 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008225 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008226 CmdArgs.push_back(
8227 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8228 CmdArgs.push_back(
8229 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8230 CmdArgs.push_back(
8231 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008232 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008233 CmdArgs.push_back(
8234 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8235 CmdArgs.push_back(
8236 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008237 }
8238 }
8239
8240 Args.AddAllArgs(CmdArgs, options::OPT_L);
8241 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8242 Args.AddAllArgs(CmdArgs, options::OPT_e);
8243 Args.AddAllArgs(CmdArgs, options::OPT_s);
8244 Args.AddAllArgs(CmdArgs, options::OPT_t);
8245 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8246 Args.AddAllArgs(CmdArgs, options::OPT_r);
8247
8248 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8249
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008250 unsigned Major, Minor, Micro;
8251 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8252 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008253 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008254 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008255 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008256 case llvm::Triple::arm:
8257 case llvm::Triple::armeb:
8258 case llvm::Triple::thumb:
8259 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008260 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008261 case llvm::Triple::ppc64:
8262 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008263 case llvm::Triple::x86:
8264 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008265 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008266 break;
8267 default:
8268 break;
8269 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008270 }
8271
Douglas Katzman78b37b02015-11-17 20:28:07 +00008272 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008273 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008274 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008275 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8276 CmdArgs.push_back("-lm");
8277 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008278 if (Args.hasArg(options::OPT_pthread))
8279 CmdArgs.push_back("-lpthread");
8280 CmdArgs.push_back("-lc");
8281
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008282 if (useLibgcc) {
8283 if (Args.hasArg(options::OPT_static)) {
8284 // libgcc_eh depends on libc, so resolve as much as possible,
8285 // pull in any new requirements from libc and then get the rest
8286 // of libgcc.
8287 CmdArgs.push_back("-lgcc_eh");
8288 CmdArgs.push_back("-lc");
8289 CmdArgs.push_back("-lgcc");
8290 } else {
8291 CmdArgs.push_back("-lgcc");
8292 CmdArgs.push_back("--as-needed");
8293 CmdArgs.push_back("-lgcc_s");
8294 CmdArgs.push_back("--no-as-needed");
8295 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008296 }
8297 }
8298
Douglas Katzman78b37b02015-11-17 20:28:07 +00008299 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008300 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008301 CmdArgs.push_back(
8302 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008303 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008304 CmdArgs.push_back(
8305 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8306 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008307 }
8308
Xinliang David Li69306c02015-10-22 06:15:31 +00008309 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008310
Logan Chieneb9162f2014-06-26 14:23:45 +00008311 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008312 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008313}
8314
Douglas Katzman95354292015-06-23 20:42:09 +00008315void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8316 const InputInfo &Output,
8317 const InputInfoList &Inputs,
8318 const ArgList &Args,
8319 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008320 claimNoWarnArgs(Args);
8321
James Y Knight2db38f32015-08-15 03:45:25 +00008322 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8323 llvm::Triple Triple = llvm::Triple(TripleStr);
8324
Rafael Espindola92b00932010-08-10 00:25:48 +00008325 ArgStringList CmdArgs;
8326
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008327 llvm::Reloc::Model RelocationModel;
8328 unsigned PICLevel;
8329 bool IsPIE;
8330 std::tie(RelocationModel, PICLevel, IsPIE) =
8331 ParsePICArgs(getToolChain(), Triple, Args);
8332
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008333 switch (getToolChain().getArch()) {
8334 default:
8335 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008336 // Add --32/--64 to make sure we get the format we want.
8337 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008338 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008339 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008340 break;
8341 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008342 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8343 CmdArgs.push_back("--x32");
8344 else
8345 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008346 break;
8347 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008348 CmdArgs.push_back("-a32");
8349 CmdArgs.push_back("-mppc");
8350 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008351 break;
8352 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008353 CmdArgs.push_back("-a64");
8354 CmdArgs.push_back("-mppc64");
8355 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008356 break;
8357 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008358 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008359 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008360 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008361 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008362 break;
8363 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008364 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008365 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008366 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8367 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8368 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008369 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008370 }
8371 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008372 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008373 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8374 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8375 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008376 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008377 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008378 case llvm::Triple::arm:
8379 case llvm::Triple::armeb:
8380 case llvm::Triple::thumb:
8381 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008382 const llvm::Triple &Triple2 = getToolChain().getTriple();
8383 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008384 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008385 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008386 break;
8387 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008388 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008389 break;
8390 default:
8391 break;
8392 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008393
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008394 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008395 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8396 case arm::FloatABI::Soft:
8397 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8398 break;
8399 case arm::FloatABI::SoftFP:
8400 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8401 break;
8402 case arm::FloatABI::Hard:
8403 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8404 break;
8405 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008406
8407 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008408
8409 // FIXME: remove krait check when GNU tools support krait cpu
8410 // for now replace it with -march=armv7-a to avoid a lower
8411 // march from being picked in the absence of a cpu flag.
8412 Arg *A;
8413 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008414 StringRef(A->getValue()).lower() == "krait")
8415 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008416 else
8417 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008418 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008419 break;
8420 }
8421 case llvm::Triple::mips:
8422 case llvm::Triple::mipsel:
8423 case llvm::Triple::mips64:
8424 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008425 StringRef CPUName;
8426 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008427 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008428 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008429
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008430 CmdArgs.push_back("-march");
8431 CmdArgs.push_back(CPUName.data());
8432
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008433 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008434 CmdArgs.push_back(ABIName.data());
8435
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008436 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8437 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008438 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008439 CmdArgs.push_back("-mno-shared");
8440
Daniel Sanders379d44b2014-07-16 11:52:23 +00008441 // LLVM doesn't support -mplt yet and acts as if it is always given.
8442 // However, -mplt has no effect with the N64 ABI.
8443 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008444
8445 if (getToolChain().getArch() == llvm::Triple::mips ||
8446 getToolChain().getArch() == llvm::Triple::mips64)
8447 CmdArgs.push_back("-EB");
8448 else
8449 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008450
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008451 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8452 if (StringRef(A->getValue()) == "2008")
8453 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8454 }
8455
Daniel Sanders379d44b2014-07-16 11:52:23 +00008456 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8457 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8458 options::OPT_mfp64)) {
8459 A->claim();
8460 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008461 } else if (mips::shouldUseFPXX(
8462 Args, getToolChain().getTriple(), CPUName, ABIName,
8463 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008464 CmdArgs.push_back("-mfpxx");
8465
8466 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8467 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008468 if (Arg *A =
8469 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008470 if (A->getOption().matches(options::OPT_mips16)) {
8471 A->claim();
8472 A->render(Args, CmdArgs);
8473 } else {
8474 A->claim();
8475 CmdArgs.push_back("-no-mips16");
8476 }
8477 }
8478
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008479 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8480 options::OPT_mno_micromips);
8481 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8482 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8483
Simon Atanasyanbd986632013-11-26 11:58:04 +00008484 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8485 // Do not use AddLastArg because not all versions of MIPS assembler
8486 // support -mmsa / -mno-msa options.
8487 if (A->getOption().matches(options::OPT_mmsa))
8488 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8489 }
8490
Daniel Sanders379d44b2014-07-16 11:52:23 +00008491 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8492 options::OPT_msoft_float);
8493
Toma Tabacub36d6102015-06-11 12:13:18 +00008494 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8495 options::OPT_msingle_float);
8496
Daniel Sanders379d44b2014-07-16 11:52:23 +00008497 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8498 options::OPT_mno_odd_spreg);
8499
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008500 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008501 break;
8502 }
8503 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008504 // Always pass an -march option, since our default of z10 is later
8505 // than the GNU assembler's default.
8506 StringRef CPUName = getSystemZTargetCPU(Args);
8507 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008508 break;
8509 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008510 }
8511
Renato Golina74bbc72015-07-22 15:32:36 +00008512 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008513 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008514
8515 CmdArgs.push_back("-o");
8516 CmdArgs.push_back(Output.getFilename());
8517
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008518 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008519 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008520
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008521 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008522 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008523
8524 // Handle the debug info splitting at object creation time if we're
8525 // creating an object.
8526 // TODO: Currently only works on linux with newer objcopy.
8527 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008528 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008529 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008530 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008531}
8532
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008533static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008534 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008535 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008536 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008537 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8538 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008539 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008540 CmdArgs.push_back("-lgcc");
8541
Logan Chien3d3373c2012-11-19 12:04:11 +00008542 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008543 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008544 CmdArgs.push_back("-lgcc");
8545 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008546 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008547 CmdArgs.push_back("--as-needed");
8548 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008549 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008550 CmdArgs.push_back("--no-as-needed");
8551 }
8552
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008553 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008554 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008555 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008556 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008557
8558 // According to Android ABI, we have to link with libdl if we are
8559 // linking with non-static libgcc.
8560 //
8561 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8562 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8563 if (isAndroid && !StaticLibgcc)
8564 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008565}
8566
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008567static std::string getLinuxDynamicLinker(const ArgList &Args,
8568 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008569 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8570
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008571 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008572 if (ToolChain.getTriple().isArch64Bit())
8573 return "/system/bin/linker64";
8574 else
8575 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008576 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8577 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008578 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008579 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008580 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008581 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008582 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008583 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008584 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008585 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008586 return "/lib/ld-linux-armhf.so.3";
8587 else
8588 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008589 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8590 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008591 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008592 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008593 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008594 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008595 return "/lib/ld-linux.so.3";
8596 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8597 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008598 std::string LibDir =
8599 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008600 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008601 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008602 if (mips::isUCLibc(Args))
8603 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008604 else if (!ToolChain.getTriple().hasEnvironment()) {
8605 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8606 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8607 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8608 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008609 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008610
8611 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008612 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008613 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008614 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008615 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8616 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008617 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008618 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008619 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8620 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008621 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008622 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008623 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008624 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008625 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008626 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008627 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8628 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008629 else
8630 return "/lib64/ld-linux-x86-64.so.2";
8631}
8632
Renato Golinc4b49242014-02-13 10:01:16 +00008633static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008634 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008635 // Make use of compiler-rt if --rtlib option is used
8636 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8637
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008638 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008639 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008640 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008641 default:
8642 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008643 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008644 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008645 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008646 break;
8647 }
Renato Golinc4b49242014-02-13 10:01:16 +00008648 break;
8649 case ToolChain::RLT_Libgcc:
8650 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8651 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008652 }
8653}
8654
Rafael Espindola1e085772014-08-15 17:14:35 +00008655static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8656 switch (T.getArch()) {
8657 case llvm::Triple::x86:
8658 return "elf_i386";
8659 case llvm::Triple::aarch64:
8660 return "aarch64linux";
8661 case llvm::Triple::aarch64_be:
8662 return "aarch64_be_linux";
8663 case llvm::Triple::arm:
8664 case llvm::Triple::thumb:
8665 return "armelf_linux_eabi";
8666 case llvm::Triple::armeb:
8667 case llvm::Triple::thumbeb:
8668 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8669 case llvm::Triple::ppc:
8670 return "elf32ppclinux";
8671 case llvm::Triple::ppc64:
8672 return "elf64ppc";
8673 case llvm::Triple::ppc64le:
8674 return "elf64lppc";
8675 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008676 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008677 return "elf32_sparc";
8678 case llvm::Triple::sparcv9:
8679 return "elf64_sparc";
8680 case llvm::Triple::mips:
8681 return "elf32btsmip";
8682 case llvm::Triple::mipsel:
8683 return "elf32ltsmip";
8684 case llvm::Triple::mips64:
8685 if (mips::hasMipsAbiArg(Args, "n32"))
8686 return "elf32btsmipn32";
8687 return "elf64btsmip";
8688 case llvm::Triple::mips64el:
8689 if (mips::hasMipsAbiArg(Args, "n32"))
8690 return "elf32ltsmipn32";
8691 return "elf64ltsmip";
8692 case llvm::Triple::systemz:
8693 return "elf64_s390";
8694 case llvm::Triple::x86_64:
8695 if (T.getEnvironment() == llvm::Triple::GNUX32)
8696 return "elf32_x86_64";
8697 return "elf_x86_64";
8698 default:
8699 llvm_unreachable("Unexpected arch");
8700 }
8701}
8702
Douglas Katzman95354292015-06-23 20:42:09 +00008703void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8704 const InputInfo &Output,
8705 const InputInfoList &Inputs,
8706 const ArgList &Args,
8707 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008708 const toolchains::Linux &ToolChain =
8709 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008710 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008711
8712 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8713 llvm::Triple Triple = llvm::Triple(TripleStr);
8714
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008715 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008716 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008717 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008718 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8719 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008720 const bool HasCRTBeginEndFiles =
8721 ToolChain.getTriple().hasEnvironment() ||
8722 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008723
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008724 ArgStringList CmdArgs;
8725
Rafael Espindolad1002f62010-11-15 18:28:16 +00008726 // Silence warning for "clang -g foo.o -o foo"
8727 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008728 // and "clang -emit-llvm foo.o -o foo"
8729 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008730 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008731 // handled somewhere else.
8732 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008733
Peter Collingbourne39719a72015-11-20 20:49:39 +00008734 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8735 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008736 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008737 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008738 CmdArgs.push_back("-target");
8739 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8740 }
8741
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008742 if (!D.SysRoot.empty())
8743 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008744
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008745 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008746 CmdArgs.push_back("-pie");
8747
Rafael Espindola1c76c592010-11-07 22:57:16 +00008748 if (Args.hasArg(options::OPT_rdynamic))
8749 CmdArgs.push_back("-export-dynamic");
8750
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008751 if (Args.hasArg(options::OPT_s))
8752 CmdArgs.push_back("-s");
8753
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008754 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008755 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008756
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008757 for (const auto &Opt : ToolChain.ExtraOpts)
8758 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008759
8760 if (!Args.hasArg(options::OPT_static)) {
8761 CmdArgs.push_back("--eh-frame-hdr");
8762 }
8763
8764 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008765 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008766
8767 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008768 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8769 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008770 CmdArgs.push_back("-Bstatic");
8771 else
8772 CmdArgs.push_back("-static");
8773 } else if (Args.hasArg(options::OPT_shared)) {
8774 CmdArgs.push_back("-shared");
8775 }
8776
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008777 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8778 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008779 (!Args.hasArg(options::OPT_static) &&
8780 !Args.hasArg(options::OPT_shared))) {
8781 CmdArgs.push_back("-dynamic-linker");
8782 CmdArgs.push_back(Args.MakeArgString(
8783 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8784 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008785
8786 CmdArgs.push_back("-o");
8787 CmdArgs.push_back(Output.getFilename());
8788
Douglas Katzman78b37b02015-11-17 20:28:07 +00008789 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008790 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008791 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008792 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008793 if (Args.hasArg(options::OPT_pg))
8794 crt1 = "gcrt1.o";
8795 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008796 crt1 = "Scrt1.o";
8797 else
8798 crt1 = "crt1.o";
8799 }
8800 if (crt1)
8801 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008802
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008803 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8804 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008805
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008806 const char *crtbegin;
8807 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008808 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008809 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008810 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008811 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008812 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008813 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008814 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008815
8816 if (HasCRTBeginEndFiles)
8817 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008818
8819 // Add crtfastmath.o if available and fast math is enabled.
8820 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008821 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008822
8823 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008824 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008825
Douglas Katzman6059ef92015-11-17 17:41:23 +00008826 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008827
Teresa Johnson945bc502015-10-15 20:35:53 +00008828 if (D.isUsingLTO())
8829 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008830
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008831 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8832 CmdArgs.push_back("--no-demangle");
8833
Alexey Samsonov52550342014-09-15 19:58:40 +00008834 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008835 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008836 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008837 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008838
Douglas Katzman78b37b02015-11-17 20:28:07 +00008839 if (D.CCCIsCXX() &&
8840 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008841 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008842 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008843 if (OnlyLibstdcxxStatic)
8844 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008845 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008846 if (OnlyLibstdcxxStatic)
8847 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008848 CmdArgs.push_back("-lm");
8849 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008850 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8851 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008852
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008853 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008854 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8855 if (Args.hasArg(options::OPT_static))
8856 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008857
Alexey Samsonov52550342014-09-15 19:58:40 +00008858 if (NeedsSanitizerDeps)
8859 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8860
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008861 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8862 Args.hasArg(options::OPT_pthreads);
8863
8864 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8865 options::OPT_fno_openmp, false)) {
8866 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8867 // FIXME: Does this really make sense for all GNU toolchains?
8868 WantPthread = true;
8869
8870 // Also link the particular OpenMP runtimes.
8871 switch (getOpenMPRuntime(ToolChain, Args)) {
8872 case OMPRT_OMP:
8873 CmdArgs.push_back("-lomp");
8874 break;
8875 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008876 CmdArgs.push_back("-lgomp");
8877
8878 // FIXME: Exclude this for platforms with libgomp that don't require
8879 // librt. Most modern Linux platforms require it, but some may not.
8880 CmdArgs.push_back("-lrt");
8881 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008882 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008883 CmdArgs.push_back("-liomp5");
8884 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008885 case OMPRT_Unknown:
8886 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008887 break;
8888 }
Chandler Carruth01538002013-01-17 13:19:29 +00008889 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008890
Renato Golinc4b49242014-02-13 10:01:16 +00008891 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008892
Richard Smith31d1de22015-05-20 22:48:44 +00008893 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008894 CmdArgs.push_back("-lpthread");
8895
8896 CmdArgs.push_back("-lc");
8897
8898 if (Args.hasArg(options::OPT_static))
8899 CmdArgs.push_back("--end-group");
8900 else
Renato Golinc4b49242014-02-13 10:01:16 +00008901 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008902 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008903
Rafael Espindola81937ec2010-12-01 01:52:43 +00008904 if (!Args.hasArg(options::OPT_nostartfiles)) {
8905 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008906 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008907 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008908 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008909 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008910 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008911 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008912
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008913 if (HasCRTBeginEndFiles)
8914 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008915 if (!isAndroid)
8916 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008917 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00008918 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008919
Peter Collingbourne39719a72015-11-20 20:49:39 +00008920 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008921}
8922
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008923// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8924// for the various SFI requirements like register masking. The assembly tool
8925// inserts the file containing the macros as an input into all the assembly
8926// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008927void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8928 const InputInfo &Output,
8929 const InputInfoList &Inputs,
8930 const ArgList &Args,
8931 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008932 const toolchains::NaClToolChain &ToolChain =
8933 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008934 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8935 "nacl-arm-macros.s");
8936 InputInfoList NewInputs;
8937 NewInputs.push_back(NaClMacros);
8938 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008939 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8940 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008941}
8942
Douglas Katzman750cfc52015-06-29 18:42:16 +00008943// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008944// we use static by default, do not yet support sanitizers or LTO, and a few
8945// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008946// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008947void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8948 const InputInfo &Output,
8949 const InputInfoList &Inputs,
8950 const ArgList &Args,
8951 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008952
Douglas Katzman54366072015-07-27 16:53:08 +00008953 const toolchains::NaClToolChain &ToolChain =
8954 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008955 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008956 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008957 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008958 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008959
8960 ArgStringList CmdArgs;
8961
8962 // Silence warning for "clang -g foo.o -o foo"
8963 Args.ClaimAllArgs(options::OPT_g_Group);
8964 // and "clang -emit-llvm foo.o -o foo"
8965 Args.ClaimAllArgs(options::OPT_emit_llvm);
8966 // and for "clang -w foo.o -o foo". Other warning options are already
8967 // handled somewhere else.
8968 Args.ClaimAllArgs(options::OPT_w);
8969
8970 if (!D.SysRoot.empty())
8971 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8972
8973 if (Args.hasArg(options::OPT_rdynamic))
8974 CmdArgs.push_back("-export-dynamic");
8975
8976 if (Args.hasArg(options::OPT_s))
8977 CmdArgs.push_back("-s");
8978
Douglas Katzman54366072015-07-27 16:53:08 +00008979 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8980 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008981 CmdArgs.push_back("--build-id");
8982
8983 if (!IsStatic)
8984 CmdArgs.push_back("--eh-frame-hdr");
8985
8986 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008987 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008988 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008989 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008990 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008991 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008992 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008993 else if (Arch == llvm::Triple::mipsel)
8994 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008995 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008996 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8997 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008998
8999 if (IsStatic)
9000 CmdArgs.push_back("-static");
9001 else if (Args.hasArg(options::OPT_shared))
9002 CmdArgs.push_back("-shared");
9003
9004 CmdArgs.push_back("-o");
9005 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009006 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009007 if (!Args.hasArg(options::OPT_shared))
9008 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9009 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9010
9011 const char *crtbegin;
9012 if (IsStatic)
9013 crtbegin = "crtbeginT.o";
9014 else if (Args.hasArg(options::OPT_shared))
9015 crtbegin = "crtbeginS.o";
9016 else
9017 crtbegin = "crtbegin.o";
9018 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9019 }
9020
9021 Args.AddAllArgs(CmdArgs, options::OPT_L);
9022 Args.AddAllArgs(CmdArgs, options::OPT_u);
9023
Douglas Katzman6059ef92015-11-17 17:41:23 +00009024 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009025
9026 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9027 CmdArgs.push_back("--no-demangle");
9028
9029 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9030
Douglas Katzman78b37b02015-11-17 20:28:07 +00009031 if (D.CCCIsCXX() &&
9032 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009033 bool OnlyLibstdcxxStatic =
9034 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009035 if (OnlyLibstdcxxStatic)
9036 CmdArgs.push_back("-Bstatic");
9037 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9038 if (OnlyLibstdcxxStatic)
9039 CmdArgs.push_back("-Bdynamic");
9040 CmdArgs.push_back("-lm");
9041 }
9042
9043 if (!Args.hasArg(options::OPT_nostdlib)) {
9044 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9045 // Always use groups, since it has no effect on dynamic libraries.
9046 CmdArgs.push_back("--start-group");
9047 CmdArgs.push_back("-lc");
9048 // NaCl's libc++ currently requires libpthread, so just always include it
9049 // in the group for C++.
9050 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009051 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009052 // Gold, used by Mips, handles nested groups differently than ld, and
9053 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9054 // which is not a desired behaviour here.
9055 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9056 if (getToolChain().getArch() == llvm::Triple::mipsel)
9057 CmdArgs.push_back("-lnacl");
9058
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009059 CmdArgs.push_back("-lpthread");
9060 }
9061
9062 CmdArgs.push_back("-lgcc");
9063 CmdArgs.push_back("--as-needed");
9064 if (IsStatic)
9065 CmdArgs.push_back("-lgcc_eh");
9066 else
9067 CmdArgs.push_back("-lgcc_s");
9068 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009069
9070 // Mips needs to create and use pnacl_legacy library that contains
9071 // definitions from bitcode/pnaclmm.c and definitions for
9072 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9073 if (getToolChain().getArch() == llvm::Triple::mipsel)
9074 CmdArgs.push_back("-lpnacl_legacy");
9075
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009076 CmdArgs.push_back("--end-group");
9077 }
9078
9079 if (!Args.hasArg(options::OPT_nostartfiles)) {
9080 const char *crtend;
9081 if (Args.hasArg(options::OPT_shared))
9082 crtend = "crtendS.o";
9083 else
9084 crtend = "crtend.o";
9085
9086 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9087 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9088 }
9089 }
9090
Peter Collingbourne39719a72015-11-20 20:49:39 +00009091 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9092 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009093}
9094
Douglas Katzman95354292015-06-23 20:42:09 +00009095void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9096 const InputInfo &Output,
9097 const InputInfoList &Inputs,
9098 const ArgList &Args,
9099 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009100 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009101 ArgStringList CmdArgs;
9102
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009103 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009104
9105 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009106 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009107
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009108 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009109 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009110
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009111 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009112 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009113}
9114
Douglas Katzman95354292015-06-23 20:42:09 +00009115void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9116 const InputInfo &Output,
9117 const InputInfoList &Inputs,
9118 const ArgList &Args,
9119 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009120 const Driver &D = getToolChain().getDriver();
9121 ArgStringList CmdArgs;
9122
Daniel Dunbarb440f562010-08-02 02:38:21 +00009123 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009124 CmdArgs.push_back("-o");
9125 CmdArgs.push_back(Output.getFilename());
9126 } else {
9127 assert(Output.isNothing() && "Invalid output.");
9128 }
9129
Douglas Katzman78b37b02015-11-17 20:28:07 +00009130 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009131 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9132 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9133 CmdArgs.push_back(
9134 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9135 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009136 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009137
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009138 Args.AddAllArgs(CmdArgs,
9139 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009140
Daniel Dunbar54423b22010-09-17 00:24:54 +00009141 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009142
Xinliang David Li69306c02015-10-22 06:15:31 +00009143 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009144
Douglas Katzman78b37b02015-11-17 20:28:07 +00009145 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009146 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009147 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009148 CmdArgs.push_back("-lm");
9149 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009150 }
9151
Douglas Katzman78b37b02015-11-17 20:28:07 +00009152 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009153 if (Args.hasArg(options::OPT_pthread))
9154 CmdArgs.push_back("-lpthread");
9155 CmdArgs.push_back("-lc");
9156 CmdArgs.push_back("-lCompilerRT-Generic");
9157 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9158 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009159 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009160 }
9161
Logan Chieneb9162f2014-06-26 14:23:45 +00009162 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009163 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009164}
9165
Daniel Dunbarcc912342009-05-02 18:28:39 +00009166/// DragonFly Tools
9167
9168// For now, DragonFly Assemble does just about the same as for
9169// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009170void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9171 const InputInfo &Output,
9172 const InputInfoList &Inputs,
9173 const ArgList &Args,
9174 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009175 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009176 ArgStringList CmdArgs;
9177
9178 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9179 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009180 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009181 CmdArgs.push_back("--32");
9182
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009183 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009184
9185 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009186 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009187
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009188 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009189 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009190
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009191 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009192 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009193}
9194
Douglas Katzman95354292015-06-23 20:42:09 +00009195void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9196 const InputInfo &Output,
9197 const InputInfoList &Inputs,
9198 const ArgList &Args,
9199 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009200 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009201 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009202
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009203 if (!D.SysRoot.empty())
9204 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9205
John McCall65b8da02013-04-11 22:55:55 +00009206 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009207 if (Args.hasArg(options::OPT_static)) {
9208 CmdArgs.push_back("-Bstatic");
9209 } else {
John McCall65b8da02013-04-11 22:55:55 +00009210 if (Args.hasArg(options::OPT_rdynamic))
9211 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009212 if (Args.hasArg(options::OPT_shared))
9213 CmdArgs.push_back("-Bshareable");
9214 else {
9215 CmdArgs.push_back("-dynamic-linker");
9216 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9217 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009218 CmdArgs.push_back("--hash-style=gnu");
9219 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009220 }
9221
9222 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9223 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009224 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009225 CmdArgs.push_back("-m");
9226 CmdArgs.push_back("elf_i386");
9227 }
9228
Daniel Dunbarb440f562010-08-02 02:38:21 +00009229 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009230 CmdArgs.push_back("-o");
9231 CmdArgs.push_back(Output.getFilename());
9232 } else {
9233 assert(Output.isNothing() && "Invalid output.");
9234 }
9235
Douglas Katzman78b37b02015-11-17 20:28:07 +00009236 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009237 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009238 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009239 CmdArgs.push_back(
9240 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009241 else {
9242 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009243 CmdArgs.push_back(
9244 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009245 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009246 CmdArgs.push_back(
9247 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009248 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009249 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009250 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009251 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009252 CmdArgs.push_back(
9253 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009254 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009255 CmdArgs.push_back(
9256 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009257 }
9258
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009259 Args.AddAllArgs(CmdArgs,
9260 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009261
Daniel Dunbar54423b22010-09-17 00:24:54 +00009262 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009263
Douglas Katzman78b37b02015-11-17 20:28:07 +00009264 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009265 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009266
9267 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009268 CmdArgs.push_back("-rpath");
9269 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009270 }
9271
Hans Wennborg70850d82013-07-18 20:29:38 +00009272 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009273 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009274 CmdArgs.push_back("-lm");
9275 }
9276
Daniel Dunbarcc912342009-05-02 18:28:39 +00009277 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009278 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009279
9280 if (!Args.hasArg(options::OPT_nolibc)) {
9281 CmdArgs.push_back("-lc");
9282 }
9283
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009284 if (Args.hasArg(options::OPT_static) ||
9285 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009286 CmdArgs.push_back("-lgcc");
9287 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009288 } else {
9289 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009290 CmdArgs.push_back("-lgcc_pic");
9291 if (!Args.hasArg(options::OPT_shared))
9292 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009293 } else {
John McCall65b8da02013-04-11 22:55:55 +00009294 CmdArgs.push_back("-lgcc");
9295 CmdArgs.push_back("--as-needed");
9296 CmdArgs.push_back("-lgcc_pic");
9297 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009298 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009299 }
9300 }
9301
Douglas Katzman78b37b02015-11-17 20:28:07 +00009302 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009303 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009304 CmdArgs.push_back(
9305 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009306 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009307 CmdArgs.push_back(
9308 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9309 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009310 }
9311
Xinliang David Li69306c02015-10-22 06:15:31 +00009312 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009313
Logan Chieneb9162f2014-06-26 14:23:45 +00009314 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009315 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009316}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009317
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009318// Try to find Exe from a Visual Studio distribution. This first tries to find
9319// an installed copy of Visual Studio and, failing that, looks in the PATH,
9320// making sure that whatever executable that's found is not a same-named exe
9321// from clang itself to prevent clang from falling back to itself.
9322static std::string FindVisualStudioExecutable(const ToolChain &TC,
9323 const char *Exe,
9324 const char *ClangProgramPath) {
9325 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9326 std::string visualStudioBinDir;
9327 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9328 visualStudioBinDir)) {
9329 SmallString<128> FilePath(visualStudioBinDir);
9330 llvm::sys::path::append(FilePath, Exe);
9331 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9332 return FilePath.str();
9333 }
9334
9335 return Exe;
9336}
9337
Douglas Katzman95354292015-06-23 20:42:09 +00009338void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9339 const InputInfo &Output,
9340 const InputInfoList &Inputs,
9341 const ArgList &Args,
9342 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009343 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009344 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009345
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009346 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9347 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009348 CmdArgs.push_back(
9349 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009350
Douglas Katzman78b37b02015-11-17 20:28:07 +00009351 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9352 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009353 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009354
Zachary Turner10d75b22014-10-22 20:40:43 +00009355 if (!llvm::sys::Process::GetEnv("LIB")) {
9356 // If the VC environment hasn't been configured (perhaps because the user
9357 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009358 // the environment variable is set however, assume the user knows what
9359 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009360 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009361 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009362 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9363 SmallString<128> LibDir(VisualStudioDir);
9364 llvm::sys::path::append(LibDir, "VC", "lib");
9365 switch (MSVC.getArch()) {
9366 case llvm::Triple::x86:
9367 // x86 just puts the libraries directly in lib
9368 break;
9369 case llvm::Triple::x86_64:
9370 llvm::sys::path::append(LibDir, "amd64");
9371 break;
9372 case llvm::Triple::arm:
9373 llvm::sys::path::append(LibDir, "arm");
9374 break;
9375 default:
9376 break;
9377 }
9378 CmdArgs.push_back(
9379 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009380
9381 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9382 std::string UniversalCRTLibPath;
9383 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9384 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9385 UniversalCRTLibPath.c_str()));
9386 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009387 }
9388
9389 std::string WindowsSdkLibPath;
9390 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9391 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9392 WindowsSdkLibPath.c_str()));
9393 }
9394
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009395 CmdArgs.push_back("-nologo");
9396
Reid Kleckner124955a2015-08-05 18:51:13 +00009397 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009398 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009399
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009400 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009401 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009402 if (DLL) {
9403 CmdArgs.push_back(Args.MakeArgString("-dll"));
9404
9405 SmallString<128> ImplibName(Output.getFilename());
9406 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009407 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009408 }
9409
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009410 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009411 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009412 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009413 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009414 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9415 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009416 // Make sure the dynamic runtime thunk is not optimized out at link time
9417 // to ensure proper SEH handling.
9418 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009419 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009420 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009421 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009422 for (const auto &Lib : {"asan", "asan_cxx"})
9423 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009424 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009425 }
9426
Hans Wennborg2e274592013-08-13 23:38:57 +00009427 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009428
Alexey Bataevc7e84352015-08-19 04:49:01 +00009429 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9430 options::OPT_fno_openmp, false)) {
9431 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9432 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9433 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9434 TC.getDriver().Dir + "/../lib"));
9435 switch (getOpenMPRuntime(getToolChain(), Args)) {
9436 case OMPRT_OMP:
9437 CmdArgs.push_back("-defaultlib:libomp.lib");
9438 break;
9439 case OMPRT_IOMP5:
9440 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9441 break;
9442 case OMPRT_GOMP:
9443 break;
9444 case OMPRT_Unknown:
9445 // Already diagnosed.
9446 break;
9447 }
9448 }
9449
Reid Kleckner337188f2014-09-16 19:22:00 +00009450 // Add filenames, libraries, and other linker inputs.
9451 for (const auto &Input : Inputs) {
9452 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009453 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009454 continue;
9455 }
9456
9457 const Arg &A = Input.getInputArg();
9458
9459 // Render -l options differently for the MSVC linker.
9460 if (A.getOption().matches(options::OPT_l)) {
9461 StringRef Lib = A.getValue();
9462 const char *LinkLibArg;
9463 if (Lib.endswith(".lib"))
9464 LinkLibArg = Args.MakeArgString(Lib);
9465 else
9466 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9467 CmdArgs.push_back(LinkLibArg);
9468 continue;
9469 }
9470
9471 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9472 // or -L. Render it, even if MSVC doesn't understand it.
9473 A.renderAsInput(Args, CmdArgs);
9474 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009475
Zachary Turner719f58c2014-12-01 23:06:47 +00009476 // We need to special case some linker paths. In the case of lld, we need to
9477 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9478 // linker, we need to use a special search algorithm.
9479 llvm::SmallString<128> linkPath;
9480 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9481 if (Linker.equals_lower("lld"))
9482 Linker = "lld-link";
9483
9484 if (Linker.equals_lower("link")) {
9485 // If we're using the MSVC linker, it's not sufficient to just use link
9486 // from the program PATH, because other environments like GnuWin32 install
9487 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009488 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009489 C.getDriver().getClangProgramPath());
9490 } else {
9491 linkPath = Linker;
9492 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009493 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009494 }
9495
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009496 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009497 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009498}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009499
Douglas Katzman95354292015-06-23 20:42:09 +00009500void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9501 const InputInfo &Output,
9502 const InputInfoList &Inputs,
9503 const ArgList &Args,
9504 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009505 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9506}
9507
Douglas Katzman95354292015-06-23 20:42:09 +00009508std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009509 Compilation &C, const JobAction &JA, const InputInfo &Output,
9510 const InputInfoList &Inputs, const ArgList &Args,
9511 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009512 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009513 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009514 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009515 CmdArgs.push_back("/W0"); // No warnings.
9516
9517 // The goal is to be able to invoke this tool correctly based on
9518 // any flag accepted by clang-cl.
9519
9520 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009521 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009522
9523 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009524 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9525 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9526 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009527 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9528 if (A->getOption().getID() == options::OPT_O0) {
9529 CmdArgs.push_back("/Od");
9530 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009531 CmdArgs.push_back("/Og");
9532
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009533 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009534 if (OptLevel == "s" || OptLevel == "z")
9535 CmdArgs.push_back("/Os");
9536 else
9537 CmdArgs.push_back("/Ot");
9538
9539 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009540 }
9541 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009542 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9543 options::OPT_fno_omit_frame_pointer))
9544 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9545 ? "/Oy"
9546 : "/Oy-");
9547 if (!Args.hasArg(options::OPT_fwritable_strings))
9548 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009549
Nico Weber3f8dafb2015-03-12 19:37:10 +00009550 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009551 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9552
David Majnemerf6072342014-07-01 22:24:56 +00009553 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9554 /*default=*/false))
9555 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009556 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9557 options::OPT_fno_function_sections))
9558 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9559 ? "/Gy"
9560 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009561 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9562 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009563 CmdArgs.push_back(
9564 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009565 if (Args.hasArg(options::OPT_fsyntax_only))
9566 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009567 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9568 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009569 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009570
Nico Weber3f8dafb2015-03-12 19:37:10 +00009571 std::vector<std::string> Includes =
9572 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009573 for (const auto &Include : Includes)
9574 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009575
Hans Wennborg87cfa712013-09-19 20:32:16 +00009576 // Flags that can simply be passed through.
9577 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9578 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009579 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009580 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009581
9582 // The order of these flags is relevant, so pick the last one.
9583 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9584 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9585 A->render(Args, CmdArgs);
9586
Hans Wennborg87cfa712013-09-19 20:32:16 +00009587 // Input filename.
9588 assert(Inputs.size() == 1);
9589 const InputInfo &II = Inputs[0];
9590 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9591 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9592 if (II.isFilename())
9593 CmdArgs.push_back(II.getFilename());
9594 else
9595 II.getInputArg().renderAsInput(Args, CmdArgs);
9596
9597 // Output filename.
9598 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009599 const char *Fo =
9600 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009601 CmdArgs.push_back(Fo);
9602
Hans Wennborg188382e2013-09-20 18:16:35 +00009603 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009604 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9605 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009606 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009607 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009608}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009609
Yaron Keren1c0070c2015-07-02 04:45:27 +00009610/// MinGW Tools
9611void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9612 const InputInfo &Output,
9613 const InputInfoList &Inputs,
9614 const ArgList &Args,
9615 const char *LinkingOutput) const {
9616 claimNoWarnArgs(Args);
9617 ArgStringList CmdArgs;
9618
9619 if (getToolChain().getArch() == llvm::Triple::x86) {
9620 CmdArgs.push_back("--32");
9621 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9622 CmdArgs.push_back("--64");
9623 }
9624
9625 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9626
9627 CmdArgs.push_back("-o");
9628 CmdArgs.push_back(Output.getFilename());
9629
9630 for (const auto &II : Inputs)
9631 CmdArgs.push_back(II.getFilename());
9632
9633 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009634 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009635
9636 if (Args.hasArg(options::OPT_gsplit_dwarf))
9637 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9638 SplitDebugName(Args, Inputs[0]));
9639}
9640
9641void MinGW::Linker::AddLibGCC(const ArgList &Args,
9642 ArgStringList &CmdArgs) const {
9643 if (Args.hasArg(options::OPT_mthreads))
9644 CmdArgs.push_back("-lmingwthrd");
9645 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009646
Yaron Kerenaa281332015-08-09 00:24:07 +00009647 // Make use of compiler-rt if --rtlib option is used
9648 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9649 if (RLT == ToolChain::RLT_Libgcc) {
9650 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9651 Args.hasArg(options::OPT_static);
9652 bool Shared = Args.hasArg(options::OPT_shared);
9653 bool CXX = getToolChain().getDriver().CCCIsCXX();
9654
9655 if (Static || (!CXX && !Shared)) {
9656 CmdArgs.push_back("-lgcc");
9657 CmdArgs.push_back("-lgcc_eh");
9658 } else {
9659 CmdArgs.push_back("-lgcc_s");
9660 CmdArgs.push_back("-lgcc");
9661 }
9662 } else {
9663 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9664 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009665
Yaron Keren1c0070c2015-07-02 04:45:27 +00009666 CmdArgs.push_back("-lmoldname");
9667 CmdArgs.push_back("-lmingwex");
9668 CmdArgs.push_back("-lmsvcrt");
9669}
9670
9671void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9672 const InputInfo &Output,
9673 const InputInfoList &Inputs,
9674 const ArgList &Args,
9675 const char *LinkingOutput) const {
9676 const ToolChain &TC = getToolChain();
9677 const Driver &D = TC.getDriver();
9678 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9679
9680 ArgStringList CmdArgs;
9681
9682 // Silence warning for "clang -g foo.o -o foo"
9683 Args.ClaimAllArgs(options::OPT_g_Group);
9684 // and "clang -emit-llvm foo.o -o foo"
9685 Args.ClaimAllArgs(options::OPT_emit_llvm);
9686 // and for "clang -w foo.o -o foo". Other warning options are already
9687 // handled somewhere else.
9688 Args.ClaimAllArgs(options::OPT_w);
9689
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009690 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9691 if (LinkerName.equals_lower("lld")) {
9692 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009693 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009694 } else if (!LinkerName.equals_lower("ld")) {
9695 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009696 }
9697
Yaron Keren1c0070c2015-07-02 04:45:27 +00009698 if (!D.SysRoot.empty())
9699 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9700
9701 if (Args.hasArg(options::OPT_s))
9702 CmdArgs.push_back("-s");
9703
9704 CmdArgs.push_back("-m");
9705 if (TC.getArch() == llvm::Triple::x86)
9706 CmdArgs.push_back("i386pe");
9707 if (TC.getArch() == llvm::Triple::x86_64)
9708 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009709 if (TC.getArch() == llvm::Triple::arm)
9710 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009711
9712 if (Args.hasArg(options::OPT_mwindows)) {
9713 CmdArgs.push_back("--subsystem");
9714 CmdArgs.push_back("windows");
9715 } else if (Args.hasArg(options::OPT_mconsole)) {
9716 CmdArgs.push_back("--subsystem");
9717 CmdArgs.push_back("console");
9718 }
9719
9720 if (Args.hasArg(options::OPT_static))
9721 CmdArgs.push_back("-Bstatic");
9722 else {
9723 if (Args.hasArg(options::OPT_mdll))
9724 CmdArgs.push_back("--dll");
9725 else if (Args.hasArg(options::OPT_shared))
9726 CmdArgs.push_back("--shared");
9727 CmdArgs.push_back("-Bdynamic");
9728 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9729 CmdArgs.push_back("-e");
9730 if (TC.getArch() == llvm::Triple::x86)
9731 CmdArgs.push_back("_DllMainCRTStartup@12");
9732 else
9733 CmdArgs.push_back("DllMainCRTStartup");
9734 CmdArgs.push_back("--enable-auto-image-base");
9735 }
9736 }
9737
9738 CmdArgs.push_back("-o");
9739 CmdArgs.push_back(Output.getFilename());
9740
9741 Args.AddAllArgs(CmdArgs, options::OPT_e);
9742 // FIXME: add -N, -n flags
9743 Args.AddLastArg(CmdArgs, options::OPT_r);
9744 Args.AddLastArg(CmdArgs, options::OPT_s);
9745 Args.AddLastArg(CmdArgs, options::OPT_t);
9746 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9747 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9748
Douglas Katzman78b37b02015-11-17 20:28:07 +00009749 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009750 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9751 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9752 } else {
9753 if (Args.hasArg(options::OPT_municode))
9754 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9755 else
9756 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9757 }
9758 if (Args.hasArg(options::OPT_pg))
9759 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9760 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9761 }
9762
9763 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009764 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009765 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9766
9767 // TODO: Add ASan stuff here
9768
9769 // TODO: Add profile stuff here
9770
Douglas Katzman78b37b02015-11-17 20:28:07 +00009771 if (D.CCCIsCXX() &&
9772 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009773 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9774 !Args.hasArg(options::OPT_static);
9775 if (OnlyLibstdcxxStatic)
9776 CmdArgs.push_back("-Bstatic");
9777 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9778 if (OnlyLibstdcxxStatic)
9779 CmdArgs.push_back("-Bdynamic");
9780 }
9781
9782 if (!Args.hasArg(options::OPT_nostdlib)) {
9783 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9784 if (Args.hasArg(options::OPT_static))
9785 CmdArgs.push_back("--start-group");
9786
9787 if (Args.hasArg(options::OPT_fstack_protector) ||
9788 Args.hasArg(options::OPT_fstack_protector_strong) ||
9789 Args.hasArg(options::OPT_fstack_protector_all)) {
9790 CmdArgs.push_back("-lssp_nonshared");
9791 CmdArgs.push_back("-lssp");
9792 }
9793 if (Args.hasArg(options::OPT_fopenmp))
9794 CmdArgs.push_back("-lgomp");
9795
9796 AddLibGCC(Args, CmdArgs);
9797
9798 if (Args.hasArg(options::OPT_pg))
9799 CmdArgs.push_back("-lgmon");
9800
Yaron Kerenadce68e2015-07-06 18:52:19 +00009801 if (Args.hasArg(options::OPT_pthread))
9802 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009803
9804 // add system libraries
9805 if (Args.hasArg(options::OPT_mwindows)) {
9806 CmdArgs.push_back("-lgdi32");
9807 CmdArgs.push_back("-lcomdlg32");
9808 }
9809 CmdArgs.push_back("-ladvapi32");
9810 CmdArgs.push_back("-lshell32");
9811 CmdArgs.push_back("-luser32");
9812 CmdArgs.push_back("-lkernel32");
9813
9814 if (Args.hasArg(options::OPT_static))
9815 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009816 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009817 AddLibGCC(Args, CmdArgs);
9818 }
9819
9820 if (!Args.hasArg(options::OPT_nostartfiles)) {
9821 // Add crtfastmath.o if available and fast math is enabled.
9822 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9823
9824 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9825 }
9826 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009827 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009828 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009829}
9830
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009831/// XCore Tools
9832// We pass assemble and link construction to the xcc tool.
9833
Douglas Katzman95354292015-06-23 20:42:09 +00009834void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9835 const InputInfo &Output,
9836 const InputInfoList &Inputs,
9837 const ArgList &Args,
9838 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009839 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009840 ArgStringList CmdArgs;
9841
9842 CmdArgs.push_back("-o");
9843 CmdArgs.push_back(Output.getFilename());
9844
9845 CmdArgs.push_back("-c");
9846
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009847 if (Args.hasArg(options::OPT_v))
9848 CmdArgs.push_back("-v");
9849
Robert Lytton894d25c2014-05-02 09:33:25 +00009850 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9851 if (!A->getOption().matches(options::OPT_g0))
9852 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009853
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009854 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9855 false))
9856 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009857
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009858 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009859
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009860 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009861 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009862
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009863 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009864 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009865}
9866
Douglas Katzman95354292015-06-23 20:42:09 +00009867void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9868 const InputInfo &Output,
9869 const InputInfoList &Inputs,
9870 const ArgList &Args,
9871 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009872 ArgStringList CmdArgs;
9873
9874 if (Output.isFilename()) {
9875 CmdArgs.push_back("-o");
9876 CmdArgs.push_back(Output.getFilename());
9877 } else {
9878 assert(Output.isNothing() && "Invalid output.");
9879 }
9880
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009881 if (Args.hasArg(options::OPT_v))
9882 CmdArgs.push_back("-v");
9883
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009884 // Pass -fexceptions through to the linker if it was present.
9885 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9886 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009887 CmdArgs.push_back("-fexceptions");
9888
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009889 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9890
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009891 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009892 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009893}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009894
Douglas Katzman95354292015-06-23 20:42:09 +00009895void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9896 const InputInfo &Output,
9897 const InputInfoList &Inputs,
9898 const ArgList &Args,
9899 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009900 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009901 const auto &TC =
9902 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9903 ArgStringList CmdArgs;
9904 const char *Exec;
9905
9906 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009907 default:
9908 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009909 case llvm::Triple::arm:
9910 case llvm::Triple::thumb:
9911 break;
9912 case llvm::Triple::x86:
9913 CmdArgs.push_back("--32");
9914 break;
9915 case llvm::Triple::x86_64:
9916 CmdArgs.push_back("--64");
9917 break;
9918 }
9919
9920 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9921
9922 CmdArgs.push_back("-o");
9923 CmdArgs.push_back(Output.getFilename());
9924
9925 for (const auto &Input : Inputs)
9926 CmdArgs.push_back(Input.getFilename());
9927
9928 const std::string Assembler = TC.GetProgramPath("as");
9929 Exec = Args.MakeArgString(Assembler);
9930
Justin Bognerd3371d82015-07-17 03:35:54 +00009931 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009932}
9933
Douglas Katzman95354292015-06-23 20:42:09 +00009934void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9935 const InputInfo &Output,
9936 const InputInfoList &Inputs,
9937 const ArgList &Args,
9938 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009939 const auto &TC =
9940 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9941 const llvm::Triple &T = TC.getTriple();
9942 const Driver &D = TC.getDriver();
9943 SmallString<128> EntryPoint;
9944 ArgStringList CmdArgs;
9945 const char *Exec;
9946
9947 // Silence warning for "clang -g foo.o -o foo"
9948 Args.ClaimAllArgs(options::OPT_g_Group);
9949 // and "clang -emit-llvm foo.o -o foo"
9950 Args.ClaimAllArgs(options::OPT_emit_llvm);
9951 // and for "clang -w foo.o -o foo"
9952 Args.ClaimAllArgs(options::OPT_w);
9953 // Other warning options are already handled somewhere else.
9954
9955 if (!D.SysRoot.empty())
9956 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9957
9958 if (Args.hasArg(options::OPT_pie))
9959 CmdArgs.push_back("-pie");
9960 if (Args.hasArg(options::OPT_rdynamic))
9961 CmdArgs.push_back("-export-dynamic");
9962 if (Args.hasArg(options::OPT_s))
9963 CmdArgs.push_back("--strip-all");
9964
9965 CmdArgs.push_back("-m");
9966 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009967 default:
9968 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009969 case llvm::Triple::arm:
9970 case llvm::Triple::thumb:
9971 // FIXME: this is incorrect for WinCE
9972 CmdArgs.push_back("thumb2pe");
9973 break;
9974 case llvm::Triple::x86:
9975 CmdArgs.push_back("i386pe");
9976 EntryPoint.append("_");
9977 break;
9978 case llvm::Triple::x86_64:
9979 CmdArgs.push_back("i386pep");
9980 break;
9981 }
9982
9983 if (Args.hasArg(options::OPT_shared)) {
9984 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009985 default:
9986 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009987 case llvm::Triple::arm:
9988 case llvm::Triple::thumb:
9989 case llvm::Triple::x86_64:
9990 EntryPoint.append("_DllMainCRTStartup");
9991 break;
9992 case llvm::Triple::x86:
9993 EntryPoint.append("_DllMainCRTStartup@12");
9994 break;
9995 }
9996
9997 CmdArgs.push_back("-shared");
9998 CmdArgs.push_back("-Bdynamic");
9999
10000 CmdArgs.push_back("--enable-auto-image-base");
10001
10002 CmdArgs.push_back("--entry");
10003 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10004 } else {
10005 EntryPoint.append("mainCRTStartup");
10006
10007 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10008 : "-Bdynamic");
10009
Douglas Katzman78b37b02015-11-17 20:28:07 +000010010 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010011 CmdArgs.push_back("--entry");
10012 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10013 }
10014
10015 // FIXME: handle subsystem
10016 }
10017
10018 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010019 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010020
10021 CmdArgs.push_back("-o");
10022 CmdArgs.push_back(Output.getFilename());
10023
10024 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10025 SmallString<261> ImpLib(Output.getFilename());
10026 llvm::sys::path::replace_extension(ImpLib, ".lib");
10027
10028 CmdArgs.push_back("--out-implib");
10029 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10030 }
10031
Douglas Katzman78b37b02015-11-17 20:28:07 +000010032 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010033 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10034 const char *CRTBegin;
10035
10036 CRTBegin =
10037 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10038 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10039 }
10040
10041 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010042 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010043 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10044
10045 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10046 !Args.hasArg(options::OPT_nodefaultlibs)) {
10047 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10048 !Args.hasArg(options::OPT_static);
10049 if (StaticCXX)
10050 CmdArgs.push_back("-Bstatic");
10051 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10052 if (StaticCXX)
10053 CmdArgs.push_back("-Bdynamic");
10054 }
10055
10056 if (!Args.hasArg(options::OPT_nostdlib)) {
10057 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10058 // TODO handle /MT[d] /MD[d]
10059 CmdArgs.push_back("-lmsvcrt");
10060 AddRunTimeLibs(TC, D, CmdArgs, Args);
10061 }
10062 }
10063
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010064 if (TC.getSanitizerArgs().needsAsanRt()) {
10065 // TODO handle /MT[d] /MD[d]
10066 if (Args.hasArg(options::OPT_shared)) {
10067 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10068 } else {
10069 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10070 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10071 // Make sure the dynamic runtime thunk is not optimized out at link time
10072 // to ensure proper SEH handling.
10073 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10074 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10075 ? "___asan_seh_interceptor"
10076 : "__asan_seh_interceptor"));
10077 }
10078 }
10079
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010080 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010081
Justin Bognerd3371d82015-07-17 03:35:54 +000010082 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010083}
Douglas Katzman84a75642015-06-19 14:55:19 +000010084
Douglas Katzman95354292015-06-23 20:42:09 +000010085void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10086 const InputInfo &Output,
10087 const InputInfoList &Inputs,
10088 const ArgList &Args,
10089 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010090 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010091 assert(Inputs.size() == 1);
10092 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010093 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10094 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010095
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010096 if (JA.getKind() == Action::PreprocessJobClass) {
10097 Args.ClaimAllArgs();
10098 CmdArgs.push_back("-E");
10099 } else {
10100 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10101 CmdArgs.push_back("-S");
10102 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10103 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010104 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010105 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010106
Douglas Katzmanf6071112015-08-03 14:34:22 +000010107 // Append all -I, -iquote, -isystem paths, defines/undefines,
10108 // 'f' flags, optimize flags, and warning options.
10109 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010110 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010111 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010112 options::OPT_f_Group, options::OPT_f_clang_Group,
10113 options::OPT_g_Group, options::OPT_M_Group,
10114 options::OPT_O_Group, options::OPT_W_Group});
10115
10116 // If we're producing a dependency file, and assembly is the final action,
10117 // then the name of the target in the dependency file should be the '.o'
10118 // file, not the '.s' file produced by this step. For example, instead of
10119 // /tmp/mumble.s: mumble.c .../someheader.h
10120 // the filename on the lefthand side should be "mumble.o"
10121 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10122 C.getActions().size() == 1 &&
10123 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10124 Arg *A = Args.getLastArg(options::OPT_o);
10125 if (A) {
10126 CmdArgs.push_back("-MT");
10127 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10128 }
10129 }
10130
Douglas Katzman84a75642015-06-19 14:55:19 +000010131 CmdArgs.push_back(II.getFilename());
10132 CmdArgs.push_back("-o");
10133 CmdArgs.push_back(Output.getFilename());
10134
10135 std::string Exec =
10136 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010137 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10138 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010139}
10140
Douglas Katzman95354292015-06-23 20:42:09 +000010141void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10142 const InputInfo &Output,
10143 const InputInfoList &Inputs,
10144 const ArgList &Args,
10145 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010146 ArgStringList CmdArgs;
10147
10148 assert(Inputs.size() == 1);
10149 const InputInfo &II = Inputs[0];
10150 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10151 assert(Output.getType() == types::TY_Object);
10152
10153 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010154 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010155 CmdArgs.push_back("-noSPrefixing");
10156 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010157 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10158 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10159 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010160 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010161 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010162 }
10163 CmdArgs.push_back("-elf"); // Output format.
10164 CmdArgs.push_back(II.getFilename());
10165 CmdArgs.push_back(
10166 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10167
10168 std::string Exec =
10169 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010170 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10171 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010172}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010173
10174void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10175 const InputInfo &Output,
10176 const InputInfoList &Inputs,
10177 const ArgList &Args,
10178 const char *LinkingOutput) const {
10179 const auto &TC =
10180 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10181 const llvm::Triple &T = TC.getTriple();
10182 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010183 bool UseStartfiles =
10184 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010185 bool UseDefaultLibs =
10186 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010187
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010188 if (T.getArch() == llvm::Triple::sparc)
10189 CmdArgs.push_back("-EB");
10190 else // SHAVE assumes little-endian, and sparcel is expressly so.
10191 CmdArgs.push_back("-EL");
10192
10193 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10194 // but we never pass through a --sysroot option and various other bits.
10195 // For example, there are no sanitizers (yet) nor gold linker.
10196
10197 // Eat some arguments that may be present but have no effect.
10198 Args.ClaimAllArgs(options::OPT_g_Group);
10199 Args.ClaimAllArgs(options::OPT_w);
10200 Args.ClaimAllArgs(options::OPT_static_libgcc);
10201
10202 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10203 CmdArgs.push_back("-s");
10204
10205 CmdArgs.push_back("-o");
10206 CmdArgs.push_back(Output.getFilename());
10207
10208 if (UseStartfiles) {
10209 // If you want startfiles, it means you want the builtin crti and crtbegin,
10210 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010211 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10212 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010213 }
10214
10215 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10216 options::OPT_e, options::OPT_s, options::OPT_t,
10217 options::OPT_Z_Flag, options::OPT_r});
10218
Douglas Katzman674a3122015-11-18 16:24:46 +000010219 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010220
10221 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10222
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010223 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010224 if (C.getDriver().CCCIsCXX())
10225 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010226 if (T.getOS() == llvm::Triple::RTEMS) {
10227 CmdArgs.push_back("--start-group");
10228 CmdArgs.push_back("-lc");
10229 // You must provide your own "-L" option to enable finding these.
10230 CmdArgs.push_back("-lrtemscpu");
10231 CmdArgs.push_back("-lrtemsbsp");
10232 CmdArgs.push_back("--end-group");
10233 } else {
10234 CmdArgs.push_back("-lc");
10235 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010236 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010237 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010238 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010239 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10240 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010241 }
10242
10243 std::string Exec =
10244 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10245 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10246 CmdArgs, Inputs));
10247}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010248
10249void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10250 const InputInfo &Output,
10251 const InputInfoList &Inputs,
10252 const ArgList &Args,
10253 const char *LinkingOutput) const {
10254 claimNoWarnArgs(Args);
10255 ArgStringList CmdArgs;
10256
10257 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10258
10259 CmdArgs.push_back("-o");
10260 CmdArgs.push_back(Output.getFilename());
10261
10262 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10263 const InputInfo &Input = Inputs[0];
10264 assert(Input.isFilename() && "Invalid input.");
10265 CmdArgs.push_back(Input.getFilename());
10266
10267 const char *Exec =
10268 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10269 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10270}
10271
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010272static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10273 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10274 if (SanArgs.needsUbsanRt()) {
10275 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10276 }
10277 if (SanArgs.needsAsanRt()) {
10278 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10279 }
10280}
10281
10282static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10283 const JobAction &JA, const InputInfo &Output,
10284 const InputInfoList &Inputs,
10285 const ArgList &Args,
10286 const char *LinkingOutput) {
10287 const toolchains::FreeBSD &ToolChain =
10288 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10289 const Driver &D = ToolChain.getDriver();
10290 ArgStringList CmdArgs;
10291
10292 // Silence warning for "clang -g foo.o -o foo"
10293 Args.ClaimAllArgs(options::OPT_g_Group);
10294 // and "clang -emit-llvm foo.o -o foo"
10295 Args.ClaimAllArgs(options::OPT_emit_llvm);
10296 // and for "clang -w foo.o -o foo". Other warning options are already
10297 // handled somewhere else.
10298 Args.ClaimAllArgs(options::OPT_w);
10299
10300 if (!D.SysRoot.empty())
10301 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10302
10303 if (Args.hasArg(options::OPT_pie))
10304 CmdArgs.push_back("-pie");
10305
10306 if (Args.hasArg(options::OPT_rdynamic))
10307 CmdArgs.push_back("-export-dynamic");
10308 if (Args.hasArg(options::OPT_shared))
10309 CmdArgs.push_back("--oformat=so");
10310
10311 if (Output.isFilename()) {
10312 CmdArgs.push_back("-o");
10313 CmdArgs.push_back(Output.getFilename());
10314 } else {
10315 assert(Output.isNothing() && "Invalid output.");
10316 }
10317
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010318 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10319
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010320 Args.AddAllArgs(CmdArgs, options::OPT_L);
10321 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10322 Args.AddAllArgs(CmdArgs, options::OPT_e);
10323 Args.AddAllArgs(CmdArgs, options::OPT_s);
10324 Args.AddAllArgs(CmdArgs, options::OPT_t);
10325 Args.AddAllArgs(CmdArgs, options::OPT_r);
10326
10327 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10328 CmdArgs.push_back("--no-demangle");
10329
10330 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10331
10332 if (Args.hasArg(options::OPT_pthread)) {
10333 CmdArgs.push_back("-lpthread");
10334 }
10335
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010336 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10337
10338 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10339}
10340
10341static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10342 const JobAction &JA, const InputInfo &Output,
10343 const InputInfoList &Inputs,
10344 const ArgList &Args,
10345 const char *LinkingOutput) {
10346 const toolchains::FreeBSD &ToolChain =
10347 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10348 const Driver &D = ToolChain.getDriver();
10349 ArgStringList CmdArgs;
10350
10351 // Silence warning for "clang -g foo.o -o foo"
10352 Args.ClaimAllArgs(options::OPT_g_Group);
10353 // and "clang -emit-llvm foo.o -o foo"
10354 Args.ClaimAllArgs(options::OPT_emit_llvm);
10355 // and for "clang -w foo.o -o foo". Other warning options are already
10356 // handled somewhere else.
10357 Args.ClaimAllArgs(options::OPT_w);
10358
10359 if (!D.SysRoot.empty())
10360 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10361
10362 if (Args.hasArg(options::OPT_pie))
10363 CmdArgs.push_back("-pie");
10364
10365 if (Args.hasArg(options::OPT_static)) {
10366 CmdArgs.push_back("-Bstatic");
10367 } else {
10368 if (Args.hasArg(options::OPT_rdynamic))
10369 CmdArgs.push_back("-export-dynamic");
10370 CmdArgs.push_back("--eh-frame-hdr");
10371 if (Args.hasArg(options::OPT_shared)) {
10372 CmdArgs.push_back("-Bshareable");
10373 } else {
10374 CmdArgs.push_back("-dynamic-linker");
10375 CmdArgs.push_back("/libexec/ld-elf.so.1");
10376 }
10377 CmdArgs.push_back("--enable-new-dtags");
10378 }
10379
10380 if (Output.isFilename()) {
10381 CmdArgs.push_back("-o");
10382 CmdArgs.push_back(Output.getFilename());
10383 } else {
10384 assert(Output.isNothing() && "Invalid output.");
10385 }
10386
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010387 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10388
Douglas Katzman78b37b02015-11-17 20:28:07 +000010389 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010390 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010391 if (!Args.hasArg(options::OPT_shared)) {
10392 if (Args.hasArg(options::OPT_pg))
10393 crt1 = "gcrt1.o";
10394 else if (Args.hasArg(options::OPT_pie))
10395 crt1 = "Scrt1.o";
10396 else
10397 crt1 = "crt1.o";
10398 }
10399 if (crt1)
10400 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10401
10402 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10403
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010404 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010405 if (Args.hasArg(options::OPT_static))
10406 crtbegin = "crtbeginT.o";
10407 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10408 crtbegin = "crtbeginS.o";
10409 else
10410 crtbegin = "crtbegin.o";
10411
10412 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10413 }
10414
10415 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010416 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010417 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10418 Args.AddAllArgs(CmdArgs, options::OPT_e);
10419 Args.AddAllArgs(CmdArgs, options::OPT_s);
10420 Args.AddAllArgs(CmdArgs, options::OPT_t);
10421 Args.AddAllArgs(CmdArgs, options::OPT_r);
10422
10423 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10424 CmdArgs.push_back("--no-demangle");
10425
10426 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10427
Douglas Katzman78b37b02015-11-17 20:28:07 +000010428 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010429 // For PS4, we always want to pass libm, libstdc++ and libkernel
10430 // libraries for both C and C++ compilations.
10431 CmdArgs.push_back("-lkernel");
10432 if (D.CCCIsCXX()) {
10433 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10434 if (Args.hasArg(options::OPT_pg))
10435 CmdArgs.push_back("-lm_p");
10436 else
10437 CmdArgs.push_back("-lm");
10438 }
10439 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10440 // the default system libraries. Just mimic this for now.
10441 if (Args.hasArg(options::OPT_pg))
10442 CmdArgs.push_back("-lgcc_p");
10443 else
10444 CmdArgs.push_back("-lcompiler_rt");
10445 if (Args.hasArg(options::OPT_static)) {
10446 CmdArgs.push_back("-lstdc++");
10447 } else if (Args.hasArg(options::OPT_pg)) {
10448 CmdArgs.push_back("-lgcc_eh_p");
10449 } else {
10450 CmdArgs.push_back("--as-needed");
10451 CmdArgs.push_back("-lstdc++");
10452 CmdArgs.push_back("--no-as-needed");
10453 }
10454
10455 if (Args.hasArg(options::OPT_pthread)) {
10456 if (Args.hasArg(options::OPT_pg))
10457 CmdArgs.push_back("-lpthread_p");
10458 else
10459 CmdArgs.push_back("-lpthread");
10460 }
10461
10462 if (Args.hasArg(options::OPT_pg)) {
10463 if (Args.hasArg(options::OPT_shared))
10464 CmdArgs.push_back("-lc");
10465 else {
10466 if (Args.hasArg(options::OPT_static)) {
10467 CmdArgs.push_back("--start-group");
10468 CmdArgs.push_back("-lc_p");
10469 CmdArgs.push_back("-lpthread_p");
10470 CmdArgs.push_back("--end-group");
10471 } else {
10472 CmdArgs.push_back("-lc_p");
10473 }
10474 }
10475 CmdArgs.push_back("-lgcc_p");
10476 } else {
10477 if (Args.hasArg(options::OPT_static)) {
10478 CmdArgs.push_back("--start-group");
10479 CmdArgs.push_back("-lc");
10480 CmdArgs.push_back("-lpthread");
10481 CmdArgs.push_back("--end-group");
10482 } else {
10483 CmdArgs.push_back("-lc");
10484 }
10485 CmdArgs.push_back("-lcompiler_rt");
10486 }
10487
10488 if (Args.hasArg(options::OPT_static)) {
10489 CmdArgs.push_back("-lstdc++");
10490 } else if (Args.hasArg(options::OPT_pg)) {
10491 CmdArgs.push_back("-lgcc_eh_p");
10492 } else {
10493 CmdArgs.push_back("--as-needed");
10494 CmdArgs.push_back("-lstdc++");
10495 CmdArgs.push_back("--no-as-needed");
10496 }
10497 }
10498
Douglas Katzman78b37b02015-11-17 20:28:07 +000010499 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010500 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10501 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10502 else
10503 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10504 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10505 }
10506
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010507 const char *Exec =
10508#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010509 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010510#else
10511 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10512#endif
10513
10514 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10515}
10516
10517void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10518 const InputInfo &Output,
10519 const InputInfoList &Inputs,
10520 const ArgList &Args,
10521 const char *LinkingOutput) const {
10522 const toolchains::FreeBSD &ToolChain =
10523 static_cast<const toolchains::FreeBSD &>(getToolChain());
10524 const Driver &D = ToolChain.getDriver();
10525 bool PS4Linker;
10526 StringRef LinkerOptName;
10527 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10528 LinkerOptName = A->getValue();
10529 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10530 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10531 }
10532
10533 if (LinkerOptName == "gold")
10534 PS4Linker = false;
10535 else if (LinkerOptName == "ps4")
10536 PS4Linker = true;
10537 else
10538 PS4Linker = !Args.hasArg(options::OPT_shared);
10539
10540 if (PS4Linker)
10541 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10542 else
10543 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10544}