blob: 84681053dd1a4fb5209738e1a74acbae984df2d8 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000389 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000390 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000391 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
393 RenderedImplicitInclude = true;
394
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000395 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000396 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000397
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000398 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000399 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000400 SmallString<128> P(A->getValue());
401 // We want the files to have a name like foo.h.pch. Add a dummy extension
402 // so that replace_extension does the right thing.
403 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000404 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000405 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000406 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000407 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000408 }
409
Douglas Gregor111af7d2009-04-18 00:34:01 +0000410 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000411 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000413 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000414 }
415
Douglas Gregor111af7d2009-04-18 00:34:01 +0000416 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000417 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000419 FoundPCH = UsePCH;
420 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000421 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000422 }
423
424 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000425 if (IsFirstImplicitInclude) {
426 A->claim();
427 if (UsePCH)
428 CmdArgs.push_back("-include-pch");
429 else
430 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000431 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000432 continue;
433 } else {
434 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000435 D.Diag(diag::warn_drv_pch_not_first_include) << P
436 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000437 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000438 }
439 }
440
441 // Not translated, render as usual.
442 A->claim();
443 A->render(Args, CmdArgs);
444 }
445
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000446 Args.AddAllArgs(CmdArgs,
447 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
448 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000450 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000451
452 // FIXME: There is a very unfortunate problem here, some troubled
453 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
454 // really support that we would have to parse and then translate
455 // those options. :(
456 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
457 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000458
459 // -I- is a deprecated GCC feature, reject it.
460 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000461 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000462
463 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
464 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000465 StringRef sysroot = C.getSysRoot();
466 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000467 if (!Args.hasArg(options::OPT_isysroot)) {
468 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000469 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000470 }
471 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000472
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000473 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000474 // FIXME: We should probably sink the logic for handling these from the
475 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000476 // CPATH - included following the user specified includes (but prior to
477 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000478 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000479 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000480 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000481 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000482 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000483 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000484 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000485 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000486 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000487
Artem Belevichfa11ab52015-11-17 22:28:46 +0000488 // Optional AuxToolChain indicates that we need to include headers
489 // for more than one target. If that's the case, add include paths
490 // from AuxToolChain right after include paths of the same kind for
491 // the current target.
492
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000493 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000494 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000495 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000496 if (AuxToolChain)
497 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
498 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000499
500 // Add system include arguments.
501 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000502 if (AuxToolChain)
503 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
504
505 // Add CUDA include arguments, if needed.
506 if (types::isCuda(Inputs[0].getType()))
507 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000508}
509
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000510// FIXME: Move to target hook.
511static bool isSignedCharDefault(const llvm::Triple &Triple) {
512 switch (Triple.getArch()) {
513 default:
514 return true;
515
Tim Northover9bb857a2013-01-31 12:13:10 +0000516 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000517 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000518 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000519 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000522 if (Triple.isOSDarwin() || Triple.isOSWindows())
523 return true;
524 return false;
525
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000526 case llvm::Triple::ppc:
527 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000528 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000529 return true;
530 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000531
David Majnemerdcecd932015-05-23 19:23:55 +0000532 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000533 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000534 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000535 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000536 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000537 }
538}
539
Robert Lytton0e076492013-08-13 09:43:10 +0000540static bool isNoCommonDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return false;
544
545 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000546 case llvm::Triple::wasm32:
547 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000548 return true;
549 }
550}
551
Renato Goline17c5802015-07-27 23:44:42 +0000552// ARM tools start.
553
554// Get SubArch (vN).
555static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
556 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000557 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000558}
559
560// True if M-profile.
561static bool isARMMProfile(const llvm::Triple &Triple) {
562 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000563 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000564 return Profile == llvm::ARM::PK_M;
565}
566
567// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000568static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
569 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000570 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
571 CPU = A->getValue();
572 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
573 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000574 if (!FromAs)
575 return;
576
577 for (const Arg *A :
578 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
579 StringRef Value = A->getValue();
580 if (Value.startswith("-mcpu="))
581 CPU = Value.substr(6);
582 if (Value.startswith("-march="))
583 Arch = Value.substr(7);
584 }
Renato Goline17c5802015-07-27 23:44:42 +0000585}
586
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000587// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000588// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000589static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000590 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000591 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000592 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
593 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
595}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000596
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000597// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000598static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000599 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000600 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000601 unsigned FPUID = llvm::ARM::parseFPU(FPU);
602 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000603 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
604}
605
Bradley Smithbbf5a002015-11-18 16:33:48 +0000606// Decode ARM features from string like +[no]featureA+[no]featureB+...
607static bool DecodeARMFeatures(const Driver &D, StringRef text,
608 std::vector<const char *> &Features) {
609 SmallVector<StringRef, 8> Split;
610 text.split(Split, StringRef("+"), -1, false);
611
612 for (StringRef Feature : Split) {
613 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
614 if (FeatureName)
615 Features.push_back(FeatureName);
616 else
617 return false;
618 }
619 return true;
620}
621
Renato Golin7c542b42015-07-27 23:44:45 +0000622// Check if -march is valid by checking if it can be canonicalised and parsed.
623// getARMArch is used here instead of just checking the -march value in order
624// to handle -march=native correctly.
625static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000626 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000627 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000628 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000629 std::pair<StringRef, StringRef> Split = ArchName.split("+");
630
Renato Goline17c5802015-07-27 23:44:42 +0000631 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000632 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
633 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000634 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000635}
636
Renato Golin7c542b42015-07-27 23:44:45 +0000637// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
638static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
639 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000640 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000641 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000642 std::pair<StringRef, StringRef> Split = CPUName.split("+");
643
Renato Goline17c5802015-07-27 23:44:42 +0000644 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000645 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
646 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000647 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000648}
649
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000650static bool useAAPCSForMachO(const llvm::Triple &T) {
651 // The backend is hardwired to assume AAPCS for M-class processors, ensure
652 // the frontend matches that.
653 return T.getEnvironment() == llvm::Triple::EABI ||
654 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
655}
656
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000657// Select the float ABI as determined by -msoft-float, -mhard-float, and
658// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000659arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
660 const Driver &D = TC.getDriver();
661 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 auto SubArch = getARMSubArchVersionNumber(Triple);
663 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000664 if (Arg *A =
665 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
666 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000667 if (A->getOption().matches(options::OPT_msoft_float)) {
668 ABI = FloatABI::Soft;
669 } else if (A->getOption().matches(options::OPT_mhard_float)) {
670 ABI = FloatABI::Hard;
671 } else {
672 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
673 .Case("soft", FloatABI::Soft)
674 .Case("softfp", FloatABI::SoftFP)
675 .Case("hard", FloatABI::Hard)
676 .Default(FloatABI::Invalid);
677 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000678 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000679 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000680 }
681 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000682
683 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
684 // "apcs-gnu".
685 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000686 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000687 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
688 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000689 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000690 }
691
692 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000693 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000694 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000695 case llvm::Triple::Darwin:
696 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000697 case llvm::Triple::IOS:
698 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000699 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000700 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000701 break;
702 }
Tim Northover756447a2015-10-30 16:30:36 +0000703 case llvm::Triple::WatchOS:
704 ABI = FloatABI::Hard;
705 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000706
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000707 // FIXME: this is invalid for WindowsCE
708 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000709 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000710 break;
711
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000712 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000713 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000714 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000715 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000716 break;
717 default:
718 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000719 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000720 break;
721 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000722 break;
723
Daniel Dunbar78485922009-09-10 23:00:09 +0000724 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000725 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000726 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 case llvm::Triple::EABIHF:
728 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000729 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000730 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000731 case llvm::Triple::EABI:
732 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000733 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000734 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000735 case llvm::Triple::Android:
736 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000737 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000738 default:
739 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000740 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000741 if (Triple.getOS() != llvm::Triple::UnknownOS ||
742 !Triple.isOSBinFormatMachO())
743 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000744 break;
745 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000746 }
747 }
748
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000749 assert(ABI != FloatABI::Invalid && "must select an ABI");
750 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000751}
752
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000753static void getARMTargetFeatures(const ToolChain &TC,
754 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000755 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000756 std::vector<const char *> &Features,
757 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000758 const Driver &D = TC.getDriver();
759
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000760 bool KernelOrKext =
761 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000762 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000763 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
764 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
765
Nico Weber6e0ebae2015-04-29 21:16:40 +0000766 if (!ForAS) {
767 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
768 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
769 // stripped out by the ARM target. We should probably pass this a new
770 // -target-option, which is handled by the -cc1/-cc1as invocation.
771 //
772 // FIXME2: For consistency, it would be ideal if we set up the target
773 // machine state the same when using the frontend or the assembler. We don't
774 // currently do that for the assembler, we pass the options directly to the
775 // backend and never even instantiate the frontend TargetInfo. If we did,
776 // and used its handleTargetFeatures hook, then we could ensure the
777 // assembler and the frontend behave the same.
778
779 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000780 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000781 Features.push_back("+soft-float");
782
783 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000784 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000785 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000786 } else {
787 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
788 // to the assembler correctly.
789 for (const Arg *A :
790 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
791 StringRef Value = A->getValue();
792 if (Value.startswith("-mfpu=")) {
793 WaFPU = A;
794 } else if (Value.startswith("-mcpu=")) {
795 WaCPU = A;
796 } else if (Value.startswith("-mhwdiv=")) {
797 WaHDiv = A;
798 } else if (Value.startswith("-march=")) {
799 WaArch = A;
800 }
801 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000802 }
803
Renato Golin7c542b42015-07-27 23:44:45 +0000804 // Check -march. ClangAs gives preference to -Wa,-march=.
805 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000806 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000807 if (WaArch) {
808 if (ArchArg)
809 D.Diag(clang::diag::warn_drv_unused_argument)
810 << ArchArg->getAsString(Args);
811 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000812 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000813 // FIXME: Set Arch.
814 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
815 } else if (ArchArg) {
816 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000817 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000818 }
819
Renato Golin7c542b42015-07-27 23:44:45 +0000820 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
821 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000822 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000823 if (WaCPU) {
824 if (CPUArg)
825 D.Diag(clang::diag::warn_drv_unused_argument)
826 << CPUArg->getAsString(Args);
827 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000828 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000829 } else if (CPUArg) {
830 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000831 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000832 }
John Brawna95c1a82015-05-08 12:52:18 +0000833
Renato Golin23459c62015-07-30 16:40:17 +0000834 // Add CPU features for generic CPUs
835 if (CPUName == "native") {
836 llvm::StringMap<bool> HostFeatures;
837 if (llvm::sys::getHostCPUFeatures(HostFeatures))
838 for (auto &F : HostFeatures)
839 Features.push_back(
840 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
841 }
842
843 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
844 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
845 if (WaFPU) {
846 if (FPUArg)
847 D.Diag(clang::diag::warn_drv_unused_argument)
848 << FPUArg->getAsString(Args);
849 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
850 Features);
851 } else if (FPUArg) {
852 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
853 }
854
855 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
856 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
857 if (WaHDiv) {
858 if (HDivArg)
859 D.Diag(clang::diag::warn_drv_unused_argument)
860 << HDivArg->getAsString(Args);
861 getARMHWDivFeatures(D, WaHDiv, Args,
862 StringRef(WaHDiv->getValue()).substr(8), Features);
863 } else if (HDivArg)
864 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
865
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000866 // Setting -msoft-float effectively disables NEON because of the GCC
867 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000868 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000869 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000870 // Also need to explicitly disable features which imply NEON.
871 Features.push_back("-crypto");
872 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000873
Eric Christopher269c2a22015-04-04 03:34:43 +0000874 // En/disable crc code generation.
875 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000876 if (A->getOption().matches(options::OPT_mcrc))
877 Features.push_back("+crc");
878 else
879 Features.push_back("-crc");
880 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000881
882 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
883 Features.insert(Features.begin(), "+v8.1a");
884 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000885
Akira Hatanakac2694822015-07-07 08:28:42 +0000886 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
887 // neither options are specified, see if we are compiling for kernel/kext and
888 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000889 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
890 options::OPT_mno_long_calls)) {
891 if (A->getOption().matches(options::OPT_mlong_calls))
892 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000893 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
894 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000895 Features.push_back("+long-calls");
896 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000897
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000898 // Kernel code has more strict alignment requirements.
899 if (KernelOrKext)
900 Features.push_back("+strict-align");
901 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
902 options::OPT_munaligned_access)) {
903 if (A->getOption().matches(options::OPT_munaligned_access)) {
904 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
905 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
906 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
907 } else
908 Features.push_back("+strict-align");
909 } else {
910 // Assume pre-ARMv6 doesn't support unaligned accesses.
911 //
912 // ARMv6 may or may not support unaligned accesses depending on the
913 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
914 // Darwin and NetBSD targets support unaligned accesses, and others don't.
915 //
916 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
917 // which raises an alignment fault on unaligned accesses. Linux
918 // defaults this bit to 0 and handles it as a system-wide (not
919 // per-process) setting. It is therefore safe to assume that ARMv7+
920 // Linux targets support unaligned accesses. The same goes for NaCl.
921 //
922 // The above behavior is consistent with GCC.
923 int VersionNum = getARMSubArchVersionNumber(Triple);
924 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000925 if (VersionNum < 6 ||
926 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000927 Features.push_back("+strict-align");
928 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
929 if (VersionNum < 7)
930 Features.push_back("+strict-align");
931 } else
932 Features.push_back("+strict-align");
933 }
934
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000935 // llvm does not support reserving registers in general. There is support
936 // for reserving r9 on ARM though (defined as a platform-specific register
937 // in ARM EABI).
938 if (Args.hasArg(options::OPT_ffixed_r9))
939 Features.push_back("+reserve-r9");
940
Dimitry Andric08107392016-01-06 07:42:18 +0000941 // The kext linker doesn't know how to deal with movw/movt.
942 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +0000943 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000944}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000945
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000946void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
947 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000948 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000949 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000950 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000951 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000952 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000953 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000954 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000955 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000956 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000957 } else if (Triple.isWatchOS()) {
958 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000959 } else {
960 ABIName = "apcs-gnu";
961 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000962 } else if (Triple.isOSWindows()) {
963 // FIXME: this is invalid for WindowsCE
964 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000965 } else {
966 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000967 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000968 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000969 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000970 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000971 ABIName = "aapcs-linux";
972 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000973 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000974 case llvm::Triple::EABI:
975 ABIName = "aapcs";
976 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000977 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000978 if (Triple.getOS() == llvm::Triple::NetBSD)
979 ABIName = "apcs-gnu";
980 else
981 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000982 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000983 }
984 }
985 CmdArgs.push_back("-target-abi");
986 CmdArgs.push_back(ABIName);
987
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000988 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000989 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000990 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000991 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000992 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000993 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000994 CmdArgs.push_back("-mfloat-abi");
995 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000996 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000997 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000998 CmdArgs.push_back("-mfloat-abi");
999 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001000 } else {
1001 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001002 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001003 CmdArgs.push_back("-mfloat-abi");
1004 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001005 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001006
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001008 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1009 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001011 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001012 CmdArgs.push_back("-arm-global-merge=false");
1013 else
1014 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001015 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001016
Bob Wilson9c8af452013-04-11 18:53:25 +00001017 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001018 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001019 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001020}
Renato Goline17c5802015-07-27 23:44:42 +00001021// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001022
Tim Northover573cbee2014-05-24 12:52:07 +00001023/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1024/// targeting.
1025static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001026 Arg *A;
1027 std::string CPU;
1028 // If we have -mtune or -mcpu, use that.
1029 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001030 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001031 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001032 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001033 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001034 }
1035
Kevin Qin110db6f2014-07-18 07:03:22 +00001036 // Handle CPU name is 'native'.
1037 if (CPU == "native")
1038 return llvm::sys::getHostCPUName();
1039 else if (CPU.size())
1040 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001041
James Molloy9b1586b2014-04-17 12:51:17 +00001042 // Make sure we pick "cyclone" if -arch is used.
1043 // FIXME: Should this be picked by checking the target triple instead?
1044 if (Args.getLastArg(options::OPT_arch))
1045 return "cyclone";
1046
1047 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001048}
1049
Tim Northover573cbee2014-05-24 12:52:07 +00001050void Clang::AddAArch64TargetArgs(const ArgList &Args,
1051 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001052 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1053 llvm::Triple Triple(TripleStr);
1054
1055 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1056 Args.hasArg(options::OPT_mkernel) ||
1057 Args.hasArg(options::OPT_fapple_kext))
1058 CmdArgs.push_back("-disable-red-zone");
1059
1060 if (!Args.hasFlag(options::OPT_mimplicit_float,
1061 options::OPT_mno_implicit_float, true))
1062 CmdArgs.push_back("-no-implicit-float");
1063
Craig Topper92fc2df2014-05-17 16:56:41 +00001064 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001065 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1066 ABIName = A->getValue();
1067 else if (Triple.isOSDarwin())
1068 ABIName = "darwinpcs";
1069 else
1070 ABIName = "aapcs";
1071
1072 CmdArgs.push_back("-target-abi");
1073 CmdArgs.push_back(ABIName);
1074
Bradley Smith9ff64332014-10-13 10:16:06 +00001075 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1076 options::OPT_mno_fix_cortex_a53_835769)) {
1077 CmdArgs.push_back("-backend-option");
1078 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1079 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1080 else
1081 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001082 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001083 // Enabled A53 errata (835769) workaround by default on android
1084 CmdArgs.push_back("-backend-option");
1085 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001086 }
1087
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001088 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001089 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1090 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001091 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001092 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001093 CmdArgs.push_back("-aarch64-global-merge=false");
1094 else
1095 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001096 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001097}
1098
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001099// Get CPU and ABI names. They are not independent
1100// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001101void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1102 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001103 const char *DefMips32CPU = "mips32r2";
1104 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001105
Daniel Sanders2bf13662014-07-10 14:40:57 +00001106 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1107 // default for mips64(el)?-img-linux-gnu.
1108 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1109 Triple.getEnvironment() == llvm::Triple::GNU) {
1110 DefMips32CPU = "mips32r6";
1111 DefMips64CPU = "mips64r6";
1112 }
Renato Golin7c542b42015-07-27 23:44:45 +00001113
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001114 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001115 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001116 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001117
Brad Smithba26f582015-01-06 02:53:17 +00001118 // MIPS3 is the default for mips64*-unknown-openbsd.
1119 if (Triple.getOS() == llvm::Triple::OpenBSD)
1120 DefMips64CPU = "mips3";
1121
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001122 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001123 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001124
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001125 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001126 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001127 // Convert a GNU style Mips ABI name to the name
1128 // accepted by LLVM Mips backend.
1129 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001130 .Case("32", "o32")
1131 .Case("64", "n64")
1132 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001133 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001134
1135 // Setup default CPU and ABI names.
1136 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001137 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001138 default:
1139 llvm_unreachable("Unexpected triple arch name");
1140 case llvm::Triple::mips:
1141 case llvm::Triple::mipsel:
1142 CPUName = DefMips32CPU;
1143 break;
1144 case llvm::Triple::mips64:
1145 case llvm::Triple::mips64el:
1146 CPUName = DefMips64CPU;
1147 break;
1148 }
1149 }
1150
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001151 if (ABIName.empty()) {
1152 // Deduce ABI name from the target triple.
1153 if (Triple.getArch() == llvm::Triple::mips ||
1154 Triple.getArch() == llvm::Triple::mipsel)
1155 ABIName = "o32";
1156 else
1157 ABIName = "n64";
1158 }
1159
1160 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001161 // Deduce CPU name from ABI name.
1162 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001163 .Cases("o32", "eabi", DefMips32CPU)
1164 .Cases("n32", "n64", DefMips64CPU)
1165 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001166 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001167
1168 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001169}
1170
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001171std::string mips::getMipsABILibSuffix(const ArgList &Args,
1172 const llvm::Triple &Triple) {
1173 StringRef CPUName, ABIName;
1174 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1175 return llvm::StringSwitch<std::string>(ABIName)
1176 .Case("o32", "")
1177 .Case("n32", "32")
1178 .Case("n64", "64");
1179}
1180
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001181// Convert ABI name to the GNU tools acceptable variant.
1182static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1183 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001184 .Case("o32", "32")
1185 .Case("n64", "64")
1186 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001187}
1188
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001189// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1190// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001191static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1192 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A =
1194 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1195 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001196 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001197 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001198 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001201 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1202 .Case("soft", mips::FloatABI::Soft)
1203 .Case("hard", mips::FloatABI::Hard)
1204 .Default(mips::FloatABI::Invalid);
1205 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001206 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001207 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001208 }
1209 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001210 }
1211
1212 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001213 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001214 // Assume "hard", because it's a default value used by gcc.
1215 // When we start to recognize specific target MIPS processors,
1216 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001217 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001218 }
1219
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001220 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1221 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001222}
1223
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001224static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001225 std::vector<const char *> &Features,
1226 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001227 StringRef FeatureName) {
1228 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001229 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001230 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001231 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001232 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001233 }
1234}
1235
Daniel Sanders379d44b2014-07-16 11:52:23 +00001236static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1237 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001238 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001239 StringRef CPUName;
1240 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001241 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001242 ABIName = getGnuCompatibleMipsABIName(ABIName);
1243
Daniel Sandersfeb61302014-08-08 15:47:17 +00001244 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1245 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001246
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001247 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1248 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001249 // FIXME: Note, this is a hack. We need to pass the selected float
1250 // mode to the MipsTargetInfoBase to define appropriate macros there.
1251 // Now it is the only method.
1252 Features.push_back("+soft-float");
1253 }
1254
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001255 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001256 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001257 if (Val == "2008") {
1258 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1259 Features.push_back("+nan2008");
1260 else {
1261 Features.push_back("-nan2008");
1262 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1263 }
1264 } else if (Val == "legacy") {
1265 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1266 Features.push_back("-nan2008");
1267 else {
1268 Features.push_back("+nan2008");
1269 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1270 }
1271 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001272 D.Diag(diag::err_drv_unsupported_option_argument)
1273 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001274 }
1275
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001276 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1277 options::OPT_mdouble_float, "single-float");
1278 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1279 "mips16");
1280 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1281 options::OPT_mno_micromips, "micromips");
1282 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1283 "dsp");
1284 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1285 "dspr2");
1286 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1287 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001288
1289 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1290 // pass -mfpxx
1291 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1292 options::OPT_mfp64)) {
1293 if (A->getOption().matches(options::OPT_mfp32))
1294 Features.push_back(Args.MakeArgString("-fp64"));
1295 else if (A->getOption().matches(options::OPT_mfpxx)) {
1296 Features.push_back(Args.MakeArgString("+fpxx"));
1297 Features.push_back(Args.MakeArgString("+nooddspreg"));
1298 } else
1299 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001300 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001301 Features.push_back(Args.MakeArgString("+fpxx"));
1302 Features.push_back(Args.MakeArgString("+nooddspreg"));
1303 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001304
Daniel Sanders28e5d392014-07-10 10:39:51 +00001305 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1306 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001307}
1308
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001309void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001310 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001311 const Driver &D = getToolChain().getDriver();
1312 StringRef CPUName;
1313 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001314 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001315 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001316
1317 CmdArgs.push_back("-target-abi");
1318 CmdArgs.push_back(ABIName.data());
1319
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001320 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1321 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001322 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001323 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001324 CmdArgs.push_back("-mfloat-abi");
1325 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001326 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001327 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001328 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001329 CmdArgs.push_back("-mfloat-abi");
1330 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001331 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001332
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001333 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1334 if (A->getOption().matches(options::OPT_mxgot)) {
1335 CmdArgs.push_back("-mllvm");
1336 CmdArgs.push_back("-mxgot");
1337 }
1338 }
1339
Simon Atanasyanc580b322013-05-11 06:33:44 +00001340 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1341 options::OPT_mno_ldc1_sdc1)) {
1342 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1343 CmdArgs.push_back("-mllvm");
1344 CmdArgs.push_back("-mno-ldc1-sdc1");
1345 }
1346 }
1347
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001348 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1349 options::OPT_mno_check_zero_division)) {
1350 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1351 CmdArgs.push_back("-mllvm");
1352 CmdArgs.push_back("-mno-check-zero-division");
1353 }
1354 }
1355
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001356 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001357 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001358 CmdArgs.push_back("-mllvm");
1359 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1360 A->claim();
1361 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001362}
1363
Hal Finkel8eb59282012-06-11 22:35:19 +00001364/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1365static std::string getPPCTargetCPU(const ArgList &Args) {
1366 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001367 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001368
1369 if (CPUName == "native") {
1370 std::string CPU = llvm::sys::getHostCPUName();
1371 if (!CPU.empty() && CPU != "generic")
1372 return CPU;
1373 else
1374 return "";
1375 }
1376
1377 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001378 .Case("common", "generic")
1379 .Case("440", "440")
1380 .Case("440fp", "440")
1381 .Case("450", "450")
1382 .Case("601", "601")
1383 .Case("602", "602")
1384 .Case("603", "603")
1385 .Case("603e", "603e")
1386 .Case("603ev", "603ev")
1387 .Case("604", "604")
1388 .Case("604e", "604e")
1389 .Case("620", "620")
1390 .Case("630", "pwr3")
1391 .Case("G3", "g3")
1392 .Case("7400", "7400")
1393 .Case("G4", "g4")
1394 .Case("7450", "7450")
1395 .Case("G4+", "g4+")
1396 .Case("750", "750")
1397 .Case("970", "970")
1398 .Case("G5", "g5")
1399 .Case("a2", "a2")
1400 .Case("a2q", "a2q")
1401 .Case("e500mc", "e500mc")
1402 .Case("e5500", "e5500")
1403 .Case("power3", "pwr3")
1404 .Case("power4", "pwr4")
1405 .Case("power5", "pwr5")
1406 .Case("power5x", "pwr5x")
1407 .Case("power6", "pwr6")
1408 .Case("power6x", "pwr6x")
1409 .Case("power7", "pwr7")
1410 .Case("power8", "pwr8")
1411 .Case("pwr3", "pwr3")
1412 .Case("pwr4", "pwr4")
1413 .Case("pwr5", "pwr5")
1414 .Case("pwr5x", "pwr5x")
1415 .Case("pwr6", "pwr6")
1416 .Case("pwr6x", "pwr6x")
1417 .Case("pwr7", "pwr7")
1418 .Case("pwr8", "pwr8")
1419 .Case("powerpc", "ppc")
1420 .Case("powerpc64", "ppc64")
1421 .Case("powerpc64le", "ppc64le")
1422 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001423 }
1424
1425 return "";
1426}
1427
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001428static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1429 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001430 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001431 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001432
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001433 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1434 if (FloatABI == ppc::FloatABI::Soft &&
1435 !(Triple.getArch() == llvm::Triple::ppc64 ||
1436 Triple.getArch() == llvm::Triple::ppc64le))
1437 Features.push_back("+soft-float");
1438 else if (FloatABI == ppc::FloatABI::Soft &&
1439 (Triple.getArch() == llvm::Triple::ppc64 ||
1440 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001441 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001442 << "soft float is not supported for ppc64";
1443
Eric Christopher643bb6a2013-10-16 20:40:08 +00001444 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001445 AddTargetFeature(Args, Features, options::OPT_faltivec,
1446 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001447}
1448
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001449ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1450 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1451 if (Arg *A =
1452 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1453 options::OPT_mfloat_abi_EQ)) {
1454 if (A->getOption().matches(options::OPT_msoft_float))
1455 ABI = ppc::FloatABI::Soft;
1456 else if (A->getOption().matches(options::OPT_mhard_float))
1457 ABI = ppc::FloatABI::Hard;
1458 else {
1459 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1460 .Case("soft", ppc::FloatABI::Soft)
1461 .Case("hard", ppc::FloatABI::Hard)
1462 .Default(ppc::FloatABI::Invalid);
1463 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1464 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1465 ABI = ppc::FloatABI::Hard;
1466 }
1467 }
1468 }
1469
1470 // If unspecified, choose the default based on the platform.
1471 if (ABI == ppc::FloatABI::Invalid) {
1472 ABI = ppc::FloatABI::Hard;
1473 }
1474
1475 return ABI;
1476}
1477
Ulrich Weigand8afad612014-07-28 13:17:52 +00001478void Clang::AddPPCTargetArgs(const ArgList &Args,
1479 ArgStringList &CmdArgs) const {
1480 // Select the ABI to use.
1481 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001482 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001483 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001484 case llvm::Triple::ppc64: {
1485 // When targeting a processor that supports QPX, or if QPX is
1486 // specifically enabled, default to using the ABI that supports QPX (so
1487 // long as it is not specifically disabled).
1488 bool HasQPX = false;
1489 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1490 HasQPX = A->getValue() == StringRef("a2q");
1491 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1492 if (HasQPX) {
1493 ABIName = "elfv1-qpx";
1494 break;
1495 }
1496
Ulrich Weigand8afad612014-07-28 13:17:52 +00001497 ABIName = "elfv1";
1498 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001499 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001500 case llvm::Triple::ppc64le:
1501 ABIName = "elfv2";
1502 break;
1503 default:
1504 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001505 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001506
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001507 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1508 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1509 // the option if given as we don't have backend support for any targets
1510 // that don't use the altivec abi.
1511 if (StringRef(A->getValue()) != "altivec")
1512 ABIName = A->getValue();
1513
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001514 ppc::FloatABI FloatABI =
1515 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1516
1517 if (FloatABI == ppc::FloatABI::Soft) {
1518 // Floating point operations and argument passing are soft.
1519 CmdArgs.push_back("-msoft-float");
1520 CmdArgs.push_back("-mfloat-abi");
1521 CmdArgs.push_back("soft");
1522 } else {
1523 // Floating point operations and argument passing are hard.
1524 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1525 CmdArgs.push_back("-mfloat-abi");
1526 CmdArgs.push_back("hard");
1527 }
1528
Ulrich Weigand8afad612014-07-28 13:17:52 +00001529 if (ABIName) {
1530 CmdArgs.push_back("-target-abi");
1531 CmdArgs.push_back(ABIName);
1532 }
1533}
1534
1535bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1536 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1537 return A && (A->getValue() == StringRef(Value));
1538}
1539
Tom Stellard6674c702013-04-01 20:56:53 +00001540/// Get the (LLVM) name of the R600 gpu we are targeting.
1541static std::string getR600TargetGPU(const ArgList &Args) {
1542 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001543 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001544 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001545 .Cases("rv630", "rv635", "r600")
1546 .Cases("rv610", "rv620", "rs780", "rs880")
1547 .Case("rv740", "rv770")
1548 .Case("palm", "cedar")
1549 .Cases("sumo", "sumo2", "sumo")
1550 .Case("hemlock", "cypress")
1551 .Case("aruba", "cayman")
1552 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001553 }
1554 return "";
1555}
1556
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001557void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001558 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001559 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001560 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001561
James Y Knightb2406522015-06-15 20:51:24 +00001562 bool SoftFloatABI = false;
1563 if (Arg *A =
1564 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001565 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001566 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001567 }
1568
James Y Knightb2406522015-06-15 20:51:24 +00001569 // Only the hard-float ABI on Sparc is standardized, and it is the
1570 // default. GCC also supports a nonstandard soft-float ABI mode, and
1571 // perhaps LLVM should implement that, too. However, since llvm
1572 // currently does not support Sparc soft-float, at all, display an
1573 // error if it's requested.
1574 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001575 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1576 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001577 }
1578}
1579
Richard Sandiford4652d892013-07-19 16:51:51 +00001580static const char *getSystemZTargetCPU(const ArgList &Args) {
1581 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1582 return A->getValue();
1583 return "z10";
1584}
1585
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001586static void getSystemZTargetFeatures(const ArgList &Args,
1587 std::vector<const char *> &Features) {
1588 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001589 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001590 if (A->getOption().matches(options::OPT_mhtm))
1591 Features.push_back("+transactional-execution");
1592 else
1593 Features.push_back("-transactional-execution");
1594 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001595 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001596 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001597 if (A->getOption().matches(options::OPT_mvx))
1598 Features.push_back("+vector");
1599 else
1600 Features.push_back("-vector");
1601 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001602}
1603
Chandler Carruth953fb082013-01-13 11:46:33 +00001604static const char *getX86TargetCPU(const ArgList &Args,
1605 const llvm::Triple &Triple) {
1606 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001607 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001608 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 return "core-avx2";
1610
Chandler Carruth953fb082013-01-13 11:46:33 +00001611 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001612 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001613
1614 // FIXME: Reject attempts to use -march=native unless the target matches
1615 // the host.
1616 //
1617 // FIXME: We should also incorporate the detected target features for use
1618 // with -native.
1619 std::string CPU = llvm::sys::getHostCPUName();
1620 if (!CPU.empty() && CPU != "generic")
1621 return Args.MakeArgString(CPU);
1622 }
1623
Reid Kleckner3123eff2015-06-30 16:32:04 +00001624 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1625 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1626 StringRef Arch = A->getValue();
1627 const char *CPU;
1628 if (Triple.getArch() == llvm::Triple::x86) {
1629 CPU = llvm::StringSwitch<const char *>(Arch)
1630 .Case("IA32", "i386")
1631 .Case("SSE", "pentium3")
1632 .Case("SSE2", "pentium4")
1633 .Case("AVX", "sandybridge")
1634 .Case("AVX2", "haswell")
1635 .Default(nullptr);
1636 } else {
1637 CPU = llvm::StringSwitch<const char *>(Arch)
1638 .Case("AVX", "sandybridge")
1639 .Case("AVX2", "haswell")
1640 .Default(nullptr);
1641 }
1642 if (CPU)
1643 return CPU;
1644 }
1645
Chandler Carruth953fb082013-01-13 11:46:33 +00001646 // Select the default CPU if none was given (or detection failed).
1647
1648 if (Triple.getArch() != llvm::Triple::x86_64 &&
1649 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001650 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001651
1652 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1653
1654 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001655 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001656 if (Triple.getArchName() == "x86_64h")
1657 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001658 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001659 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001660
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001661 // Set up default CPU name for PS4 compilers.
1662 if (Triple.isPS4CPU())
1663 return "btver2";
1664
Alexey Bataev286d1b92014-01-31 04:07:13 +00001665 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001666 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001667 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001668
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001669 // Everything else goes to x86-64 in 64-bit mode.
1670 if (Is64Bit)
1671 return "x86-64";
1672
1673 switch (Triple.getOS()) {
1674 case llvm::Triple::FreeBSD:
1675 case llvm::Triple::NetBSD:
1676 case llvm::Triple::OpenBSD:
1677 return "i486";
1678 case llvm::Triple::Haiku:
1679 return "i586";
1680 case llvm::Triple::Bitrig:
1681 return "i686";
1682 default:
1683 // Fallback to p4.
1684 return "pentium4";
1685 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001686}
1687
Dan Gohmanc2853072015-09-03 22:51:53 +00001688/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1689static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1690 // If we have -mcpu=, use that.
1691 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1692 StringRef CPU = A->getValue();
1693
1694#ifdef __wasm__
1695 // Handle "native" by examining the host. "native" isn't meaningful when
1696 // cross compiling, so only support this when the host is also WebAssembly.
1697 if (CPU == "native")
1698 return llvm::sys::getHostCPUName();
1699#endif
1700
1701 return CPU;
1702 }
1703
1704 return "generic";
1705}
1706
Renato Golin7c542b42015-07-27 23:44:45 +00001707static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1708 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001709 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001710 default:
1711 return "";
1712
Amara Emerson703da2e2013-10-31 09:32:33 +00001713 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001714 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001715 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001716
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001717 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001718 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001719 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001720 case llvm::Triple::thumbeb: {
1721 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001722 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001723 return arm::getARMTargetCPU(MCPU, MArch, T);
1724 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001725 case llvm::Triple::mips:
1726 case llvm::Triple::mipsel:
1727 case llvm::Triple::mips64:
1728 case llvm::Triple::mips64el: {
1729 StringRef CPUName;
1730 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001731 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001732 return CPUName;
1733 }
1734
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001735 case llvm::Triple::nvptx:
1736 case llvm::Triple::nvptx64:
1737 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1738 return A->getValue();
1739 return "";
1740
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001741 case llvm::Triple::ppc:
1742 case llvm::Triple::ppc64:
1743 case llvm::Triple::ppc64le: {
1744 std::string TargetCPUName = getPPCTargetCPU(Args);
1745 // LLVM may default to generating code for the native CPU,
1746 // but, like gcc, we default to a more generic option for
1747 // each architecture. (except on Darwin)
1748 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1749 if (T.getArch() == llvm::Triple::ppc64)
1750 TargetCPUName = "ppc64";
1751 else if (T.getArch() == llvm::Triple::ppc64le)
1752 TargetCPUName = "ppc64le";
1753 else
1754 TargetCPUName = "ppc";
1755 }
1756 return TargetCPUName;
1757 }
1758
1759 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001760 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001761 case llvm::Triple::sparcv9:
1762 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001763 return A->getValue();
1764 return "";
1765
1766 case llvm::Triple::x86:
1767 case llvm::Triple::x86_64:
1768 return getX86TargetCPU(Args, T);
1769
1770 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001771 return "hexagon" +
1772 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001773
1774 case llvm::Triple::systemz:
1775 return getSystemZTargetCPU(Args);
1776
1777 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001778 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001779 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001780
1781 case llvm::Triple::wasm32:
1782 case llvm::Triple::wasm64:
1783 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001784 }
1785}
1786
Alp Tokerce365ca2013-12-02 12:43:03 +00001787static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001788 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001789 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1790 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1791 // forward.
1792 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001793 std::string Plugin =
1794 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001795 CmdArgs.push_back(Args.MakeArgString(Plugin));
1796
1797 // Try to pass driver level flags relevant to LTO code generation down to
1798 // the plugin.
1799
1800 // Handle flags for selecting CPU variants.
1801 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1802 if (!CPU.empty())
1803 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001804
James Molloyf97fdae2015-12-21 10:44:36 +00001805 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1806 StringRef OOpt;
1807 if (A->getOption().matches(options::OPT_O4) ||
1808 A->getOption().matches(options::OPT_Ofast))
1809 OOpt = "3";
1810 else if (A->getOption().matches(options::OPT_O))
1811 OOpt = A->getValue();
1812 else if (A->getOption().matches(options::OPT_O0))
1813 OOpt = "0";
1814 if (!OOpt.empty())
1815 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1816 }
1817
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001818 if (IsThinLTO)
1819 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001820}
1821
Sanjay Patel2987c292015-06-11 14:53:41 +00001822/// This is a helper function for validating the optional refinement step
1823/// parameter in reciprocal argument strings. Return false if there is an error
1824/// parsing the refinement step. Otherwise, return true and set the Position
1825/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001826static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001827 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001828 const char RefinementStepToken = ':';
1829 Position = In.find(RefinementStepToken);
1830 if (Position != StringRef::npos) {
1831 StringRef Option = A.getOption().getName();
1832 StringRef RefStep = In.substr(Position + 1);
1833 // Allow exactly one numeric character for the additional refinement
1834 // step parameter. This is reasonable for all currently-supported
1835 // operations and architectures because we would expect that a larger value
1836 // of refinement steps would cause the estimate "optimization" to
1837 // under-perform the native operation. Also, if the estimate does not
1838 // converge quickly, it probably will not ever converge, so further
1839 // refinement steps will not produce a better answer.
1840 if (RefStep.size() != 1) {
1841 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1842 return false;
1843 }
1844 char RefStepChar = RefStep[0];
1845 if (RefStepChar < '0' || RefStepChar > '9') {
1846 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1847 return false;
1848 }
1849 }
1850 return true;
1851}
1852
1853/// The -mrecip flag requires processing of many optional parameters.
1854static void ParseMRecip(const Driver &D, const ArgList &Args,
1855 ArgStringList &OutStrings) {
1856 StringRef DisabledPrefixIn = "!";
1857 StringRef DisabledPrefixOut = "!";
1858 StringRef EnabledPrefixOut = "";
1859 StringRef Out = "-mrecip=";
1860
1861 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1862 if (!A)
1863 return;
1864
1865 unsigned NumOptions = A->getNumValues();
1866 if (NumOptions == 0) {
1867 // No option is the same as "all".
1868 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1869 return;
1870 }
1871
1872 // Pass through "all", "none", or "default" with an optional refinement step.
1873 if (NumOptions == 1) {
1874 StringRef Val = A->getValue(0);
1875 size_t RefStepLoc;
1876 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1877 return;
1878 StringRef ValBase = Val.slice(0, RefStepLoc);
1879 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1880 OutStrings.push_back(Args.MakeArgString(Out + Val));
1881 return;
1882 }
1883 }
1884
1885 // Each reciprocal type may be enabled or disabled individually.
1886 // Check each input value for validity, concatenate them all back together,
1887 // and pass through.
1888
1889 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001890 OptionStrings.insert(std::make_pair("divd", false));
1891 OptionStrings.insert(std::make_pair("divf", false));
1892 OptionStrings.insert(std::make_pair("vec-divd", false));
1893 OptionStrings.insert(std::make_pair("vec-divf", false));
1894 OptionStrings.insert(std::make_pair("sqrtd", false));
1895 OptionStrings.insert(std::make_pair("sqrtf", false));
1896 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1897 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001898
1899 for (unsigned i = 0; i != NumOptions; ++i) {
1900 StringRef Val = A->getValue(i);
1901
1902 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1903 // Ignore the disablement token for string matching.
1904 if (IsDisabled)
1905 Val = Val.substr(1);
1906
1907 size_t RefStep;
1908 if (!getRefinementStep(Val, D, *A, RefStep))
1909 return;
1910
1911 StringRef ValBase = Val.slice(0, RefStep);
1912 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1913 if (OptionIter == OptionStrings.end()) {
1914 // Try again specifying float suffix.
1915 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1916 if (OptionIter == OptionStrings.end()) {
1917 // The input name did not match any known option string.
1918 D.Diag(diag::err_drv_unknown_argument) << Val;
1919 return;
1920 }
1921 // The option was specified without a float or double suffix.
1922 // Make sure that the double entry was not already specified.
1923 // The float entry will be checked below.
1924 if (OptionStrings[ValBase.str() + 'd']) {
1925 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1926 return;
1927 }
1928 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929
Sanjay Patel2987c292015-06-11 14:53:41 +00001930 if (OptionIter->second == true) {
1931 // Duplicate option specified.
1932 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1933 return;
1934 }
1935
1936 // Mark the matched option as found. Do not allow duplicate specifiers.
1937 OptionIter->second = true;
1938
1939 // If the precision was not specified, also mark the double entry as found.
1940 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1941 OptionStrings[ValBase.str() + 'd'] = true;
1942
1943 // Build the output string.
1944 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1945 Out = Args.MakeArgString(Out + Prefix + Val);
1946 if (i != NumOptions - 1)
1947 Out = Args.MakeArgString(Out + ",");
1948 }
1949
1950 OutStrings.push_back(Args.MakeArgString(Out));
1951}
1952
Eric Christopherc54920a2015-03-23 19:26:05 +00001953static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001954 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001955 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001956 // If -march=native, autodetect the feature list.
1957 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1958 if (StringRef(A->getValue()) == "native") {
1959 llvm::StringMap<bool> HostFeatures;
1960 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1961 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001962 Features.push_back(
1963 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001964 }
1965 }
1966
Jim Grosbach82eee262013-11-16 00:53:35 +00001967 if (Triple.getArchName() == "x86_64h") {
1968 // x86_64h implies quite a few of the more modern subtarget features
1969 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1970 Features.push_back("-rdrnd");
1971 Features.push_back("-aes");
1972 Features.push_back("-pclmul");
1973 Features.push_back("-rtm");
1974 Features.push_back("-hle");
1975 Features.push_back("-fsgsbase");
1976 }
1977
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001978 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001979 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001980 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001981 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001982 Features.push_back("+sse4.2");
1983 Features.push_back("+popcnt");
1984 } else
1985 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001986 }
1987
Eric Christopherc54920a2015-03-23 19:26:05 +00001988 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001989 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1990 StringRef Arch = A->getValue();
1991 bool ArchUsed = false;
1992 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001993 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001994 if (Arch == "AVX" || Arch == "AVX2") {
1995 ArchUsed = true;
1996 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1997 }
1998 }
1999 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002000 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002001 if (Arch == "IA32") {
2002 ArchUsed = true;
2003 } else if (Arch == "SSE" || Arch == "SSE2") {
2004 ArchUsed = true;
2005 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2006 }
2007 }
2008 if (!ArchUsed)
2009 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2010 }
2011
Jim Grosbach82eee262013-11-16 00:53:35 +00002012 // Now add any that the user explicitly requested on the command line,
2013 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002014 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002015}
2016
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002017void Clang::AddX86TargetArgs(const ArgList &Args,
2018 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002019 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002020 Args.hasArg(options::OPT_mkernel) ||
2021 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002022 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002023
Bob Wilson2616e2e2013-02-10 16:01:41 +00002024 // Default to avoid implicit floating-point for kernel/kext code, but allow
2025 // that to be overridden with -mno-soft-float.
2026 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2027 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002028 if (Arg *A = Args.getLastArg(
2029 options::OPT_msoft_float, options::OPT_mno_soft_float,
2030 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002031 const Option &O = A->getOption();
2032 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2033 O.matches(options::OPT_msoft_float));
2034 }
2035 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002036 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002037
2038 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2039 StringRef Value = A->getValue();
2040 if (Value == "intel" || Value == "att") {
2041 CmdArgs.push_back("-mllvm");
2042 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2043 } else {
2044 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2045 << A->getOption().getName() << Value;
2046 }
2047 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002048}
2049
Tony Linthicum76329bf2011-12-12 21:14:55 +00002050void Clang::AddHexagonTargetArgs(const ArgList &Args,
2051 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002052 CmdArgs.push_back("-mqdsp6-compat");
2053 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002054
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002055 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2056 std::string N = llvm::utostr(G.getValue());
2057 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002058 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002059 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002060 }
2061
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002062 if (!Args.hasArg(options::OPT_fno_short_enums))
2063 CmdArgs.push_back("-fshort-enums");
2064 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002065 CmdArgs.push_back("-mllvm");
2066 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002067 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002068 CmdArgs.push_back("-mllvm");
2069 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002070}
2071
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
Sean Evesonb38c32b2016-01-06 10:03:58 +00003595 // Disable some unix checkers for PS4.
3596 if (IsPS4CPU) {
3597 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3598 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3599 }
3600
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003601 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003602 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003603
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003604 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003605
Artem Belevichba558952015-05-06 18:20:23 +00003606 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003607 CmdArgs.push_back("-analyzer-checker=cplusplus");
3608
Sean Evesonb38c32b2016-01-06 10:03:58 +00003609 if (!IsPS4CPU) {
3610 CmdArgs.push_back(
3611 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3612 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3613 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3614 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3615 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3616 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3617 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003618
3619 // Default nullability checks.
3620 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3621 CmdArgs.push_back(
3622 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003623 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003624
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003625 // Set the output format. The default is plist, for (lame) historical
3626 // reasons.
3627 CmdArgs.push_back("-analyzer-output");
3628 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003629 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003630 else
3631 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003632
Ted Kremenekfe449a22010-03-22 22:32:05 +00003633 // Disable the presentation of standard compiler warnings when
3634 // using --analyze. We only want to show static analyzer diagnostics
3635 // or frontend errors.
3636 CmdArgs.push_back("-w");
3637
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003638 // Add -Xanalyzer arguments when running as analyzer.
3639 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003640 }
3641
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003642 CheckCodeGenerationOptions(D, Args);
3643
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003644 llvm::Reloc::Model RelocationModel;
3645 unsigned PICLevel;
3646 bool IsPIE;
3647 std::tie(RelocationModel, PICLevel, IsPIE) =
3648 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003649
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003650 const char *RMName = RelocationModelName(RelocationModel);
3651 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003652 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003653 CmdArgs.push_back(RMName);
3654 }
3655 if (PICLevel > 0) {
3656 CmdArgs.push_back("-pic-level");
3657 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3658 if (IsPIE) {
3659 CmdArgs.push_back("-pie-level");
3660 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003661 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003662 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003663
Renato Golin4854d802015-11-09 12:40:41 +00003664 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3665 CmdArgs.push_back("-meabi");
3666 CmdArgs.push_back(A->getValue());
3667 }
3668
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003669 CmdArgs.push_back("-mthread-model");
3670 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3671 CmdArgs.push_back(A->getValue());
3672 else
3673 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3674
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003675 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3676
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003677 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3678 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003679 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003680
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003681 // LLVM Code Generator Options.
3682
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003683 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3684 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003685 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3686 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003687 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003688 CmdArgs.push_back(A->getValue());
3689 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003690 }
3691 }
3692
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003693 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3694 StringRef v = A->getValue();
3695 CmdArgs.push_back("-mllvm");
3696 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3697 A->claim();
3698 }
3699
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003700 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3701 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003702 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003703 }
3704
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003705 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3706 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003707 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003708 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003709 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003710 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3711 CmdArgs.push_back("-fpcc-struct-return");
3712 } else {
3713 assert(A->getOption().matches(options::OPT_freg_struct_return));
3714 CmdArgs.push_back("-freg-struct-return");
3715 }
3716 }
3717
Roman Divacky65b88cd2011-03-01 17:40:53 +00003718 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3719 CmdArgs.push_back("-mrtd");
3720
Rafael Espindola224dd632011-12-14 21:02:23 +00003721 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003722 CmdArgs.push_back("-mdisable-fp-elim");
3723 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3724 options::OPT_fno_zero_initialized_in_bss))
3725 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003726
3727 bool OFastEnabled = isOptimizationLevelFast(Args);
3728 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3729 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003730 OptSpecifier StrictAliasingAliasOption =
3731 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003732 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3733 // doesn't do any TBAA.
3734 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003735 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003736 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003737 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003738 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3739 options::OPT_fno_struct_path_tbaa))
3740 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003741 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3742 false))
3743 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003744 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3745 options::OPT_fno_strict_vtable_pointers,
3746 false))
3747 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003748 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3749 options::OPT_fno_optimize_sibling_calls))
3750 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003751
Eric Christopher006208c2013-04-04 06:29:47 +00003752 // Handle segmented stacks.
3753 if (Args.hasArg(options::OPT_fsplit_stack))
3754 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003755
3756 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3757 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003758 OptSpecifier FastMathAliasOption =
3759 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3760
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003761 // Handle various floating point optimization flags, mapping them to the
3762 // appropriate LLVM code generation flags. The pattern for all of these is to
3763 // default off the codegen optimizations, and if any flag enables them and no
3764 // flag disables them after the flag enabling them, enable the codegen
3765 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003766 if (Arg *A = Args.getLastArg(
3767 options::OPT_ffast_math, FastMathAliasOption,
3768 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3769 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3770 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003771 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3772 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003773 A->getOption().getID() != options::OPT_fhonor_infinities)
3774 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003775 if (Arg *A = Args.getLastArg(
3776 options::OPT_ffast_math, FastMathAliasOption,
3777 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3778 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3779 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003780 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3781 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003782 A->getOption().getID() != options::OPT_fhonor_nans)
3783 CmdArgs.push_back("-menable-no-nans");
3784
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003785 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3786 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003787 if (Arg *A =
3788 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3789 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3790 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003791 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3792 // However, turning *off* -ffast_math merely restores the toolchain default
3793 // (which may be false).
3794 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3795 A->getOption().getID() == options::OPT_ffast_math ||
3796 A->getOption().getID() == options::OPT_Ofast)
3797 MathErrno = false;
3798 else if (A->getOption().getID() == options::OPT_fmath_errno)
3799 MathErrno = true;
3800 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003801 if (MathErrno)
3802 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003803
3804 // There are several flags which require disabling very specific
3805 // optimizations. Any of these being disabled forces us to turn off the
3806 // entire set of LLVM optimizations, so collect them through all the flag
3807 // madness.
3808 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003809 if (Arg *A = Args.getLastArg(
3810 options::OPT_ffast_math, FastMathAliasOption,
3811 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3812 options::OPT_fno_unsafe_math_optimizations,
3813 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003814 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3815 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003816 A->getOption().getID() != options::OPT_fno_associative_math)
3817 AssociativeMath = true;
3818 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003819 if (Arg *A = Args.getLastArg(
3820 options::OPT_ffast_math, FastMathAliasOption,
3821 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3822 options::OPT_fno_unsafe_math_optimizations,
3823 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003824 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3825 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003826 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3827 ReciprocalMath = true;
3828 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003829 if (Arg *A = Args.getLastArg(
3830 options::OPT_ffast_math, FastMathAliasOption,
3831 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3832 options::OPT_fno_unsafe_math_optimizations,
3833 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003834 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3835 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003836 A->getOption().getID() != options::OPT_fsigned_zeros)
3837 SignedZeros = false;
3838 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003839 if (Arg *A = Args.getLastArg(
3840 options::OPT_ffast_math, FastMathAliasOption,
3841 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3842 options::OPT_fno_unsafe_math_optimizations,
3843 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003844 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3845 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003846 A->getOption().getID() != options::OPT_ftrapping_math)
3847 TrappingMath = false;
3848 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3849 !TrappingMath)
3850 CmdArgs.push_back("-menable-unsafe-fp-math");
3851
Sanjay Patel76c9e092015-01-23 16:40:50 +00003852 if (!SignedZeros)
3853 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003854
Sanjay Patel359b1052015-04-09 15:03:23 +00003855 if (ReciprocalMath)
3856 CmdArgs.push_back("-freciprocal-math");
3857
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003858 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003859 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003860 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003861 options::OPT_ffp_contract)) {
3862 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003863 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003864 if (Val == "fast" || Val == "on" || Val == "off") {
3865 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3866 } else {
3867 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003868 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003869 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003870 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3871 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003872 // If fast-math is set then set the fp-contract mode to fast.
3873 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3874 }
3875 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003876
Sanjay Patel2987c292015-06-11 14:53:41 +00003877 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003878
Bob Wilson6a039162012-07-19 03:52:53 +00003879 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3880 // and if we find them, tell the frontend to provide the appropriate
3881 // preprocessor macros. This is distinct from enabling any optimizations as
3882 // these options induce language changes which must survive serialization
3883 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003884 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3885 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003886 if (!A->getOption().matches(options::OPT_fno_fast_math))
3887 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003888 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3889 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003890 if (A->getOption().matches(options::OPT_ffinite_math_only))
3891 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003892
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003893 // Decide whether to use verbose asm. Verbose assembly is the default on
3894 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003895 bool IsIntegratedAssemblerDefault =
3896 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003897 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003898 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003899 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003900 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003901
Rafael Espindolab8a12932015-05-22 20:44:03 +00003902 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3903 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003904 CmdArgs.push_back("-no-integrated-as");
3905
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003906 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3907 CmdArgs.push_back("-mdebug-pass");
3908 CmdArgs.push_back("Structure");
3909 }
3910 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3911 CmdArgs.push_back("-mdebug-pass");
3912 CmdArgs.push_back("Arguments");
3913 }
3914
John McCall8517abc2010-02-19 02:45:38 +00003915 // Enable -mconstructor-aliases except on darwin, where we have to
3916 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003917 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003918 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003919
John McCall7ef5cb32011-03-18 02:56:14 +00003920 // Darwin's kernel doesn't support guard variables; just die if we
3921 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003922 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003923 CmdArgs.push_back("-fforbid-guard-variables");
3924
Akira Hatanaka02028482015-11-12 17:21:22 +00003925 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3926 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003927 CmdArgs.push_back("-mms-bitfields");
3928 }
John McCall8517abc2010-02-19 02:45:38 +00003929
Daniel Dunbar306945d2009-09-16 06:17:29 +00003930 // This is a coarse approximation of what llvm-gcc actually does, both
3931 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3932 // complicated ways.
3933 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003934 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3935 options::OPT_fno_asynchronous_unwind_tables,
3936 (getToolChain().IsUnwindTablesDefault() ||
3937 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3938 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003939 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3940 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003941 CmdArgs.push_back("-munwind-tables");
3942
Chandler Carruth05fb5852012-11-21 23:40:23 +00003943 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003944
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003945 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3946 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003947 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003948 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003949
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003950 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003951 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003952
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003953 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003954 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003955 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003956 }
3957
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003958 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003959 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003960 if (!CPU.empty()) {
3961 CmdArgs.push_back("-target-cpu");
3962 CmdArgs.push_back(Args.MakeArgString(CPU));
3963 }
3964
Rafael Espindolaeb265472013-08-21 21:59:03 +00003965 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3966 CmdArgs.push_back("-mfpmath");
3967 CmdArgs.push_back(A->getValue());
3968 }
3969
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003970 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003971 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003972
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003973 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003974 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003975 default:
3976 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003977
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003978 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003979 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003980 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003981 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003982 // Use the effective triple, which takes into account the deployment target.
3983 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003984 break;
3985
Tim Northover573cbee2014-05-24 12:52:07 +00003986 case llvm::Triple::aarch64:
3987 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003988 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003989 break;
3990
Eric Christopher0b26a612010-03-02 02:41:08 +00003991 case llvm::Triple::mips:
3992 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003993 case llvm::Triple::mips64:
3994 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003995 AddMIPSTargetArgs(Args, CmdArgs);
3996 break;
3997
Ulrich Weigand8afad612014-07-28 13:17:52 +00003998 case llvm::Triple::ppc:
3999 case llvm::Triple::ppc64:
4000 case llvm::Triple::ppc64le:
4001 AddPPCTargetArgs(Args, CmdArgs);
4002 break;
4003
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004004 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004005 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004006 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004007 AddSparcTargetArgs(Args, CmdArgs);
4008 break;
4009
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004010 case llvm::Triple::x86:
4011 case llvm::Triple::x86_64:
4012 AddX86TargetArgs(Args, CmdArgs);
4013 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004014
4015 case llvm::Triple::hexagon:
4016 AddHexagonTargetArgs(Args, CmdArgs);
4017 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004018 }
4019
Douglas Katzman3459ce22015-10-08 04:24:12 +00004020 // The 'g' groups options involve a somewhat intricate sequence of decisions
4021 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004022 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004023 // * what level of debug info to generate
4024 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004025 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004026 // This avoids having to monkey around further in cc1 other than to disable
4027 // codeview if not running in a Windows environment. Perhaps even that
4028 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004029 unsigned DwarfVersion = 0;
4030 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4031 // These two are potentially updated by AddClangCLArgs.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004032 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4033 CodeGenOptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004034 bool EmitCodeView = false;
4035
Hans Wennborg75958c42013-08-08 00:17:41 +00004036 // Add clang-cl arguments.
4037 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004038 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004039
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004040 // Pass the linker version in use.
4041 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4042 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004043 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004044 }
4045
Eric Christopherb7d97e92013-04-03 01:58:53 +00004046 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004047 CmdArgs.push_back("-momit-leaf-frame-pointer");
4048
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004049 // Explicitly error on some things we know we don't support and can't just
4050 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004051 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004052 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4053 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004054 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004055 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004056 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4057 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004058 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004059 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004060 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004061 }
4062
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004063 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004064 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004065 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004066 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004067 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4068 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004069 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004070 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004071 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004072
Chad Rosierbe10f982011-08-02 17:58:04 +00004073 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004074 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004075 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4076 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004077 }
4078
Rafael Espindola08a692a2010-03-07 04:46:18 +00004079 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004080 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004081 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004082 // If the last option explicitly specified a debug-info level, use it.
4083 if (A->getOption().matches(options::OPT_gN_Group)) {
4084 DebugInfoKind = DebugLevelToInfoKind(*A);
4085 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4086 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4087 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4088 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4089 A->getIndex() > SplitDwarfArg->getIndex())
4090 SplitDwarfArg = nullptr;
4091 } else
4092 // For any other 'g' option, use Limited.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004093 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004094 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004095
Paul Robinson0334a042015-12-19 19:41:48 +00004096 // If a debugger tuning argument appeared, remember it.
4097 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4098 options::OPT_ggdbN_Group)) {
4099 if (A->getOption().matches(options::OPT_glldb))
4100 DebuggerTuning = llvm::DebuggerKind::LLDB;
4101 else if (A->getOption().matches(options::OPT_gsce))
4102 DebuggerTuning = llvm::DebuggerKind::SCE;
4103 else
4104 DebuggerTuning = llvm::DebuggerKind::GDB;
4105 }
4106
4107 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004108 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004109 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004110 DwarfVersion = DwarfVersionNum(A->getSpelling());
4111
Reid Kleckner124955a2015-08-05 18:51:13 +00004112 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004113 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4114 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4115 // DwarfVersion remains at 0 if no explicit choice was made.
4116 CmdArgs.push_back("-gcodeview");
4117 } else if (DwarfVersion == 0 &&
4118 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4119 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4120 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004121
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004122 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4123 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004124
4125 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004126 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004127 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004128 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004129
Eric Christopher138c32b2013-09-13 22:37:55 +00004130 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004131 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004132 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004133 CmdArgs.push_back("-dwarf-ext-refs");
4134 CmdArgs.push_back("-fmodule-format=obj");
4135 }
4136
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004137 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4138 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004139 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004140 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004141 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004142 CmdArgs.push_back("-backend-option");
4143 CmdArgs.push_back("-split-dwarf=Enable");
4144 }
4145
Douglas Katzman3459ce22015-10-08 04:24:12 +00004146 // After we've dealt with all combinations of things that could
4147 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4148 // figure out if we need to "upgrade" it to standalone debug info.
4149 // We parse these two '-f' options whether or not they will be used,
4150 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4151 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4152 options::OPT_fno_standalone_debug,
4153 getToolChain().GetDefaultStandaloneDebug());
4154 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4155 DebugInfoKind = CodeGenOptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004156 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4157 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004158
Eric Christopher138c32b2013-09-13 22:37:55 +00004159 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4160 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4161 CmdArgs.push_back("-backend-option");
4162 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4163 }
Eric Christophereec89c22013-06-18 00:03:50 +00004164
Eric Christopher0d403d22014-02-14 01:27:03 +00004165 // -gdwarf-aranges turns on the emission of the aranges section in the
4166 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004167 // Always enabled on the PS4.
4168 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004169 CmdArgs.push_back("-backend-option");
4170 CmdArgs.push_back("-generate-arange-section");
4171 }
4172
David Blaikief36d9ba2014-01-27 18:52:43 +00004173 if (Args.hasFlag(options::OPT_fdebug_types_section,
4174 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004175 CmdArgs.push_back("-backend-option");
4176 CmdArgs.push_back("-generate-type-units");
4177 }
Eric Christophereec89c22013-06-18 00:03:50 +00004178
Ed Schouten6e576152015-03-26 17:50:28 +00004179 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4180 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4181
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004182 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004183 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004184 CmdArgs.push_back("-ffunction-sections");
4185 }
4186
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004187 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4188 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004189 CmdArgs.push_back("-fdata-sections");
4190 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004191
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004192 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004193 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004194 CmdArgs.push_back("-fno-unique-section-names");
4195
Chris Lattner3c77a352010-06-22 00:03:40 +00004196 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4197
Diego Novilloa0545962015-07-10 18:00:07 +00004198 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004199
Paul Robinsond083b9a2015-12-16 17:25:27 +00004200 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4201 if (getToolChain().getTriple().isPS4CPU())
4202 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4203
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004204 // Pass options for controlling the default header search paths.
4205 if (Args.hasArg(options::OPT_nostdinc)) {
4206 CmdArgs.push_back("-nostdsysteminc");
4207 CmdArgs.push_back("-nobuiltininc");
4208 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004209 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004210 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004211 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4212 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4213 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004214
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004215 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004216 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004217 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004218
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004219 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4220
Ted Kremenekf7639e12012-03-06 20:06:33 +00004221 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004222 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004223 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004224 options::OPT_ccc_arcmt_modify,
4225 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004226 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004227 switch (A->getOption().getID()) {
4228 default:
4229 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004230 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004231 CmdArgs.push_back("-arcmt-check");
4232 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004233 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004234 CmdArgs.push_back("-arcmt-modify");
4235 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004236 case options::OPT_ccc_arcmt_migrate:
4237 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004238 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004239 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004240
4241 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4242 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004243 break;
John McCalld70fb982011-06-15 23:25:17 +00004244 }
4245 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004246 } else {
4247 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4248 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4249 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004250 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004251
Ted Kremenekf7639e12012-03-06 20:06:33 +00004252 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4253 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004254 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4255 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004256 }
4257 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004258 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004259
4260 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004261 options::OPT_objcmt_migrate_subscripting,
4262 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004263 // None specified, means enable them all.
4264 CmdArgs.push_back("-objcmt-migrate-literals");
4265 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004266 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004267 } else {
4268 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4269 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004270 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004271 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004272 } else {
4273 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4274 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4275 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4276 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4277 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4278 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004279 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004280 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4281 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4282 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4283 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4284 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4285 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4286 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004287 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004288 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004289 }
4290
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004291 // Add preprocessing options like -I, -D, etc. if we are using the
4292 // preprocessor.
4293 //
4294 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004295 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004296 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4297 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004298
Rafael Espindolaa7431922011-07-21 23:40:37 +00004299 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4300 // that "The compiler can only warn and ignore the option if not recognized".
4301 // When building with ccache, it will pass -D options to clang even on
4302 // preprocessed inputs and configure concludes that -fPIC is not supported.
4303 Args.ClaimAllArgs(options::OPT_D);
4304
Alp Toker7874bdc2013-11-15 20:40:58 +00004305 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004306 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4307 if (A->getOption().matches(options::OPT_O4)) {
4308 CmdArgs.push_back("-O3");
4309 D.Diag(diag::warn_O4_is_O3);
4310 } else {
4311 A->render(Args, CmdArgs);
4312 }
4313 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004314
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004315 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004316 for (const Arg *A :
4317 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4318 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004319 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004320 }
4321
Rafael Espindola577637a2015-01-03 00:06:04 +00004322 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004323
Richard Smith3be1cb22014-08-07 00:24:21 +00004324 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004325 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004326 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4327 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004328 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004329 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004330
4331 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004332 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004333 //
4334 // If a std is supplied, only add -trigraphs if it follows the
4335 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004336 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004337 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4338 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004339 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004340 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004341 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004342 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004343 else
4344 Std->render(Args, CmdArgs);
4345
Nico Weber00721502014-12-23 22:32:37 +00004346 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004347 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004348 options::OPT_ftrigraphs,
4349 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004350 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004351 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004352 } else {
4353 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004354 //
4355 // FIXME: Clang doesn't correctly handle -std= when the input language
4356 // doesn't match. For the time being just ignore this for C++ inputs;
4357 // eventually we want to do all the standard defaulting here instead of
4358 // splitting it between the driver and clang -cc1.
4359 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004360 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4361 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004362 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004363 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004364
Nico Weber00721502014-12-23 22:32:37 +00004365 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4366 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004367 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004368
Richard Smith282b4492013-09-04 22:50:31 +00004369 // GCC's behavior for -Wwrite-strings is a bit strange:
4370 // * In C, this "warning flag" changes the types of string literals from
4371 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4372 // for the discarded qualifier.
4373 // * In C++, this is just a normal warning flag.
4374 //
4375 // Implementing this warning correctly in C is hard, so we follow GCC's
4376 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4377 // a non-const char* in C, rather than using this crude hack.
4378 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004379 // FIXME: This should behave just like a warning flag, and thus should also
4380 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4381 Arg *WriteStrings =
4382 Args.getLastArg(options::OPT_Wwrite_strings,
4383 options::OPT_Wno_write_strings, options::OPT_w);
4384 if (WriteStrings &&
4385 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004386 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004387 }
4388
Chandler Carruth61fbf622011-04-23 09:27:53 +00004389 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004390 // during C++ compilation, which it is by default. GCC keeps this define even
4391 // in the presence of '-w', match this behavior bug-for-bug.
4392 if (types::isCXX(InputType) &&
4393 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4394 true)) {
4395 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004396 }
4397
Chandler Carruthe0391482010-05-22 02:21:53 +00004398 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4399 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4400 if (Asm->getOption().matches(options::OPT_fasm))
4401 CmdArgs.push_back("-fgnu-keywords");
4402 else
4403 CmdArgs.push_back("-fno-gnu-keywords");
4404 }
4405
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004406 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4407 CmdArgs.push_back("-fno-dwarf-directory-asm");
4408
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004409 if (ShouldDisableAutolink(Args, getToolChain()))
4410 CmdArgs.push_back("-fno-autolink");
4411
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004412 // Add in -fdebug-compilation-dir if necessary.
4413 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004414
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004415 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4416 StringRef Map = A->getValue();
4417 if (Map.find('=') == StringRef::npos)
4418 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4419 else
4420 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4421 A->claim();
4422 }
4423
Richard Smith9a568822011-11-21 19:36:32 +00004424 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4425 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004426 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004427 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004428 }
4429
Richard Smith79c927b2013-11-06 19:31:51 +00004430 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4431 CmdArgs.push_back("-foperator-arrow-depth");
4432 CmdArgs.push_back(A->getValue());
4433 }
4434
Richard Smith9a568822011-11-21 19:36:32 +00004435 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4436 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004437 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004438 }
4439
Richard Smitha3d3bd22013-05-08 02:12:03 +00004440 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4441 CmdArgs.push_back("-fconstexpr-steps");
4442 CmdArgs.push_back(A->getValue());
4443 }
4444
Richard Smithb3a14522013-02-22 01:59:51 +00004445 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4446 CmdArgs.push_back("-fbracket-depth");
4447 CmdArgs.push_back(A->getValue());
4448 }
4449
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004450 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4451 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004452 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004453 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004454 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4455 } else
4456 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004457 }
4458
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004459 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004460 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004461
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004462 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4463 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004464 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004465 }
David Chisnall5778fce2009-08-31 16:41:57 +00004466
Chris Lattnere23003d2010-01-09 21:54:33 +00004467 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4468 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004469 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004470 }
4471
Chris Lattnerb35583d2010-04-07 20:49:23 +00004472 CmdArgs.push_back("-ferror-limit");
4473 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004474 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004475 else
4476 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004477
Chandler Carrutha77a7272010-05-06 04:55:18 +00004478 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4479 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004480 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004481 }
4482
4483 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4484 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004485 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004486 }
4487
Richard Smithf6f003a2011-12-16 19:06:07 +00004488 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4489 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004490 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004491 }
4492
Nick Lewycky24653262014-12-16 21:39:02 +00004493 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4494 CmdArgs.push_back("-fspell-checking-limit");
4495 CmdArgs.push_back(A->getValue());
4496 }
4497
Daniel Dunbar2c978472009-11-04 06:24:47 +00004498 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004499 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004500 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004501 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004502 } else {
4503 // If -fmessage-length=N was not specified, determine whether this is a
4504 // terminal and, if so, implicitly define -fmessage-length appropriately.
4505 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004506 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004507 }
4508
John McCallb4a99d32013-02-19 01:57:35 +00004509 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4510 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4511 options::OPT_fvisibility_ms_compat)) {
4512 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4513 CmdArgs.push_back("-fvisibility");
4514 CmdArgs.push_back(A->getValue());
4515 } else {
4516 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4517 CmdArgs.push_back("-fvisibility");
4518 CmdArgs.push_back("hidden");
4519 CmdArgs.push_back("-ftype-visibility");
4520 CmdArgs.push_back("default");
4521 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004522 }
4523
Douglas Gregor08329632010-06-15 17:05:35 +00004524 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004525
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004526 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4527
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004528 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004529 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4530 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004531 CmdArgs.push_back("-ffreestanding");
4532
Daniel Dunbare357d562009-12-03 18:42:11 +00004533 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004534 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004535 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004536 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004537 // Emulated TLS is enabled by default on Android, and can be enabled manually
4538 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004539 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004540 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4541 EmulatedTLSDefault))
4542 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004543 // AltiVec-like language extensions aren't relevant for assembling.
4544 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004545 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004546 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4547 }
Richard Trieu91844232012-06-26 18:18:47 +00004548 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4549 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004550
Alexey Bataevdb390212015-05-20 04:24:19 +00004551 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004552 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4553 options::OPT_fno_openmp, false))
4554 switch (getOpenMPRuntime(getToolChain(), Args)) {
4555 case OMPRT_OMP:
4556 case OMPRT_IOMP5:
4557 // Clang can generate useful OpenMP code for these two runtime libraries.
4558 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004559
4560 // If no option regarding the use of TLS in OpenMP codegeneration is
4561 // given, decide a default based on the target. Otherwise rely on the
4562 // options and pass the right information to the frontend.
4563 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004564 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004565 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004566 break;
4567 default:
4568 // By default, if Clang doesn't know how to generate useful OpenMP code
4569 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4570 // down to the actual compilation.
4571 // FIXME: It would be better to have a mode which *only* omits IR
4572 // generation based on the OpenMP support so that we get consistent
4573 // semantic analysis, etc.
4574 break;
4575 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004576
Peter Collingbourne32701642013-11-01 18:16:25 +00004577 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004578 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004579
Eric Christopher459d2712013-02-19 06:16:53 +00004580 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004581 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4582 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4583 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4584 Arch == llvm::Triple::ppc64le))
4585 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4586 << "ppc/ppc64/ppc64le";
4587 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004588
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004589 // -fzvector is incompatible with -faltivec.
4590 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4591 if (Args.hasArg(options::OPT_faltivec))
4592 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4593 << "-faltivec";
4594
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004595 if (getToolChain().SupportsProfiling())
4596 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004597
4598 // -flax-vector-conversions is default.
4599 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4600 options::OPT_fno_lax_vector_conversions))
4601 CmdArgs.push_back("-fno-lax-vector-conversions");
4602
John Brawna7b4ec02015-08-10 11:11:28 +00004603 if (Args.getLastArg(options::OPT_fapple_kext) ||
4604 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004605 CmdArgs.push_back("-fapple-kext");
4606
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004607 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004608 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004609 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004610 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4611 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004612
4613 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4614 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004615 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004616 }
4617
Bob Wilson14adb362012-02-03 06:27:22 +00004618 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004619
Chandler Carruth6e501032011-03-27 00:04:55 +00004620 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4621 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004622 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004623 if (A->getOption().matches(options::OPT_fwrapv))
4624 CmdArgs.push_back("-fwrapv");
4625 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4626 options::OPT_fno_strict_overflow)) {
4627 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4628 CmdArgs.push_back("-fwrapv");
4629 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004630
4631 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4632 options::OPT_fno_reroll_loops))
4633 if (A->getOption().matches(options::OPT_freroll_loops))
4634 CmdArgs.push_back("-freroll-loops");
4635
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004636 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004637 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4638 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004639
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004640 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4641
Daniel Dunbar4930e332009-11-17 08:07:36 +00004642 // -stack-protector=0 is default.
4643 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004644 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4645 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4646 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4647 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4648 Args.ClaimAllArgs(options::OPT_fstack_protector);
4649 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004650 options::OPT_fstack_protector_all,
4651 options::OPT_fstack_protector_strong,
4652 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004653 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004654 StackProtectorLevel = std::max<unsigned>(
4655 LangOptions::SSPOn,
4656 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004657 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004658 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004659 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004660 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004661 } else {
4662 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004663 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004664 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004665 if (StackProtectorLevel) {
4666 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004667 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004668 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004669
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004670 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004671 for (const Arg *A : Args.filtered(options::OPT__param)) {
4672 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004673 if (Str.startswith("ssp-buffer-size=")) {
4674 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004675 CmdArgs.push_back("-stack-protector-buffer-size");
4676 // FIXME: Verify the argument is a valid integer.
4677 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004678 }
Sean Silva14facf32015-06-09 01:57:17 +00004679 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004680 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004681 }
4682
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004683 // Translate -mstackrealign
4684 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004685 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004686 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004687
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004688 if (Args.hasArg(options::OPT_mstack_alignment)) {
4689 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4690 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004691 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004692
Hans Wennborg77dc2362015-01-20 19:45:50 +00004693 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4694 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4695
4696 if (!Size.empty())
4697 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4698 else
4699 CmdArgs.push_back("-mstack-probe-size=0");
4700 }
4701
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004702 switch (getToolChain().getArch()) {
4703 case llvm::Triple::aarch64:
4704 case llvm::Triple::aarch64_be:
4705 case llvm::Triple::arm:
4706 case llvm::Triple::armeb:
4707 case llvm::Triple::thumb:
4708 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004709 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004710 break;
4711
4712 default:
4713 break;
4714 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004715
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004716 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4717 options::OPT_mno_restrict_it)) {
4718 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4719 CmdArgs.push_back("-backend-option");
4720 CmdArgs.push_back("-arm-restrict-it");
4721 } else {
4722 CmdArgs.push_back("-backend-option");
4723 CmdArgs.push_back("-arm-no-restrict-it");
4724 }
James Y Knight2db38f32015-08-15 03:45:25 +00004725 } else if (Triple.isOSWindows() &&
4726 (Triple.getArch() == llvm::Triple::arm ||
4727 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004728 // Windows on ARM expects restricted IT blocks
4729 CmdArgs.push_back("-backend-option");
4730 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004731 }
4732
Daniel Dunbard18049a2009-04-07 21:16:11 +00004733 // Forward -f options with positive and negative forms; we translate
4734 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004735 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4736 StringRef fname = A->getValue();
4737 if (!llvm::sys::fs::exists(fname))
4738 D.Diag(diag::err_drv_no_such_file) << fname;
4739 else
4740 A->render(Args, CmdArgs);
4741 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004742
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004743 // -fbuiltin is default unless -mkernel is used.
4744 bool UseBuiltins =
4745 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4746 !Args.hasArg(options::OPT_mkernel));
4747 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004748 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004749
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004750 // -ffreestanding implies -fno-builtin.
4751 if (Args.hasArg(options::OPT_ffreestanding))
4752 UseBuiltins = false;
4753
4754 // Process the -fno-builtin-* options.
4755 for (const auto &Arg : Args) {
4756 const Option &O = Arg->getOption();
4757 if (!O.matches(options::OPT_fno_builtin_))
4758 continue;
4759
4760 Arg->claim();
4761 // If -fno-builtin is specified, then there's no need to pass the option to
4762 // the frontend.
4763 if (!UseBuiltins)
4764 continue;
4765
4766 StringRef FuncName = Arg->getValue();
4767 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4768 }
4769
Nuno Lopes13c88c72009-12-16 16:59:22 +00004770 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4771 options::OPT_fno_assume_sane_operator_new))
4772 CmdArgs.push_back("-fno-assume-sane-operator-new");
4773
Daniel Dunbar4930e332009-11-17 08:07:36 +00004774 // -fblocks=0 is default.
4775 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004776 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004777 (Args.hasArg(options::OPT_fgnu_runtime) &&
4778 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4779 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004780 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004781
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004782 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004783 !getToolChain().hasBlocksRuntime())
4784 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004785 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004786
Richard Smith47972af2015-06-16 00:08:24 +00004787 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004788 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004789 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004790 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004791 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004792 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4793 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004794 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004795 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004796 HaveModules = true;
4797 }
4798 }
4799
Richard Smith47972af2015-06-16 00:08:24 +00004800 // -fmodule-maps enables implicit reading of module map files. By default,
4801 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004802 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4803 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004804 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004805 }
4806
Daniel Jasperac42b752013-10-21 06:34:34 +00004807 // -fmodules-decluse checks that modules used are declared so (off by
4808 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004809 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004810 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004811 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004812 }
4813
Daniel Jasper962b38e2014-04-11 11:47:45 +00004814 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4815 // all #included headers are part of modules.
4816 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004817 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004818 CmdArgs.push_back("-fmodules-strict-decluse");
4819 }
4820
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004821 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4822 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4823 options::OPT_fno_implicit_modules)) {
4824 CmdArgs.push_back("-fno-implicit-modules");
4825 }
4826
Daniel Jasperac42b752013-10-21 06:34:34 +00004827 // -fmodule-name specifies the module that is currently being built (or
4828 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004829 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004830
Richard Smith9887d792014-10-17 01:42:53 +00004831 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004832 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004833 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004834
Richard Smithe842a472014-10-22 02:05:46 +00004835 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004836 if (HaveModules)
4837 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4838 else
4839 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004840
4841 // -fmodule-cache-path specifies where our implicitly-built module files
4842 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004843 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004844 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004845 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004846 if (HaveModules) {
4847 if (C.isForDiagnostics()) {
4848 // When generating crash reports, we want to emit the modules along with
4849 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004850 Path = Output.getFilename();
4851 llvm::sys::path::replace_extension(Path, ".cache");
4852 llvm::sys::path::append(Path, "modules");
4853 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004854 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004855 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004856 llvm::sys::path::append(Path, "org.llvm.clang.");
4857 appendUserToPath(Path);
4858 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004859 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004860 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004861 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4862 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004863 }
4864
4865 // When building modules and generating crashdumps, we need to dump a module
4866 // dependency VFS alongside the output.
4867 if (HaveModules && C.isForDiagnostics()) {
4868 SmallString<128> VFSDir(Output.getFilename());
4869 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004870 // Add the cache directory as a temp so the crash diagnostics pick it up.
4871 C.addTempFile(Args.MakeArgString(VFSDir));
4872
Justin Bognera88f0122014-06-20 22:59:50 +00004873 llvm::sys::path::append(VFSDir, "vfs");
4874 CmdArgs.push_back("-module-dependency-dir");
4875 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004876 }
4877
Richard Smith9887d792014-10-17 01:42:53 +00004878 if (HaveModules)
4879 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004880
Douglas Gregor35b04d62013-02-07 19:01:24 +00004881 // Pass through all -fmodules-ignore-macro arguments.
4882 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004883 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4884 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004885
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004886 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4887
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004888 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4889 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4890 D.Diag(diag::err_drv_argument_not_allowed_with)
4891 << A->getAsString(Args) << "-fbuild-session-timestamp";
4892
4893 llvm::sys::fs::file_status Status;
4894 if (llvm::sys::fs::status(A->getValue(), Status))
4895 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004896 CmdArgs.push_back(Args.MakeArgString(
4897 "-fbuild-session-timestamp=" +
4898 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004899 }
4900
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004901 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004902 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4903 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004904 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4905
4906 Args.AddLastArg(CmdArgs,
4907 options::OPT_fmodules_validate_once_per_build_session);
4908 }
4909
Ben Langmuirdcf73862014-03-12 00:06:17 +00004910 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4911
John McCalldfea9982010-04-09 19:12:06 +00004912 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004913 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004914 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004915 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004916
Anders Carlssond470fef2010-11-21 00:09:52 +00004917 // -felide-constructors is the default.
4918 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004919 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004920 CmdArgs.push_back("-fno-elide-constructors");
4921
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004922 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004923
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004924 if (KernelOrKext || (types::isCXX(InputType) &&
4925 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4926 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004927 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004928
Tony Linthicum76329bf2011-12-12 21:14:55 +00004929 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004930 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4931 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004932 CmdArgs.push_back("-fshort-enums");
4933
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004934 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004935 if (Arg *A = Args.getLastArg(
4936 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4937 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4938 if (A->getOption().matches(options::OPT_funsigned_char) ||
4939 A->getOption().matches(options::OPT_fno_signed_char)) {
4940 CmdArgs.push_back("-fno-signed-char");
4941 }
4942 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004943 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004944 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004945
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004946 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004947 if (!Args.hasFlag(
4948 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4949 !IsWindowsCygnus && !IsWindowsGNU &&
4950 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4951 getToolChain().getArch() != llvm::Triple::hexagon &&
4952 getToolChain().getArch() != llvm::Triple::xcore &&
4953 ((getToolChain().getTriple().getVendor() !=
4954 llvm::Triple::MipsTechnologies) ||
4955 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004956 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004957 CmdArgs.push_back("-fno-use-cxa-atexit");
4958
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004959 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004960 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004961 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004962 CmdArgs.push_back("-fms-extensions");
4963
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004964 // -fno-use-line-directives is default.
4965 if (Args.hasFlag(options::OPT_fuse_line_directives,
4966 options::OPT_fno_use_line_directives, false))
4967 CmdArgs.push_back("-fuse-line-directives");
4968
Francois Pichet1b4f1632011-09-17 04:32:15 +00004969 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004970 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004971 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004972 (IsWindowsMSVC &&
4973 Args.hasFlag(options::OPT_fms_extensions,
4974 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004975 CmdArgs.push_back("-fms-compatibility");
4976
David Majnemerc371ff02015-03-22 08:39:22 +00004977 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004978 VersionTuple MSVT = visualstudio::getMSVCVersion(
4979 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4980 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004981 CmdArgs.push_back(
4982 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004983
David Majnemer8db91762015-05-18 04:49:30 +00004984 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4985 if (ImplyVCPPCXXVer) {
4986 if (IsMSVC2015Compatible)
4987 CmdArgs.push_back("-std=c++14");
4988 else
4989 CmdArgs.push_back("-std=c++11");
4990 }
4991
Eric Christopher5ecce122013-02-18 00:38:31 +00004992 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004993 if (Args.hasFlag(options::OPT_fborland_extensions,
4994 options::OPT_fno_borland_extensions, false))
4995 CmdArgs.push_back("-fborland-extensions");
4996
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004997 // -fno-declspec is default, except for PS4.
4998 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4999 getToolChain().getTriple().isPS4()))
5000 CmdArgs.push_back("-fdeclspec");
5001 else if (Args.hasArg(options::OPT_fno_declspec))
5002 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5003
David Majnemerc371ff02015-03-22 08:39:22 +00005004 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5005 // than 19.
5006 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5007 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005008 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005009 CmdArgs.push_back("-fno-threadsafe-statics");
5010
Francois Pichet02744872011-09-01 16:38:08 +00005011 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5012 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005013 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005014 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005015 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005016
Chandler Carruthe03aa552010-04-17 20:17:31 +00005017 // -fgnu-keywords default varies depending on language; only pass if
5018 // specified.
5019 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005020 options::OPT_fno_gnu_keywords))
5021 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005022
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005023 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005024 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005025 CmdArgs.push_back("-fgnu89-inline");
5026
Chad Rosier9c76d242012-03-15 22:31:42 +00005027 if (Args.hasArg(options::OPT_fno_inline))
5028 CmdArgs.push_back("-fno-inline");
5029
Chad Rosier64d6be92012-03-06 21:17:19 +00005030 if (Args.hasArg(options::OPT_fno_inline_functions))
5031 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005032
John McCall5fb5df92012-06-20 06:18:46 +00005033 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005034
John McCall5fb5df92012-06-20 06:18:46 +00005035 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005036 // legacy is the default. Except for deployment taget of 10.5,
5037 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5038 // gets ignored silently.
5039 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005040 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5041 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005042 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005043 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005044 if (getToolChain().UseObjCMixedDispatch())
5045 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5046 else
5047 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5048 }
5049 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005050
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005051 // When ObjectiveC legacy runtime is in effect on MacOSX,
5052 // turn on the option to do Array/Dictionary subscripting
5053 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005054 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005055 getToolChain().getTriple().isMacOSX() &&
5056 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5057 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005058 objcRuntime.isNeXTFamily())
5059 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005060
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005061 // -fencode-extended-block-signature=1 is default.
5062 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5063 CmdArgs.push_back("-fencode-extended-block-signature");
5064 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005065
John McCall24fc0de2011-07-06 00:26:06 +00005066 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5067 // NOTE: This logic is duplicated in ToolChains.cpp.
5068 bool ARC = isObjCAutoRefCount(Args);
5069 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005070 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005071
John McCall24fc0de2011-07-06 00:26:06 +00005072 CmdArgs.push_back("-fobjc-arc");
5073
Chandler Carruth491db322011-11-04 07:34:47 +00005074 // FIXME: It seems like this entire block, and several around it should be
5075 // wrapped in isObjC, but for now we just use it here as this is where it
5076 // was being used previously.
5077 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5078 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5079 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5080 else
5081 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5082 }
5083
John McCall24fc0de2011-07-06 00:26:06 +00005084 // Allow the user to enable full exceptions code emission.
5085 // We define off for Objective-CC, on for Objective-C++.
5086 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5087 options::OPT_fno_objc_arc_exceptions,
5088 /*default*/ types::isCXX(InputType)))
5089 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005090
John McCall24fc0de2011-07-06 00:26:06 +00005091 }
5092
5093 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5094 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005095 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005096 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005097
John McCall24fc0de2011-07-06 00:26:06 +00005098 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5099 // takes precedence.
5100 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5101 if (!GCArg)
5102 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5103 if (GCArg) {
5104 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005105 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005106 } else if (getToolChain().SupportsObjCGC()) {
5107 GCArg->render(Args, CmdArgs);
5108 } else {
5109 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005110 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005111 }
5112 }
5113
John McCallfbe5ed72015-11-05 19:19:56 +00005114 // Pass down -fobjc-weak or -fno-objc-weak if present.
5115 if (types::isObjC(InputType)) {
5116 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5117 options::OPT_fno_objc_weak);
5118 if (!WeakArg) {
5119 // nothing to do
5120 } else if (GCArg) {
5121 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5122 D.Diag(diag::err_objc_weak_with_gc);
5123 } else if (!objcRuntime.allowsWeak()) {
5124 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5125 D.Diag(diag::err_objc_weak_unsupported);
5126 } else {
5127 WeakArg->render(Args, CmdArgs);
5128 }
5129 }
5130
Bob Wilsonb111ec92015-03-02 19:01:14 +00005131 if (Args.hasFlag(options::OPT_fapplication_extension,
5132 options::OPT_fno_application_extension, false))
5133 CmdArgs.push_back("-fapplication-extension");
5134
Reid Klecknerc542d372014-06-27 17:02:02 +00005135 // Handle GCC-style exception args.
5136 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005137 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5138 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005139
Tim Northovere931f9f2015-10-30 16:30:41 +00005140 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005141 CmdArgs.push_back("-fsjlj-exceptions");
5142
5143 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005144 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5145 options::OPT_fno_assume_sane_operator_new))
5146 CmdArgs.push_back("-fno-assume-sane-operator-new");
5147
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005148 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5149 // most platforms.
5150 if (Args.hasFlag(options::OPT_fsized_deallocation,
5151 options::OPT_fno_sized_deallocation, false))
5152 CmdArgs.push_back("-fsized-deallocation");
5153
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005154 // -fconstant-cfstrings is default, and may be subject to argument translation
5155 // on Darwin.
5156 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5157 options::OPT_fno_constant_cfstrings) ||
5158 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5159 options::OPT_mno_constant_cfstrings))
5160 CmdArgs.push_back("-fno-constant-cfstrings");
5161
John Thompsoned4e2952009-11-05 20:14:16 +00005162 // -fshort-wchar default varies depending on platform; only
5163 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005164 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5165 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005166 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005167
Hans Wennborg28c96312013-07-31 23:39:13 +00005168 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005169 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005170 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005171 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005172
Daniel Dunbar096ed292011-10-05 21:04:55 +00005173 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5174 // -fno-pack-struct doesn't apply to -fpack-struct=.
5175 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005176 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005177 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005178 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005179 } else if (Args.hasFlag(options::OPT_fpack_struct,
5180 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005181 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005182 }
5183
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005184 // Handle -fmax-type-align=N and -fno-type-align
5185 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5186 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5187 if (!SkipMaxTypeAlign) {
5188 std::string MaxTypeAlignStr = "-fmax-type-align=";
5189 MaxTypeAlignStr += A->getValue();
5190 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5191 }
5192 } else if (getToolChain().getTriple().isOSDarwin()) {
5193 if (!SkipMaxTypeAlign) {
5194 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5195 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5196 }
5197 }
5198
John Brawna7b4ec02015-08-10 11:11:28 +00005199 // -fcommon is the default unless compiling kernel code or the target says so
5200 bool NoCommonDefault =
5201 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5202 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5203 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005204 CmdArgs.push_back("-fno-common");
5205
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005206 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005207 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005208 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005209 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005210 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005211 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005212
Daniel Dunbar6358d682010-10-15 22:30:42 +00005213 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005214 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005215 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005216 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005217
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005218 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005219 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5220 StringRef value = inputCharset->getValue();
5221 if (value != "UTF-8")
5222 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5223 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005224 }
5225
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005226 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005227 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5228 StringRef value = execCharset->getValue();
5229 if (value != "UTF-8")
5230 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5231 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005232 }
5233
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005234 // -fcaret-diagnostics is default.
5235 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5236 options::OPT_fno_caret_diagnostics, true))
5237 CmdArgs.push_back("-fno-caret-diagnostics");
5238
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005239 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005240 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005241 options::OPT_fno_diagnostics_fixit_info))
5242 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005243
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005244 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005245 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005246 options::OPT_fno_diagnostics_show_option))
5247 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005248
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005249 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005250 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005251 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005252 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005253 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005254
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005255 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005256 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005257 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005258 }
5259
Chandler Carruthb6766f02011-03-27 01:50:55 +00005260 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005261 options::OPT_fdiagnostics_show_note_include_stack,
5262 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005263 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005264 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005265 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5266 else
5267 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5268 }
5269
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005270 // Color diagnostics are the default, unless the terminal doesn't support
5271 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005272 // Support both clang's -f[no-]color-diagnostics and gcc's
5273 // -f[no-]diagnostics-colors[=never|always|auto].
5274 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005275 for (const auto &Arg : Args) {
5276 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005277 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5278 !O.matches(options::OPT_fdiagnostics_color) &&
5279 !O.matches(options::OPT_fno_color_diagnostics) &&
5280 !O.matches(options::OPT_fno_diagnostics_color) &&
5281 !O.matches(options::OPT_fdiagnostics_color_EQ))
5282 continue;
5283
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005284 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005285 if (O.matches(options::OPT_fcolor_diagnostics) ||
5286 O.matches(options::OPT_fdiagnostics_color)) {
5287 ShowColors = Colors_On;
5288 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5289 O.matches(options::OPT_fno_diagnostics_color)) {
5290 ShowColors = Colors_Off;
5291 } else {
5292 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005293 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005294 if (value == "always")
5295 ShowColors = Colors_On;
5296 else if (value == "never")
5297 ShowColors = Colors_Off;
5298 else if (value == "auto")
5299 ShowColors = Colors_Auto;
5300 else
5301 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005302 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005303 }
5304 }
5305 if (ShowColors == Colors_On ||
5306 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005307 CmdArgs.push_back("-fcolor-diagnostics");
5308
Nico Rieck7857d462013-09-11 00:38:02 +00005309 if (Args.hasArg(options::OPT_fansi_escape_codes))
5310 CmdArgs.push_back("-fansi-escape-codes");
5311
Daniel Dunbardb097022009-06-08 21:13:54 +00005312 if (!Args.hasFlag(options::OPT_fshow_source_location,
5313 options::OPT_fno_show_source_location))
5314 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005315
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005316 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005317 true))
5318 CmdArgs.push_back("-fno-show-column");
5319
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005320 if (!Args.hasFlag(options::OPT_fspell_checking,
5321 options::OPT_fno_spell_checking))
5322 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005323
Chad Rosierc8e56e82012-12-05 21:08:21 +00005324 // -fno-asm-blocks is default.
5325 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5326 false))
5327 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005328
Steven Wucb0d13f2015-01-16 23:05:28 +00005329 // -fgnu-inline-asm is default.
5330 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5331 options::OPT_fno_gnu_inline_asm, true))
5332 CmdArgs.push_back("-fno-gnu-inline-asm");
5333
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005334 // Enable vectorization per default according to the optimization level
5335 // selected. For optimization levels that want vectorization we use the alias
5336 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005337 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005338 OptSpecifier VectorizeAliasOption =
5339 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005340 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005341 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005342 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005343
Chad Rosier136d67d2014-04-28 19:30:57 +00005344 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005345 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005346 OptSpecifier SLPVectAliasOption =
5347 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005348 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005349 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005350 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005351
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005352 // -fno-slp-vectorize-aggressive is default.
5353 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005354 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005355 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005356
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005357 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5358 A->render(Args, CmdArgs);
5359
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005360 // -fdollars-in-identifiers default varies depending on platform and
5361 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005362 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005363 options::OPT_fno_dollars_in_identifiers)) {
5364 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005365 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005366 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005367 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005368 }
5369
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005370 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5371 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005372 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005373 options::OPT_fno_unit_at_a_time)) {
5374 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005375 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005376 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005377
Eli Friedman055c9702011-11-02 01:53:16 +00005378 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5379 options::OPT_fno_apple_pragma_pack, false))
5380 CmdArgs.push_back("-fapple-pragma-pack");
5381
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005382 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005383 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5384 // by default.
5385 if (getToolChain().getArch() == llvm::Triple::le32) {
5386 CmdArgs.push_back("-fno-math-builtin");
5387 }
5388
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005389// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5390//
5391// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005392#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005393 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005394 (getToolChain().getArch() == llvm::Triple::arm ||
5395 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005396 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5397 CmdArgs.push_back("-fno-builtin-strcat");
5398 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5399 CmdArgs.push_back("-fno-builtin-strcpy");
5400 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005401#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005402
Justin Bognera88f0122014-06-20 22:59:50 +00005403 // Enable rewrite includes if the user's asked for it or if we're generating
5404 // diagnostics.
5405 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5406 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005407 if (Args.hasFlag(options::OPT_frewrite_includes,
5408 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005409 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005410 CmdArgs.push_back("-frewrite-includes");
5411
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005412 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005413 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005414 options::OPT_traditional_cpp)) {
5415 if (isa<PreprocessJobAction>(JA))
5416 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005417 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005418 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005419 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005420
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005421 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005422 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005423
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005424 // Handle serialized diagnostics.
5425 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5426 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005427 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005428 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005429
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005430 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5431 CmdArgs.push_back("-fretain-comments-from-system-headers");
5432
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005433 // Forward -fcomment-block-commands to -cc1.
5434 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005435 // Forward -fparse-all-comments to -cc1.
5436 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005437
John Brawnad31ace2015-09-23 13:55:40 +00005438 // Turn -fplugin=name.so into -load name.so
5439 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5440 CmdArgs.push_back("-load");
5441 CmdArgs.push_back(A->getValue());
5442 A->claim();
5443 }
5444
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005445 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5446 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005447 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005448 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5449 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005450
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005451 // We translate this by hand to the -cc1 argument, since nightly test uses
5452 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005453 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005454 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005455 } else
Sean Silva14facf32015-06-09 01:57:17 +00005456 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005457 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005458
Bob Wilson23a55f12014-12-21 07:00:00 +00005459 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005460 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5461 // by the frontend.
5462 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5463 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005464
Daniel Dunbard67a3222009-03-30 06:36:42 +00005465 if (Output.getType() == types::TY_Dependencies) {
5466 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005467 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005468 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005469 CmdArgs.push_back(Output.getFilename());
5470 } else {
5471 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005472 }
5473
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005474 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005475
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005476 if (Input.isFilename())
5477 CmdArgs.push_back(Input.getFilename());
5478 else
5479 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005480
Chris Lattnere9d7d782009-11-03 19:50:27 +00005481 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5482
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005483 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005484
5485 // Optionally embed the -cc1 level arguments into the debug info, for build
5486 // analysis.
5487 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005488 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005489 for (const auto &Arg : Args)
5490 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005491
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005492 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005493 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005494 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005495 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005496 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005497 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005498 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005499 }
5500 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005501 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005502 }
5503
Eric Christopherd3804002013-02-22 20:12:52 +00005504 // Add the split debug info name to the command lines here so we
5505 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005506 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005507 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5508 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005509 const char *SplitDwarfOut;
5510 if (SplitDwarf) {
5511 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005512 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005513 CmdArgs.push_back(SplitDwarfOut);
5514 }
5515
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005516 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5517 // Include them with -fcuda-include-gpubinary.
5518 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005519 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005520 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005521 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005522 }
5523
Eric Christopherd3804002013-02-22 20:12:52 +00005524 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005525 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005526 Output.getType() == types::TY_Object &&
5527 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005528 auto CLCommand =
5529 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005530 C.addCommand(llvm::make_unique<FallbackCommand>(
5531 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005532 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005533 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005534 }
5535
Eric Christopherf1545832013-02-22 23:50:16 +00005536 // Handle the debug info splitting at object creation time if we're
5537 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005538 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005539 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005540 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005541
Roman Divacky178e01602011-02-10 16:52:03 +00005542 if (Arg *A = Args.getLastArg(options::OPT_pg))
5543 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005544 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5545 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005546
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005547 // Claim some arguments which clang supports automatically.
5548
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005549 // -fpch-preprocess is used with gcc to add a special marker in the output to
5550 // include the PCH file. Clang's PTH solution is completely transparent, so we
5551 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005552 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005553
Daniel Dunbar17731772009-03-23 19:03:36 +00005554 // Claim some arguments which clang doesn't support, but we don't
5555 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005556 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5557 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005558
Rafael Espindolab0092d72013-09-04 19:37:35 +00005559 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005560 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005561}
5562
John McCall5fb5df92012-06-20 06:18:46 +00005563/// Add options related to the Objective-C runtime/ABI.
5564///
5565/// Returns true if the runtime is non-fragile.
5566ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5567 ArgStringList &cmdArgs,
5568 RewriteKind rewriteKind) const {
5569 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005570 Arg *runtimeArg =
5571 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5572 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005573
5574 // Just forward -fobjc-runtime= to the frontend. This supercedes
5575 // options about fragility.
5576 if (runtimeArg &&
5577 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5578 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005579 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005580 if (runtime.tryParse(value)) {
5581 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005582 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005583 }
5584
5585 runtimeArg->render(args, cmdArgs);
5586 return runtime;
5587 }
5588
5589 // Otherwise, we'll need the ABI "version". Version numbers are
5590 // slightly confusing for historical reasons:
5591 // 1 - Traditional "fragile" ABI
5592 // 2 - Non-fragile ABI, version 1
5593 // 3 - Non-fragile ABI, version 2
5594 unsigned objcABIVersion = 1;
5595 // If -fobjc-abi-version= is present, use that to set the version.
5596 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005597 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005598 if (value == "1")
5599 objcABIVersion = 1;
5600 else if (value == "2")
5601 objcABIVersion = 2;
5602 else if (value == "3")
5603 objcABIVersion = 3;
5604 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005605 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005606 } else {
5607 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005608 bool nonFragileABIIsDefault =
5609 (rewriteKind == RK_NonFragile ||
5610 (rewriteKind == RK_None &&
5611 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005612 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5613 options::OPT_fno_objc_nonfragile_abi,
5614 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005615// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005616#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5617 unsigned nonFragileABIVersion = 1;
5618#else
5619 unsigned nonFragileABIVersion = 2;
5620#endif
5621
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005622 if (Arg *abiArg =
5623 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005624 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005625 if (value == "1")
5626 nonFragileABIVersion = 1;
5627 else if (value == "2")
5628 nonFragileABIVersion = 2;
5629 else
5630 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005631 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005632 }
5633
5634 objcABIVersion = 1 + nonFragileABIVersion;
5635 } else {
5636 objcABIVersion = 1;
5637 }
5638 }
5639
5640 // We don't actually care about the ABI version other than whether
5641 // it's non-fragile.
5642 bool isNonFragile = objcABIVersion != 1;
5643
5644 // If we have no runtime argument, ask the toolchain for its default runtime.
5645 // However, the rewriter only really supports the Mac runtime, so assume that.
5646 ObjCRuntime runtime;
5647 if (!runtimeArg) {
5648 switch (rewriteKind) {
5649 case RK_None:
5650 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5651 break;
5652 case RK_Fragile:
5653 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5654 break;
5655 case RK_NonFragile:
5656 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5657 break;
5658 }
5659
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005660 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005661 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5662 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005663 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005664 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5665
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005666 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005667 } else {
5668 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5669 }
5670
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005671 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005672 } else {
5673 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005674 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005675 // non-fragile mode or the GCC runtime in fragile mode.
5676 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005677 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005678 else
5679 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005680 }
5681
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005682 cmdArgs.push_back(
5683 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005684 return runtime;
5685}
5686
Reid Klecknerc542d372014-06-27 17:02:02 +00005687static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5688 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5689 I += HaveDash;
5690 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005691}
Reid Klecknerc542d372014-06-27 17:02:02 +00005692
Benjamin Kramere003ca22015-10-28 13:54:16 +00005693namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005694struct EHFlags {
5695 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5696 bool Synch;
5697 bool Asynch;
5698 bool NoExceptC;
5699};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005700} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005701
5702/// /EH controls whether to run destructor cleanups when exceptions are
5703/// thrown. There are three modifiers:
5704/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5705/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5706/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5707/// - c: Assume that extern "C" functions are implicitly noexcept. This
5708/// modifier is an optimization, so we ignore it for now.
5709/// The default is /EHs-c-, meaning cleanups are disabled.
5710static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5711 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005712
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005713 std::vector<std::string> EHArgs =
5714 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005715 for (auto EHVal : EHArgs) {
5716 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5717 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005718 case 'a':
5719 EH.Asynch = maybeConsumeDash(EHVal, I);
5720 continue;
5721 case 'c':
5722 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5723 continue;
5724 case 's':
5725 EH.Synch = maybeConsumeDash(EHVal, I);
5726 continue;
5727 default:
5728 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005729 }
5730 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5731 break;
5732 }
5733 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005734
Reid Klecknerc542d372014-06-27 17:02:02 +00005735 return EH;
5736}
5737
Douglas Katzman3459ce22015-10-08 04:24:12 +00005738void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5739 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5740 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005741 unsigned RTOptionID = options::OPT__SLASH_MT;
5742
Hans Wennborgf1a74252013-09-10 20:18:04 +00005743 if (Args.hasArg(options::OPT__SLASH_LDd))
5744 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5745 // but defining _DEBUG is sticky.
5746 RTOptionID = options::OPT__SLASH_MTd;
5747
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005748 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005749 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005750
David Majnemere2afb472015-07-24 06:49:13 +00005751 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005752 switch (RTOptionID) {
5753 case options::OPT__SLASH_MD:
5754 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005755 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005756 CmdArgs.push_back("-D_MT");
5757 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005758 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005759 break;
5760 case options::OPT__SLASH_MDd:
5761 CmdArgs.push_back("-D_DEBUG");
5762 CmdArgs.push_back("-D_MT");
5763 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005764 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005765 break;
5766 case options::OPT__SLASH_MT:
5767 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005768 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005769 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005770 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005771 break;
5772 case options::OPT__SLASH_MTd:
5773 CmdArgs.push_back("-D_DEBUG");
5774 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005775 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005776 break;
5777 default:
5778 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005779 }
5780
David Majnemere2afb472015-07-24 06:49:13 +00005781 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5782 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5783 } else {
5784 CmdArgs.push_back(FlagForCRT.data());
5785
5786 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5787 // users want. The /Za flag to cl.exe turns this off, but it's not
5788 // implemented in clang.
5789 CmdArgs.push_back("--dependent-lib=oldnames");
5790 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005791
Hans Wennborg8858a032014-07-21 23:42:07 +00005792 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5793 // would produce interleaved output, so ignore /showIncludes in such cases.
5794 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5795 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5796 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005797
David Majnemerf6072342014-07-01 22:24:56 +00005798 // This controls whether or not we emit RTTI data for polymorphic types.
5799 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5800 /*default=*/false))
5801 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005802
Reid Kleckner124955a2015-08-05 18:51:13 +00005803 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005804 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005805 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5806 // If we are emitting CV but not DWARF, don't build information that LLVM
5807 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005808 if (*EmitCodeView && !EmitDwarf)
5809 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5810 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005811 CmdArgs.push_back("-gcodeview");
5812
Reid Klecknerc542d372014-06-27 17:02:02 +00005813 const Driver &D = getToolChain().getDriver();
5814 EHFlags EH = parseClangCLEHFlags(D, Args);
5815 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005816 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005817 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005818 CmdArgs.push_back("-fexceptions");
5819 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005820
Hans Wennborge50cec32014-06-13 20:59:54 +00005821 // /EP should expand to -E -P.
5822 if (Args.hasArg(options::OPT__SLASH_EP)) {
5823 CmdArgs.push_back("-E");
5824 CmdArgs.push_back("-P");
5825 }
5826
David Majnemera5b195a2015-02-14 01:35:12 +00005827 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005828 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5829 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005830 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5831 else
5832 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5833
5834 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5835 VolatileOptionID = A->getOption().getID();
5836
5837 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5838 CmdArgs.push_back("-fms-volatile");
5839
David Majnemer86c318f2014-02-11 21:05:00 +00005840 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5841 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5842 if (MostGeneralArg && BestCaseArg)
5843 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5844 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5845
5846 if (MostGeneralArg) {
5847 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5848 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5849 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5850
5851 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5852 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5853 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5854 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5855 << FirstConflict->getAsString(Args)
5856 << SecondConflict->getAsString(Args);
5857
5858 if (SingleArg)
5859 CmdArgs.push_back("-fms-memptr-rep=single");
5860 else if (MultipleArg)
5861 CmdArgs.push_back("-fms-memptr-rep=multiple");
5862 else
5863 CmdArgs.push_back("-fms-memptr-rep=virtual");
5864 }
5865
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005866 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5867 A->render(Args, CmdArgs);
5868
Hans Wennborg81f74482013-09-10 01:07:07 +00005869 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5870 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005871 if (Args.hasArg(options::OPT__SLASH_fallback))
5872 CmdArgs.push_back("msvc-fallback");
5873 else
5874 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005875 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005876}
5877
Douglas Katzman95354292015-06-23 20:42:09 +00005878visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005879 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005880 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005881 return CLFallback.get();
5882}
5883
Daniel Sanders7f933f42015-01-30 17:35:23 +00005884void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5885 ArgStringList &CmdArgs) const {
5886 StringRef CPUName;
5887 StringRef ABIName;
5888 const llvm::Triple &Triple = getToolChain().getTriple();
5889 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5890
5891 CmdArgs.push_back("-target-abi");
5892 CmdArgs.push_back(ABIName.data());
5893}
5894
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005895void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005896 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005897 const ArgList &Args,
5898 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005899 ArgStringList CmdArgs;
5900
5901 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5902 const InputInfo &Input = Inputs[0];
5903
James Y Knight2db38f32015-08-15 03:45:25 +00005904 std::string TripleStr =
5905 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5906 const llvm::Triple Triple(TripleStr);
5907
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005908 // Don't warn about "clang -w -c foo.s"
5909 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005910 // and "clang -emit-llvm -c foo.s"
5911 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005912
Rafael Espindola577637a2015-01-03 00:06:04 +00005913 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005914
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005915 // Invoke ourselves in -cc1as mode.
5916 //
5917 // FIXME: Implement custom jobs for internal actions.
5918 CmdArgs.push_back("-cc1as");
5919
5920 // Add the "effective" target triple.
5921 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005922 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5923
5924 // Set the output mode, we currently only expect to be used as a real
5925 // assembler.
5926 CmdArgs.push_back("-filetype");
5927 CmdArgs.push_back("obj");
5928
Eric Christopher45f2e712012-12-18 00:31:10 +00005929 // Set the main file name, so that debug info works even with
5930 // -save-temps or preprocessed assembly.
5931 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005932 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005933
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005934 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005935 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005936 if (!CPU.empty()) {
5937 CmdArgs.push_back("-target-cpu");
5938 CmdArgs.push_back(Args.MakeArgString(CPU));
5939 }
5940
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005941 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005942 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005943
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005944 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005945 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005946
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005947 // Pass along any -I options so we get proper .include search paths.
5948 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5949
Eric Christopherfc3ee562012-01-10 00:38:01 +00005950 // Determine the original source input.
5951 const Action *SourceAction = &JA;
5952 while (SourceAction->getKind() != Action::InputClass) {
5953 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5954 SourceAction = SourceAction->getInputs()[0];
5955 }
5956
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005957 // Forward -g and handle debug info related flags, assuming we are dealing
5958 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005959 if (SourceAction->getType() == types::TY_Asm ||
5960 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005961 bool WantDebug = false;
5962 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005963 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005964 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00005965 WantDebug = !A->getOption().matches(options::OPT_g0) &&
5966 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005967 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005968 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005969 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005970 if (DwarfVersion == 0)
5971 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005972 RenderDebugEnablingArgs(Args, CmdArgs,
5973 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5974 : CodeGenOptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00005975 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005976
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005977 // Add the -fdebug-compilation-dir flag if needed.
5978 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005979
5980 // Set the AT_producer to the clang version when using the integrated
5981 // assembler on assembly source files.
5982 CmdArgs.push_back("-dwarf-debug-producer");
5983 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005984
5985 // And pass along -I options
5986 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005987 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005988
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005989 // Handle -fPIC et al -- the relocation-model affects the assembler
5990 // for some targets.
5991 llvm::Reloc::Model RelocationModel;
5992 unsigned PICLevel;
5993 bool IsPIE;
5994 std::tie(RelocationModel, PICLevel, IsPIE) =
5995 ParsePICArgs(getToolChain(), Triple, Args);
5996
5997 const char *RMName = RelocationModelName(RelocationModel);
5998 if (RMName) {
5999 CmdArgs.push_back("-mrelocation-model");
6000 CmdArgs.push_back(RMName);
6001 }
6002
Kevin Enderby292dc082011-12-22 19:31:58 +00006003 // Optionally embed the -cc1as level arguments into the debug info, for build
6004 // analysis.
6005 if (getToolChain().UseDwarfDebugFlags()) {
6006 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006007 for (const auto &Arg : Args)
6008 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006009
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006010 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006011 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6012 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006013 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006014 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006015 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006016 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006017 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006018 }
6019 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006020 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006021 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006022
6023 // FIXME: Add -static support, once we have it.
6024
Daniel Sanders7f933f42015-01-30 17:35:23 +00006025 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006026 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006027 default:
6028 break;
6029
6030 case llvm::Triple::mips:
6031 case llvm::Triple::mipsel:
6032 case llvm::Triple::mips64:
6033 case llvm::Triple::mips64el:
6034 AddMIPSTargetArgs(Args, CmdArgs);
6035 break;
6036 }
6037
David Blaikie372d9502014-01-17 03:17:40 +00006038 // Consume all the warning flags. Usually this would be handled more
6039 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6040 // doesn't handle that so rather than warning about unused flags that are
6041 // actually used, we'll lie by omission instead.
6042 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00006043 for (const Arg *A : Args.filtered(options::OPT_W_Group))
6044 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00006045
David Blaikie9260ed62013-07-25 21:19:01 +00006046 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6047 getToolChain().getDriver());
6048
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006049 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006050
6051 assert(Output.isFilename() && "Unexpected lipo output.");
6052 CmdArgs.push_back("-o");
6053 CmdArgs.push_back(Output.getFilename());
6054
Daniel Dunbarb440f562010-08-02 02:38:21 +00006055 assert(Input.isFilename() && "Invalid input.");
6056 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006057
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006058 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006059 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006060
6061 // Handle the debug info splitting at object creation time if we're
6062 // creating an object.
6063 // TODO: Currently only works on linux with newer objcopy.
6064 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006065 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006066 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006067 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006068}
6069
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006070void GnuTool::anchor() {}
6071
Daniel Dunbara3246a02009-03-18 08:07:30 +00006072void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006073 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006074 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006075 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006076 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006077 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006078
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006079 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006080 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00006081 // Don't forward any -g arguments to assembly steps.
6082 if (isa<AssembleJobAction>(JA) &&
6083 A->getOption().matches(options::OPT_g_Group))
6084 continue;
6085
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006086 // Don't forward any -W arguments to assembly and link steps.
6087 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6088 A->getOption().matches(options::OPT_W_Group))
6089 continue;
6090
Daniel Dunbar2da02722009-03-19 07:55:12 +00006091 // It is unfortunate that we have to claim here, as this means
6092 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00006093 // platforms using a generic gcc, even if we are just using gcc
6094 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00006095 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006096 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006097 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006098 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006099
Daniel Dunbar4e295052010-01-25 22:35:08 +00006100 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006101
6102 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006103 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006104 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006105 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006106 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006107 }
6108
Daniel Dunbar5716d872009-05-02 21:41:52 +00006109 // Try to force gcc to match the tool chain we want, if we recognize
6110 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006111 //
6112 // FIXME: The triple class should directly provide the information we want
6113 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006114 switch (getToolChain().getArch()) {
6115 default:
6116 break;
6117 case llvm::Triple::x86:
6118 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006119 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006120 break;
6121 case llvm::Triple::x86_64:
6122 case llvm::Triple::ppc64:
6123 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006124 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006125 break;
6126 case llvm::Triple::sparcel:
6127 CmdArgs.push_back("-EL");
6128 break;
6129 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006130
Daniel Dunbarb440f562010-08-02 02:38:21 +00006131 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006132 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006133 CmdArgs.push_back(Output.getFilename());
6134 } else {
6135 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006136 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006137 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006139 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006140
6141 // Only pass -x if gcc will understand it; otherwise hope gcc
6142 // understands the suffix correctly. The main use case this would go
6143 // wrong in is for linker inputs if they happened to have an odd
6144 // suffix; really the only way to get this to happen is a command
6145 // like '-x foobar a.c' which will treat a.c like a linker input.
6146 //
6147 // FIXME: For the linker case specifically, can we safely convert
6148 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006149 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006150 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006151 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006152 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006153 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006154 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006155 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006156 else if (II.getType() == types::TY_ModuleFile)
6157 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006158 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006159
Daniel Dunbara3246a02009-03-18 08:07:30 +00006160 if (types::canTypeBeUserSpecified(II.getType())) {
6161 CmdArgs.push_back("-x");
6162 CmdArgs.push_back(types::getTypeName(II.getType()));
6163 }
6164
Daniel Dunbarb440f562010-08-02 02:38:21 +00006165 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006166 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006167 else {
6168 const Arg &A = II.getInputArg();
6169
6170 // Reverse translate some rewritten options.
6171 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6172 CmdArgs.push_back("-lstdc++");
6173 continue;
6174 }
6175
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006176 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006177 A.render(Args, CmdArgs);
6178 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006179 }
6180
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006181 const std::string customGCCName = D.getCCCGenericGCCName();
6182 const char *GCCName;
6183 if (!customGCCName.empty())
6184 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006185 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006186 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006187 } else
6188 GCCName = "gcc";
6189
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006190 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006191 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006192}
6193
Douglas Katzman95354292015-06-23 20:42:09 +00006194void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6195 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006196 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006197}
6198
Douglas Katzman95354292015-06-23 20:42:09 +00006199void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6200 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006201 const Driver &D = getToolChain().getDriver();
6202
Eric Christophercc7ff502015-01-29 00:56:17 +00006203 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006204 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006205 case types::TY_LLVM_IR:
6206 case types::TY_LTO_IR:
6207 case types::TY_LLVM_BC:
6208 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006209 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006210 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006211 // We assume we've got an "integrated" assembler in that gcc will produce an
6212 // object file itself.
6213 case types::TY_Object:
6214 CmdArgs.push_back("-c");
6215 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006216 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006217 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006218 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006219 case types::TY_Nothing:
6220 CmdArgs.push_back("-fsyntax-only");
6221 break;
6222 default:
6223 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006224 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006225}
6226
Douglas Katzman95354292015-06-23 20:42:09 +00006227void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6228 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006229 // The types are (hopefully) good enough.
6230}
6231
Tony Linthicum76329bf2011-12-12 21:14:55 +00006232// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006233void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006234 ArgStringList &CmdArgs) const {
6235}
6236
Douglas Katzman95354292015-06-23 20:42:09 +00006237void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6238 const InputInfo &Output,
6239 const InputInfoList &Inputs,
6240 const ArgList &Args,
6241 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006242 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006243
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006244 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6245 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006246 ArgStringList CmdArgs;
6247
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006248 std::string MArchString = "-march=hexagon";
6249 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006250
6251 RenderExtraToolArgs(JA, CmdArgs);
6252
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006253 std::string AsName = "hexagon-llvm-mc";
6254 std::string MCpuString = "-mcpu=hexagon" +
6255 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6256 CmdArgs.push_back("-filetype=obj");
6257 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6258
Tony Linthicum76329bf2011-12-12 21:14:55 +00006259 if (Output.isFilename()) {
6260 CmdArgs.push_back("-o");
6261 CmdArgs.push_back(Output.getFilename());
6262 } else {
6263 assert(Output.isNothing() && "Unexpected output");
6264 CmdArgs.push_back("-fsyntax-only");
6265 }
6266
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006267 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6268 std::string N = llvm::utostr(G.getValue());
6269 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6270 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006271
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006272 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006273
Tony Linthicum76329bf2011-12-12 21:14:55 +00006274 // Only pass -x if gcc will understand it; otherwise hope gcc
6275 // understands the suffix correctly. The main use case this would go
6276 // wrong in is for linker inputs if they happened to have an odd
6277 // suffix; really the only way to get this to happen is a command
6278 // like '-x foobar a.c' which will treat a.c like a linker input.
6279 //
6280 // FIXME: For the linker case specifically, can we safely convert
6281 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006282 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006283 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006284 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006285 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006286 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006287 else if (II.getType() == types::TY_AST)
6288 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006289 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006290 else if (II.getType() == types::TY_ModuleFile)
6291 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006292 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006293
6294 if (II.isFilename())
6295 CmdArgs.push_back(II.getFilename());
6296 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006297 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006298 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006299 II.getInputArg().render(Args, CmdArgs);
6300 }
6301
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006302 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006303 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006304}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006305
Douglas Katzman95354292015-06-23 20:42:09 +00006306void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6307 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006308}
6309
Douglas Katzman54366072015-07-27 16:53:08 +00006310static void
6311constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006312 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006313 const InputInfo &Output, const InputInfoList &Inputs,
6314 const ArgList &Args, ArgStringList &CmdArgs,
6315 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006316
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006317 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006318
Matthew Curtise689b052012-12-06 15:46:07 +00006319 //----------------------------------------------------------------------------
6320 //
6321 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006322 bool IsStatic = Args.hasArg(options::OPT_static);
6323 bool IsShared = Args.hasArg(options::OPT_shared);
6324 bool IsPIE = Args.hasArg(options::OPT_pie);
6325 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6326 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6327 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6328 bool UseG0 = false;
6329 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006330
Matthew Curtise689b052012-12-06 15:46:07 +00006331 //----------------------------------------------------------------------------
6332 // Silence warnings for various options
6333 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006334 Args.ClaimAllArgs(options::OPT_g_Group);
6335 Args.ClaimAllArgs(options::OPT_emit_llvm);
6336 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6337 // handled somewhere else.
6338 Args.ClaimAllArgs(options::OPT_static_libgcc);
6339
6340 //----------------------------------------------------------------------------
6341 //
6342 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006343 if (Args.hasArg(options::OPT_s))
6344 CmdArgs.push_back("-s");
6345
6346 if (Args.hasArg(options::OPT_r))
6347 CmdArgs.push_back("-r");
6348
6349 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006350 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006351
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006352 CmdArgs.push_back("-march=hexagon");
6353 std::string CpuVer =
6354 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6355 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6356 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006357
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006358 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006359 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006360 // The following should be the default, but doing as hexagon-gcc does.
6361 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006362 }
6363
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006364 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006365 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006366
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006367 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006368 CmdArgs.push_back("-pie");
6369
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006370 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6371 std::string N = llvm::utostr(G.getValue());
6372 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6373 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006374 }
6375
Matthew Curtise689b052012-12-06 15:46:07 +00006376 //----------------------------------------------------------------------------
6377 //
6378 //----------------------------------------------------------------------------
6379 CmdArgs.push_back("-o");
6380 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006381
Matthew Curtise689b052012-12-06 15:46:07 +00006382 //----------------------------------------------------------------------------
6383 // moslib
6384 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006385 std::vector<std::string> OsLibs;
6386 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006387
Sean Silva14facf32015-06-09 01:57:17 +00006388 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6389 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006390 OsLibs.emplace_back(A->getValue());
6391 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006392 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006393 if (OsLibs.empty()) {
6394 OsLibs.push_back("standalone");
6395 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006396 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006397
Matthew Curtise689b052012-12-06 15:46:07 +00006398 //----------------------------------------------------------------------------
6399 // Start Files
6400 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006401 const std::string MCpuSuffix = "/" + CpuVer;
6402 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6403 const std::string RootDir =
6404 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6405 const std::string StartSubDir =
6406 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006407
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006408 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6409 const char *Name) -> std::string {
6410 std::string RelName = SubDir + Name;
6411 std::string P = HTC.GetFilePath(RelName.c_str());
6412 if (llvm::sys::fs::exists(P))
6413 return P;
6414 return RootDir + RelName;
6415 };
6416
6417 if (IncStdLib && IncStartFiles) {
6418 if (!IsShared) {
6419 if (HasStandalone) {
6420 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6421 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006422 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006423 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6424 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006425 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006426 std::string Init = UseShared
6427 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6428 : Find(RootDir, StartSubDir, "/init.o");
6429 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006430 }
6431
6432 //----------------------------------------------------------------------------
6433 // Library Search Paths
6434 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006435 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6436 for (const auto &LibPath : LibPaths)
6437 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006438
6439 //----------------------------------------------------------------------------
6440 //
6441 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006442 Args.AddAllArgs(CmdArgs,
6443 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6444 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006445
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006446 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006447
6448 //----------------------------------------------------------------------------
6449 // Libraries
6450 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006451 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006452 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006453 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006454 CmdArgs.push_back("-lm");
6455 }
6456
6457 CmdArgs.push_back("--start-group");
6458
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006459 if (!IsShared) {
6460 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006461 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006462 CmdArgs.push_back("-lc");
6463 }
6464 CmdArgs.push_back("-lgcc");
6465
6466 CmdArgs.push_back("--end-group");
6467 }
6468
6469 //----------------------------------------------------------------------------
6470 // End files
6471 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006472 if (IncStdLib && IncStartFiles) {
6473 std::string Fini = UseShared
6474 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6475 : Find(RootDir, StartSubDir, "/fini.o");
6476 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006477 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006478}
6479
Douglas Katzman95354292015-06-23 20:42:09 +00006480void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6481 const InputInfo &Output,
6482 const InputInfoList &Inputs,
6483 const ArgList &Args,
6484 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006485 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006486
6487 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006488 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006489 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006490
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006491 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006492 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006493 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006494}
6495// Hexagon tools end.
6496
Tom Stellard8fa33092015-07-18 01:49:05 +00006497void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6498 const InputInfo &Output,
6499 const InputInfoList &Inputs,
6500 const ArgList &Args,
6501 const char *LinkingOutput) const {
6502
6503 std::string Linker = getToolChain().GetProgramPath(getShortName());
6504 ArgStringList CmdArgs;
6505 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006506 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006507 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006508 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006509 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6510 CmdArgs.push_back("-o");
6511 CmdArgs.push_back(Output.getFilename());
6512 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6513 CmdArgs, Inputs));
6514}
6515// AMDGPU tools end.
6516
Dan Gohman52816862015-12-16 23:30:41 +00006517wasm::Linker::Linker(const ToolChain &TC)
6518 : GnuTool("wasm::Linker", "lld", TC) {}
6519
6520bool wasm::Linker::isLinkJob() const {
6521 return true;
6522}
6523
6524bool wasm::Linker::hasIntegratedCPP() const {
6525 return false;
6526}
6527
6528void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6529 const InputInfo &Output,
6530 const InputInfoList &Inputs,
6531 const ArgList &Args,
6532 const char *LinkingOutput) const {
6533 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6534 ArgStringList CmdArgs;
6535 CmdArgs.push_back("-flavor");
6536 CmdArgs.push_back("ld");
Dan Gohman52816862015-12-16 23:30:41 +00006537 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6538 CmdArgs.push_back("-o");
6539 CmdArgs.push_back(Output.getFilename());
6540 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6541}
6542
Renato Golin7c542b42015-07-27 23:44:45 +00006543const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006544 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006545 if (!Arch.empty())
6546 MArch = Arch;
6547 else
Bernard Ogden31561762013-12-12 13:27:11 +00006548 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006549 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006550
6551 // Handle -march=native.
6552 if (MArch == "native") {
6553 std::string CPU = llvm::sys::getHostCPUName();
6554 if (CPU != "generic") {
6555 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006556 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006557 // If there is no valid architecture suffix for this CPU we don't know how
6558 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006559 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006560 MArch = "";
6561 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006562 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006563 }
6564 }
6565
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006566 return MArch;
6567}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006568
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006569/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006570StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006571 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006572 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6573 // here means an -march=native that we can't handle, so instead return no CPU.
6574 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006575 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006576
John Brawna95c1a82015-05-08 12:52:18 +00006577 // We need to return an empty string here on invalid MArch values as the
6578 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006579 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006580}
6581
6582/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006583std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006584 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006585 // FIXME: Warn on inconsistent use of -mcpu and -march.
6586 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006587 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006588 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006589 // Handle -mcpu=native.
6590 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006591 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006592 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006593 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006594 }
6595
Renato Goline17c5802015-07-27 23:44:42 +00006596 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006597}
6598
6599/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006600/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006601// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006602StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6603 const llvm::Triple &Triple) {
6604 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006605 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006606 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006607 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006608 if (ArchKind == llvm::ARM::AK_INVALID)
6609 // In case of generic Arch, i.e. "arm",
6610 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006611 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006612 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006613 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6614 // armv7k triple if it's actually been specified via "-arch armv7k".
6615 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006616 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006617 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006618 }
Renato Golin3c007252015-05-28 15:05:53 +00006619 if (ArchKind == llvm::ARM::AK_INVALID)
6620 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006621 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006622}
6623
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006624void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006625 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006626 if (Args.hasArg(options::OPT_r))
6627 return;
6628
John Brawn94fd9632015-05-21 12:19:49 +00006629 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6630 // to generate BE-8 executables.
6631 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6632 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006633}
6634
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006635mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006636 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6637 // was first introduced in Release 3. However, other compilers have
6638 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006639 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6640 .Case("mips1", NanLegacy)
6641 .Case("mips2", NanLegacy)
6642 .Case("mips3", NanLegacy)
6643 .Case("mips4", NanLegacy)
6644 .Case("mips5", NanLegacy)
6645 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006646 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006647 .Case("mips32r3", NanLegacy | Nan2008)
6648 .Case("mips32r5", NanLegacy | Nan2008)
6649 .Case("mips32r6", Nan2008)
6650 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006651 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006652 .Case("mips64r3", NanLegacy | Nan2008)
6653 .Case("mips64r5", NanLegacy | Nan2008)
6654 .Case("mips64r6", Nan2008)
6655 .Default(NanLegacy);
6656}
6657
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006658bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6659 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6660 return A && (A->getValue() == StringRef(Value));
6661}
6662
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006663bool mips::isUCLibc(const ArgList &Args) {
6664 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006665 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006666}
6667
Daniel Sanders2bf13662014-07-10 14:40:57 +00006668bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006669 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6670 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006671 .Case("2008", true)
6672 .Case("legacy", false)
6673 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006674
6675 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006676 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006677 .Cases("mips32r6", "mips64r6", true)
6678 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006679
6680 return false;
6681}
6682
Daniel Sanders379d44b2014-07-16 11:52:23 +00006683bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006684 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006685 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006686 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006687 return false;
6688
6689 if (ABIName != "32")
6690 return false;
6691
Toma Tabacu94ea6862015-06-16 13:54:13 +00006692 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6693 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006694 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006695 return false;
6696
Daniel Sanders379d44b2014-07-16 11:52:23 +00006697 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006698 .Cases("mips2", "mips3", "mips4", "mips5", true)
6699 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6700 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6701 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006702}
6703
Toma Tabacu94ea6862015-06-16 13:54:13 +00006704bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6705 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006706 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006707 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6708
6709 // FPXX shouldn't be used if -msingle-float is present.
6710 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6711 options::OPT_mdouble_float))
6712 if (A->getOption().matches(options::OPT_msingle_float))
6713 UseFPXX = false;
6714
6715 return UseFPXX;
6716}
6717
Tim Northover157d9112014-01-16 08:48:16 +00006718llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006719 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6720 // archs which Darwin doesn't use.
6721
6722 // The matching this routine does is fairly pointless, since it is neither the
6723 // complete architecture list, nor a reasonable subset. The problem is that
6724 // historically the driver driver accepts this and also ties its -march=
6725 // handling to the architecture name, so we need to be careful before removing
6726 // support for it.
6727
6728 // This code must be kept in sync with Clang's Darwin specific argument
6729 // translation.
6730
6731 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006732 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6733 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6734 .Case("ppc64", llvm::Triple::ppc64)
6735 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6736 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6737 llvm::Triple::x86)
6738 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6739 // This is derived from the driver driver.
6740 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6741 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6742 .Cases("armv7s", "xscale", llvm::Triple::arm)
6743 .Case("arm64", llvm::Triple::aarch64)
6744 .Case("r600", llvm::Triple::r600)
6745 .Case("amdgcn", llvm::Triple::amdgcn)
6746 .Case("nvptx", llvm::Triple::nvptx)
6747 .Case("nvptx64", llvm::Triple::nvptx64)
6748 .Case("amdil", llvm::Triple::amdil)
6749 .Case("spir", llvm::Triple::spir)
6750 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006751}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006752
Tim Northover157d9112014-01-16 08:48:16 +00006753void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006754 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006755 T.setArch(Arch);
6756
6757 if (Str == "x86_64h")
6758 T.setArchName(Str);
6759 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6760 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006761 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006762 }
6763}
6764
Bob Wilsondecc03e2012-11-23 06:14:39 +00006765const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006766 const InputInfo &Input) {
6767 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006768}
6769
Bob Wilsondecc03e2012-11-23 06:14:39 +00006770const char *Clang::getBaseInputStem(const ArgList &Args,
6771 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006772 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006773
Chris Lattner906bb902011-01-16 08:14:11 +00006774 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006775 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006776
6777 return Str;
6778}
6779
Bob Wilsondecc03e2012-11-23 06:14:39 +00006780const char *Clang::getDependencyFileName(const ArgList &Args,
6781 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006782 // FIXME: Think about this more.
6783 std::string Res;
6784
6785 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006786 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006787 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006788 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006789 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006790 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006791 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006792}
6793
Douglas Katzman95354292015-06-23 20:42:09 +00006794void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6795 const InputInfo &Output,
6796 const InputInfoList &Inputs,
6797 const ArgList &Args,
6798 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006799 const ToolChain &ToolChain = getToolChain();
6800 const Driver &D = ToolChain.getDriver();
6801 ArgStringList CmdArgs;
6802
6803 // Silence warning for "clang -g foo.o -o foo"
6804 Args.ClaimAllArgs(options::OPT_g_Group);
6805 // and "clang -emit-llvm foo.o -o foo"
6806 Args.ClaimAllArgs(options::OPT_emit_llvm);
6807 // and for "clang -w foo.o -o foo". Other warning options are already
6808 // handled somewhere else.
6809 Args.ClaimAllArgs(options::OPT_w);
6810
6811 if (!D.SysRoot.empty())
6812 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6813
6814 // CloudABI only supports static linkage.
6815 CmdArgs.push_back("-Bstatic");
6816 CmdArgs.push_back("--eh-frame-hdr");
6817 CmdArgs.push_back("--gc-sections");
6818
6819 if (Output.isFilename()) {
6820 CmdArgs.push_back("-o");
6821 CmdArgs.push_back(Output.getFilename());
6822 } else {
6823 assert(Output.isNothing() && "Invalid output.");
6824 }
6825
Douglas Katzman78b37b02015-11-17 20:28:07 +00006826 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006827 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6828 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6829 }
6830
6831 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006832 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006833 Args.AddAllArgs(CmdArgs,
6834 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6835 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006836
Teresa Johnson945bc502015-10-15 20:35:53 +00006837 if (D.isUsingLTO())
6838 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006839
6840 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6841
Douglas Katzman78b37b02015-11-17 20:28:07 +00006842 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006843 if (D.CCCIsCXX())
6844 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6845 CmdArgs.push_back("-lc");
6846 CmdArgs.push_back("-lcompiler_rt");
6847 }
6848
Douglas Katzman78b37b02015-11-17 20:28:07 +00006849 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006850 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6851
6852 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006853 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006854}
6855
Douglas Katzman95354292015-06-23 20:42:09 +00006856void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6857 const InputInfo &Output,
6858 const InputInfoList &Inputs,
6859 const ArgList &Args,
6860 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006861 ArgStringList CmdArgs;
6862
6863 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6864 const InputInfo &Input = Inputs[0];
6865
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006866 // Determine the original source input.
6867 const Action *SourceAction = &JA;
6868 while (SourceAction->getKind() != Action::InputClass) {
6869 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6870 SourceAction = SourceAction->getInputs()[0];
6871 }
6872
Eric Christopherf5a8f492015-12-08 00:10:10 +00006873 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006874 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006875 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6876 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006877 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006878 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006879 const llvm::Triple &T(getToolChain().getTriple());
6880 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006881 CmdArgs.push_back("-Q");
6882 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006883
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006884 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006885 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006886 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006887 if (Args.hasArg(options::OPT_gstabs))
6888 CmdArgs.push_back("--gstabs");
6889 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006890 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006891 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006892
Daniel Dunbarbe220842009-03-20 16:06:39 +00006893 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006894 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006895
Daniel Dunbar6d484762010-07-22 01:47:22 +00006896 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006897 if (getToolChain().getArch() == llvm::Triple::x86 ||
6898 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006899 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6900 CmdArgs.push_back("-force_cpusubtype_ALL");
6901
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006902 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006903 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006904 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006905 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006906 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006907 CmdArgs.push_back("-static");
6908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006909 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006910
6911 assert(Output.isFilename() && "Unexpected lipo output.");
6912 CmdArgs.push_back("-o");
6913 CmdArgs.push_back(Output.getFilename());
6914
Daniel Dunbarb440f562010-08-02 02:38:21 +00006915 assert(Input.isFilename() && "Invalid input.");
6916 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006917
6918 // asm_final spec is empty.
6919
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006920 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006921 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006922}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006923
Tim Northover157d9112014-01-16 08:48:16 +00006924void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006925
Tim Northover157d9112014-01-16 08:48:16 +00006926void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6927 ArgStringList &CmdArgs) const {
6928 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006929
Daniel Dunbarc1964212009-03-26 16:23:12 +00006930 // Derived from darwin_arch spec.
6931 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006932 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006933
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006934 // FIXME: Is this needed anymore?
6935 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006936 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006937}
6938
Douglas Katzman95354292015-06-23 20:42:09 +00006939bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006940 // We only need to generate a temp path for LTO if we aren't compiling object
6941 // files. When compiling source files, we run 'dsymutil' after linking. We
6942 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006943 for (const auto &Input : Inputs)
6944 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006945 return true;
6946
6947 return false;
6948}
6949
Douglas Katzman95354292015-06-23 20:42:09 +00006950void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6951 ArgStringList &CmdArgs,
6952 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006953 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006954 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006955
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006956 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006957 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6958 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006959 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6960 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006961 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006962 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006963 }
6964
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006965 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006966 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006967 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6968 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006969
Bob Wilson3d27dad2013-08-02 22:25:34 +00006970 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6971 CmdArgs.push_back("-export_dynamic");
6972
Bob Wilsonb111ec92015-03-02 19:01:14 +00006973 // If we are using App Extension restrictions, pass a flag to the linker
6974 // telling it that the compiled code has been audited.
6975 if (Args.hasFlag(options::OPT_fapplication_extension,
6976 options::OPT_fno_application_extension, false))
6977 CmdArgs.push_back("-application_extension");
6978
Teresa Johnson945bc502015-10-15 20:35:53 +00006979 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006980 // If we are using LTO, then automatically create a temporary file path for
6981 // the linker to use, so that it's lifetime will extend past a possible
6982 // dsymutil step.
6983 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6984 const char *TmpPath = C.getArgs().MakeArgString(
6985 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6986 C.addTempFile(TmpPath);
6987 CmdArgs.push_back("-object_path_lto");
6988 CmdArgs.push_back(TmpPath);
6989 }
6990
6991 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6992 // it in clang installed libraries. If not found, the option is not used
6993 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6994 if (Version[0] >= 133) {
6995 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6996 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6997 SmallString<128> LibLTOPath(P);
6998 llvm::sys::path::append(LibLTOPath, "lib");
6999 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7000 if (llvm::sys::fs::exists(LibLTOPath)) {
7001 CmdArgs.push_back("-lto_library");
7002 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7003 } else {
7004 D.Diag(diag::warn_drv_lto_libpath);
7005 }
7006 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007007 }
7008
Daniel Dunbarc1964212009-03-26 16:23:12 +00007009 // Derived from the "link" spec.
7010 Args.AddAllArgs(CmdArgs, options::OPT_static);
7011 if (!Args.hasArg(options::OPT_static))
7012 CmdArgs.push_back("-dynamic");
7013 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7014 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7015 // here. How do we wish to handle such things?
7016 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007017
Daniel Dunbarc1964212009-03-26 16:23:12 +00007018 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007019 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007020 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007021 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007022
7023 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7024 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7025 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7026
7027 Arg *A;
7028 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7029 (A = Args.getLastArg(options::OPT_current__version)) ||
7030 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007031 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7032 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007033
7034 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7035 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7036 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7037 } else {
7038 CmdArgs.push_back("-dylib");
7039
7040 Arg *A;
7041 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7042 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7043 (A = Args.getLastArg(options::OPT_client__name)) ||
7044 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7045 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7046 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007047 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7048 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007049
Daniel Dunbarc1964212009-03-26 16:23:12 +00007050 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7051 "-dylib_compatibility_version");
7052 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7053 "-dylib_current_version");
7054
Tim Northover157d9112014-01-16 08:48:16 +00007055 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007056
7057 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7058 "-dylib_install_name");
7059 }
7060
7061 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7062 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7063 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007064 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007065 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007066 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7067 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7068 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7069 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7070 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7071 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007072 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007073 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7074 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7075 Args.AddAllArgs(CmdArgs, options::OPT_init);
7076
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007077 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007078 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007079
Daniel Dunbarc1964212009-03-26 16:23:12 +00007080 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7081 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7082 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7083 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7084 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007085
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007086 if (const Arg *A =
7087 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7088 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007089 if (A->getOption().matches(options::OPT_fpie) ||
7090 A->getOption().matches(options::OPT_fPIE))
7091 CmdArgs.push_back("-pie");
7092 else
7093 CmdArgs.push_back("-no_pie");
7094 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007095
7096 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7097 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7098 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7099 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7100 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7101 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7102 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7103 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7104 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7105 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7106 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7107 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7108 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7109 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7110 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7111 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007112
Daniel Dunbar84384642011-05-02 21:03:47 +00007113 // Give --sysroot= preference, over the Apple specific behavior to also use
7114 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007115 StringRef sysroot = C.getSysRoot();
7116 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007117 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007118 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007119 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7120 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007121 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007122 }
7123
Daniel Dunbarc1964212009-03-26 16:23:12 +00007124 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7125 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7126 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7127 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7128 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007129 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007130 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7131 Args.AddAllArgs(CmdArgs, options::OPT_y);
7132 Args.AddLastArg(CmdArgs, options::OPT_w);
7133 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7134 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7135 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7136 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7137 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7138 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7139 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7140 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7141 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7142 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7143 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7144 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7145}
7146
Douglas Katzman95354292015-06-23 20:42:09 +00007147void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7148 const InputInfo &Output,
7149 const InputInfoList &Inputs,
7150 const ArgList &Args,
7151 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007152 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007153
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007154 // If the number of arguments surpasses the system limits, we will encode the
7155 // input files in a separate file, shortening the command line. To this end,
7156 // build a list of input file names that can be passed via a file with the
7157 // -filelist linker option.
7158 llvm::opt::ArgStringList InputFileList;
7159
Daniel Dunbarc1964212009-03-26 16:23:12 +00007160 // The logic here is derived from gcc's behavior; most of which
7161 // comes from specs (starting with link_command). Consult gcc for
7162 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007163 ArgStringList CmdArgs;
7164
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007165 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7166 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7167 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007168 for (const auto &Arg : Args)
7169 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007170 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007171 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007172 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007173 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007174 return;
7175 }
7176
Daniel Dunbarc1964212009-03-26 16:23:12 +00007177 // I'm not sure why this particular decomposition exists in gcc, but
7178 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007179 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007180
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007181 // It seems that the 'e' option is completely ignored for dynamic executables
7182 // (the default), and with static executables, the last one wins, as expected.
7183 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7184 options::OPT_Z_Flag, options::OPT_u_Group,
7185 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007186
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007187 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7188 // members of static archive libraries which implement Objective-C classes or
7189 // categories.
7190 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7191 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007192
Daniel Dunbarc1964212009-03-26 16:23:12 +00007193 CmdArgs.push_back("-o");
7194 CmdArgs.push_back(Output.getFilename());
7195
Douglas Katzman78b37b02015-11-17 20:28:07 +00007196 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007197 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007198
Peter Collingbournec4122c12015-06-15 21:08:13 +00007199 // SafeStack requires its own runtime libraries
7200 // These libraries should be linked first, to make sure the
7201 // __safestack_init constructor executes before everything else
7202 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7203 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7204 "libclang_rt.safestack_osx.a",
7205 /*AlwaysLink=*/true);
7206 }
7207
Daniel Dunbarc1964212009-03-26 16:23:12 +00007208 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007209
Douglas Gregor9295df02012-05-15 21:00:27 +00007210 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007211 // Build the input file for -filelist (list of linker input files) in case we
7212 // need it later
7213 for (const auto &II : Inputs) {
7214 if (!II.isFilename()) {
7215 // This is a linker input argument.
7216 // We cannot mix input arguments and file names in a -filelist input, thus
7217 // we prematurely stop our list (remaining files shall be passed as
7218 // arguments).
7219 if (InputFileList.size() > 0)
7220 break;
7221
7222 continue;
7223 }
7224
7225 InputFileList.push_back(II.getFilename());
7226 }
7227
Douglas Katzman78b37b02015-11-17 20:28:07 +00007228 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007229 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7230
Douglas Katzman78b37b02015-11-17 20:28:07 +00007231 if (isObjCRuntimeLinked(Args) &&
7232 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007233 // We use arclite library for both ARC and subscripting support.
7234 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7235
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007236 CmdArgs.push_back("-framework");
7237 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007238 // Link libobj.
7239 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007240 }
John McCall31168b02011-06-15 23:02:42 +00007241
Daniel Dunbarc1964212009-03-26 16:23:12 +00007242 if (LinkingOutput) {
7243 CmdArgs.push_back("-arch_multiple");
7244 CmdArgs.push_back("-final_output");
7245 CmdArgs.push_back(LinkingOutput);
7246 }
7247
Daniel Dunbarc1964212009-03-26 16:23:12 +00007248 if (Args.hasArg(options::OPT_fnested_functions))
7249 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007250
Justin Bognerc7701242015-05-12 05:44:36 +00007251 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7252
Douglas Katzman78b37b02015-11-17 20:28:07 +00007253 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007254 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007255 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007256
Daniel Dunbarc1964212009-03-26 16:23:12 +00007257 // link_ssp spec is empty.
7258
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007259 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007260 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007261 }
7262
Douglas Katzman78b37b02015-11-17 20:28:07 +00007263 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007264 // endfile_spec is empty.
7265 }
7266
7267 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7268 Args.AddAllArgs(CmdArgs, options::OPT_F);
7269
Steven Wu3ffb61b2015-02-06 18:08:29 +00007270 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007271 for (const Arg *A : Args.filtered(options::OPT_iframework))
7272 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007273
Douglas Katzman78b37b02015-11-17 20:28:07 +00007274 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007275 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7276 if (A->getValue() == StringRef("Accelerate")) {
7277 CmdArgs.push_back("-framework");
7278 CmdArgs.push_back("Accelerate");
7279 }
7280 }
7281 }
7282
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007283 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007284 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007285 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007286 Cmd->setInputFileList(std::move(InputFileList));
7287 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007288}
7289
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007290void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007291 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007292 const InputInfoList &Inputs,
7293 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007294 const char *LinkingOutput) const {
7295 ArgStringList CmdArgs;
7296
7297 CmdArgs.push_back("-create");
7298 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007299
7300 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007301 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007302
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007303 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007304 assert(II.isFilename() && "Unexpected lipo input.");
7305 CmdArgs.push_back(II.getFilename());
7306 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007307
7308 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007309 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007310}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007311
Daniel Dunbar88299622010-06-04 18:28:36 +00007312void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007313 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007314 const InputInfoList &Inputs,
7315 const ArgList &Args,
7316 const char *LinkingOutput) const {
7317 ArgStringList CmdArgs;
7318
Daniel Dunbareb86b042011-05-09 17:23:16 +00007319 CmdArgs.push_back("-o");
7320 CmdArgs.push_back(Output.getFilename());
7321
Daniel Dunbar88299622010-06-04 18:28:36 +00007322 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7323 const InputInfo &Input = Inputs[0];
7324 assert(Input.isFilename() && "Unexpected dsymutil input.");
7325 CmdArgs.push_back(Input.getFilename());
7326
Daniel Dunbar88299622010-06-04 18:28:36 +00007327 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007328 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007329 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007330}
7331
Eric Christopher551ef452011-08-23 17:56:55 +00007332void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007333 const InputInfo &Output,
7334 const InputInfoList &Inputs,
7335 const ArgList &Args,
7336 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007337 ArgStringList CmdArgs;
7338 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007339 CmdArgs.push_back("--debug-info");
7340 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007341 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007342
7343 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7344 const InputInfo &Input = Inputs[0];
7345 assert(Input.isFilename() && "Unexpected verify input");
7346
7347 // Grabbing the output of the earlier dsymutil run.
7348 CmdArgs.push_back(Input.getFilename());
7349
7350 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007351 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007352 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007353}
7354
Douglas Katzman95354292015-06-23 20:42:09 +00007355void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007356 const InputInfo &Output,
7357 const InputInfoList &Inputs,
7358 const ArgList &Args,
7359 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007360 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007361 ArgStringList CmdArgs;
7362
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007363 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007364
7365 CmdArgs.push_back("-o");
7366 CmdArgs.push_back(Output.getFilename());
7367
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007368 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007369 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007370
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007371 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007372 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007373}
7374
Douglas Katzman95354292015-06-23 20:42:09 +00007375void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7376 const InputInfo &Output,
7377 const InputInfoList &Inputs,
7378 const ArgList &Args,
7379 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007380 ArgStringList CmdArgs;
7381
David Chisnall272a0712012-02-29 15:06:12 +00007382 // Demangle C++ names in errors
7383 CmdArgs.push_back("-C");
7384
Douglas Katzman78b37b02015-11-17 20:28:07 +00007385 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007386 CmdArgs.push_back("-e");
7387 CmdArgs.push_back("_start");
7388 }
7389
7390 if (Args.hasArg(options::OPT_static)) {
7391 CmdArgs.push_back("-Bstatic");
7392 CmdArgs.push_back("-dn");
7393 } else {
7394 CmdArgs.push_back("-Bdynamic");
7395 if (Args.hasArg(options::OPT_shared)) {
7396 CmdArgs.push_back("-shared");
7397 } else {
7398 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007399 CmdArgs.push_back(
7400 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007401 }
7402 }
7403
7404 if (Output.isFilename()) {
7405 CmdArgs.push_back("-o");
7406 CmdArgs.push_back(Output.getFilename());
7407 } else {
7408 assert(Output.isNothing() && "Invalid output.");
7409 }
7410
Douglas Katzman78b37b02015-11-17 20:28:07 +00007411 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007412 if (!Args.hasArg(options::OPT_shared))
7413 CmdArgs.push_back(
7414 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7415
7416 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7417 CmdArgs.push_back(
7418 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7419 CmdArgs.push_back(
7420 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007421 }
7422
Douglas Katzman6059ef92015-11-17 17:41:23 +00007423 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007424
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007425 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7426 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007427
7428 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7429
Douglas Katzman78b37b02015-11-17 20:28:07 +00007430 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007431 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007432 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007433 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007434 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007435 if (!Args.hasArg(options::OPT_shared)) {
7436 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007437 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007438 }
David Chisnallf571cde2012-02-15 13:39:01 +00007439 }
7440
Douglas Katzman78b37b02015-11-17 20:28:07 +00007441 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007442 CmdArgs.push_back(
7443 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007444 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007445 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007446
Xinliang David Li69306c02015-10-22 06:15:31 +00007447 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007448
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007449 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007450 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007451}
7452
Douglas Katzman95354292015-06-23 20:42:09 +00007453void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7454 const InputInfo &Output,
7455 const InputInfoList &Inputs,
7456 const ArgList &Args,
7457 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007458 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007459 ArgStringList CmdArgs;
7460
Rafael Espindolacc126272014-02-28 01:55:21 +00007461 switch (getToolChain().getArch()) {
7462 case llvm::Triple::x86:
7463 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7464 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007465 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007466 break;
7467
7468 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007469 CmdArgs.push_back("-mppc");
7470 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007471 break;
7472
7473 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007474 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007475 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007476 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7477 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7478 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007479 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007480 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007481
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007482 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007483 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007484 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7485 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7486 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007487 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007488 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007489
7490 case llvm::Triple::mips64:
7491 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007492 StringRef CPUName;
7493 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007494 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007495
7496 CmdArgs.push_back("-mabi");
7497 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7498
7499 if (getToolChain().getArch() == llvm::Triple::mips64)
7500 CmdArgs.push_back("-EB");
7501 else
7502 CmdArgs.push_back("-EL");
7503
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007504 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007505 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007506 }
7507
Rafael Espindolacc126272014-02-28 01:55:21 +00007508 default:
7509 break;
7510 }
7511
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007512 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007513
7514 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007515 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007516
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007517 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007518 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007519
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007520 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007521 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007522}
7523
Douglas Katzman95354292015-06-23 20:42:09 +00007524void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7525 const InputInfo &Output,
7526 const InputInfoList &Inputs,
7527 const ArgList &Args,
7528 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007529 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007530 ArgStringList CmdArgs;
7531
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007532 // Silence warning for "clang -g foo.o -o foo"
7533 Args.ClaimAllArgs(options::OPT_g_Group);
7534 // and "clang -emit-llvm foo.o -o foo"
7535 Args.ClaimAllArgs(options::OPT_emit_llvm);
7536 // and for "clang -w foo.o -o foo". Other warning options are already
7537 // handled somewhere else.
7538 Args.ClaimAllArgs(options::OPT_w);
7539
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007540 if (getToolChain().getArch() == llvm::Triple::mips64)
7541 CmdArgs.push_back("-EB");
7542 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7543 CmdArgs.push_back("-EL");
7544
Douglas Katzman78b37b02015-11-17 20:28:07 +00007545 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007546 CmdArgs.push_back("-e");
7547 CmdArgs.push_back("__start");
7548 }
7549
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007550 if (Args.hasArg(options::OPT_static)) {
7551 CmdArgs.push_back("-Bstatic");
7552 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007553 if (Args.hasArg(options::OPT_rdynamic))
7554 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007555 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007556 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007557 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007558 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007559 } else {
7560 CmdArgs.push_back("-dynamic-linker");
7561 CmdArgs.push_back("/usr/libexec/ld.so");
7562 }
7563 }
7564
Rafael Espindola044f7832013-06-05 04:28:55 +00007565 if (Args.hasArg(options::OPT_nopie))
7566 CmdArgs.push_back("-nopie");
7567
Daniel Dunbarb440f562010-08-02 02:38:21 +00007568 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007569 CmdArgs.push_back("-o");
7570 CmdArgs.push_back(Output.getFilename());
7571 } else {
7572 assert(Output.isNothing() && "Invalid output.");
7573 }
7574
Douglas Katzman78b37b02015-11-17 20:28:07 +00007575 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007576 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007577 if (Args.hasArg(options::OPT_pg))
7578 CmdArgs.push_back(
7579 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007580 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007581 CmdArgs.push_back(
7582 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7583 CmdArgs.push_back(
7584 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007585 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007586 CmdArgs.push_back(
7587 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007588 }
7589 }
7590
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007591 std::string Triple = getToolChain().getTripleString();
7592 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007593 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007594 CmdArgs.push_back(
7595 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007596
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007597 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7598 options::OPT_e, options::OPT_s, options::OPT_t,
7599 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007600
Daniel Dunbar54423b22010-09-17 00:24:54 +00007601 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007602
Douglas Katzman78b37b02015-11-17 20:28:07 +00007603 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007604 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007605 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007606 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007607 CmdArgs.push_back("-lm_p");
7608 else
7609 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007610 }
7611
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007612 // FIXME: For some reason GCC passes -lgcc before adding
7613 // the default system libraries. Just mimic this for now.
7614 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007615
Eric Christopher17674ec2012-09-13 06:32:34 +00007616 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007617 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7618 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007619 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007620 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007621 }
7622
Chandler Carruth45661652011-12-17 22:32:42 +00007623 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007624 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007625 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007626 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007627 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007628 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007629
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007630 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007631 }
7632
Douglas Katzman78b37b02015-11-17 20:28:07 +00007633 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007634 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007635 CmdArgs.push_back(
7636 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007637 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007638 CmdArgs.push_back(
7639 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007640 }
7641
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007642 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007643 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007644}
Ed Schoutene33194b2009-04-02 19:13:12 +00007645
Douglas Katzman95354292015-06-23 20:42:09 +00007646void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7647 const InputInfo &Output,
7648 const InputInfoList &Inputs,
7649 const ArgList &Args,
7650 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007651 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007652 ArgStringList CmdArgs;
7653
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007654 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007655
7656 CmdArgs.push_back("-o");
7657 CmdArgs.push_back(Output.getFilename());
7658
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007659 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007660 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007661
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007662 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007663 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007664}
7665
Douglas Katzman95354292015-06-23 20:42:09 +00007666void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7667 const InputInfo &Output,
7668 const InputInfoList &Inputs,
7669 const ArgList &Args,
7670 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007671 const Driver &D = getToolChain().getDriver();
7672 ArgStringList CmdArgs;
7673
Douglas Katzman78b37b02015-11-17 20:28:07 +00007674 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007675 CmdArgs.push_back("-e");
7676 CmdArgs.push_back("__start");
7677 }
7678
7679 if (Args.hasArg(options::OPT_static)) {
7680 CmdArgs.push_back("-Bstatic");
7681 } else {
7682 if (Args.hasArg(options::OPT_rdynamic))
7683 CmdArgs.push_back("-export-dynamic");
7684 CmdArgs.push_back("--eh-frame-hdr");
7685 CmdArgs.push_back("-Bdynamic");
7686 if (Args.hasArg(options::OPT_shared)) {
7687 CmdArgs.push_back("-shared");
7688 } else {
7689 CmdArgs.push_back("-dynamic-linker");
7690 CmdArgs.push_back("/usr/libexec/ld.so");
7691 }
7692 }
7693
7694 if (Output.isFilename()) {
7695 CmdArgs.push_back("-o");
7696 CmdArgs.push_back(Output.getFilename());
7697 } else {
7698 assert(Output.isNothing() && "Invalid output.");
7699 }
7700
Douglas Katzman78b37b02015-11-17 20:28:07 +00007701 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007702 if (!Args.hasArg(options::OPT_shared)) {
7703 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007704 CmdArgs.push_back(
7705 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007706 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007707 CmdArgs.push_back(
7708 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7709 CmdArgs.push_back(
7710 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007711 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007712 CmdArgs.push_back(
7713 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007714 }
7715 }
7716
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007717 Args.AddAllArgs(CmdArgs,
7718 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007719
7720 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7721
Douglas Katzman78b37b02015-11-17 20:28:07 +00007722 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007723 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007724 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7725 if (Args.hasArg(options::OPT_pg))
7726 CmdArgs.push_back("-lm_p");
7727 else
7728 CmdArgs.push_back("-lm");
7729 }
7730
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007731 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007732 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007733 CmdArgs.push_back("-lpthread_p");
7734 else
7735 CmdArgs.push_back("-lpthread");
7736 }
7737
Eli Friedman9fa28852012-08-08 23:57:20 +00007738 if (!Args.hasArg(options::OPT_shared)) {
7739 if (Args.hasArg(options::OPT_pg))
7740 CmdArgs.push_back("-lc_p");
7741 else
7742 CmdArgs.push_back("-lc");
7743 }
7744
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007745 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007746 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007747 case llvm::Triple::arm:
7748 MyArch = "arm";
7749 break;
7750 case llvm::Triple::x86:
7751 MyArch = "i386";
7752 break;
7753 case llvm::Triple::x86_64:
7754 MyArch = "amd64";
7755 break;
7756 default:
7757 llvm_unreachable("Unsupported architecture");
7758 }
7759 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007760 }
7761
Douglas Katzman78b37b02015-11-17 20:28:07 +00007762 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007763 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007764 CmdArgs.push_back(
7765 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007766 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007767 CmdArgs.push_back(
7768 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007769 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007770
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007771 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007772 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007773}
7774
Douglas Katzman95354292015-06-23 20:42:09 +00007775void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7776 const InputInfo &Output,
7777 const InputInfoList &Inputs,
7778 const ArgList &Args,
7779 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007780 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007781 ArgStringList CmdArgs;
7782
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007783 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7784 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007785 switch (getToolChain().getArch()) {
7786 default:
7787 break;
7788 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007789 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007790 break;
7791 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007792 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007793 break;
7794 case llvm::Triple::mips:
7795 case llvm::Triple::mipsel:
7796 case llvm::Triple::mips64:
7797 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007798 StringRef CPUName;
7799 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007800 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007801
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007802 CmdArgs.push_back("-march");
7803 CmdArgs.push_back(CPUName.data());
7804
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007805 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007806 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007807
7808 if (getToolChain().getArch() == llvm::Triple::mips ||
7809 getToolChain().getArch() == llvm::Triple::mips64)
7810 CmdArgs.push_back("-EB");
7811 else
7812 CmdArgs.push_back("-EL");
7813
Dimitry Andric46f338c2015-12-27 10:36:44 +00007814 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7815 StringRef v = A->getValue();
7816 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7817 A->claim();
7818 }
7819
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007820 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007821 break;
7822 }
7823 case llvm::Triple::arm:
7824 case llvm::Triple::armeb:
7825 case llvm::Triple::thumb:
7826 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007827 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007828
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007829 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007830 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007831 else
Renato Golinf4421f72014-02-19 10:44:07 +00007832 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007833
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007834 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007835 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007836 case llvm::Triple::GNUEABI:
7837 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007838 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007839 break;
7840
7841 default:
7842 CmdArgs.push_back("-matpcs");
7843 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007844 break;
7845 }
7846 case llvm::Triple::sparc:
7847 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007848 case llvm::Triple::sparcv9: {
7849 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7850 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007851 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007852 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007853 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007854 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007855
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007856 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007857
7858 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007859 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007860
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007861 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007862 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007863
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007864 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007865 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007866}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007867
Douglas Katzman95354292015-06-23 20:42:09 +00007868void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7869 const InputInfo &Output,
7870 const InputInfoList &Inputs,
7871 const ArgList &Args,
7872 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007873 const toolchains::FreeBSD &ToolChain =
7874 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007875 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007876 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007877 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007878 !Args.hasArg(options::OPT_shared) &&
7879 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007880 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007881
7882 // Silence warning for "clang -g foo.o -o foo"
7883 Args.ClaimAllArgs(options::OPT_g_Group);
7884 // and "clang -emit-llvm foo.o -o foo"
7885 Args.ClaimAllArgs(options::OPT_emit_llvm);
7886 // and for "clang -w foo.o -o foo". Other warning options are already
7887 // handled somewhere else.
7888 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007889
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007890 if (!D.SysRoot.empty())
7891 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7892
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007893 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007894 CmdArgs.push_back("-pie");
7895
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007896 if (Args.hasArg(options::OPT_static)) {
7897 CmdArgs.push_back("-Bstatic");
7898 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007899 if (Args.hasArg(options::OPT_rdynamic))
7900 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007901 CmdArgs.push_back("--eh-frame-hdr");
7902 if (Args.hasArg(options::OPT_shared)) {
7903 CmdArgs.push_back("-Bshareable");
7904 } else {
7905 CmdArgs.push_back("-dynamic-linker");
7906 CmdArgs.push_back("/libexec/ld-elf.so.1");
7907 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007908 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007909 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7910 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7911 CmdArgs.push_back("--hash-style=both");
7912 }
7913 }
7914 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007915 }
7916
7917 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7918 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007919 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007920 CmdArgs.push_back("-m");
7921 CmdArgs.push_back("elf_i386_fbsd");
7922 }
7923
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007924 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007925 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007926 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007927 }
7928
Dimitry Andric904895f2015-12-27 06:47:09 +00007929 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7930 if (ToolChain.getArch() == llvm::Triple::mips ||
7931 ToolChain.getArch() == llvm::Triple::mipsel ||
7932 ToolChain.getArch() == llvm::Triple::mips64 ||
7933 ToolChain.getArch() == llvm::Triple::mips64el) {
7934 StringRef v = A->getValue();
7935 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7936 A->claim();
7937 }
7938 }
7939
Daniel Dunbarb440f562010-08-02 02:38:21 +00007940 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007941 CmdArgs.push_back("-o");
7942 CmdArgs.push_back(Output.getFilename());
7943 } else {
7944 assert(Output.isNothing() && "Invalid output.");
7945 }
7946
Douglas Katzman78b37b02015-11-17 20:28:07 +00007947 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007948 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007949 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007950 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007951 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007952 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007953 crt1 = "Scrt1.o";
7954 else
7955 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007956 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007957 if (crt1)
7958 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7959
7960 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7961
Craig Topper92fc2df2014-05-17 16:56:41 +00007962 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007963 if (Args.hasArg(options::OPT_static))
7964 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007965 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007966 crtbegin = "crtbeginS.o";
7967 else
7968 crtbegin = "crtbegin.o";
7969
7970 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007971 }
7972
7973 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007974 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007975 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7976 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007977 Args.AddAllArgs(CmdArgs, options::OPT_s);
7978 Args.AddAllArgs(CmdArgs, options::OPT_t);
7979 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7980 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007981
Teresa Johnson945bc502015-10-15 20:35:53 +00007982 if (D.isUsingLTO())
7983 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007984
Alexey Samsonov52550342014-09-15 19:58:40 +00007985 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007986 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007987
Douglas Katzman78b37b02015-11-17 20:28:07 +00007988 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007989 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007990 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007991 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007992 if (Args.hasArg(options::OPT_pg))
7993 CmdArgs.push_back("-lm_p");
7994 else
7995 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007996 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007997 if (NeedsSanitizerDeps)
7998 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007999 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8000 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008001 if (Args.hasArg(options::OPT_pg))
8002 CmdArgs.push_back("-lgcc_p");
8003 else
8004 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008005 if (Args.hasArg(options::OPT_static)) {
8006 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008007 } else if (Args.hasArg(options::OPT_pg)) {
8008 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008009 } else {
8010 CmdArgs.push_back("--as-needed");
8011 CmdArgs.push_back("-lgcc_s");
8012 CmdArgs.push_back("--no-as-needed");
8013 }
8014
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008015 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008016 if (Args.hasArg(options::OPT_pg))
8017 CmdArgs.push_back("-lpthread_p");
8018 else
8019 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008020 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008021
Roman Divacky66f22762011-02-10 16:59:40 +00008022 if (Args.hasArg(options::OPT_pg)) {
8023 if (Args.hasArg(options::OPT_shared))
8024 CmdArgs.push_back("-lc");
8025 else
8026 CmdArgs.push_back("-lc_p");
8027 CmdArgs.push_back("-lgcc_p");
8028 } else {
8029 CmdArgs.push_back("-lc");
8030 CmdArgs.push_back("-lgcc");
8031 }
8032
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008033 if (Args.hasArg(options::OPT_static)) {
8034 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008035 } else if (Args.hasArg(options::OPT_pg)) {
8036 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008037 } else {
8038 CmdArgs.push_back("--as-needed");
8039 CmdArgs.push_back("-lgcc_s");
8040 CmdArgs.push_back("--no-as-needed");
8041 }
8042 }
8043
Douglas Katzman78b37b02015-11-17 20:28:07 +00008044 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008045 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008046 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008047 else
8048 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008049 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008050 }
8051
Xinliang David Li69306c02015-10-22 06:15:31 +00008052 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008053
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008054 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008055 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008056}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008057
Douglas Katzman95354292015-06-23 20:42:09 +00008058void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008059 const InputInfo &Output,
8060 const InputInfoList &Inputs,
8061 const ArgList &Args,
8062 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008063 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008064 ArgStringList CmdArgs;
8065
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008066 // GNU as needs different flags for creating the correct output format
8067 // on architectures with different ABIs or optional feature sets.
8068 switch (getToolChain().getArch()) {
8069 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008070 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008071 break;
8072 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008073 case llvm::Triple::armeb:
8074 case llvm::Triple::thumb:
8075 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008076 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008077 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8078 std::string Arch =
8079 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008080 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008081 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008082 }
8083
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008084 case llvm::Triple::mips:
8085 case llvm::Triple::mipsel:
8086 case llvm::Triple::mips64:
8087 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008088 StringRef CPUName;
8089 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008090 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008091
8092 CmdArgs.push_back("-march");
8093 CmdArgs.push_back(CPUName.data());
8094
8095 CmdArgs.push_back("-mabi");
8096 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8097
8098 if (getToolChain().getArch() == llvm::Triple::mips ||
8099 getToolChain().getArch() == llvm::Triple::mips64)
8100 CmdArgs.push_back("-EB");
8101 else
8102 CmdArgs.push_back("-EL");
8103
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008104 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008105 break;
8106 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008107
8108 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008109 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008110 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008111 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8112 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008113 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008114 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008115 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008116
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008117 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008118 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008119 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8120 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008121 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008122 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008123 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008124
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008125 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008126 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008127 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008128
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008129 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008130
8131 CmdArgs.push_back("-o");
8132 CmdArgs.push_back(Output.getFilename());
8133
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008134 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008135 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008136
David Chisnallddbd68f2011-09-27 22:03:18 +00008137 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008138 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008139}
8140
Douglas Katzman95354292015-06-23 20:42:09 +00008141void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8142 const InputInfo &Output,
8143 const InputInfoList &Inputs,
8144 const ArgList &Args,
8145 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008146 const Driver &D = getToolChain().getDriver();
8147 ArgStringList CmdArgs;
8148
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008149 if (!D.SysRoot.empty())
8150 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8151
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008152 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008153 if (Args.hasArg(options::OPT_static)) {
8154 CmdArgs.push_back("-Bstatic");
8155 } else {
8156 if (Args.hasArg(options::OPT_rdynamic))
8157 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008158 if (Args.hasArg(options::OPT_shared)) {
8159 CmdArgs.push_back("-Bshareable");
8160 } else {
8161 CmdArgs.push_back("-dynamic-linker");
8162 CmdArgs.push_back("/libexec/ld.elf_so");
8163 }
8164 }
8165
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008166 // Many NetBSD architectures support more than one ABI.
8167 // Determine the correct emulation for ld.
8168 switch (getToolChain().getArch()) {
8169 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008170 CmdArgs.push_back("-m");
8171 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008172 break;
8173 case llvm::Triple::arm:
8174 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008175 CmdArgs.push_back("-m");
8176 switch (getToolChain().getTriple().getEnvironment()) {
8177 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008178 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008179 CmdArgs.push_back("armelf_nbsd_eabi");
8180 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008181 case llvm::Triple::EABIHF:
8182 case llvm::Triple::GNUEABIHF:
8183 CmdArgs.push_back("armelf_nbsd_eabihf");
8184 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008185 default:
8186 CmdArgs.push_back("armelf_nbsd");
8187 break;
8188 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008189 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008190 case llvm::Triple::armeb:
8191 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008192 arm::appendEBLinkFlags(
8193 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008194 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008195 CmdArgs.push_back("-m");
8196 switch (getToolChain().getTriple().getEnvironment()) {
8197 case llvm::Triple::EABI:
8198 case llvm::Triple::GNUEABI:
8199 CmdArgs.push_back("armelfb_nbsd_eabi");
8200 break;
8201 case llvm::Triple::EABIHF:
8202 case llvm::Triple::GNUEABIHF:
8203 CmdArgs.push_back("armelfb_nbsd_eabihf");
8204 break;
8205 default:
8206 CmdArgs.push_back("armelfb_nbsd");
8207 break;
8208 }
8209 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008210 case llvm::Triple::mips64:
8211 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008212 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008213 CmdArgs.push_back("-m");
8214 if (getToolChain().getArch() == llvm::Triple::mips64)
8215 CmdArgs.push_back("elf32btsmip");
8216 else
8217 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008218 } else if (mips::hasMipsAbiArg(Args, "64")) {
8219 CmdArgs.push_back("-m");
8220 if (getToolChain().getArch() == llvm::Triple::mips64)
8221 CmdArgs.push_back("elf64btsmip");
8222 else
8223 CmdArgs.push_back("elf64ltsmip");
8224 }
8225 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008226 case llvm::Triple::ppc:
8227 CmdArgs.push_back("-m");
8228 CmdArgs.push_back("elf32ppc_nbsd");
8229 break;
8230
8231 case llvm::Triple::ppc64:
8232 case llvm::Triple::ppc64le:
8233 CmdArgs.push_back("-m");
8234 CmdArgs.push_back("elf64ppc");
8235 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008236
8237 case llvm::Triple::sparc:
8238 CmdArgs.push_back("-m");
8239 CmdArgs.push_back("elf32_sparc");
8240 break;
8241
8242 case llvm::Triple::sparcv9:
8243 CmdArgs.push_back("-m");
8244 CmdArgs.push_back("elf64_sparc");
8245 break;
8246
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008247 default:
8248 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008249 }
8250
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008251 if (Output.isFilename()) {
8252 CmdArgs.push_back("-o");
8253 CmdArgs.push_back(Output.getFilename());
8254 } else {
8255 assert(Output.isNothing() && "Invalid output.");
8256 }
8257
Douglas Katzman78b37b02015-11-17 20:28:07 +00008258 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008259 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008260 CmdArgs.push_back(
8261 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8262 CmdArgs.push_back(
8263 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8264 CmdArgs.push_back(
8265 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008266 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008267 CmdArgs.push_back(
8268 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8269 CmdArgs.push_back(
8270 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008271 }
8272 }
8273
8274 Args.AddAllArgs(CmdArgs, options::OPT_L);
8275 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8276 Args.AddAllArgs(CmdArgs, options::OPT_e);
8277 Args.AddAllArgs(CmdArgs, options::OPT_s);
8278 Args.AddAllArgs(CmdArgs, options::OPT_t);
8279 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8280 Args.AddAllArgs(CmdArgs, options::OPT_r);
8281
8282 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8283
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008284 unsigned Major, Minor, Micro;
8285 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8286 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008287 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008288 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008289 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008290 case llvm::Triple::arm:
8291 case llvm::Triple::armeb:
8292 case llvm::Triple::thumb:
8293 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008294 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008295 case llvm::Triple::ppc64:
8296 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008297 case llvm::Triple::x86:
8298 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008299 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008300 break;
8301 default:
8302 break;
8303 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008304 }
8305
Douglas Katzman78b37b02015-11-17 20:28:07 +00008306 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008307 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008308 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008309 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8310 CmdArgs.push_back("-lm");
8311 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008312 if (Args.hasArg(options::OPT_pthread))
8313 CmdArgs.push_back("-lpthread");
8314 CmdArgs.push_back("-lc");
8315
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008316 if (useLibgcc) {
8317 if (Args.hasArg(options::OPT_static)) {
8318 // libgcc_eh depends on libc, so resolve as much as possible,
8319 // pull in any new requirements from libc and then get the rest
8320 // of libgcc.
8321 CmdArgs.push_back("-lgcc_eh");
8322 CmdArgs.push_back("-lc");
8323 CmdArgs.push_back("-lgcc");
8324 } else {
8325 CmdArgs.push_back("-lgcc");
8326 CmdArgs.push_back("--as-needed");
8327 CmdArgs.push_back("-lgcc_s");
8328 CmdArgs.push_back("--no-as-needed");
8329 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008330 }
8331 }
8332
Douglas Katzman78b37b02015-11-17 20:28:07 +00008333 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008334 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008335 CmdArgs.push_back(
8336 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008337 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008338 CmdArgs.push_back(
8339 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8340 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008341 }
8342
Xinliang David Li69306c02015-10-22 06:15:31 +00008343 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008344
Logan Chieneb9162f2014-06-26 14:23:45 +00008345 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008346 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008347}
8348
Douglas Katzman95354292015-06-23 20:42:09 +00008349void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8350 const InputInfo &Output,
8351 const InputInfoList &Inputs,
8352 const ArgList &Args,
8353 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008354 claimNoWarnArgs(Args);
8355
James Y Knight2db38f32015-08-15 03:45:25 +00008356 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8357 llvm::Triple Triple = llvm::Triple(TripleStr);
8358
Rafael Espindola92b00932010-08-10 00:25:48 +00008359 ArgStringList CmdArgs;
8360
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008361 llvm::Reloc::Model RelocationModel;
8362 unsigned PICLevel;
8363 bool IsPIE;
8364 std::tie(RelocationModel, PICLevel, IsPIE) =
8365 ParsePICArgs(getToolChain(), Triple, Args);
8366
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008367 switch (getToolChain().getArch()) {
8368 default:
8369 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008370 // Add --32/--64 to make sure we get the format we want.
8371 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008372 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008373 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008374 break;
8375 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008376 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8377 CmdArgs.push_back("--x32");
8378 else
8379 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008380 break;
8381 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008382 CmdArgs.push_back("-a32");
8383 CmdArgs.push_back("-mppc");
8384 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008385 break;
8386 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008387 CmdArgs.push_back("-a64");
8388 CmdArgs.push_back("-mppc64");
8389 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008390 break;
8391 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008392 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008393 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008394 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008395 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008396 break;
8397 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008398 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008399 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008400 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8401 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8402 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008403 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008404 }
8405 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008406 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008407 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8408 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8409 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008410 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008411 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008412 case llvm::Triple::arm:
8413 case llvm::Triple::armeb:
8414 case llvm::Triple::thumb:
8415 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008416 const llvm::Triple &Triple2 = getToolChain().getTriple();
8417 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008418 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008419 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008420 break;
8421 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008422 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008423 break;
8424 default:
8425 break;
8426 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008427
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008428 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008429 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8430 case arm::FloatABI::Soft:
8431 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8432 break;
8433 case arm::FloatABI::SoftFP:
8434 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8435 break;
8436 case arm::FloatABI::Hard:
8437 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8438 break;
8439 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008440
8441 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008442
8443 // FIXME: remove krait check when GNU tools support krait cpu
8444 // for now replace it with -march=armv7-a to avoid a lower
8445 // march from being picked in the absence of a cpu flag.
8446 Arg *A;
8447 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008448 StringRef(A->getValue()).lower() == "krait")
8449 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008450 else
8451 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008452 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008453 break;
8454 }
8455 case llvm::Triple::mips:
8456 case llvm::Triple::mipsel:
8457 case llvm::Triple::mips64:
8458 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008459 StringRef CPUName;
8460 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008461 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008462 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008463
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008464 CmdArgs.push_back("-march");
8465 CmdArgs.push_back(CPUName.data());
8466
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008467 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008468 CmdArgs.push_back(ABIName.data());
8469
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008470 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8471 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008472 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008473 CmdArgs.push_back("-mno-shared");
8474
Daniel Sanders379d44b2014-07-16 11:52:23 +00008475 // LLVM doesn't support -mplt yet and acts as if it is always given.
8476 // However, -mplt has no effect with the N64 ABI.
8477 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008478
8479 if (getToolChain().getArch() == llvm::Triple::mips ||
8480 getToolChain().getArch() == llvm::Triple::mips64)
8481 CmdArgs.push_back("-EB");
8482 else
8483 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008484
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008485 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8486 if (StringRef(A->getValue()) == "2008")
8487 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8488 }
8489
Daniel Sanders379d44b2014-07-16 11:52:23 +00008490 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8491 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8492 options::OPT_mfp64)) {
8493 A->claim();
8494 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008495 } else if (mips::shouldUseFPXX(
8496 Args, getToolChain().getTriple(), CPUName, ABIName,
8497 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008498 CmdArgs.push_back("-mfpxx");
8499
8500 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8501 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008502 if (Arg *A =
8503 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008504 if (A->getOption().matches(options::OPT_mips16)) {
8505 A->claim();
8506 A->render(Args, CmdArgs);
8507 } else {
8508 A->claim();
8509 CmdArgs.push_back("-no-mips16");
8510 }
8511 }
8512
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008513 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8514 options::OPT_mno_micromips);
8515 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8516 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8517
Simon Atanasyanbd986632013-11-26 11:58:04 +00008518 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8519 // Do not use AddLastArg because not all versions of MIPS assembler
8520 // support -mmsa / -mno-msa options.
8521 if (A->getOption().matches(options::OPT_mmsa))
8522 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8523 }
8524
Daniel Sanders379d44b2014-07-16 11:52:23 +00008525 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8526 options::OPT_msoft_float);
8527
Toma Tabacub36d6102015-06-11 12:13:18 +00008528 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8529 options::OPT_msingle_float);
8530
Daniel Sanders379d44b2014-07-16 11:52:23 +00008531 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8532 options::OPT_mno_odd_spreg);
8533
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008534 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008535 break;
8536 }
8537 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008538 // Always pass an -march option, since our default of z10 is later
8539 // than the GNU assembler's default.
8540 StringRef CPUName = getSystemZTargetCPU(Args);
8541 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008542 break;
8543 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008544 }
8545
Renato Golina74bbc72015-07-22 15:32:36 +00008546 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008547 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008548
8549 CmdArgs.push_back("-o");
8550 CmdArgs.push_back(Output.getFilename());
8551
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008552 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008553 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008554
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008555 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008556 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008557
8558 // Handle the debug info splitting at object creation time if we're
8559 // creating an object.
8560 // TODO: Currently only works on linux with newer objcopy.
8561 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008562 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008563 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008564 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008565}
8566
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008567static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008568 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008569 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008570 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008571 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8572 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008573 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008574 CmdArgs.push_back("-lgcc");
8575
Logan Chien3d3373c2012-11-19 12:04:11 +00008576 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008577 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008578 CmdArgs.push_back("-lgcc");
8579 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008580 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008581 CmdArgs.push_back("--as-needed");
8582 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008583 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008584 CmdArgs.push_back("--no-as-needed");
8585 }
8586
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008587 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008588 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008589 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008590 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008591
8592 // According to Android ABI, we have to link with libdl if we are
8593 // linking with non-static libgcc.
8594 //
8595 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8596 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8597 if (isAndroid && !StaticLibgcc)
8598 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008599}
8600
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008601static std::string getLinuxDynamicLinker(const ArgList &Args,
8602 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008603 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8604
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008605 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008606 if (ToolChain.getTriple().isArch64Bit())
8607 return "/system/bin/linker64";
8608 else
8609 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008610 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8611 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008612 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008613 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008614 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008615 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008616 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008617 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008618 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008619 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008620 return "/lib/ld-linux-armhf.so.3";
8621 else
8622 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008623 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8624 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008625 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008626 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008627 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008628 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008629 return "/lib/ld-linux.so.3";
8630 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8631 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008632 std::string LibDir =
8633 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008634 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008635 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008636 if (mips::isUCLibc(Args))
8637 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008638 else if (!ToolChain.getTriple().hasEnvironment()) {
8639 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8640 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8641 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8642 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008643 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008644
8645 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008646 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008647 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008648 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008649 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8650 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008651 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008652 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008653 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8654 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008655 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008656 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008657 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008658 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008659 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008660 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008661 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8662 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008663 else
8664 return "/lib64/ld-linux-x86-64.so.2";
8665}
8666
Renato Golinc4b49242014-02-13 10:01:16 +00008667static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008668 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008669 // Make use of compiler-rt if --rtlib option is used
8670 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8671
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008672 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008673 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008674 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008675 default:
8676 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008677 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008678 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008679 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008680 break;
8681 }
Renato Golinc4b49242014-02-13 10:01:16 +00008682 break;
8683 case ToolChain::RLT_Libgcc:
8684 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8685 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008686 }
8687}
8688
Rafael Espindola1e085772014-08-15 17:14:35 +00008689static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8690 switch (T.getArch()) {
8691 case llvm::Triple::x86:
8692 return "elf_i386";
8693 case llvm::Triple::aarch64:
8694 return "aarch64linux";
8695 case llvm::Triple::aarch64_be:
8696 return "aarch64_be_linux";
8697 case llvm::Triple::arm:
8698 case llvm::Triple::thumb:
8699 return "armelf_linux_eabi";
8700 case llvm::Triple::armeb:
8701 case llvm::Triple::thumbeb:
8702 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8703 case llvm::Triple::ppc:
8704 return "elf32ppclinux";
8705 case llvm::Triple::ppc64:
8706 return "elf64ppc";
8707 case llvm::Triple::ppc64le:
8708 return "elf64lppc";
8709 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008710 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008711 return "elf32_sparc";
8712 case llvm::Triple::sparcv9:
8713 return "elf64_sparc";
8714 case llvm::Triple::mips:
8715 return "elf32btsmip";
8716 case llvm::Triple::mipsel:
8717 return "elf32ltsmip";
8718 case llvm::Triple::mips64:
8719 if (mips::hasMipsAbiArg(Args, "n32"))
8720 return "elf32btsmipn32";
8721 return "elf64btsmip";
8722 case llvm::Triple::mips64el:
8723 if (mips::hasMipsAbiArg(Args, "n32"))
8724 return "elf32ltsmipn32";
8725 return "elf64ltsmip";
8726 case llvm::Triple::systemz:
8727 return "elf64_s390";
8728 case llvm::Triple::x86_64:
8729 if (T.getEnvironment() == llvm::Triple::GNUX32)
8730 return "elf32_x86_64";
8731 return "elf_x86_64";
8732 default:
8733 llvm_unreachable("Unexpected arch");
8734 }
8735}
8736
Douglas Katzman95354292015-06-23 20:42:09 +00008737void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8738 const InputInfo &Output,
8739 const InputInfoList &Inputs,
8740 const ArgList &Args,
8741 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008742 const toolchains::Linux &ToolChain =
8743 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008744 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008745
8746 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8747 llvm::Triple Triple = llvm::Triple(TripleStr);
8748
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008749 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008750 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008751 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008752 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8753 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008754 const bool HasCRTBeginEndFiles =
8755 ToolChain.getTriple().hasEnvironment() ||
8756 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008757
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008758 ArgStringList CmdArgs;
8759
Rafael Espindolad1002f62010-11-15 18:28:16 +00008760 // Silence warning for "clang -g foo.o -o foo"
8761 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008762 // and "clang -emit-llvm foo.o -o foo"
8763 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008764 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008765 // handled somewhere else.
8766 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008767
Peter Collingbourne39719a72015-11-20 20:49:39 +00008768 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8769 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008770 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008771 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008772 CmdArgs.push_back("-target");
8773 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8774 }
8775
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008776 if (!D.SysRoot.empty())
8777 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008778
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008779 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008780 CmdArgs.push_back("-pie");
8781
Rafael Espindola1c76c592010-11-07 22:57:16 +00008782 if (Args.hasArg(options::OPT_rdynamic))
8783 CmdArgs.push_back("-export-dynamic");
8784
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008785 if (Args.hasArg(options::OPT_s))
8786 CmdArgs.push_back("-s");
8787
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008788 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008789 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008790
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008791 for (const auto &Opt : ToolChain.ExtraOpts)
8792 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008793
8794 if (!Args.hasArg(options::OPT_static)) {
8795 CmdArgs.push_back("--eh-frame-hdr");
8796 }
8797
8798 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008799 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008800
8801 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008802 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8803 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008804 CmdArgs.push_back("-Bstatic");
8805 else
8806 CmdArgs.push_back("-static");
8807 } else if (Args.hasArg(options::OPT_shared)) {
8808 CmdArgs.push_back("-shared");
8809 }
8810
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008811 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8812 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008813 (!Args.hasArg(options::OPT_static) &&
8814 !Args.hasArg(options::OPT_shared))) {
8815 CmdArgs.push_back("-dynamic-linker");
8816 CmdArgs.push_back(Args.MakeArgString(
8817 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8818 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008819
8820 CmdArgs.push_back("-o");
8821 CmdArgs.push_back(Output.getFilename());
8822
Douglas Katzman78b37b02015-11-17 20:28:07 +00008823 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008824 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008825 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008826 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008827 if (Args.hasArg(options::OPT_pg))
8828 crt1 = "gcrt1.o";
8829 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008830 crt1 = "Scrt1.o";
8831 else
8832 crt1 = "crt1.o";
8833 }
8834 if (crt1)
8835 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008836
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008837 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8838 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008839
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008840 const char *crtbegin;
8841 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008842 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008843 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008844 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008845 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008846 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008847 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008848 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008849
8850 if (HasCRTBeginEndFiles)
8851 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008852
8853 // Add crtfastmath.o if available and fast math is enabled.
8854 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008855 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008856
8857 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008858 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008859
Douglas Katzman6059ef92015-11-17 17:41:23 +00008860 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008861
Teresa Johnson945bc502015-10-15 20:35:53 +00008862 if (D.isUsingLTO())
8863 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008864
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008865 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8866 CmdArgs.push_back("--no-demangle");
8867
Alexey Samsonov52550342014-09-15 19:58:40 +00008868 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008869 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008870 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008871 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008872
Douglas Katzman78b37b02015-11-17 20:28:07 +00008873 if (D.CCCIsCXX() &&
8874 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008875 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008876 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008877 if (OnlyLibstdcxxStatic)
8878 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008879 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008880 if (OnlyLibstdcxxStatic)
8881 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008882 CmdArgs.push_back("-lm");
8883 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008884 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8885 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008886
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008887 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008888 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8889 if (Args.hasArg(options::OPT_static))
8890 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008891
Alexey Samsonov52550342014-09-15 19:58:40 +00008892 if (NeedsSanitizerDeps)
8893 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8894
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008895 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8896 Args.hasArg(options::OPT_pthreads);
8897
8898 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8899 options::OPT_fno_openmp, false)) {
8900 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8901 // FIXME: Does this really make sense for all GNU toolchains?
8902 WantPthread = true;
8903
8904 // Also link the particular OpenMP runtimes.
8905 switch (getOpenMPRuntime(ToolChain, Args)) {
8906 case OMPRT_OMP:
8907 CmdArgs.push_back("-lomp");
8908 break;
8909 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008910 CmdArgs.push_back("-lgomp");
8911
8912 // FIXME: Exclude this for platforms with libgomp that don't require
8913 // librt. Most modern Linux platforms require it, but some may not.
8914 CmdArgs.push_back("-lrt");
8915 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008916 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008917 CmdArgs.push_back("-liomp5");
8918 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008919 case OMPRT_Unknown:
8920 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008921 break;
8922 }
Chandler Carruth01538002013-01-17 13:19:29 +00008923 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008924
Renato Golinc4b49242014-02-13 10:01:16 +00008925 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008926
Richard Smith31d1de22015-05-20 22:48:44 +00008927 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008928 CmdArgs.push_back("-lpthread");
8929
8930 CmdArgs.push_back("-lc");
8931
8932 if (Args.hasArg(options::OPT_static))
8933 CmdArgs.push_back("--end-group");
8934 else
Renato Golinc4b49242014-02-13 10:01:16 +00008935 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008936 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008937
Rafael Espindola81937ec2010-12-01 01:52:43 +00008938 if (!Args.hasArg(options::OPT_nostartfiles)) {
8939 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008940 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008941 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008942 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008943 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008944 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008945 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008946
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008947 if (HasCRTBeginEndFiles)
8948 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008949 if (!isAndroid)
8950 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008951 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00008952 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008953
Peter Collingbourne39719a72015-11-20 20:49:39 +00008954 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008955}
8956
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008957// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8958// for the various SFI requirements like register masking. The assembly tool
8959// inserts the file containing the macros as an input into all the assembly
8960// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008961void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8962 const InputInfo &Output,
8963 const InputInfoList &Inputs,
8964 const ArgList &Args,
8965 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008966 const toolchains::NaClToolChain &ToolChain =
8967 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008968 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8969 "nacl-arm-macros.s");
8970 InputInfoList NewInputs;
8971 NewInputs.push_back(NaClMacros);
8972 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008973 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8974 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008975}
8976
Douglas Katzman750cfc52015-06-29 18:42:16 +00008977// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008978// we use static by default, do not yet support sanitizers or LTO, and a few
8979// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008980// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008981void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8982 const InputInfo &Output,
8983 const InputInfoList &Inputs,
8984 const ArgList &Args,
8985 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008986
Douglas Katzman54366072015-07-27 16:53:08 +00008987 const toolchains::NaClToolChain &ToolChain =
8988 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008989 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008990 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008991 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008992 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008993
8994 ArgStringList CmdArgs;
8995
8996 // Silence warning for "clang -g foo.o -o foo"
8997 Args.ClaimAllArgs(options::OPT_g_Group);
8998 // and "clang -emit-llvm foo.o -o foo"
8999 Args.ClaimAllArgs(options::OPT_emit_llvm);
9000 // and for "clang -w foo.o -o foo". Other warning options are already
9001 // handled somewhere else.
9002 Args.ClaimAllArgs(options::OPT_w);
9003
9004 if (!D.SysRoot.empty())
9005 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9006
9007 if (Args.hasArg(options::OPT_rdynamic))
9008 CmdArgs.push_back("-export-dynamic");
9009
9010 if (Args.hasArg(options::OPT_s))
9011 CmdArgs.push_back("-s");
9012
Douglas Katzman54366072015-07-27 16:53:08 +00009013 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9014 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009015 CmdArgs.push_back("--build-id");
9016
9017 if (!IsStatic)
9018 CmdArgs.push_back("--eh-frame-hdr");
9019
9020 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009021 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009022 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009023 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009024 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009025 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009026 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009027 else if (Arch == llvm::Triple::mipsel)
9028 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009029 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009030 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9031 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009032
9033 if (IsStatic)
9034 CmdArgs.push_back("-static");
9035 else if (Args.hasArg(options::OPT_shared))
9036 CmdArgs.push_back("-shared");
9037
9038 CmdArgs.push_back("-o");
9039 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009040 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009041 if (!Args.hasArg(options::OPT_shared))
9042 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9043 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9044
9045 const char *crtbegin;
9046 if (IsStatic)
9047 crtbegin = "crtbeginT.o";
9048 else if (Args.hasArg(options::OPT_shared))
9049 crtbegin = "crtbeginS.o";
9050 else
9051 crtbegin = "crtbegin.o";
9052 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9053 }
9054
9055 Args.AddAllArgs(CmdArgs, options::OPT_L);
9056 Args.AddAllArgs(CmdArgs, options::OPT_u);
9057
Douglas Katzman6059ef92015-11-17 17:41:23 +00009058 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009059
9060 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9061 CmdArgs.push_back("--no-demangle");
9062
9063 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9064
Douglas Katzman78b37b02015-11-17 20:28:07 +00009065 if (D.CCCIsCXX() &&
9066 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009067 bool OnlyLibstdcxxStatic =
9068 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009069 if (OnlyLibstdcxxStatic)
9070 CmdArgs.push_back("-Bstatic");
9071 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9072 if (OnlyLibstdcxxStatic)
9073 CmdArgs.push_back("-Bdynamic");
9074 CmdArgs.push_back("-lm");
9075 }
9076
9077 if (!Args.hasArg(options::OPT_nostdlib)) {
9078 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9079 // Always use groups, since it has no effect on dynamic libraries.
9080 CmdArgs.push_back("--start-group");
9081 CmdArgs.push_back("-lc");
9082 // NaCl's libc++ currently requires libpthread, so just always include it
9083 // in the group for C++.
9084 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009085 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009086 // Gold, used by Mips, handles nested groups differently than ld, and
9087 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9088 // which is not a desired behaviour here.
9089 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9090 if (getToolChain().getArch() == llvm::Triple::mipsel)
9091 CmdArgs.push_back("-lnacl");
9092
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009093 CmdArgs.push_back("-lpthread");
9094 }
9095
9096 CmdArgs.push_back("-lgcc");
9097 CmdArgs.push_back("--as-needed");
9098 if (IsStatic)
9099 CmdArgs.push_back("-lgcc_eh");
9100 else
9101 CmdArgs.push_back("-lgcc_s");
9102 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009103
9104 // Mips needs to create and use pnacl_legacy library that contains
9105 // definitions from bitcode/pnaclmm.c and definitions for
9106 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9107 if (getToolChain().getArch() == llvm::Triple::mipsel)
9108 CmdArgs.push_back("-lpnacl_legacy");
9109
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009110 CmdArgs.push_back("--end-group");
9111 }
9112
9113 if (!Args.hasArg(options::OPT_nostartfiles)) {
9114 const char *crtend;
9115 if (Args.hasArg(options::OPT_shared))
9116 crtend = "crtendS.o";
9117 else
9118 crtend = "crtend.o";
9119
9120 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9121 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9122 }
9123 }
9124
Peter Collingbourne39719a72015-11-20 20:49:39 +00009125 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9126 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009127}
9128
Douglas Katzman95354292015-06-23 20:42:09 +00009129void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9130 const InputInfo &Output,
9131 const InputInfoList &Inputs,
9132 const ArgList &Args,
9133 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009134 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009135 ArgStringList CmdArgs;
9136
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009137 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009138
9139 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009140 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009141
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009142 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009143 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009144
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009145 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009146 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009147}
9148
Douglas Katzman95354292015-06-23 20:42:09 +00009149void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9150 const InputInfo &Output,
9151 const InputInfoList &Inputs,
9152 const ArgList &Args,
9153 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009154 const Driver &D = getToolChain().getDriver();
9155 ArgStringList CmdArgs;
9156
Daniel Dunbarb440f562010-08-02 02:38:21 +00009157 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009158 CmdArgs.push_back("-o");
9159 CmdArgs.push_back(Output.getFilename());
9160 } else {
9161 assert(Output.isNothing() && "Invalid output.");
9162 }
9163
Douglas Katzman78b37b02015-11-17 20:28:07 +00009164 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009165 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9166 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9167 CmdArgs.push_back(
9168 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9169 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009170 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009171
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009172 Args.AddAllArgs(CmdArgs,
9173 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009174
Daniel Dunbar54423b22010-09-17 00:24:54 +00009175 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009176
Xinliang David Li69306c02015-10-22 06:15:31 +00009177 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009178
Douglas Katzman78b37b02015-11-17 20:28:07 +00009179 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009180 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009181 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009182 CmdArgs.push_back("-lm");
9183 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009184 }
9185
Douglas Katzman78b37b02015-11-17 20:28:07 +00009186 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009187 if (Args.hasArg(options::OPT_pthread))
9188 CmdArgs.push_back("-lpthread");
9189 CmdArgs.push_back("-lc");
9190 CmdArgs.push_back("-lCompilerRT-Generic");
9191 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9192 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009193 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009194 }
9195
Logan Chieneb9162f2014-06-26 14:23:45 +00009196 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009197 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009198}
9199
Daniel Dunbarcc912342009-05-02 18:28:39 +00009200/// DragonFly Tools
9201
9202// For now, DragonFly Assemble does just about the same as for
9203// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009204void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9205 const InputInfo &Output,
9206 const InputInfoList &Inputs,
9207 const ArgList &Args,
9208 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009209 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009210 ArgStringList CmdArgs;
9211
9212 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9213 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009214 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009215 CmdArgs.push_back("--32");
9216
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009217 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009218
9219 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009220 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009221
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009222 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009223 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009224
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009225 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009226 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009227}
9228
Douglas Katzman95354292015-06-23 20:42:09 +00009229void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9230 const InputInfo &Output,
9231 const InputInfoList &Inputs,
9232 const ArgList &Args,
9233 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009234 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009235 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009236
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009237 if (!D.SysRoot.empty())
9238 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9239
John McCall65b8da02013-04-11 22:55:55 +00009240 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009241 if (Args.hasArg(options::OPT_static)) {
9242 CmdArgs.push_back("-Bstatic");
9243 } else {
John McCall65b8da02013-04-11 22:55:55 +00009244 if (Args.hasArg(options::OPT_rdynamic))
9245 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009246 if (Args.hasArg(options::OPT_shared))
9247 CmdArgs.push_back("-Bshareable");
9248 else {
9249 CmdArgs.push_back("-dynamic-linker");
9250 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9251 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009252 CmdArgs.push_back("--hash-style=gnu");
9253 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009254 }
9255
9256 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9257 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009258 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009259 CmdArgs.push_back("-m");
9260 CmdArgs.push_back("elf_i386");
9261 }
9262
Daniel Dunbarb440f562010-08-02 02:38:21 +00009263 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009264 CmdArgs.push_back("-o");
9265 CmdArgs.push_back(Output.getFilename());
9266 } else {
9267 assert(Output.isNothing() && "Invalid output.");
9268 }
9269
Douglas Katzman78b37b02015-11-17 20:28:07 +00009270 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009271 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009272 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009273 CmdArgs.push_back(
9274 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009275 else {
9276 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009277 CmdArgs.push_back(
9278 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009279 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009280 CmdArgs.push_back(
9281 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009282 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009283 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009284 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009285 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009286 CmdArgs.push_back(
9287 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009288 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009289 CmdArgs.push_back(
9290 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009291 }
9292
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009293 Args.AddAllArgs(CmdArgs,
9294 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009295
Daniel Dunbar54423b22010-09-17 00:24:54 +00009296 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009297
Douglas Katzman78b37b02015-11-17 20:28:07 +00009298 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009299 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009300
9301 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009302 CmdArgs.push_back("-rpath");
9303 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009304 }
9305
Hans Wennborg70850d82013-07-18 20:29:38 +00009306 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009307 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009308 CmdArgs.push_back("-lm");
9309 }
9310
Daniel Dunbarcc912342009-05-02 18:28:39 +00009311 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009312 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009313
9314 if (!Args.hasArg(options::OPT_nolibc)) {
9315 CmdArgs.push_back("-lc");
9316 }
9317
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009318 if (Args.hasArg(options::OPT_static) ||
9319 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009320 CmdArgs.push_back("-lgcc");
9321 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009322 } else {
9323 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009324 CmdArgs.push_back("-lgcc_pic");
9325 if (!Args.hasArg(options::OPT_shared))
9326 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009327 } else {
John McCall65b8da02013-04-11 22:55:55 +00009328 CmdArgs.push_back("-lgcc");
9329 CmdArgs.push_back("--as-needed");
9330 CmdArgs.push_back("-lgcc_pic");
9331 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009332 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009333 }
9334 }
9335
Douglas Katzman78b37b02015-11-17 20:28:07 +00009336 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009337 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009338 CmdArgs.push_back(
9339 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009340 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009341 CmdArgs.push_back(
9342 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9343 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009344 }
9345
Xinliang David Li69306c02015-10-22 06:15:31 +00009346 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009347
Logan Chieneb9162f2014-06-26 14:23:45 +00009348 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009349 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009350}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009351
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009352// Try to find Exe from a Visual Studio distribution. This first tries to find
9353// an installed copy of Visual Studio and, failing that, looks in the PATH,
9354// making sure that whatever executable that's found is not a same-named exe
9355// from clang itself to prevent clang from falling back to itself.
9356static std::string FindVisualStudioExecutable(const ToolChain &TC,
9357 const char *Exe,
9358 const char *ClangProgramPath) {
9359 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9360 std::string visualStudioBinDir;
9361 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9362 visualStudioBinDir)) {
9363 SmallString<128> FilePath(visualStudioBinDir);
9364 llvm::sys::path::append(FilePath, Exe);
9365 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9366 return FilePath.str();
9367 }
9368
9369 return Exe;
9370}
9371
Douglas Katzman95354292015-06-23 20:42:09 +00009372void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9373 const InputInfo &Output,
9374 const InputInfoList &Inputs,
9375 const ArgList &Args,
9376 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009377 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009378 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009379
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009380 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9381 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009382 CmdArgs.push_back(
9383 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009384
Douglas Katzman78b37b02015-11-17 20:28:07 +00009385 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9386 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009387 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009388
Zachary Turner10d75b22014-10-22 20:40:43 +00009389 if (!llvm::sys::Process::GetEnv("LIB")) {
9390 // If the VC environment hasn't been configured (perhaps because the user
9391 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009392 // the environment variable is set however, assume the user knows what
9393 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009394 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009395 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009396 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9397 SmallString<128> LibDir(VisualStudioDir);
9398 llvm::sys::path::append(LibDir, "VC", "lib");
9399 switch (MSVC.getArch()) {
9400 case llvm::Triple::x86:
9401 // x86 just puts the libraries directly in lib
9402 break;
9403 case llvm::Triple::x86_64:
9404 llvm::sys::path::append(LibDir, "amd64");
9405 break;
9406 case llvm::Triple::arm:
9407 llvm::sys::path::append(LibDir, "arm");
9408 break;
9409 default:
9410 break;
9411 }
9412 CmdArgs.push_back(
9413 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009414
9415 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9416 std::string UniversalCRTLibPath;
9417 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9418 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9419 UniversalCRTLibPath.c_str()));
9420 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009421 }
9422
9423 std::string WindowsSdkLibPath;
9424 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9425 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9426 WindowsSdkLibPath.c_str()));
9427 }
9428
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009429 CmdArgs.push_back("-nologo");
9430
Reid Kleckner124955a2015-08-05 18:51:13 +00009431 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009432 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009433
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009434 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009435 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009436 if (DLL) {
9437 CmdArgs.push_back(Args.MakeArgString("-dll"));
9438
9439 SmallString<128> ImplibName(Output.getFilename());
9440 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009441 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009442 }
9443
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009444 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009445 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009446 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009447 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009448 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9449 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009450 // Make sure the dynamic runtime thunk is not optimized out at link time
9451 // to ensure proper SEH handling.
9452 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009453 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009454 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009455 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009456 for (const auto &Lib : {"asan", "asan_cxx"})
9457 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009458 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009459 }
9460
Hans Wennborg2e274592013-08-13 23:38:57 +00009461 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009462
Alexey Bataevc7e84352015-08-19 04:49:01 +00009463 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9464 options::OPT_fno_openmp, false)) {
9465 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9466 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9467 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9468 TC.getDriver().Dir + "/../lib"));
9469 switch (getOpenMPRuntime(getToolChain(), Args)) {
9470 case OMPRT_OMP:
9471 CmdArgs.push_back("-defaultlib:libomp.lib");
9472 break;
9473 case OMPRT_IOMP5:
9474 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9475 break;
9476 case OMPRT_GOMP:
9477 break;
9478 case OMPRT_Unknown:
9479 // Already diagnosed.
9480 break;
9481 }
9482 }
9483
Reid Kleckner337188f2014-09-16 19:22:00 +00009484 // Add filenames, libraries, and other linker inputs.
9485 for (const auto &Input : Inputs) {
9486 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009487 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009488 continue;
9489 }
9490
9491 const Arg &A = Input.getInputArg();
9492
9493 // Render -l options differently for the MSVC linker.
9494 if (A.getOption().matches(options::OPT_l)) {
9495 StringRef Lib = A.getValue();
9496 const char *LinkLibArg;
9497 if (Lib.endswith(".lib"))
9498 LinkLibArg = Args.MakeArgString(Lib);
9499 else
9500 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9501 CmdArgs.push_back(LinkLibArg);
9502 continue;
9503 }
9504
9505 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9506 // or -L. Render it, even if MSVC doesn't understand it.
9507 A.renderAsInput(Args, CmdArgs);
9508 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009509
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009510 TC.addProfileRTLibs(Args, CmdArgs);
9511
Zachary Turner719f58c2014-12-01 23:06:47 +00009512 // We need to special case some linker paths. In the case of lld, we need to
9513 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9514 // linker, we need to use a special search algorithm.
9515 llvm::SmallString<128> linkPath;
9516 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9517 if (Linker.equals_lower("lld"))
9518 Linker = "lld-link";
9519
9520 if (Linker.equals_lower("link")) {
9521 // If we're using the MSVC linker, it's not sufficient to just use link
9522 // from the program PATH, because other environments like GnuWin32 install
9523 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009524 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009525 C.getDriver().getClangProgramPath());
9526 } else {
9527 linkPath = Linker;
9528 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009529 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009530 }
9531
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009532 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009533 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009534}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009535
Douglas Katzman95354292015-06-23 20:42:09 +00009536void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9537 const InputInfo &Output,
9538 const InputInfoList &Inputs,
9539 const ArgList &Args,
9540 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009541 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9542}
9543
Douglas Katzman95354292015-06-23 20:42:09 +00009544std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009545 Compilation &C, const JobAction &JA, const InputInfo &Output,
9546 const InputInfoList &Inputs, const ArgList &Args,
9547 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009548 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009549 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009550 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009551 CmdArgs.push_back("/W0"); // No warnings.
9552
9553 // The goal is to be able to invoke this tool correctly based on
9554 // any flag accepted by clang-cl.
9555
9556 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009557 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009558
9559 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009560 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9561 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9562 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009563 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9564 if (A->getOption().getID() == options::OPT_O0) {
9565 CmdArgs.push_back("/Od");
9566 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009567 CmdArgs.push_back("/Og");
9568
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009569 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009570 if (OptLevel == "s" || OptLevel == "z")
9571 CmdArgs.push_back("/Os");
9572 else
9573 CmdArgs.push_back("/Ot");
9574
9575 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009576 }
9577 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009578 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9579 options::OPT_fno_omit_frame_pointer))
9580 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9581 ? "/Oy"
9582 : "/Oy-");
9583 if (!Args.hasArg(options::OPT_fwritable_strings))
9584 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009585
Nico Weber3f8dafb2015-03-12 19:37:10 +00009586 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009587 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9588
David Majnemerf6072342014-07-01 22:24:56 +00009589 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9590 /*default=*/false))
9591 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009592 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9593 options::OPT_fno_function_sections))
9594 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9595 ? "/Gy"
9596 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009597 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9598 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009599 CmdArgs.push_back(
9600 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009601 if (Args.hasArg(options::OPT_fsyntax_only))
9602 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009603 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9604 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009605 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009606
Nico Weber3f8dafb2015-03-12 19:37:10 +00009607 std::vector<std::string> Includes =
9608 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009609 for (const auto &Include : Includes)
9610 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009611
Hans Wennborg87cfa712013-09-19 20:32:16 +00009612 // Flags that can simply be passed through.
9613 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9614 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009615 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009616 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009617
9618 // The order of these flags is relevant, so pick the last one.
9619 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9620 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9621 A->render(Args, CmdArgs);
9622
Hans Wennborg87cfa712013-09-19 20:32:16 +00009623 // Input filename.
9624 assert(Inputs.size() == 1);
9625 const InputInfo &II = Inputs[0];
9626 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9627 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9628 if (II.isFilename())
9629 CmdArgs.push_back(II.getFilename());
9630 else
9631 II.getInputArg().renderAsInput(Args, CmdArgs);
9632
9633 // Output filename.
9634 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009635 const char *Fo =
9636 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009637 CmdArgs.push_back(Fo);
9638
Hans Wennborg188382e2013-09-20 18:16:35 +00009639 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009640 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9641 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009642 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009643 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009644}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009645
Yaron Keren1c0070c2015-07-02 04:45:27 +00009646/// MinGW Tools
9647void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9648 const InputInfo &Output,
9649 const InputInfoList &Inputs,
9650 const ArgList &Args,
9651 const char *LinkingOutput) const {
9652 claimNoWarnArgs(Args);
9653 ArgStringList CmdArgs;
9654
9655 if (getToolChain().getArch() == llvm::Triple::x86) {
9656 CmdArgs.push_back("--32");
9657 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9658 CmdArgs.push_back("--64");
9659 }
9660
9661 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9662
9663 CmdArgs.push_back("-o");
9664 CmdArgs.push_back(Output.getFilename());
9665
9666 for (const auto &II : Inputs)
9667 CmdArgs.push_back(II.getFilename());
9668
9669 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009670 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009671
9672 if (Args.hasArg(options::OPT_gsplit_dwarf))
9673 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9674 SplitDebugName(Args, Inputs[0]));
9675}
9676
9677void MinGW::Linker::AddLibGCC(const ArgList &Args,
9678 ArgStringList &CmdArgs) const {
9679 if (Args.hasArg(options::OPT_mthreads))
9680 CmdArgs.push_back("-lmingwthrd");
9681 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009682
Yaron Kerenaa281332015-08-09 00:24:07 +00009683 // Make use of compiler-rt if --rtlib option is used
9684 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9685 if (RLT == ToolChain::RLT_Libgcc) {
9686 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9687 Args.hasArg(options::OPT_static);
9688 bool Shared = Args.hasArg(options::OPT_shared);
9689 bool CXX = getToolChain().getDriver().CCCIsCXX();
9690
9691 if (Static || (!CXX && !Shared)) {
9692 CmdArgs.push_back("-lgcc");
9693 CmdArgs.push_back("-lgcc_eh");
9694 } else {
9695 CmdArgs.push_back("-lgcc_s");
9696 CmdArgs.push_back("-lgcc");
9697 }
9698 } else {
9699 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9700 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009701
Yaron Keren1c0070c2015-07-02 04:45:27 +00009702 CmdArgs.push_back("-lmoldname");
9703 CmdArgs.push_back("-lmingwex");
9704 CmdArgs.push_back("-lmsvcrt");
9705}
9706
9707void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9708 const InputInfo &Output,
9709 const InputInfoList &Inputs,
9710 const ArgList &Args,
9711 const char *LinkingOutput) const {
9712 const ToolChain &TC = getToolChain();
9713 const Driver &D = TC.getDriver();
9714 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9715
9716 ArgStringList CmdArgs;
9717
9718 // Silence warning for "clang -g foo.o -o foo"
9719 Args.ClaimAllArgs(options::OPT_g_Group);
9720 // and "clang -emit-llvm foo.o -o foo"
9721 Args.ClaimAllArgs(options::OPT_emit_llvm);
9722 // and for "clang -w foo.o -o foo". Other warning options are already
9723 // handled somewhere else.
9724 Args.ClaimAllArgs(options::OPT_w);
9725
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009726 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9727 if (LinkerName.equals_lower("lld")) {
9728 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009729 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009730 } else if (!LinkerName.equals_lower("ld")) {
9731 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009732 }
9733
Yaron Keren1c0070c2015-07-02 04:45:27 +00009734 if (!D.SysRoot.empty())
9735 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9736
9737 if (Args.hasArg(options::OPT_s))
9738 CmdArgs.push_back("-s");
9739
9740 CmdArgs.push_back("-m");
9741 if (TC.getArch() == llvm::Triple::x86)
9742 CmdArgs.push_back("i386pe");
9743 if (TC.getArch() == llvm::Triple::x86_64)
9744 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009745 if (TC.getArch() == llvm::Triple::arm)
9746 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009747
9748 if (Args.hasArg(options::OPT_mwindows)) {
9749 CmdArgs.push_back("--subsystem");
9750 CmdArgs.push_back("windows");
9751 } else if (Args.hasArg(options::OPT_mconsole)) {
9752 CmdArgs.push_back("--subsystem");
9753 CmdArgs.push_back("console");
9754 }
9755
9756 if (Args.hasArg(options::OPT_static))
9757 CmdArgs.push_back("-Bstatic");
9758 else {
9759 if (Args.hasArg(options::OPT_mdll))
9760 CmdArgs.push_back("--dll");
9761 else if (Args.hasArg(options::OPT_shared))
9762 CmdArgs.push_back("--shared");
9763 CmdArgs.push_back("-Bdynamic");
9764 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9765 CmdArgs.push_back("-e");
9766 if (TC.getArch() == llvm::Triple::x86)
9767 CmdArgs.push_back("_DllMainCRTStartup@12");
9768 else
9769 CmdArgs.push_back("DllMainCRTStartup");
9770 CmdArgs.push_back("--enable-auto-image-base");
9771 }
9772 }
9773
9774 CmdArgs.push_back("-o");
9775 CmdArgs.push_back(Output.getFilename());
9776
9777 Args.AddAllArgs(CmdArgs, options::OPT_e);
9778 // FIXME: add -N, -n flags
9779 Args.AddLastArg(CmdArgs, options::OPT_r);
9780 Args.AddLastArg(CmdArgs, options::OPT_s);
9781 Args.AddLastArg(CmdArgs, options::OPT_t);
9782 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9783 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9784
Douglas Katzman78b37b02015-11-17 20:28:07 +00009785 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009786 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9787 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9788 } else {
9789 if (Args.hasArg(options::OPT_municode))
9790 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9791 else
9792 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9793 }
9794 if (Args.hasArg(options::OPT_pg))
9795 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9796 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9797 }
9798
9799 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009800 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009801 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9802
9803 // TODO: Add ASan stuff here
9804
9805 // TODO: Add profile stuff here
9806
Douglas Katzman78b37b02015-11-17 20:28:07 +00009807 if (D.CCCIsCXX() &&
9808 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009809 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9810 !Args.hasArg(options::OPT_static);
9811 if (OnlyLibstdcxxStatic)
9812 CmdArgs.push_back("-Bstatic");
9813 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9814 if (OnlyLibstdcxxStatic)
9815 CmdArgs.push_back("-Bdynamic");
9816 }
9817
9818 if (!Args.hasArg(options::OPT_nostdlib)) {
9819 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9820 if (Args.hasArg(options::OPT_static))
9821 CmdArgs.push_back("--start-group");
9822
9823 if (Args.hasArg(options::OPT_fstack_protector) ||
9824 Args.hasArg(options::OPT_fstack_protector_strong) ||
9825 Args.hasArg(options::OPT_fstack_protector_all)) {
9826 CmdArgs.push_back("-lssp_nonshared");
9827 CmdArgs.push_back("-lssp");
9828 }
9829 if (Args.hasArg(options::OPT_fopenmp))
9830 CmdArgs.push_back("-lgomp");
9831
9832 AddLibGCC(Args, CmdArgs);
9833
9834 if (Args.hasArg(options::OPT_pg))
9835 CmdArgs.push_back("-lgmon");
9836
Yaron Kerenadce68e2015-07-06 18:52:19 +00009837 if (Args.hasArg(options::OPT_pthread))
9838 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009839
9840 // add system libraries
9841 if (Args.hasArg(options::OPT_mwindows)) {
9842 CmdArgs.push_back("-lgdi32");
9843 CmdArgs.push_back("-lcomdlg32");
9844 }
9845 CmdArgs.push_back("-ladvapi32");
9846 CmdArgs.push_back("-lshell32");
9847 CmdArgs.push_back("-luser32");
9848 CmdArgs.push_back("-lkernel32");
9849
9850 if (Args.hasArg(options::OPT_static))
9851 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009852 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009853 AddLibGCC(Args, CmdArgs);
9854 }
9855
9856 if (!Args.hasArg(options::OPT_nostartfiles)) {
9857 // Add crtfastmath.o if available and fast math is enabled.
9858 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9859
9860 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9861 }
9862 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009863 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009864 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009865}
9866
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009867/// XCore Tools
9868// We pass assemble and link construction to the xcc tool.
9869
Douglas Katzman95354292015-06-23 20:42:09 +00009870void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9871 const InputInfo &Output,
9872 const InputInfoList &Inputs,
9873 const ArgList &Args,
9874 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009875 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009876 ArgStringList CmdArgs;
9877
9878 CmdArgs.push_back("-o");
9879 CmdArgs.push_back(Output.getFilename());
9880
9881 CmdArgs.push_back("-c");
9882
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009883 if (Args.hasArg(options::OPT_v))
9884 CmdArgs.push_back("-v");
9885
Robert Lytton894d25c2014-05-02 09:33:25 +00009886 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9887 if (!A->getOption().matches(options::OPT_g0))
9888 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009889
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009890 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9891 false))
9892 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009893
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009894 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009895
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009896 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009897 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009898
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009899 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009900 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009901}
9902
Douglas Katzman95354292015-06-23 20:42:09 +00009903void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9904 const InputInfo &Output,
9905 const InputInfoList &Inputs,
9906 const ArgList &Args,
9907 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009908 ArgStringList CmdArgs;
9909
9910 if (Output.isFilename()) {
9911 CmdArgs.push_back("-o");
9912 CmdArgs.push_back(Output.getFilename());
9913 } else {
9914 assert(Output.isNothing() && "Invalid output.");
9915 }
9916
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009917 if (Args.hasArg(options::OPT_v))
9918 CmdArgs.push_back("-v");
9919
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009920 // Pass -fexceptions through to the linker if it was present.
9921 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9922 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009923 CmdArgs.push_back("-fexceptions");
9924
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009925 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9926
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009927 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009928 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009929}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009930
Douglas Katzman95354292015-06-23 20:42:09 +00009931void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9932 const InputInfo &Output,
9933 const InputInfoList &Inputs,
9934 const ArgList &Args,
9935 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009936 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009937 const auto &TC =
9938 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9939 ArgStringList CmdArgs;
9940 const char *Exec;
9941
9942 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009943 default:
9944 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009945 case llvm::Triple::arm:
9946 case llvm::Triple::thumb:
9947 break;
9948 case llvm::Triple::x86:
9949 CmdArgs.push_back("--32");
9950 break;
9951 case llvm::Triple::x86_64:
9952 CmdArgs.push_back("--64");
9953 break;
9954 }
9955
9956 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9957
9958 CmdArgs.push_back("-o");
9959 CmdArgs.push_back(Output.getFilename());
9960
9961 for (const auto &Input : Inputs)
9962 CmdArgs.push_back(Input.getFilename());
9963
9964 const std::string Assembler = TC.GetProgramPath("as");
9965 Exec = Args.MakeArgString(Assembler);
9966
Justin Bognerd3371d82015-07-17 03:35:54 +00009967 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009968}
9969
Douglas Katzman95354292015-06-23 20:42:09 +00009970void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9971 const InputInfo &Output,
9972 const InputInfoList &Inputs,
9973 const ArgList &Args,
9974 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009975 const auto &TC =
9976 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9977 const llvm::Triple &T = TC.getTriple();
9978 const Driver &D = TC.getDriver();
9979 SmallString<128> EntryPoint;
9980 ArgStringList CmdArgs;
9981 const char *Exec;
9982
9983 // Silence warning for "clang -g foo.o -o foo"
9984 Args.ClaimAllArgs(options::OPT_g_Group);
9985 // and "clang -emit-llvm foo.o -o foo"
9986 Args.ClaimAllArgs(options::OPT_emit_llvm);
9987 // and for "clang -w foo.o -o foo"
9988 Args.ClaimAllArgs(options::OPT_w);
9989 // Other warning options are already handled somewhere else.
9990
9991 if (!D.SysRoot.empty())
9992 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9993
9994 if (Args.hasArg(options::OPT_pie))
9995 CmdArgs.push_back("-pie");
9996 if (Args.hasArg(options::OPT_rdynamic))
9997 CmdArgs.push_back("-export-dynamic");
9998 if (Args.hasArg(options::OPT_s))
9999 CmdArgs.push_back("--strip-all");
10000
10001 CmdArgs.push_back("-m");
10002 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010003 default:
10004 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010005 case llvm::Triple::arm:
10006 case llvm::Triple::thumb:
10007 // FIXME: this is incorrect for WinCE
10008 CmdArgs.push_back("thumb2pe");
10009 break;
10010 case llvm::Triple::x86:
10011 CmdArgs.push_back("i386pe");
10012 EntryPoint.append("_");
10013 break;
10014 case llvm::Triple::x86_64:
10015 CmdArgs.push_back("i386pep");
10016 break;
10017 }
10018
10019 if (Args.hasArg(options::OPT_shared)) {
10020 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010021 default:
10022 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010023 case llvm::Triple::arm:
10024 case llvm::Triple::thumb:
10025 case llvm::Triple::x86_64:
10026 EntryPoint.append("_DllMainCRTStartup");
10027 break;
10028 case llvm::Triple::x86:
10029 EntryPoint.append("_DllMainCRTStartup@12");
10030 break;
10031 }
10032
10033 CmdArgs.push_back("-shared");
10034 CmdArgs.push_back("-Bdynamic");
10035
10036 CmdArgs.push_back("--enable-auto-image-base");
10037
10038 CmdArgs.push_back("--entry");
10039 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10040 } else {
10041 EntryPoint.append("mainCRTStartup");
10042
10043 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10044 : "-Bdynamic");
10045
Douglas Katzman78b37b02015-11-17 20:28:07 +000010046 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010047 CmdArgs.push_back("--entry");
10048 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10049 }
10050
10051 // FIXME: handle subsystem
10052 }
10053
10054 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010055 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010056
10057 CmdArgs.push_back("-o");
10058 CmdArgs.push_back(Output.getFilename());
10059
10060 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10061 SmallString<261> ImpLib(Output.getFilename());
10062 llvm::sys::path::replace_extension(ImpLib, ".lib");
10063
10064 CmdArgs.push_back("--out-implib");
10065 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10066 }
10067
Douglas Katzman78b37b02015-11-17 20:28:07 +000010068 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010069 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10070 const char *CRTBegin;
10071
10072 CRTBegin =
10073 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10074 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10075 }
10076
10077 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010078 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010079 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10080
10081 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10082 !Args.hasArg(options::OPT_nodefaultlibs)) {
10083 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10084 !Args.hasArg(options::OPT_static);
10085 if (StaticCXX)
10086 CmdArgs.push_back("-Bstatic");
10087 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10088 if (StaticCXX)
10089 CmdArgs.push_back("-Bdynamic");
10090 }
10091
10092 if (!Args.hasArg(options::OPT_nostdlib)) {
10093 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10094 // TODO handle /MT[d] /MD[d]
10095 CmdArgs.push_back("-lmsvcrt");
10096 AddRunTimeLibs(TC, D, CmdArgs, Args);
10097 }
10098 }
10099
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010100 if (TC.getSanitizerArgs().needsAsanRt()) {
10101 // TODO handle /MT[d] /MD[d]
10102 if (Args.hasArg(options::OPT_shared)) {
10103 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10104 } else {
10105 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10106 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10107 // Make sure the dynamic runtime thunk is not optimized out at link time
10108 // to ensure proper SEH handling.
10109 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10110 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10111 ? "___asan_seh_interceptor"
10112 : "__asan_seh_interceptor"));
10113 }
10114 }
10115
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010116 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010117
Justin Bognerd3371d82015-07-17 03:35:54 +000010118 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010119}
Douglas Katzman84a75642015-06-19 14:55:19 +000010120
Douglas Katzman95354292015-06-23 20:42:09 +000010121void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10122 const InputInfo &Output,
10123 const InputInfoList &Inputs,
10124 const ArgList &Args,
10125 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010126 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010127 assert(Inputs.size() == 1);
10128 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010129 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10130 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010131
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010132 if (JA.getKind() == Action::PreprocessJobClass) {
10133 Args.ClaimAllArgs();
10134 CmdArgs.push_back("-E");
10135 } else {
10136 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10137 CmdArgs.push_back("-S");
10138 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10139 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010140 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010141 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010142
Douglas Katzmanf6071112015-08-03 14:34:22 +000010143 // Append all -I, -iquote, -isystem paths, defines/undefines,
10144 // 'f' flags, optimize flags, and warning options.
10145 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010146 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010147 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010148 options::OPT_f_Group, options::OPT_f_clang_Group,
10149 options::OPT_g_Group, options::OPT_M_Group,
10150 options::OPT_O_Group, options::OPT_W_Group});
10151
10152 // If we're producing a dependency file, and assembly is the final action,
10153 // then the name of the target in the dependency file should be the '.o'
10154 // file, not the '.s' file produced by this step. For example, instead of
10155 // /tmp/mumble.s: mumble.c .../someheader.h
10156 // the filename on the lefthand side should be "mumble.o"
10157 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10158 C.getActions().size() == 1 &&
10159 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10160 Arg *A = Args.getLastArg(options::OPT_o);
10161 if (A) {
10162 CmdArgs.push_back("-MT");
10163 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10164 }
10165 }
10166
Douglas Katzman84a75642015-06-19 14:55:19 +000010167 CmdArgs.push_back(II.getFilename());
10168 CmdArgs.push_back("-o");
10169 CmdArgs.push_back(Output.getFilename());
10170
10171 std::string Exec =
10172 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010173 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10174 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010175}
10176
Douglas Katzman95354292015-06-23 20:42:09 +000010177void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10178 const InputInfo &Output,
10179 const InputInfoList &Inputs,
10180 const ArgList &Args,
10181 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010182 ArgStringList CmdArgs;
10183
10184 assert(Inputs.size() == 1);
10185 const InputInfo &II = Inputs[0];
10186 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10187 assert(Output.getType() == types::TY_Object);
10188
10189 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010190 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010191 CmdArgs.push_back("-noSPrefixing");
10192 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010193 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10194 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10195 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010196 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010197 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010198 }
10199 CmdArgs.push_back("-elf"); // Output format.
10200 CmdArgs.push_back(II.getFilename());
10201 CmdArgs.push_back(
10202 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10203
10204 std::string Exec =
10205 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010206 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10207 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010208}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010209
10210void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10211 const InputInfo &Output,
10212 const InputInfoList &Inputs,
10213 const ArgList &Args,
10214 const char *LinkingOutput) const {
10215 const auto &TC =
10216 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10217 const llvm::Triple &T = TC.getTriple();
10218 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010219 bool UseStartfiles =
10220 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010221 bool UseDefaultLibs =
10222 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010223
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010224 if (T.getArch() == llvm::Triple::sparc)
10225 CmdArgs.push_back("-EB");
10226 else // SHAVE assumes little-endian, and sparcel is expressly so.
10227 CmdArgs.push_back("-EL");
10228
10229 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10230 // but we never pass through a --sysroot option and various other bits.
10231 // For example, there are no sanitizers (yet) nor gold linker.
10232
10233 // Eat some arguments that may be present but have no effect.
10234 Args.ClaimAllArgs(options::OPT_g_Group);
10235 Args.ClaimAllArgs(options::OPT_w);
10236 Args.ClaimAllArgs(options::OPT_static_libgcc);
10237
10238 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10239 CmdArgs.push_back("-s");
10240
10241 CmdArgs.push_back("-o");
10242 CmdArgs.push_back(Output.getFilename());
10243
10244 if (UseStartfiles) {
10245 // If you want startfiles, it means you want the builtin crti and crtbegin,
10246 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010247 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10248 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010249 }
10250
10251 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10252 options::OPT_e, options::OPT_s, options::OPT_t,
10253 options::OPT_Z_Flag, options::OPT_r});
10254
Douglas Katzman674a3122015-11-18 16:24:46 +000010255 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010256
10257 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10258
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010259 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010260 if (C.getDriver().CCCIsCXX())
10261 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010262 if (T.getOS() == llvm::Triple::RTEMS) {
10263 CmdArgs.push_back("--start-group");
10264 CmdArgs.push_back("-lc");
10265 // You must provide your own "-L" option to enable finding these.
10266 CmdArgs.push_back("-lrtemscpu");
10267 CmdArgs.push_back("-lrtemsbsp");
10268 CmdArgs.push_back("--end-group");
10269 } else {
10270 CmdArgs.push_back("-lc");
10271 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010272 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010273 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010274 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010275 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10276 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010277 }
10278
10279 std::string Exec =
10280 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10281 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10282 CmdArgs, Inputs));
10283}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010284
10285void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10286 const InputInfo &Output,
10287 const InputInfoList &Inputs,
10288 const ArgList &Args,
10289 const char *LinkingOutput) const {
10290 claimNoWarnArgs(Args);
10291 ArgStringList CmdArgs;
10292
10293 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10294
10295 CmdArgs.push_back("-o");
10296 CmdArgs.push_back(Output.getFilename());
10297
10298 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10299 const InputInfo &Input = Inputs[0];
10300 assert(Input.isFilename() && "Invalid input.");
10301 CmdArgs.push_back(Input.getFilename());
10302
10303 const char *Exec =
10304 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10305 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10306}
10307
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010308static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10309 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10310 if (SanArgs.needsUbsanRt()) {
10311 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10312 }
10313 if (SanArgs.needsAsanRt()) {
10314 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10315 }
10316}
10317
10318static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10319 const JobAction &JA, const InputInfo &Output,
10320 const InputInfoList &Inputs,
10321 const ArgList &Args,
10322 const char *LinkingOutput) {
10323 const toolchains::FreeBSD &ToolChain =
10324 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10325 const Driver &D = ToolChain.getDriver();
10326 ArgStringList CmdArgs;
10327
10328 // Silence warning for "clang -g foo.o -o foo"
10329 Args.ClaimAllArgs(options::OPT_g_Group);
10330 // and "clang -emit-llvm foo.o -o foo"
10331 Args.ClaimAllArgs(options::OPT_emit_llvm);
10332 // and for "clang -w foo.o -o foo". Other warning options are already
10333 // handled somewhere else.
10334 Args.ClaimAllArgs(options::OPT_w);
10335
10336 if (!D.SysRoot.empty())
10337 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10338
10339 if (Args.hasArg(options::OPT_pie))
10340 CmdArgs.push_back("-pie");
10341
10342 if (Args.hasArg(options::OPT_rdynamic))
10343 CmdArgs.push_back("-export-dynamic");
10344 if (Args.hasArg(options::OPT_shared))
10345 CmdArgs.push_back("--oformat=so");
10346
10347 if (Output.isFilename()) {
10348 CmdArgs.push_back("-o");
10349 CmdArgs.push_back(Output.getFilename());
10350 } else {
10351 assert(Output.isNothing() && "Invalid output.");
10352 }
10353
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010354 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10355
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010356 Args.AddAllArgs(CmdArgs, options::OPT_L);
10357 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10358 Args.AddAllArgs(CmdArgs, options::OPT_e);
10359 Args.AddAllArgs(CmdArgs, options::OPT_s);
10360 Args.AddAllArgs(CmdArgs, options::OPT_t);
10361 Args.AddAllArgs(CmdArgs, options::OPT_r);
10362
10363 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10364 CmdArgs.push_back("--no-demangle");
10365
10366 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10367
10368 if (Args.hasArg(options::OPT_pthread)) {
10369 CmdArgs.push_back("-lpthread");
10370 }
10371
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010372 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10373
10374 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10375}
10376
10377static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10378 const JobAction &JA, const InputInfo &Output,
10379 const InputInfoList &Inputs,
10380 const ArgList &Args,
10381 const char *LinkingOutput) {
10382 const toolchains::FreeBSD &ToolChain =
10383 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10384 const Driver &D = ToolChain.getDriver();
10385 ArgStringList CmdArgs;
10386
10387 // Silence warning for "clang -g foo.o -o foo"
10388 Args.ClaimAllArgs(options::OPT_g_Group);
10389 // and "clang -emit-llvm foo.o -o foo"
10390 Args.ClaimAllArgs(options::OPT_emit_llvm);
10391 // and for "clang -w foo.o -o foo". Other warning options are already
10392 // handled somewhere else.
10393 Args.ClaimAllArgs(options::OPT_w);
10394
10395 if (!D.SysRoot.empty())
10396 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10397
10398 if (Args.hasArg(options::OPT_pie))
10399 CmdArgs.push_back("-pie");
10400
10401 if (Args.hasArg(options::OPT_static)) {
10402 CmdArgs.push_back("-Bstatic");
10403 } else {
10404 if (Args.hasArg(options::OPT_rdynamic))
10405 CmdArgs.push_back("-export-dynamic");
10406 CmdArgs.push_back("--eh-frame-hdr");
10407 if (Args.hasArg(options::OPT_shared)) {
10408 CmdArgs.push_back("-Bshareable");
10409 } else {
10410 CmdArgs.push_back("-dynamic-linker");
10411 CmdArgs.push_back("/libexec/ld-elf.so.1");
10412 }
10413 CmdArgs.push_back("--enable-new-dtags");
10414 }
10415
10416 if (Output.isFilename()) {
10417 CmdArgs.push_back("-o");
10418 CmdArgs.push_back(Output.getFilename());
10419 } else {
10420 assert(Output.isNothing() && "Invalid output.");
10421 }
10422
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010423 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10424
Douglas Katzman78b37b02015-11-17 20:28:07 +000010425 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010426 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010427 if (!Args.hasArg(options::OPT_shared)) {
10428 if (Args.hasArg(options::OPT_pg))
10429 crt1 = "gcrt1.o";
10430 else if (Args.hasArg(options::OPT_pie))
10431 crt1 = "Scrt1.o";
10432 else
10433 crt1 = "crt1.o";
10434 }
10435 if (crt1)
10436 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10437
10438 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10439
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010440 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010441 if (Args.hasArg(options::OPT_static))
10442 crtbegin = "crtbeginT.o";
10443 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10444 crtbegin = "crtbeginS.o";
10445 else
10446 crtbegin = "crtbegin.o";
10447
10448 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10449 }
10450
10451 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010452 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010453 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10454 Args.AddAllArgs(CmdArgs, options::OPT_e);
10455 Args.AddAllArgs(CmdArgs, options::OPT_s);
10456 Args.AddAllArgs(CmdArgs, options::OPT_t);
10457 Args.AddAllArgs(CmdArgs, options::OPT_r);
10458
10459 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10460 CmdArgs.push_back("--no-demangle");
10461
10462 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10463
Douglas Katzman78b37b02015-11-17 20:28:07 +000010464 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010465 // For PS4, we always want to pass libm, libstdc++ and libkernel
10466 // libraries for both C and C++ compilations.
10467 CmdArgs.push_back("-lkernel");
10468 if (D.CCCIsCXX()) {
10469 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10470 if (Args.hasArg(options::OPT_pg))
10471 CmdArgs.push_back("-lm_p");
10472 else
10473 CmdArgs.push_back("-lm");
10474 }
10475 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10476 // the default system libraries. Just mimic this for now.
10477 if (Args.hasArg(options::OPT_pg))
10478 CmdArgs.push_back("-lgcc_p");
10479 else
10480 CmdArgs.push_back("-lcompiler_rt");
10481 if (Args.hasArg(options::OPT_static)) {
10482 CmdArgs.push_back("-lstdc++");
10483 } else if (Args.hasArg(options::OPT_pg)) {
10484 CmdArgs.push_back("-lgcc_eh_p");
10485 } else {
10486 CmdArgs.push_back("--as-needed");
10487 CmdArgs.push_back("-lstdc++");
10488 CmdArgs.push_back("--no-as-needed");
10489 }
10490
10491 if (Args.hasArg(options::OPT_pthread)) {
10492 if (Args.hasArg(options::OPT_pg))
10493 CmdArgs.push_back("-lpthread_p");
10494 else
10495 CmdArgs.push_back("-lpthread");
10496 }
10497
10498 if (Args.hasArg(options::OPT_pg)) {
10499 if (Args.hasArg(options::OPT_shared))
10500 CmdArgs.push_back("-lc");
10501 else {
10502 if (Args.hasArg(options::OPT_static)) {
10503 CmdArgs.push_back("--start-group");
10504 CmdArgs.push_back("-lc_p");
10505 CmdArgs.push_back("-lpthread_p");
10506 CmdArgs.push_back("--end-group");
10507 } else {
10508 CmdArgs.push_back("-lc_p");
10509 }
10510 }
10511 CmdArgs.push_back("-lgcc_p");
10512 } else {
10513 if (Args.hasArg(options::OPT_static)) {
10514 CmdArgs.push_back("--start-group");
10515 CmdArgs.push_back("-lc");
10516 CmdArgs.push_back("-lpthread");
10517 CmdArgs.push_back("--end-group");
10518 } else {
10519 CmdArgs.push_back("-lc");
10520 }
10521 CmdArgs.push_back("-lcompiler_rt");
10522 }
10523
10524 if (Args.hasArg(options::OPT_static)) {
10525 CmdArgs.push_back("-lstdc++");
10526 } else if (Args.hasArg(options::OPT_pg)) {
10527 CmdArgs.push_back("-lgcc_eh_p");
10528 } else {
10529 CmdArgs.push_back("--as-needed");
10530 CmdArgs.push_back("-lstdc++");
10531 CmdArgs.push_back("--no-as-needed");
10532 }
10533 }
10534
Douglas Katzman78b37b02015-11-17 20:28:07 +000010535 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010536 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10537 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10538 else
10539 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10540 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10541 }
10542
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010543 const char *Exec =
10544#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010545 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010546#else
10547 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10548#endif
10549
10550 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10551}
10552
10553void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10554 const InputInfo &Output,
10555 const InputInfoList &Inputs,
10556 const ArgList &Args,
10557 const char *LinkingOutput) const {
10558 const toolchains::FreeBSD &ToolChain =
10559 static_cast<const toolchains::FreeBSD &>(getToolChain());
10560 const Driver &D = ToolChain.getDriver();
10561 bool PS4Linker;
10562 StringRef LinkerOptName;
10563 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10564 LinkerOptName = A->getValue();
10565 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10566 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10567 }
10568
10569 if (LinkerOptName == "gold")
10570 PS4Linker = false;
10571 else if (LinkerOptName == "ps4")
10572 PS4Linker = true;
10573 else
10574 PS4Linker = !Args.hasArg(options::OPT_shared);
10575
10576 if (PS4Linker)
10577 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10578 else
10579 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10580}