blob: 6be28290a7fbdbd53bd3fb19693646832aa20771 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
Nico Weberd8ff0ee2016-04-02 19:10:07 +0000419 if (getToolChain().getDriver().IsCLMode() &&
420 A->getOption().matches(options::OPT_include)) {
Junmo Parke19d6792016-03-17 06:41:27 +0000421 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000422 // include is compiled into foo.h, and everything after goes into
423 // the .obj file. /Yufoo.h means that all includes prior to and including
424 // foo.h are completely skipped and replaced with a use of the pch file
425 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
426 // just mean that the last one wins.) If /Yc and /Yu are both present
427 // and refer to the same file, /Yc wins.
428 // Note that OPT__SLASH_FI gets mapped to OPT_include.
429 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
430 // cl.exe seems to support both flags with different values, but that
431 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000432 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000433 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
434 if (PchIndex != -1) {
435 if (isa<PrecompileJobAction>(JA)) {
436 // When building the pch, skip all includes after the pch.
437 assert(YcIndex != -1 && PchIndex == YcIndex);
438 if (AI >= YcIndex)
439 continue;
440 } else {
441 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000442 if (AI < PchIndex) {
443 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000444 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000445 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000446 if (AI == PchIndex) {
447 A->claim();
448 CmdArgs.push_back("-include-pch");
449 CmdArgs.push_back(
450 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
451 continue;
452 }
453 }
454 }
455 } else if (A->getOption().matches(options::OPT_include)) {
456 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000457 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
458 RenderedImplicitInclude = true;
459
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000460 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000461 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000462
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000464 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000465 SmallString<128> P(A->getValue());
466 // We want the files to have a name like foo.h.pch. Add a dummy extension
467 // so that replace_extension does the right thing.
468 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000469 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000470 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000471 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000473 }
474
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000476 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000477 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000479 }
480
Douglas Gregor111af7d2009-04-18 00:34:01 +0000481 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000482 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000483 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000484 FoundPCH = UsePCH;
485 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000486 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000487 }
488
489 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000490 if (IsFirstImplicitInclude) {
491 A->claim();
492 if (UsePCH)
493 CmdArgs.push_back("-include-pch");
494 else
495 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000496 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000497 continue;
498 } else {
499 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000500 D.Diag(diag::warn_drv_pch_not_first_include) << P
501 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000502 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000503 }
504 }
505
506 // Not translated, render as usual.
507 A->claim();
508 A->render(Args, CmdArgs);
509 }
510
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000511 Args.AddAllArgs(CmdArgs,
512 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
513 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000514
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000515 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000516
517 // FIXME: There is a very unfortunate problem here, some troubled
518 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
519 // really support that we would have to parse and then translate
520 // those options. :(
521 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
522 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000523
524 // -I- is a deprecated GCC feature, reject it.
525 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000526 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000527
528 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
529 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000530 StringRef sysroot = C.getSysRoot();
531 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 if (!Args.hasArg(options::OPT_isysroot)) {
533 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000534 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000535 }
536 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000537
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000539 // FIXME: We should probably sink the logic for handling these from the
540 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // CPATH - included following the user specified includes (but prior to
542 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000543 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000544 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000545 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000546 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000547 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000548 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000549 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000550 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000551 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000552
Artem Belevichfa11ab52015-11-17 22:28:46 +0000553 // Optional AuxToolChain indicates that we need to include headers
554 // for more than one target. If that's the case, add include paths
555 // from AuxToolChain right after include paths of the same kind for
556 // the current target.
557
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000558 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000559 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000560 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000561 if (AuxToolChain)
562 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
563 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000564
565 // Add system include arguments.
566 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000567 if (AuxToolChain)
568 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
569
570 // Add CUDA include arguments, if needed.
571 if (types::isCuda(Inputs[0].getType()))
572 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000573}
574
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000575// FIXME: Move to target hook.
576static bool isSignedCharDefault(const llvm::Triple &Triple) {
577 switch (Triple.getArch()) {
578 default:
579 return true;
580
Tim Northover9bb857a2013-01-31 12:13:10 +0000581 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000582 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000583 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000584 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000585 case llvm::Triple::thumb:
586 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000587 if (Triple.isOSDarwin() || Triple.isOSWindows())
588 return true;
589 return false;
590
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 case llvm::Triple::ppc:
592 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000593 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000594 return true;
595 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000596
David Majnemerdcecd932015-05-23 19:23:55 +0000597 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000598 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000599 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000600 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000601 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000602 }
603}
604
Robert Lytton0e076492013-08-13 09:43:10 +0000605static bool isNoCommonDefault(const llvm::Triple &Triple) {
606 switch (Triple.getArch()) {
607 default:
608 return false;
609
610 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000611 case llvm::Triple::wasm32:
612 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000613 return true;
614 }
615}
616
Renato Goline17c5802015-07-27 23:44:42 +0000617// ARM tools start.
618
619// Get SubArch (vN).
620static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
621 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000622 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000623}
624
625// True if M-profile.
626static bool isARMMProfile(const llvm::Triple &Triple) {
627 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000628 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000629 return Profile == llvm::ARM::PK_M;
630}
631
632// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000633static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
634 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000635 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
636 CPU = A->getValue();
637 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
638 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000639 if (!FromAs)
640 return;
641
642 for (const Arg *A :
643 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
644 StringRef Value = A->getValue();
645 if (Value.startswith("-mcpu="))
646 CPU = Value.substr(6);
647 if (Value.startswith("-march="))
648 Arch = Value.substr(7);
649 }
Renato Goline17c5802015-07-27 23:44:42 +0000650}
651
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000652// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000653// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000654static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000655 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000656 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000657 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
658 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000659 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
660}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000661
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000663static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000664 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000665 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000666 unsigned FPUID = llvm::ARM::parseFPU(FPU);
667 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Bradley Smithbbf5a002015-11-18 16:33:48 +0000671// Decode ARM features from string like +[no]featureA+[no]featureB+...
672static bool DecodeARMFeatures(const Driver &D, StringRef text,
673 std::vector<const char *> &Features) {
674 SmallVector<StringRef, 8> Split;
675 text.split(Split, StringRef("+"), -1, false);
676
677 for (StringRef Feature : Split) {
678 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
679 if (FeatureName)
680 Features.push_back(FeatureName);
681 else
682 return false;
683 }
684 return true;
685}
686
Renato Golin7c542b42015-07-27 23:44:45 +0000687// Check if -march is valid by checking if it can be canonicalised and parsed.
688// getARMArch is used here instead of just checking the -march value in order
689// to handle -march=native correctly.
690static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000691 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000692 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000693 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 std::pair<StringRef, StringRef> Split = ArchName.split("+");
695
Renato Goline17c5802015-07-27 23:44:42 +0000696 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000697 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
698 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000699 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000700}
701
Renato Golin7c542b42015-07-27 23:44:45 +0000702// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
703static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
704 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000705 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000706 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 std::pair<StringRef, StringRef> Split = CPUName.split("+");
708
Renato Goline17c5802015-07-27 23:44:42 +0000709 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000710 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
711 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000712 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000713}
714
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000715static bool useAAPCSForMachO(const llvm::Triple &T) {
716 // The backend is hardwired to assume AAPCS for M-class processors, ensure
717 // the frontend matches that.
718 return T.getEnvironment() == llvm::Triple::EABI ||
719 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
720}
721
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000722// Select the float ABI as determined by -msoft-float, -mhard-float, and
723// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000724arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
725 const Driver &D = TC.getDriver();
726 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 auto SubArch = getARMSubArchVersionNumber(Triple);
728 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000729 if (Arg *A =
730 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
731 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000732 if (A->getOption().matches(options::OPT_msoft_float)) {
733 ABI = FloatABI::Soft;
734 } else if (A->getOption().matches(options::OPT_mhard_float)) {
735 ABI = FloatABI::Hard;
736 } else {
737 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
738 .Case("soft", FloatABI::Soft)
739 .Case("softfp", FloatABI::SoftFP)
740 .Case("hard", FloatABI::Hard)
741 .Default(FloatABI::Invalid);
742 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000743 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000744 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000745 }
746 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000747
748 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
749 // "apcs-gnu".
750 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000752 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
753 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000754 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 }
756
757 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000758 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000759 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000760 case llvm::Triple::Darwin:
761 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000762 case llvm::Triple::IOS:
763 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000765 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000766 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000767 break;
768 }
Tim Northover756447a2015-10-30 16:30:36 +0000769 case llvm::Triple::WatchOS:
770 ABI = FloatABI::Hard;
771 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000772
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 // FIXME: this is invalid for WindowsCE
774 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000775 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000776 break;
777
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000778 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000779 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000780 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000782 break;
783 default:
784 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000786 break;
787 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000788 break;
789
Daniel Dunbar78485922009-09-10 23:00:09 +0000790 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000791 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000793 case llvm::Triple::EABIHF:
794 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000795 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000796 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 case llvm::Triple::EABI:
798 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000799 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000800 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000801 case llvm::Triple::Android:
802 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000803 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000804 default:
805 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000806 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000807 if (Triple.getOS() != llvm::Triple::UnknownOS ||
808 !Triple.isOSBinFormatMachO())
809 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000810 break;
811 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000812 }
813 }
814
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000815 assert(ABI != FloatABI::Invalid && "must select an ABI");
816 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000817}
818
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000819static void getARMTargetFeatures(const ToolChain &TC,
820 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000821 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000822 std::vector<const char *> &Features,
823 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000824 const Driver &D = TC.getDriver();
825
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000826 bool KernelOrKext =
827 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000828 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000829 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
830 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
831
Nico Weber6e0ebae2015-04-29 21:16:40 +0000832 if (!ForAS) {
833 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
834 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
835 // stripped out by the ARM target. We should probably pass this a new
836 // -target-option, which is handled by the -cc1/-cc1as invocation.
837 //
838 // FIXME2: For consistency, it would be ideal if we set up the target
839 // machine state the same when using the frontend or the assembler. We don't
840 // currently do that for the assembler, we pass the options directly to the
841 // backend and never even instantiate the frontend TargetInfo. If we did,
842 // and used its handleTargetFeatures hook, then we could ensure the
843 // assembler and the frontend behave the same.
844
845 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000846 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000847 Features.push_back("+soft-float");
848
849 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000850 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000851 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000852 } else {
853 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
854 // to the assembler correctly.
855 for (const Arg *A :
856 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
857 StringRef Value = A->getValue();
858 if (Value.startswith("-mfpu=")) {
859 WaFPU = A;
860 } else if (Value.startswith("-mcpu=")) {
861 WaCPU = A;
862 } else if (Value.startswith("-mhwdiv=")) {
863 WaHDiv = A;
864 } else if (Value.startswith("-march=")) {
865 WaArch = A;
866 }
867 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000868 }
869
Renato Golin7c542b42015-07-27 23:44:45 +0000870 // Check -march. ClangAs gives preference to -Wa,-march=.
871 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000872 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000873 if (WaArch) {
874 if (ArchArg)
875 D.Diag(clang::diag::warn_drv_unused_argument)
876 << ArchArg->getAsString(Args);
877 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000878 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000879 // FIXME: Set Arch.
880 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
881 } else if (ArchArg) {
882 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000883 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000884 }
885
Renato Golin7c542b42015-07-27 23:44:45 +0000886 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
887 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000888 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000889 if (WaCPU) {
890 if (CPUArg)
891 D.Diag(clang::diag::warn_drv_unused_argument)
892 << CPUArg->getAsString(Args);
893 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000894 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000895 } else if (CPUArg) {
896 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000897 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000898 }
John Brawna95c1a82015-05-08 12:52:18 +0000899
Renato Golin23459c62015-07-30 16:40:17 +0000900 // Add CPU features for generic CPUs
901 if (CPUName == "native") {
902 llvm::StringMap<bool> HostFeatures;
903 if (llvm::sys::getHostCPUFeatures(HostFeatures))
904 for (auto &F : HostFeatures)
905 Features.push_back(
906 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
907 }
908
909 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
910 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
911 if (WaFPU) {
912 if (FPUArg)
913 D.Diag(clang::diag::warn_drv_unused_argument)
914 << FPUArg->getAsString(Args);
915 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
916 Features);
917 } else if (FPUArg) {
918 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
919 }
920
921 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
922 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
923 if (WaHDiv) {
924 if (HDivArg)
925 D.Diag(clang::diag::warn_drv_unused_argument)
926 << HDivArg->getAsString(Args);
927 getARMHWDivFeatures(D, WaHDiv, Args,
928 StringRef(WaHDiv->getValue()).substr(8), Features);
929 } else if (HDivArg)
930 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
931
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000932 // Setting -msoft-float effectively disables NEON because of the GCC
933 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000934 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000935 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000936 // Also need to explicitly disable features which imply NEON.
937 Features.push_back("-crypto");
938 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000939
Eric Christopher269c2a22015-04-04 03:34:43 +0000940 // En/disable crc code generation.
941 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000942 if (A->getOption().matches(options::OPT_mcrc))
943 Features.push_back("+crc");
944 else
945 Features.push_back("-crc");
946 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000947
Akira Hatanakac2694822015-07-07 08:28:42 +0000948 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
949 // neither options are specified, see if we are compiling for kernel/kext and
950 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000951 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
952 options::OPT_mno_long_calls)) {
953 if (A->getOption().matches(options::OPT_mlong_calls))
954 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000955 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
956 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000957 Features.push_back("+long-calls");
958 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000959
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000960 // Kernel code has more strict alignment requirements.
961 if (KernelOrKext)
962 Features.push_back("+strict-align");
963 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
964 options::OPT_munaligned_access)) {
965 if (A->getOption().matches(options::OPT_munaligned_access)) {
966 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
967 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
968 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000969 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
970 // access either.
971 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
972 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000973 } else
974 Features.push_back("+strict-align");
975 } else {
976 // Assume pre-ARMv6 doesn't support unaligned accesses.
977 //
978 // ARMv6 may or may not support unaligned accesses depending on the
979 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
980 // Darwin and NetBSD targets support unaligned accesses, and others don't.
981 //
982 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
983 // which raises an alignment fault on unaligned accesses. Linux
984 // defaults this bit to 0 and handles it as a system-wide (not
985 // per-process) setting. It is therefore safe to assume that ARMv7+
986 // Linux targets support unaligned accesses. The same goes for NaCl.
987 //
988 // The above behavior is consistent with GCC.
989 int VersionNum = getARMSubArchVersionNumber(Triple);
990 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000991 if (VersionNum < 6 ||
992 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000993 Features.push_back("+strict-align");
994 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
995 if (VersionNum < 7)
996 Features.push_back("+strict-align");
997 } else
998 Features.push_back("+strict-align");
999 }
1000
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001001 // llvm does not support reserving registers in general. There is support
1002 // for reserving r9 on ARM though (defined as a platform-specific register
1003 // in ARM EABI).
1004 if (Args.hasArg(options::OPT_ffixed_r9))
1005 Features.push_back("+reserve-r9");
1006
Dimitry Andric08107392016-01-06 07:42:18 +00001007 // The kext linker doesn't know how to deal with movw/movt.
1008 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001009 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001010}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001011
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001012void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1013 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001014 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001015 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001016 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001017 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001018 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001019 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001020 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001021 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001022 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001023 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001024 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001025 } else {
1026 ABIName = "apcs-gnu";
1027 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001028 } else if (Triple.isOSWindows()) {
1029 // FIXME: this is invalid for WindowsCE
1030 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001031 } else {
1032 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001033 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001034 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001035 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001036 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001037 ABIName = "aapcs-linux";
1038 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001039 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001040 case llvm::Triple::EABI:
1041 ABIName = "aapcs";
1042 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001043 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001044 if (Triple.getOS() == llvm::Triple::NetBSD)
1045 ABIName = "apcs-gnu";
1046 else
1047 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001048 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001049 }
1050 }
1051 CmdArgs.push_back("-target-abi");
1052 CmdArgs.push_back(ABIName);
1053
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001054 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001055 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001056 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001057 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001058 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001059 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001060 CmdArgs.push_back("-mfloat-abi");
1061 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001062 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001064 CmdArgs.push_back("-mfloat-abi");
1065 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001066 } else {
1067 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001068 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001069 CmdArgs.push_back("-mfloat-abi");
1070 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001071 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001072
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001073 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001074 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1075 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001076 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001077 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001078 CmdArgs.push_back("-arm-global-merge=false");
1079 else
1080 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001081 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001082
Bob Wilson9c8af452013-04-11 18:53:25 +00001083 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001084 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001085 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001086}
Renato Goline17c5802015-07-27 23:44:42 +00001087// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001088
Tim Northover573cbee2014-05-24 12:52:07 +00001089/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1090/// targeting.
1091static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001092 Arg *A;
1093 std::string CPU;
1094 // If we have -mtune or -mcpu, use that.
1095 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001096 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001097 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001098 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001099 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001100 }
1101
Kevin Qin110db6f2014-07-18 07:03:22 +00001102 // Handle CPU name is 'native'.
1103 if (CPU == "native")
1104 return llvm::sys::getHostCPUName();
1105 else if (CPU.size())
1106 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001107
James Molloy9b1586b2014-04-17 12:51:17 +00001108 // Make sure we pick "cyclone" if -arch is used.
1109 // FIXME: Should this be picked by checking the target triple instead?
1110 if (Args.getLastArg(options::OPT_arch))
1111 return "cyclone";
1112
1113 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001114}
1115
Tim Northover573cbee2014-05-24 12:52:07 +00001116void Clang::AddAArch64TargetArgs(const ArgList &Args,
1117 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001118 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1119 llvm::Triple Triple(TripleStr);
1120
1121 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1122 Args.hasArg(options::OPT_mkernel) ||
1123 Args.hasArg(options::OPT_fapple_kext))
1124 CmdArgs.push_back("-disable-red-zone");
1125
1126 if (!Args.hasFlag(options::OPT_mimplicit_float,
1127 options::OPT_mno_implicit_float, true))
1128 CmdArgs.push_back("-no-implicit-float");
1129
Craig Topper92fc2df2014-05-17 16:56:41 +00001130 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001131 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1132 ABIName = A->getValue();
1133 else if (Triple.isOSDarwin())
1134 ABIName = "darwinpcs";
1135 else
1136 ABIName = "aapcs";
1137
1138 CmdArgs.push_back("-target-abi");
1139 CmdArgs.push_back(ABIName);
1140
Bradley Smith9ff64332014-10-13 10:16:06 +00001141 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1142 options::OPT_mno_fix_cortex_a53_835769)) {
1143 CmdArgs.push_back("-backend-option");
1144 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1145 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1146 else
1147 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001148 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001149 // Enabled A53 errata (835769) workaround by default on android
1150 CmdArgs.push_back("-backend-option");
1151 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001152 }
1153
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001154 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001155 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1156 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001157 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001158 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001159 CmdArgs.push_back("-aarch64-global-merge=false");
1160 else
1161 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001162 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001163}
1164
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001165// Get CPU and ABI names. They are not independent
1166// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001167void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1168 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001169 const char *DefMips32CPU = "mips32r2";
1170 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001171
Daniel Sanders2bf13662014-07-10 14:40:57 +00001172 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1173 // default for mips64(el)?-img-linux-gnu.
1174 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1175 Triple.getEnvironment() == llvm::Triple::GNU) {
1176 DefMips32CPU = "mips32r6";
1177 DefMips64CPU = "mips64r6";
1178 }
Renato Golin7c542b42015-07-27 23:44:45 +00001179
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001180 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001181 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001182 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001183
Brad Smithba26f582015-01-06 02:53:17 +00001184 // MIPS3 is the default for mips64*-unknown-openbsd.
1185 if (Triple.getOS() == llvm::Triple::OpenBSD)
1186 DefMips64CPU = "mips3";
1187
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001188 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001189 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001190
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001191 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001192 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001193 // Convert a GNU style Mips ABI name to the name
1194 // accepted by LLVM Mips backend.
1195 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001196 .Case("32", "o32")
1197 .Case("64", "n64")
1198 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001199 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001200
1201 // Setup default CPU and ABI names.
1202 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001203 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001204 default:
1205 llvm_unreachable("Unexpected triple arch name");
1206 case llvm::Triple::mips:
1207 case llvm::Triple::mipsel:
1208 CPUName = DefMips32CPU;
1209 break;
1210 case llvm::Triple::mips64:
1211 case llvm::Triple::mips64el:
1212 CPUName = DefMips64CPU;
1213 break;
1214 }
1215 }
1216
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001217 if (ABIName.empty()) {
1218 // Deduce ABI name from the target triple.
1219 if (Triple.getArch() == llvm::Triple::mips ||
1220 Triple.getArch() == llvm::Triple::mipsel)
1221 ABIName = "o32";
1222 else
1223 ABIName = "n64";
1224 }
1225
1226 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001227 // Deduce CPU name from ABI name.
1228 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001229 .Cases("o32", "eabi", DefMips32CPU)
1230 .Cases("n32", "n64", DefMips64CPU)
1231 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001232 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001233
1234 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001235}
1236
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001237std::string mips::getMipsABILibSuffix(const ArgList &Args,
1238 const llvm::Triple &Triple) {
1239 StringRef CPUName, ABIName;
1240 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1241 return llvm::StringSwitch<std::string>(ABIName)
1242 .Case("o32", "")
1243 .Case("n32", "32")
1244 .Case("n64", "64");
1245}
1246
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001247// Convert ABI name to the GNU tools acceptable variant.
1248static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1249 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001250 .Case("o32", "32")
1251 .Case("n64", "64")
1252 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001253}
1254
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001255// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1256// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001257static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1258 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001259 if (Arg *A =
1260 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1261 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001262 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001263 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001264 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001265 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001266 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001267 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1268 .Case("soft", mips::FloatABI::Soft)
1269 .Case("hard", mips::FloatABI::Hard)
1270 .Default(mips::FloatABI::Invalid);
1271 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001272 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001273 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001274 }
1275 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001276 }
1277
1278 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001279 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001280 // Assume "hard", because it's a default value used by gcc.
1281 // When we start to recognize specific target MIPS processors,
1282 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001283 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001284 }
1285
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001286 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1287 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001288}
1289
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001290static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001291 std::vector<const char *> &Features,
1292 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001293 StringRef FeatureName) {
1294 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001295 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001296 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001297 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001298 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001299 }
1300}
1301
Daniel Sanders379d44b2014-07-16 11:52:23 +00001302static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1303 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001304 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001305 StringRef CPUName;
1306 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001307 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001308 ABIName = getGnuCompatibleMipsABIName(ABIName);
1309
Daniel Sandersfeb61302014-08-08 15:47:17 +00001310 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1311 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001312
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001313 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1314 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001315 // FIXME: Note, this is a hack. We need to pass the selected float
1316 // mode to the MipsTargetInfoBase to define appropriate macros there.
1317 // Now it is the only method.
1318 Features.push_back("+soft-float");
1319 }
1320
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001321 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001322 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001323 if (Val == "2008") {
1324 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1325 Features.push_back("+nan2008");
1326 else {
1327 Features.push_back("-nan2008");
1328 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1329 }
1330 } else if (Val == "legacy") {
1331 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1332 Features.push_back("-nan2008");
1333 else {
1334 Features.push_back("+nan2008");
1335 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1336 }
1337 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001338 D.Diag(diag::err_drv_unsupported_option_argument)
1339 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001340 }
1341
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001342 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1343 options::OPT_mdouble_float, "single-float");
1344 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1345 "mips16");
1346 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1347 options::OPT_mno_micromips, "micromips");
1348 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1349 "dsp");
1350 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1351 "dspr2");
1352 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1353 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001354
1355 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1356 // pass -mfpxx
1357 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1358 options::OPT_mfp64)) {
1359 if (A->getOption().matches(options::OPT_mfp32))
1360 Features.push_back(Args.MakeArgString("-fp64"));
1361 else if (A->getOption().matches(options::OPT_mfpxx)) {
1362 Features.push_back(Args.MakeArgString("+fpxx"));
1363 Features.push_back(Args.MakeArgString("+nooddspreg"));
1364 } else
1365 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001366 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001367 Features.push_back(Args.MakeArgString("+fpxx"));
1368 Features.push_back(Args.MakeArgString("+nooddspreg"));
1369 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001370
Daniel Sanders28e5d392014-07-10 10:39:51 +00001371 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1372 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001373}
1374
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001375void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001376 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001377 const Driver &D = getToolChain().getDriver();
1378 StringRef CPUName;
1379 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001380 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001381 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001382
1383 CmdArgs.push_back("-target-abi");
1384 CmdArgs.push_back(ABIName.data());
1385
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001386 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1387 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001388 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001389 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001390 CmdArgs.push_back("-mfloat-abi");
1391 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001392 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001393 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001394 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001395 CmdArgs.push_back("-mfloat-abi");
1396 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001397 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001398
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001399 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1400 if (A->getOption().matches(options::OPT_mxgot)) {
1401 CmdArgs.push_back("-mllvm");
1402 CmdArgs.push_back("-mxgot");
1403 }
1404 }
1405
Simon Atanasyanc580b322013-05-11 06:33:44 +00001406 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1407 options::OPT_mno_ldc1_sdc1)) {
1408 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1409 CmdArgs.push_back("-mllvm");
1410 CmdArgs.push_back("-mno-ldc1-sdc1");
1411 }
1412 }
1413
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001414 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1415 options::OPT_mno_check_zero_division)) {
1416 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1417 CmdArgs.push_back("-mllvm");
1418 CmdArgs.push_back("-mno-check-zero-division");
1419 }
1420 }
1421
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001422 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001423 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001424 CmdArgs.push_back("-mllvm");
1425 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1426 A->claim();
1427 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001428}
1429
Hal Finkel8eb59282012-06-11 22:35:19 +00001430/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1431static std::string getPPCTargetCPU(const ArgList &Args) {
1432 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001433 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001434
1435 if (CPUName == "native") {
1436 std::string CPU = llvm::sys::getHostCPUName();
1437 if (!CPU.empty() && CPU != "generic")
1438 return CPU;
1439 else
1440 return "";
1441 }
1442
1443 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001444 .Case("common", "generic")
1445 .Case("440", "440")
1446 .Case("440fp", "440")
1447 .Case("450", "450")
1448 .Case("601", "601")
1449 .Case("602", "602")
1450 .Case("603", "603")
1451 .Case("603e", "603e")
1452 .Case("603ev", "603ev")
1453 .Case("604", "604")
1454 .Case("604e", "604e")
1455 .Case("620", "620")
1456 .Case("630", "pwr3")
1457 .Case("G3", "g3")
1458 .Case("7400", "7400")
1459 .Case("G4", "g4")
1460 .Case("7450", "7450")
1461 .Case("G4+", "g4+")
1462 .Case("750", "750")
1463 .Case("970", "970")
1464 .Case("G5", "g5")
1465 .Case("a2", "a2")
1466 .Case("a2q", "a2q")
1467 .Case("e500mc", "e500mc")
1468 .Case("e5500", "e5500")
1469 .Case("power3", "pwr3")
1470 .Case("power4", "pwr4")
1471 .Case("power5", "pwr5")
1472 .Case("power5x", "pwr5x")
1473 .Case("power6", "pwr6")
1474 .Case("power6x", "pwr6x")
1475 .Case("power7", "pwr7")
1476 .Case("power8", "pwr8")
1477 .Case("pwr3", "pwr3")
1478 .Case("pwr4", "pwr4")
1479 .Case("pwr5", "pwr5")
1480 .Case("pwr5x", "pwr5x")
1481 .Case("pwr6", "pwr6")
1482 .Case("pwr6x", "pwr6x")
1483 .Case("pwr7", "pwr7")
1484 .Case("pwr8", "pwr8")
1485 .Case("powerpc", "ppc")
1486 .Case("powerpc64", "ppc64")
1487 .Case("powerpc64le", "ppc64le")
1488 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001489 }
1490
1491 return "";
1492}
1493
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001494static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1495 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001496 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001497 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001498
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001499 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1500 if (FloatABI == ppc::FloatABI::Soft &&
1501 !(Triple.getArch() == llvm::Triple::ppc64 ||
1502 Triple.getArch() == llvm::Triple::ppc64le))
1503 Features.push_back("+soft-float");
1504 else if (FloatABI == ppc::FloatABI::Soft &&
1505 (Triple.getArch() == llvm::Triple::ppc64 ||
1506 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001507 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001508 << "soft float is not supported for ppc64";
1509
Eric Christopher643bb6a2013-10-16 20:40:08 +00001510 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001511 AddTargetFeature(Args, Features, options::OPT_faltivec,
1512 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001513}
1514
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001515ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1516 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1517 if (Arg *A =
1518 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1519 options::OPT_mfloat_abi_EQ)) {
1520 if (A->getOption().matches(options::OPT_msoft_float))
1521 ABI = ppc::FloatABI::Soft;
1522 else if (A->getOption().matches(options::OPT_mhard_float))
1523 ABI = ppc::FloatABI::Hard;
1524 else {
1525 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1526 .Case("soft", ppc::FloatABI::Soft)
1527 .Case("hard", ppc::FloatABI::Hard)
1528 .Default(ppc::FloatABI::Invalid);
1529 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1530 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1531 ABI = ppc::FloatABI::Hard;
1532 }
1533 }
1534 }
1535
1536 // If unspecified, choose the default based on the platform.
1537 if (ABI == ppc::FloatABI::Invalid) {
1538 ABI = ppc::FloatABI::Hard;
1539 }
1540
1541 return ABI;
1542}
1543
Ulrich Weigand8afad612014-07-28 13:17:52 +00001544void Clang::AddPPCTargetArgs(const ArgList &Args,
1545 ArgStringList &CmdArgs) const {
1546 // Select the ABI to use.
1547 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001548 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001549 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001550 case llvm::Triple::ppc64: {
1551 // When targeting a processor that supports QPX, or if QPX is
1552 // specifically enabled, default to using the ABI that supports QPX (so
1553 // long as it is not specifically disabled).
1554 bool HasQPX = false;
1555 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1556 HasQPX = A->getValue() == StringRef("a2q");
1557 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1558 if (HasQPX) {
1559 ABIName = "elfv1-qpx";
1560 break;
1561 }
1562
Ulrich Weigand8afad612014-07-28 13:17:52 +00001563 ABIName = "elfv1";
1564 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001565 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001566 case llvm::Triple::ppc64le:
1567 ABIName = "elfv2";
1568 break;
1569 default:
1570 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001571 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001572
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001573 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1574 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1575 // the option if given as we don't have backend support for any targets
1576 // that don't use the altivec abi.
1577 if (StringRef(A->getValue()) != "altivec")
1578 ABIName = A->getValue();
1579
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001580 ppc::FloatABI FloatABI =
1581 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1582
1583 if (FloatABI == ppc::FloatABI::Soft) {
1584 // Floating point operations and argument passing are soft.
1585 CmdArgs.push_back("-msoft-float");
1586 CmdArgs.push_back("-mfloat-abi");
1587 CmdArgs.push_back("soft");
1588 } else {
1589 // Floating point operations and argument passing are hard.
1590 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1591 CmdArgs.push_back("-mfloat-abi");
1592 CmdArgs.push_back("hard");
1593 }
1594
Ulrich Weigand8afad612014-07-28 13:17:52 +00001595 if (ABIName) {
1596 CmdArgs.push_back("-target-abi");
1597 CmdArgs.push_back(ABIName);
1598 }
1599}
1600
1601bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1602 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1603 return A && (A->getValue() == StringRef(Value));
1604}
1605
Tom Stellard6674c702013-04-01 20:56:53 +00001606/// Get the (LLVM) name of the R600 gpu we are targeting.
1607static std::string getR600TargetGPU(const ArgList &Args) {
1608 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001609 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001610 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001611 .Cases("rv630", "rv635", "r600")
1612 .Cases("rv610", "rv620", "rs780", "rs880")
1613 .Case("rv740", "rv770")
1614 .Case("palm", "cedar")
1615 .Cases("sumo", "sumo2", "sumo")
1616 .Case("hemlock", "cypress")
1617 .Case("aruba", "cayman")
1618 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001619 }
1620 return "";
1621}
1622
Jacques Pienaard964cc22016-03-28 21:02:54 +00001623static std::string getLanaiTargetCPU(const ArgList &Args) {
1624 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1625 return A->getValue();
1626 }
1627 return "";
1628}
1629
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001630void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001631 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001632 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001633 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001634
James Y Knightb2406522015-06-15 20:51:24 +00001635 bool SoftFloatABI = false;
1636 if (Arg *A =
1637 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001638 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001639 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001640 }
1641
James Y Knightb2406522015-06-15 20:51:24 +00001642 // Only the hard-float ABI on Sparc is standardized, and it is the
1643 // default. GCC also supports a nonstandard soft-float ABI mode, and
1644 // perhaps LLVM should implement that, too. However, since llvm
1645 // currently does not support Sparc soft-float, at all, display an
1646 // error if it's requested.
1647 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001648 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1649 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001650 }
1651}
1652
Richard Sandiford4652d892013-07-19 16:51:51 +00001653static const char *getSystemZTargetCPU(const ArgList &Args) {
1654 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1655 return A->getValue();
1656 return "z10";
1657}
1658
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001659static void getSystemZTargetFeatures(const ArgList &Args,
1660 std::vector<const char *> &Features) {
1661 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001662 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001663 if (A->getOption().matches(options::OPT_mhtm))
1664 Features.push_back("+transactional-execution");
1665 else
1666 Features.push_back("-transactional-execution");
1667 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001668 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001669 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001670 if (A->getOption().matches(options::OPT_mvx))
1671 Features.push_back("+vector");
1672 else
1673 Features.push_back("-vector");
1674 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001675}
1676
Chandler Carruth953fb082013-01-13 11:46:33 +00001677static const char *getX86TargetCPU(const ArgList &Args,
1678 const llvm::Triple &Triple) {
1679 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001680 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001681 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001682 return "core-avx2";
1683
Chandler Carruth953fb082013-01-13 11:46:33 +00001684 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001685 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001686
1687 // FIXME: Reject attempts to use -march=native unless the target matches
1688 // the host.
1689 //
1690 // FIXME: We should also incorporate the detected target features for use
1691 // with -native.
1692 std::string CPU = llvm::sys::getHostCPUName();
1693 if (!CPU.empty() && CPU != "generic")
1694 return Args.MakeArgString(CPU);
1695 }
1696
Reid Kleckner3123eff2015-06-30 16:32:04 +00001697 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1698 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1699 StringRef Arch = A->getValue();
1700 const char *CPU;
1701 if (Triple.getArch() == llvm::Triple::x86) {
1702 CPU = llvm::StringSwitch<const char *>(Arch)
1703 .Case("IA32", "i386")
1704 .Case("SSE", "pentium3")
1705 .Case("SSE2", "pentium4")
1706 .Case("AVX", "sandybridge")
1707 .Case("AVX2", "haswell")
1708 .Default(nullptr);
1709 } else {
1710 CPU = llvm::StringSwitch<const char *>(Arch)
1711 .Case("AVX", "sandybridge")
1712 .Case("AVX2", "haswell")
1713 .Default(nullptr);
1714 }
1715 if (CPU)
1716 return CPU;
1717 }
1718
Chandler Carruth953fb082013-01-13 11:46:33 +00001719 // Select the default CPU if none was given (or detection failed).
1720
1721 if (Triple.getArch() != llvm::Triple::x86_64 &&
1722 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001723 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001724
1725 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1726
1727 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001728 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001729 if (Triple.getArchName() == "x86_64h")
1730 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001731 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001732 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001733
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001734 // Set up default CPU name for PS4 compilers.
1735 if (Triple.isPS4CPU())
1736 return "btver2";
1737
Alexey Bataev286d1b92014-01-31 04:07:13 +00001738 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001739 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001740 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001741
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001742 // Everything else goes to x86-64 in 64-bit mode.
1743 if (Is64Bit)
1744 return "x86-64";
1745
1746 switch (Triple.getOS()) {
1747 case llvm::Triple::FreeBSD:
1748 case llvm::Triple::NetBSD:
1749 case llvm::Triple::OpenBSD:
1750 return "i486";
1751 case llvm::Triple::Haiku:
1752 return "i586";
1753 case llvm::Triple::Bitrig:
1754 return "i686";
1755 default:
1756 // Fallback to p4.
1757 return "pentium4";
1758 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001759}
1760
Dan Gohmanc2853072015-09-03 22:51:53 +00001761/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1762static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1763 // If we have -mcpu=, use that.
1764 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1765 StringRef CPU = A->getValue();
1766
1767#ifdef __wasm__
1768 // Handle "native" by examining the host. "native" isn't meaningful when
1769 // cross compiling, so only support this when the host is also WebAssembly.
1770 if (CPU == "native")
1771 return llvm::sys::getHostCPUName();
1772#endif
1773
1774 return CPU;
1775 }
1776
1777 return "generic";
1778}
1779
Renato Golin7c542b42015-07-27 23:44:45 +00001780static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1781 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001782 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001783 default:
1784 return "";
1785
Amara Emerson703da2e2013-10-31 09:32:33 +00001786 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001787 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001788 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001789
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001790 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001791 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001792 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001793 case llvm::Triple::thumbeb: {
1794 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001795 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001796 return arm::getARMTargetCPU(MCPU, MArch, T);
1797 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001798 case llvm::Triple::mips:
1799 case llvm::Triple::mipsel:
1800 case llvm::Triple::mips64:
1801 case llvm::Triple::mips64el: {
1802 StringRef CPUName;
1803 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001804 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001805 return CPUName;
1806 }
1807
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001808 case llvm::Triple::nvptx:
1809 case llvm::Triple::nvptx64:
1810 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1811 return A->getValue();
1812 return "";
1813
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001814 case llvm::Triple::ppc:
1815 case llvm::Triple::ppc64:
1816 case llvm::Triple::ppc64le: {
1817 std::string TargetCPUName = getPPCTargetCPU(Args);
1818 // LLVM may default to generating code for the native CPU,
1819 // but, like gcc, we default to a more generic option for
1820 // each architecture. (except on Darwin)
1821 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1822 if (T.getArch() == llvm::Triple::ppc64)
1823 TargetCPUName = "ppc64";
1824 else if (T.getArch() == llvm::Triple::ppc64le)
1825 TargetCPUName = "ppc64le";
1826 else
1827 TargetCPUName = "ppc";
1828 }
1829 return TargetCPUName;
1830 }
1831
1832 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001833 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001834 case llvm::Triple::sparcv9:
1835 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001836 return A->getValue();
1837 return "";
1838
1839 case llvm::Triple::x86:
1840 case llvm::Triple::x86_64:
1841 return getX86TargetCPU(Args, T);
1842
1843 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001844 return "hexagon" +
1845 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001846
Jacques Pienaard964cc22016-03-28 21:02:54 +00001847 case llvm::Triple::lanai:
1848 return getLanaiTargetCPU(Args);
1849
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001850 case llvm::Triple::systemz:
1851 return getSystemZTargetCPU(Args);
1852
1853 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001854 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001855 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001856
1857 case llvm::Triple::wasm32:
1858 case llvm::Triple::wasm64:
1859 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001860 }
1861}
1862
Alp Tokerce365ca2013-12-02 12:43:03 +00001863static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001864 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001865 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1866 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1867 // forward.
1868 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001869 std::string Plugin =
1870 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001871 CmdArgs.push_back(Args.MakeArgString(Plugin));
1872
1873 // Try to pass driver level flags relevant to LTO code generation down to
1874 // the plugin.
1875
1876 // Handle flags for selecting CPU variants.
1877 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1878 if (!CPU.empty())
1879 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001880
James Molloyf97fdae2015-12-21 10:44:36 +00001881 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1882 StringRef OOpt;
1883 if (A->getOption().matches(options::OPT_O4) ||
1884 A->getOption().matches(options::OPT_Ofast))
1885 OOpt = "3";
1886 else if (A->getOption().matches(options::OPT_O))
1887 OOpt = A->getValue();
1888 else if (A->getOption().matches(options::OPT_O0))
1889 OOpt = "0";
1890 if (!OOpt.empty())
1891 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1892 }
1893
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001894 if (IsThinLTO)
1895 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001896
1897 // If an explicit debugger tuning argument appeared, pass it along.
1898 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1899 options::OPT_ggdbN_Group)) {
1900 if (A->getOption().matches(options::OPT_glldb))
1901 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1902 else if (A->getOption().matches(options::OPT_gsce))
1903 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1904 else
1905 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1906 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001907}
1908
Sanjay Patel2987c292015-06-11 14:53:41 +00001909/// This is a helper function for validating the optional refinement step
1910/// parameter in reciprocal argument strings. Return false if there is an error
1911/// parsing the refinement step. Otherwise, return true and set the Position
1912/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001913static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001914 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001915 const char RefinementStepToken = ':';
1916 Position = In.find(RefinementStepToken);
1917 if (Position != StringRef::npos) {
1918 StringRef Option = A.getOption().getName();
1919 StringRef RefStep = In.substr(Position + 1);
1920 // Allow exactly one numeric character for the additional refinement
1921 // step parameter. This is reasonable for all currently-supported
1922 // operations and architectures because we would expect that a larger value
1923 // of refinement steps would cause the estimate "optimization" to
1924 // under-perform the native operation. Also, if the estimate does not
1925 // converge quickly, it probably will not ever converge, so further
1926 // refinement steps will not produce a better answer.
1927 if (RefStep.size() != 1) {
1928 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1929 return false;
1930 }
1931 char RefStepChar = RefStep[0];
1932 if (RefStepChar < '0' || RefStepChar > '9') {
1933 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1934 return false;
1935 }
1936 }
1937 return true;
1938}
1939
1940/// The -mrecip flag requires processing of many optional parameters.
1941static void ParseMRecip(const Driver &D, const ArgList &Args,
1942 ArgStringList &OutStrings) {
1943 StringRef DisabledPrefixIn = "!";
1944 StringRef DisabledPrefixOut = "!";
1945 StringRef EnabledPrefixOut = "";
1946 StringRef Out = "-mrecip=";
1947
1948 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1949 if (!A)
1950 return;
1951
1952 unsigned NumOptions = A->getNumValues();
1953 if (NumOptions == 0) {
1954 // No option is the same as "all".
1955 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1956 return;
1957 }
1958
1959 // Pass through "all", "none", or "default" with an optional refinement step.
1960 if (NumOptions == 1) {
1961 StringRef Val = A->getValue(0);
1962 size_t RefStepLoc;
1963 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1964 return;
1965 StringRef ValBase = Val.slice(0, RefStepLoc);
1966 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1967 OutStrings.push_back(Args.MakeArgString(Out + Val));
1968 return;
1969 }
1970 }
1971
1972 // Each reciprocal type may be enabled or disabled individually.
1973 // Check each input value for validity, concatenate them all back together,
1974 // and pass through.
1975
1976 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001977 OptionStrings.insert(std::make_pair("divd", false));
1978 OptionStrings.insert(std::make_pair("divf", false));
1979 OptionStrings.insert(std::make_pair("vec-divd", false));
1980 OptionStrings.insert(std::make_pair("vec-divf", false));
1981 OptionStrings.insert(std::make_pair("sqrtd", false));
1982 OptionStrings.insert(std::make_pair("sqrtf", false));
1983 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1984 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001985
1986 for (unsigned i = 0; i != NumOptions; ++i) {
1987 StringRef Val = A->getValue(i);
1988
1989 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1990 // Ignore the disablement token for string matching.
1991 if (IsDisabled)
1992 Val = Val.substr(1);
1993
1994 size_t RefStep;
1995 if (!getRefinementStep(Val, D, *A, RefStep))
1996 return;
1997
1998 StringRef ValBase = Val.slice(0, RefStep);
1999 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2000 if (OptionIter == OptionStrings.end()) {
2001 // Try again specifying float suffix.
2002 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2003 if (OptionIter == OptionStrings.end()) {
2004 // The input name did not match any known option string.
2005 D.Diag(diag::err_drv_unknown_argument) << Val;
2006 return;
2007 }
2008 // The option was specified without a float or double suffix.
2009 // Make sure that the double entry was not already specified.
2010 // The float entry will be checked below.
2011 if (OptionStrings[ValBase.str() + 'd']) {
2012 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2013 return;
2014 }
2015 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002016
Sanjay Patel2987c292015-06-11 14:53:41 +00002017 if (OptionIter->second == true) {
2018 // Duplicate option specified.
2019 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2020 return;
2021 }
2022
2023 // Mark the matched option as found. Do not allow duplicate specifiers.
2024 OptionIter->second = true;
2025
2026 // If the precision was not specified, also mark the double entry as found.
2027 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2028 OptionStrings[ValBase.str() + 'd'] = true;
2029
2030 // Build the output string.
2031 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2032 Out = Args.MakeArgString(Out + Prefix + Val);
2033 if (i != NumOptions - 1)
2034 Out = Args.MakeArgString(Out + ",");
2035 }
2036
2037 OutStrings.push_back(Args.MakeArgString(Out));
2038}
2039
Eric Christopherc54920a2015-03-23 19:26:05 +00002040static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002041 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002042 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002043 // If -march=native, autodetect the feature list.
2044 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2045 if (StringRef(A->getValue()) == "native") {
2046 llvm::StringMap<bool> HostFeatures;
2047 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2048 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002049 Features.push_back(
2050 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002051 }
2052 }
2053
Jim Grosbach82eee262013-11-16 00:53:35 +00002054 if (Triple.getArchName() == "x86_64h") {
2055 // x86_64h implies quite a few of the more modern subtarget features
2056 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2057 Features.push_back("-rdrnd");
2058 Features.push_back("-aes");
2059 Features.push_back("-pclmul");
2060 Features.push_back("-rtm");
2061 Features.push_back("-hle");
2062 Features.push_back("-fsgsbase");
2063 }
2064
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002065 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002066 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002067 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002068 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002069 Features.push_back("+sse4.2");
2070 Features.push_back("+popcnt");
2071 } else
2072 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002073 }
2074
Eric Christopherc54920a2015-03-23 19:26:05 +00002075 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002076 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2077 StringRef Arch = A->getValue();
2078 bool ArchUsed = false;
2079 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002080 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002081 if (Arch == "AVX" || Arch == "AVX2") {
2082 ArchUsed = true;
2083 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2084 }
2085 }
2086 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002087 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002088 if (Arch == "IA32") {
2089 ArchUsed = true;
2090 } else if (Arch == "SSE" || Arch == "SSE2") {
2091 ArchUsed = true;
2092 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2093 }
2094 }
2095 if (!ArchUsed)
2096 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2097 }
2098
Jim Grosbach82eee262013-11-16 00:53:35 +00002099 // Now add any that the user explicitly requested on the command line,
2100 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002101 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002102}
2103
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002104void Clang::AddX86TargetArgs(const ArgList &Args,
2105 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002106 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002107 Args.hasArg(options::OPT_mkernel) ||
2108 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002109 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002110
Bob Wilson2616e2e2013-02-10 16:01:41 +00002111 // Default to avoid implicit floating-point for kernel/kext code, but allow
2112 // that to be overridden with -mno-soft-float.
2113 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2114 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002115 if (Arg *A = Args.getLastArg(
2116 options::OPT_msoft_float, options::OPT_mno_soft_float,
2117 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002118 const Option &O = A->getOption();
2119 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2120 O.matches(options::OPT_msoft_float));
2121 }
2122 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002123 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002124
2125 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2126 StringRef Value = A->getValue();
2127 if (Value == "intel" || Value == "att") {
2128 CmdArgs.push_back("-mllvm");
2129 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2130 } else {
2131 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2132 << A->getOption().getName() << Value;
2133 }
2134 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002135}
2136
Tony Linthicum76329bf2011-12-12 21:14:55 +00002137void Clang::AddHexagonTargetArgs(const ArgList &Args,
2138 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002139 CmdArgs.push_back("-mqdsp6-compat");
2140 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002141
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002142 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2143 std::string N = llvm::utostr(G.getValue());
2144 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002145 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002146 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002147 }
2148
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002149 if (!Args.hasArg(options::OPT_fno_short_enums))
2150 CmdArgs.push_back("-fshort-enums");
2151 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002152 CmdArgs.push_back("-mllvm");
2153 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002154 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002155 CmdArgs.push_back("-mllvm");
2156 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002157}
2158
Jacques Pienaard964cc22016-03-28 21:02:54 +00002159void Clang::AddLanaiTargetArgs(const ArgList &Args,
2160 ArgStringList &CmdArgs) const {
2161 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2162 StringRef CPUName = A->getValue();
2163
2164 CmdArgs.push_back("-target-cpu");
2165 CmdArgs.push_back(Args.MakeArgString(CPUName));
2166 }
2167 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2168 StringRef Value = A->getValue();
2169 // Only support mregparm=4 to support old usage. Report error for all other
2170 // cases.
2171 int Mregparm;
2172 if (Value.getAsInteger(10, Mregparm)) {
2173 if (Mregparm != 4) {
2174 getToolChain().getDriver().Diag(
2175 diag::err_drv_unsupported_option_argument)
2176 << A->getOption().getName() << Value;
2177 }
2178 }
2179 }
2180}
2181
Dan Gohmane3d71e12016-01-07 01:00:21 +00002182void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2183 ArgStringList &CmdArgs) const {
2184 // Default to "hidden" visibility.
2185 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2186 options::OPT_fvisibility_ms_compat)) {
2187 CmdArgs.push_back("-fvisibility");
2188 CmdArgs.push_back("hidden");
2189 }
2190}
2191
Kevin Qin110db6f2014-07-18 07:03:22 +00002192// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002193static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002194 std::vector<const char *> &Features) {
2195 SmallVector<StringRef, 8> Split;
2196 text.split(Split, StringRef("+"), -1, false);
2197
Benjamin Kramer72e64312015-09-24 14:48:49 +00002198 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002199 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002200 .Case("fp", "+fp-armv8")
2201 .Case("simd", "+neon")
2202 .Case("crc", "+crc")
2203 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002204 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002205 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002206 .Case("nofp", "-fp-armv8")
2207 .Case("nosimd", "-neon")
2208 .Case("nocrc", "-crc")
2209 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002210 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002211 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002212 .Default(nullptr);
2213 if (result)
2214 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002215 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002216 D.Diag(diag::err_drv_no_neon_modifier);
2217 else
2218 return false;
2219 }
2220 return true;
2221}
2222
2223// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2224// decode CPU and feature.
2225static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2226 std::vector<const char *> &Features) {
2227 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2228 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002229 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002230 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2231 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002232 Features.push_back("+neon");
2233 Features.push_back("+crc");
2234 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002235 } else if (CPU == "cyclone") {
2236 Features.push_back("+neon");
2237 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002238 } else if (CPU == "generic") {
2239 Features.push_back("+neon");
2240 } else {
2241 return false;
2242 }
2243
2244 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2245 return false;
2246
2247 return true;
2248}
2249
2250static bool
2251getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2252 const ArgList &Args,
2253 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002254 std::string MarchLowerCase = March.lower();
2255 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002256
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002257 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002258 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002259 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002260 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002261 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2262 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002263 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002264 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002265 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002266
2267 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2268 return false;
2269
2270 return true;
2271}
2272
2273static bool
2274getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2275 const ArgList &Args,
2276 std::vector<const char *> &Features) {
2277 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002278 std::string McpuLowerCase = Mcpu.lower();
2279 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002280 return false;
2281
2282 return true;
2283}
2284
2285static bool
2286getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2287 const ArgList &Args,
2288 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002289 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002290 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002291 if (MtuneLowerCase == "native")
2292 MtuneLowerCase = llvm::sys::getHostCPUName();
2293 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002294 Features.push_back("+zcm");
2295 Features.push_back("+zcz");
2296 }
2297 return true;
2298}
2299
2300static bool
2301getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2302 const ArgList &Args,
2303 std::vector<const char *> &Features) {
2304 StringRef CPU;
2305 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002306 std::string McpuLowerCase = Mcpu.lower();
2307 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002308 return false;
2309
2310 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2311}
2312
Justin Bognerf9052562015-11-13 23:07:31 +00002313static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002314 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002315 Arg *A;
2316 bool success = true;
2317 // Enable NEON by default.
2318 Features.push_back("+neon");
2319 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2320 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2321 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2322 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002323 else if (Args.hasArg(options::OPT_arch))
2324 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2325 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002326
2327 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2328 success =
2329 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2330 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2331 success =
2332 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002333 else if (Args.hasArg(options::OPT_arch))
2334 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2335 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002336
2337 if (!success)
2338 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002339
2340 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2341 Features.push_back("-fp-armv8");
2342 Features.push_back("-crypto");
2343 Features.push_back("-neon");
2344 }
Bradley Smith418c5932014-05-02 15:17:51 +00002345
2346 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002347 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002348 if (A->getOption().matches(options::OPT_mcrc))
2349 Features.push_back("+crc");
2350 else
2351 Features.push_back("-crc");
2352 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002353
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002354 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2355 options::OPT_munaligned_access))
2356 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2357 Features.push_back("+strict-align");
2358
Justin Bognerf9052562015-11-13 23:07:31 +00002359 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002360 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002361}
2362
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002363static void getHexagonTargetFeatures(const ArgList &Args,
2364 std::vector<const char *> &Features) {
2365 bool HasHVX = false, HasHVXD = false;
2366
Eric Christopher49062a52015-12-22 03:12:34 +00002367 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2368 // doing dependent option handling here rather than in initFeatureMap or a
2369 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002370 for (auto &A : Args) {
2371 auto &Opt = A->getOption();
2372 if (Opt.matches(options::OPT_mhexagon_hvx))
2373 HasHVX = true;
2374 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2375 HasHVXD = HasHVX = false;
2376 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2377 HasHVXD = HasHVX = true;
2378 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2379 HasHVXD = false;
2380 else
2381 continue;
2382 A->claim();
2383 }
2384
2385 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2386 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2387}
2388
Dan Gohmanc2853072015-09-03 22:51:53 +00002389static void getWebAssemblyTargetFeatures(const ArgList &Args,
2390 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002391 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002392}
2393
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002394static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002395 const ArgList &Args, ArgStringList &CmdArgs,
2396 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002397 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002398 std::vector<const char *> Features;
2399 switch (Triple.getArch()) {
2400 default:
2401 break;
2402 case llvm::Triple::mips:
2403 case llvm::Triple::mipsel:
2404 case llvm::Triple::mips64:
2405 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002406 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002407 break;
2408
2409 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002410 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002411 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002412 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002413 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002414 break;
2415
2416 case llvm::Triple::ppc:
2417 case llvm::Triple::ppc64:
2418 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002419 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002420 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002421 case llvm::Triple::systemz:
2422 getSystemZTargetFeatures(Args, Features);
2423 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002424 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002425 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002426 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002427 break;
2428 case llvm::Triple::x86:
2429 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002430 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002431 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002432 case llvm::Triple::hexagon:
2433 getHexagonTargetFeatures(Args, Features);
2434 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002435 case llvm::Triple::wasm32:
2436 case llvm::Triple::wasm64:
2437 getWebAssemblyTargetFeatures(Args, Features);
2438 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002439 }
Rafael Espindola43964802013-08-21 17:34:32 +00002440
2441 // Find the last of each feature.
2442 llvm::StringMap<unsigned> LastOpt;
2443 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2444 const char *Name = Features[I];
2445 assert(Name[0] == '-' || Name[0] == '+');
2446 LastOpt[Name + 1] = I;
2447 }
2448
2449 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2450 // If this feature was overridden, ignore it.
2451 const char *Name = Features[I];
2452 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2453 assert(LastI != LastOpt.end());
2454 unsigned Last = LastI->second;
2455 if (Last != I)
2456 continue;
2457
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002458 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002459 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002460 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002461}
2462
David Majnemerae394812014-12-09 00:12:30 +00002463static bool
2464shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2465 const llvm::Triple &Triple) {
2466 // We use the zero-cost exception tables for Objective-C if the non-fragile
2467 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2468 // later.
2469 if (runtime.isNonFragile())
2470 return true;
2471
2472 if (!Triple.isMacOSX())
2473 return false;
2474
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002475 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002476 (Triple.getArch() == llvm::Triple::x86_64 ||
2477 Triple.getArch() == llvm::Triple::arm));
2478}
2479
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002480/// Adds exception related arguments to the driver command arguments. There's a
2481/// master flag, -fexceptions and also language specific flags to enable/disable
2482/// C++ and Objective-C exceptions. This makes it possible to for example
2483/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002484static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002485 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002486 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002487 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002488 const Driver &D = TC.getDriver();
2489 const llvm::Triple &Triple = TC.getTriple();
2490
Chad Rosier4fab82c2012-03-26 22:04:46 +00002491 if (KernelOrKext) {
2492 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2493 // arguments now to avoid warnings about unused arguments.
2494 Args.ClaimAllArgs(options::OPT_fexceptions);
2495 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2496 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2497 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2498 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2499 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002500 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002501 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002502
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002503 // See if the user explicitly enabled exceptions.
2504 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2505 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002506
David Majnemerae394812014-12-09 00:12:30 +00002507 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2508 // is not necessarily sensible, but follows GCC.
2509 if (types::isObjC(InputType) &&
2510 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002511 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002512 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002513
David Majnemerae394812014-12-09 00:12:30 +00002514 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002515 }
2516
2517 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002518 // Disable C++ EH by default on XCore and PS4.
2519 bool CXXExceptionsEnabled =
2520 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002521 Arg *ExceptionArg = Args.getLastArg(
2522 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2523 options::OPT_fexceptions, options::OPT_fno_exceptions);
2524 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002525 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002526 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2527 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002528
2529 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002530 if (Triple.isPS4CPU()) {
2531 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2532 assert(ExceptionArg &&
2533 "On the PS4 exceptions should only be enabled if passing "
2534 "an argument");
2535 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2536 const Arg *RTTIArg = TC.getRTTIArg();
2537 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2538 D.Diag(diag::err_drv_argument_not_allowed_with)
2539 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2540 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2541 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2542 } else
2543 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2544
Anders Carlssone96ab552011-02-28 02:27:16 +00002545 CmdArgs.push_back("-fcxx-exceptions");
2546
David Majnemer8de68642014-12-05 08:11:58 +00002547 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002548 }
2549 }
2550
David Majnemer8de68642014-12-05 08:11:58 +00002551 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002552 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002553}
2554
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002555static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002556 bool Default = true;
2557 if (TC.getTriple().isOSDarwin()) {
2558 // The native darwin assembler doesn't support the linker_option directives,
2559 // so we disable them if we think the .s file will be passed to it.
2560 Default = TC.useIntegratedAs();
2561 }
2562 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2563 Default);
2564}
2565
Ted Kremenek62093662013-03-12 17:02:12 +00002566static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2567 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002568 bool UseDwarfDirectory =
2569 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2570 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002571 return !UseDwarfDirectory;
2572}
2573
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002574/// \brief Check whether the given input tree contains any compilation actions.
2575static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002576 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002577 return true;
2578
Nico Weber5a459f82016-02-23 19:30:43 +00002579 for (const auto &AI : A->inputs())
2580 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002581 return true;
2582
2583 return false;
2584}
2585
2586/// \brief Check if -relax-all should be passed to the internal assembler.
2587/// This is done by default when compiling non-assembler source with -O0.
2588static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2589 bool RelaxDefault = true;
2590
2591 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2592 RelaxDefault = A->getOption().matches(options::OPT_O0);
2593
2594 if (RelaxDefault) {
2595 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002596 for (const auto &Act : C.getActions()) {
2597 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002598 RelaxDefault = true;
2599 break;
2600 }
2601 }
2602 }
2603
2604 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002605 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002606}
2607
Paul Robinson0334a042015-12-19 19:41:48 +00002608// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2609// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002610static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002611 assert(A.getOption().matches(options::OPT_gN_Group) &&
2612 "Not a -g option that specifies a debug-info level");
2613 if (A.getOption().matches(options::OPT_g0) ||
2614 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002615 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002616 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2617 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002618 return codegenoptions::DebugLineTablesOnly;
2619 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002620}
2621
Douglas Katzman3459ce22015-10-08 04:24:12 +00002622// Extract the integer N from a string spelled "-dwarf-N", returning 0
2623// on mismatch. The StringRef input (rather than an Arg) allows
2624// for use by the "-Xassembler" option parser.
2625static unsigned DwarfVersionNum(StringRef ArgValue) {
2626 return llvm::StringSwitch<unsigned>(ArgValue)
2627 .Case("-gdwarf-2", 2)
2628 .Case("-gdwarf-3", 3)
2629 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002630 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002631 .Default(0);
2632}
2633
2634static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002635 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002636 unsigned DwarfVersion,
2637 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002638 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002639 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002640 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2641 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002642 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002643 CmdArgs.push_back("-debug-info-kind=limited");
2644 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002645 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002646 CmdArgs.push_back("-debug-info-kind=standalone");
2647 break;
2648 default:
2649 break;
2650 }
2651 if (DwarfVersion > 0)
2652 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002653 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002654 switch (DebuggerTuning) {
2655 case llvm::DebuggerKind::GDB:
2656 CmdArgs.push_back("-debugger-tuning=gdb");
2657 break;
2658 case llvm::DebuggerKind::LLDB:
2659 CmdArgs.push_back("-debugger-tuning=lldb");
2660 break;
2661 case llvm::DebuggerKind::SCE:
2662 CmdArgs.push_back("-debugger-tuning=sce");
2663 break;
2664 default:
2665 break;
2666 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002667}
2668
David Blaikie9260ed62013-07-25 21:19:01 +00002669static void CollectArgsForIntegratedAssembler(Compilation &C,
2670 const ArgList &Args,
2671 ArgStringList &CmdArgs,
2672 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002673 if (UseRelaxAll(C, Args))
2674 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002675
David Majnemer2b9349d2015-12-21 22:09:34 +00002676 // Only default to -mincremental-linker-compatible if we think we are
2677 // targeting the MSVC linker.
2678 bool DefaultIncrementalLinkerCompatible =
2679 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2680 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2681 options::OPT_mno_incremental_linker_compatible,
2682 DefaultIncrementalLinkerCompatible))
2683 CmdArgs.push_back("-mincremental-linker-compatible");
2684
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002685 // When passing -I arguments to the assembler we sometimes need to
2686 // unconditionally take the next argument. For example, when parsing
2687 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2688 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2689 // arg after parsing the '-I' arg.
2690 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002691
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002692 // When using an integrated assembler, translate -Wa, and -Xassembler
2693 // options.
2694 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002695 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002696 for (const Arg *A :
2697 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2698 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002699
Benjamin Kramer72e64312015-09-24 14:48:49 +00002700 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002701 if (TakeNextArg) {
2702 CmdArgs.push_back(Value.data());
2703 TakeNextArg = false;
2704 continue;
2705 }
David Blaikie9260ed62013-07-25 21:19:01 +00002706
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002707 switch (C.getDefaultToolChain().getArch()) {
2708 default:
2709 break;
2710 case llvm::Triple::mips:
2711 case llvm::Triple::mipsel:
2712 case llvm::Triple::mips64:
2713 case llvm::Triple::mips64el:
2714 if (Value == "--trap") {
2715 CmdArgs.push_back("-target-feature");
2716 CmdArgs.push_back("+use-tcc-in-div");
2717 continue;
2718 }
2719 if (Value == "--break") {
2720 CmdArgs.push_back("-target-feature");
2721 CmdArgs.push_back("-use-tcc-in-div");
2722 continue;
2723 }
2724 if (Value.startswith("-msoft-float")) {
2725 CmdArgs.push_back("-target-feature");
2726 CmdArgs.push_back("+soft-float");
2727 continue;
2728 }
2729 if (Value.startswith("-mhard-float")) {
2730 CmdArgs.push_back("-target-feature");
2731 CmdArgs.push_back("-soft-float");
2732 continue;
2733 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002734
2735 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2736 .Case("-mips1", "+mips1")
2737 .Case("-mips2", "+mips2")
2738 .Case("-mips3", "+mips3")
2739 .Case("-mips4", "+mips4")
2740 .Case("-mips5", "+mips5")
2741 .Case("-mips32", "+mips32")
2742 .Case("-mips32r2", "+mips32r2")
2743 .Case("-mips32r3", "+mips32r3")
2744 .Case("-mips32r5", "+mips32r5")
2745 .Case("-mips32r6", "+mips32r6")
2746 .Case("-mips64", "+mips64")
2747 .Case("-mips64r2", "+mips64r2")
2748 .Case("-mips64r3", "+mips64r3")
2749 .Case("-mips64r5", "+mips64r5")
2750 .Case("-mips64r6", "+mips64r6")
2751 .Default(nullptr);
2752 if (MipsTargetFeature)
2753 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002754 }
2755
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002756 if (Value == "-force_cpusubtype_ALL") {
2757 // Do nothing, this is the default and we don't support anything else.
2758 } else if (Value == "-L") {
2759 CmdArgs.push_back("-msave-temp-labels");
2760 } else if (Value == "--fatal-warnings") {
2761 CmdArgs.push_back("-massembler-fatal-warnings");
2762 } else if (Value == "--noexecstack") {
2763 CmdArgs.push_back("-mnoexecstack");
2764 } else if (Value == "-compress-debug-sections" ||
2765 Value == "--compress-debug-sections") {
2766 CompressDebugSections = true;
2767 } else if (Value == "-nocompress-debug-sections" ||
2768 Value == "--nocompress-debug-sections") {
2769 CompressDebugSections = false;
2770 } else if (Value.startswith("-I")) {
2771 CmdArgs.push_back(Value.data());
2772 // We need to consume the next argument if the current arg is a plain
2773 // -I. The next arg will be the include directory.
2774 if (Value == "-I")
2775 TakeNextArg = true;
2776 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002777 // "-gdwarf-N" options are not cc1as options.
2778 unsigned DwarfVersion = DwarfVersionNum(Value);
2779 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2780 CmdArgs.push_back(Value.data());
2781 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002782 RenderDebugEnablingArgs(Args, CmdArgs,
2783 codegenoptions::LimitedDebugInfo,
2784 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002785 }
Renato Golin7c542b42015-07-27 23:44:45 +00002786 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2787 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2788 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002789 } else {
2790 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002791 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002792 }
2793 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002794 }
2795 if (CompressDebugSections) {
2796 if (llvm::zlib::isAvailable())
2797 CmdArgs.push_back("-compress-debug-sections");
2798 else
2799 D.Diag(diag::warn_debug_compression_unavailable);
2800 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002801 if (MipsTargetFeature != nullptr) {
2802 CmdArgs.push_back("-target-feature");
2803 CmdArgs.push_back(MipsTargetFeature);
2804 }
David Blaikie9260ed62013-07-25 21:19:01 +00002805}
2806
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002807// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002808// FIXME: Make sure we can also emit shared objects if they're requested
2809// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002810static void addClangRT(const ToolChain &TC, const ArgList &Args,
2811 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002812 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002813}
2814
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002815namespace {
2816enum OpenMPRuntimeKind {
2817 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2818 /// without knowing what runtime to target.
2819 OMPRT_Unknown,
2820
2821 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2822 /// the default for Clang.
2823 OMPRT_OMP,
2824
2825 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2826 /// this runtime but can swallow the pragmas, and find and link against the
2827 /// runtime library itself.
2828 OMPRT_GOMP,
2829
Chandler Carruthc6625c62015-05-28 21:10:31 +00002830 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002831 /// OpenMP runtime. We support this mode for users with existing dependencies
2832 /// on this runtime library name.
2833 OMPRT_IOMP5
2834};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002835}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002836
2837/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002838static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2839 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002840 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2841
2842 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2843 if (A)
2844 RuntimeName = A->getValue();
2845
2846 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002847 .Case("libomp", OMPRT_OMP)
2848 .Case("libgomp", OMPRT_GOMP)
2849 .Case("libiomp5", OMPRT_IOMP5)
2850 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002851
2852 if (RT == OMPRT_Unknown) {
2853 if (A)
2854 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002855 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002856 else
2857 // FIXME: We could use a nicer diagnostic here.
2858 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2859 }
2860
2861 return RT;
2862}
2863
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002864static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2865 const ArgList &Args) {
2866 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2867 options::OPT_fno_openmp, false))
2868 return;
2869
2870 switch (getOpenMPRuntime(TC, Args)) {
2871 case OMPRT_OMP:
2872 CmdArgs.push_back("-lomp");
2873 break;
2874 case OMPRT_GOMP:
2875 CmdArgs.push_back("-lgomp");
2876 break;
2877 case OMPRT_IOMP5:
2878 CmdArgs.push_back("-liomp5");
2879 break;
2880 case OMPRT_Unknown:
2881 // Already diagnosed.
2882 break;
2883 }
2884}
2885
Alexey Samsonov52550342014-09-15 19:58:40 +00002886static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2887 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002888 bool IsShared, bool IsWhole) {
2889 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002890 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002891 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002892 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002893 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002894}
2895
Alexey Samsonov52550342014-09-15 19:58:40 +00002896// Tries to use a file with the list of dynamic symbols that need to be exported
2897// from the runtime library. Returns true if the file was found.
2898static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2899 ArgStringList &CmdArgs,
2900 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002901 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002902 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2903 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002904 return true;
2905 }
2906 return false;
2907}
2908
2909static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2910 ArgStringList &CmdArgs) {
2911 // Force linking against the system libraries sanitizers depends on
2912 // (see PR15823 why this is necessary).
2913 CmdArgs.push_back("--no-as-needed");
2914 CmdArgs.push_back("-lpthread");
2915 CmdArgs.push_back("-lrt");
2916 CmdArgs.push_back("-lm");
2917 // There's no libdl on FreeBSD.
2918 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2919 CmdArgs.push_back("-ldl");
2920}
2921
2922static void
2923collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2924 SmallVectorImpl<StringRef> &SharedRuntimes,
2925 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002926 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2927 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2928 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002929 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2930 // Collect shared runtimes.
2931 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2932 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002933 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002934 // The stats_client library is also statically linked into DSOs.
2935 if (SanArgs.needsStatsRt())
2936 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002937
Alexey Samsonov52550342014-09-15 19:58:40 +00002938 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002939 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002940 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002941 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002942 }
2943 if (SanArgs.needsAsanRt()) {
2944 if (SanArgs.needsSharedAsanRt()) {
2945 HelperStaticRuntimes.push_back("asan-preinit");
2946 } else {
2947 StaticRuntimes.push_back("asan");
2948 if (SanArgs.linkCXXRuntimes())
2949 StaticRuntimes.push_back("asan_cxx");
2950 }
2951 }
2952 if (SanArgs.needsDfsanRt())
2953 StaticRuntimes.push_back("dfsan");
2954 if (SanArgs.needsLsanRt())
2955 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002956 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002957 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002958 if (SanArgs.linkCXXRuntimes())
2959 StaticRuntimes.push_back("msan_cxx");
2960 }
2961 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002962 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002963 if (SanArgs.linkCXXRuntimes())
2964 StaticRuntimes.push_back("tsan_cxx");
2965 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002966 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002967 StaticRuntimes.push_back("ubsan_standalone");
2968 if (SanArgs.linkCXXRuntimes())
2969 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002970 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002971 if (SanArgs.needsSafeStackRt())
2972 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002973 if (SanArgs.needsCfiRt())
2974 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002975 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002976 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002977 if (SanArgs.linkCXXRuntimes())
2978 StaticRuntimes.push_back("ubsan_standalone_cxx");
2979 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002980 if (SanArgs.needsStatsRt()) {
2981 NonWholeStaticRuntimes.push_back("stats");
2982 RequiredSymbols.push_back("__sanitizer_stats_register");
2983 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002984}
2985
Alexey Samsonov52550342014-09-15 19:58:40 +00002986// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2987// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2988static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002989 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002990 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002991 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002992 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002993 NonWholeStaticRuntimes, HelperStaticRuntimes,
2994 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002995 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002996 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002997 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002998 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002999 bool AddExportDynamic = false;
3000 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003001 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003002 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3003 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003004 for (auto RT : NonWholeStaticRuntimes) {
3005 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3006 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3007 }
3008 for (auto S : RequiredSymbols) {
3009 CmdArgs.push_back("-u");
3010 CmdArgs.push_back(Args.MakeArgString(S));
3011 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003012 // If there is a static runtime with no dynamic list, force all the symbols
3013 // to be dynamic to be sure we export sanitizer interface functions.
3014 if (AddExportDynamic)
3015 CmdArgs.push_back("-export-dynamic");
3016 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003017}
3018
Reid Kleckner86ea7702015-02-04 23:45:07 +00003019static bool areOptimizationsEnabled(const ArgList &Args) {
3020 // Find the last -O arg and see if it is non-zero.
3021 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3022 return !A->getOption().matches(options::OPT_O0);
3023 // Defaults to -O0.
3024 return false;
3025}
3026
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003027static bool shouldUseFramePointerForTarget(const ArgList &Args,
3028 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003029 switch (Triple.getArch()) {
3030 case llvm::Triple::xcore:
3031 case llvm::Triple::wasm32:
3032 case llvm::Triple::wasm64:
3033 // XCore never wants frame pointers, regardless of OS.
3034 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003035 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003036 default:
3037 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003038 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003039
3040 if (Triple.isOSLinux()) {
3041 switch (Triple.getArch()) {
3042 // Don't use a frame pointer on linux if optimizing for certain targets.
3043 case llvm::Triple::mips64:
3044 case llvm::Triple::mips64el:
3045 case llvm::Triple::mips:
3046 case llvm::Triple::mipsel:
3047 case llvm::Triple::systemz:
3048 case llvm::Triple::x86:
3049 case llvm::Triple::x86_64:
3050 return !areOptimizationsEnabled(Args);
3051 default:
3052 return true;
3053 }
3054 }
3055
3056 if (Triple.isOSWindows()) {
3057 switch (Triple.getArch()) {
3058 case llvm::Triple::x86:
3059 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003060 case llvm::Triple::x86_64:
3061 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003062 case llvm::Triple::arm:
3063 case llvm::Triple::thumb:
3064 // Windows on ARM builds with FPO disabled to aid fast stack walking
3065 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003066 default:
3067 // All other supported Windows ISAs use xdata unwind information, so frame
3068 // pointers are not generally useful.
3069 return false;
3070 }
3071 }
3072
3073 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003074}
3075
Rafael Espindola224dd632011-12-14 21:02:23 +00003076static bool shouldUseFramePointer(const ArgList &Args,
3077 const llvm::Triple &Triple) {
3078 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3079 options::OPT_fomit_frame_pointer))
3080 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003081 if (Args.hasArg(options::OPT_pg))
3082 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003083
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003084 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003085}
3086
Eric Christopherb7d97e92013-04-03 01:58:53 +00003087static bool shouldUseLeafFramePointer(const ArgList &Args,
3088 const llvm::Triple &Triple) {
3089 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3090 options::OPT_momit_leaf_frame_pointer))
3091 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003092 if (Args.hasArg(options::OPT_pg))
3093 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003094
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003095 if (Triple.isPS4CPU())
3096 return false;
3097
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003098 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003099}
3100
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003101/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003102static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003103 SmallString<128> cwd;
3104 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003105 CmdArgs.push_back("-fdebug-compilation-dir");
3106 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003107 }
3108}
3109
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003110static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003111 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3112 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3113 SmallString<128> T(FinalOutput->getValue());
3114 llvm::sys::path::replace_extension(T, "dwo");
3115 return Args.MakeArgString(T);
3116 } else {
3117 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003118 SmallString<128> T(
3119 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003120 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003121 llvm::sys::path::replace_extension(F, "dwo");
3122 T += F;
3123 return Args.MakeArgString(F);
3124 }
3125}
3126
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003127static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3128 const JobAction &JA, const ArgList &Args,
3129 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003130 ArgStringList ExtractArgs;
3131 ExtractArgs.push_back("--extract-dwo");
3132
3133 ArgStringList StripArgs;
3134 StripArgs.push_back("--strip-dwo");
3135
3136 // Grabbing the output of the earlier compile step.
3137 StripArgs.push_back(Output.getFilename());
3138 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003139 ExtractArgs.push_back(OutFile);
3140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003141 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003142 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003143
3144 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003145 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003146
3147 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003148 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003149}
3150
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003151/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003152/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3153static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003154 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003155 if (A->getOption().matches(options::OPT_O4) ||
3156 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003157 return true;
3158
3159 if (A->getOption().matches(options::OPT_O0))
3160 return false;
3161
3162 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3163
Rafael Espindola91780de2013-08-26 14:05:41 +00003164 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003165 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003166 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003167 return true;
3168
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003169 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003170 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003171 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003172
3173 unsigned OptLevel = 0;
3174 if (S.getAsInteger(10, OptLevel))
3175 return false;
3176
3177 return OptLevel > 1;
3178 }
3179
3180 return false;
3181}
3182
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003183/// Add -x lang to \p CmdArgs for \p Input.
3184static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3185 ArgStringList &CmdArgs) {
3186 // When using -verify-pch, we don't want to provide the type
3187 // 'precompiled-header' if it was inferred from the file extension
3188 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3189 return;
3190
3191 CmdArgs.push_back("-x");
3192 if (Args.hasArg(options::OPT_rewrite_objc))
3193 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3194 else
3195 CmdArgs.push_back(types::getTypeName(Input.getType()));
3196}
3197
David Majnemerc371ff02015-03-22 08:39:22 +00003198static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003199 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003200 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003201
3202 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003203 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003204
3205 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003206 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003207 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003208 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003209}
3210
Rafael Espindola577637a2015-01-03 00:06:04 +00003211// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003212// options that build systems might add but are unused when assembling or only
3213// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003214static void claimNoWarnArgs(const ArgList &Args) {
3215 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003216 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003217 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003218 Args.ClaimAllArgs(options::OPT_flto);
3219 Args.ClaimAllArgs(options::OPT_fno_lto);
3220}
3221
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003222static void appendUserToPath(SmallVectorImpl<char> &Result) {
3223#ifdef LLVM_ON_UNIX
3224 const char *Username = getenv("LOGNAME");
3225#else
3226 const char *Username = getenv("USERNAME");
3227#endif
3228 if (Username) {
3229 // Validate that LoginName can be used in a path, and get its length.
3230 size_t Len = 0;
3231 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003232 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003233 Username = nullptr;
3234 break;
3235 }
3236 }
3237
3238 if (Username && Len > 0) {
3239 Result.append(Username, Username + Len);
3240 return;
3241 }
3242 }
3243
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003244// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003245#ifdef LLVM_ON_UNIX
3246 std::string UID = llvm::utostr(getuid());
3247#else
3248 // FIXME: Windows seems to have an 'SID' that might work.
3249 std::string UID = "9999";
3250#endif
3251 Result.append(UID.begin(), UID.end());
3252}
3253
David Majnemere11d3732015-06-08 00:22:46 +00003254VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3255 const llvm::Triple &Triple,
3256 const llvm::opt::ArgList &Args,
3257 bool IsWindowsMSVC) {
3258 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3259 IsWindowsMSVC) ||
3260 Args.hasArg(options::OPT_fmsc_version) ||
3261 Args.hasArg(options::OPT_fms_compatibility_version)) {
3262 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3263 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003264 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003265
3266 if (MSCVersion && MSCompatibilityVersion) {
3267 if (D)
3268 D->Diag(diag::err_drv_argument_not_allowed_with)
3269 << MSCVersion->getAsString(Args)
3270 << MSCompatibilityVersion->getAsString(Args);
3271 return VersionTuple();
3272 }
3273
3274 if (MSCompatibilityVersion) {
3275 VersionTuple MSVT;
3276 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3277 D->Diag(diag::err_drv_invalid_value)
3278 << MSCompatibilityVersion->getAsString(Args)
3279 << MSCompatibilityVersion->getValue();
3280 return MSVT;
3281 }
3282
3283 if (MSCVersion) {
3284 unsigned Version = 0;
3285 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3286 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3287 << MSCVersion->getValue();
3288 return getMSCompatibilityVersion(Version);
3289 }
3290
3291 unsigned Major, Minor, Micro;
3292 Triple.getEnvironmentVersion(Major, Minor, Micro);
3293 if (Major || Minor || Micro)
3294 return VersionTuple(Major, Minor, Micro);
3295
Nico Weber9a952752016-03-23 23:26:59 +00003296 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
David Majnemere11d3732015-06-08 00:22:46 +00003297 return VersionTuple(18);
3298 }
3299 return VersionTuple();
3300}
3301
Diego Novilloa0545962015-07-10 18:00:07 +00003302static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3303 const InputInfo &Output, const ArgList &Args,
3304 ArgStringList &CmdArgs) {
3305 auto *ProfileGenerateArg = Args.getLastArg(
3306 options::OPT_fprofile_instr_generate,
3307 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003308 options::OPT_fprofile_generate_EQ,
3309 options::OPT_fno_profile_instr_generate);
3310 if (ProfileGenerateArg &&
3311 ProfileGenerateArg->getOption().matches(
3312 options::OPT_fno_profile_instr_generate))
3313 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003314
3315 auto *ProfileUseArg = Args.getLastArg(
3316 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003317 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3318 options::OPT_fno_profile_instr_use);
3319 if (ProfileUseArg &&
3320 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3321 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003322
3323 if (ProfileGenerateArg && ProfileUseArg)
3324 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003325 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003326
Diego Novillo758f3f52015-08-05 21:49:51 +00003327 if (ProfileGenerateArg) {
3328 if (ProfileGenerateArg->getOption().matches(
3329 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003330 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3331 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003332 else if (ProfileGenerateArg->getOption().matches(
3333 options::OPT_fprofile_generate_EQ)) {
3334 SmallString<128> Path(ProfileGenerateArg->getValue());
3335 llvm::sys::path::append(Path, "default.profraw");
3336 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003337 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3338 }
3339 // The default is to use Clang Instrumentation.
3340 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003341 }
Diego Novilloa0545962015-07-10 18:00:07 +00003342
Diego Novillo758f3f52015-08-05 21:49:51 +00003343 if (ProfileUseArg) {
3344 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003345 CmdArgs.push_back(Args.MakeArgString(
3346 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003347 else if ((ProfileUseArg->getOption().matches(
3348 options::OPT_fprofile_use_EQ) ||
3349 ProfileUseArg->getOption().matches(
3350 options::OPT_fprofile_instr_use))) {
3351 SmallString<128> Path(
3352 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3353 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3354 llvm::sys::path::append(Path, "default.profdata");
3355 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003356 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003357 }
Diego Novilloa0545962015-07-10 18:00:07 +00003358 }
3359
3360 if (Args.hasArg(options::OPT_ftest_coverage) ||
3361 Args.hasArg(options::OPT_coverage))
3362 CmdArgs.push_back("-femit-coverage-notes");
3363 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3364 false) ||
3365 Args.hasArg(options::OPT_coverage))
3366 CmdArgs.push_back("-femit-coverage-data");
3367
Diego Novilloc4b94da2015-08-05 23:27:40 +00003368 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3369 options::OPT_fno_coverage_mapping, false) &&
3370 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003371 D.Diag(diag::err_drv_argument_only_allowed_with)
3372 << "-fcoverage-mapping"
3373 << "-fprofile-instr-generate";
3374
Diego Novilloc4b94da2015-08-05 23:27:40 +00003375 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3376 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003377 CmdArgs.push_back("-fcoverage-mapping");
3378
3379 if (C.getArgs().hasArg(options::OPT_c) ||
3380 C.getArgs().hasArg(options::OPT_S)) {
3381 if (Output.isFilename()) {
3382 CmdArgs.push_back("-coverage-file");
3383 SmallString<128> CoverageFilename;
3384 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3385 CoverageFilename = FinalOutput->getValue();
3386 } else {
3387 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3388 }
3389 if (llvm::sys::path::is_relative(CoverageFilename)) {
3390 SmallString<128> Pwd;
3391 if (!llvm::sys::fs::current_path(Pwd)) {
3392 llvm::sys::path::append(Pwd, CoverageFilename);
3393 CoverageFilename.swap(Pwd);
3394 }
3395 }
3396 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3397 }
3398 }
3399}
3400
Paul Robinsond083b9a2015-12-16 17:25:27 +00003401static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3402 ArgStringList &CmdArgs) {
3403 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3404 false) ||
3405 Args.hasFlag(options::OPT_fprofile_generate,
3406 options::OPT_fno_profile_instr_generate, false) ||
3407 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3408 options::OPT_fno_profile_instr_generate, false) ||
3409 Args.hasFlag(options::OPT_fprofile_instr_generate,
3410 options::OPT_fno_profile_instr_generate, false) ||
3411 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3412 options::OPT_fno_profile_instr_generate, false) ||
3413 Args.hasArg(options::OPT_fcreate_profile) ||
3414 Args.hasArg(options::OPT_coverage)))
3415 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3416}
3417
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003418/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3419/// smooshes them together with platform defaults, to decide whether
3420/// this compile should be using PIC mode or not. Returns a tuple of
3421/// (RelocationModel, PICLevel, IsPIE).
3422static std::tuple<llvm::Reloc::Model, unsigned, bool>
3423ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3424 const ArgList &Args) {
3425 // FIXME: why does this code...and so much everywhere else, use both
3426 // ToolChain.getTriple() and Triple?
3427 bool PIE = ToolChain.isPIEDefault();
3428 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003429 // The Darwin/MachO default to use PIC does not apply when using -static.
3430 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3431 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003432 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003433 bool IsPICLevelTwo = PIC;
3434
3435 bool KernelOrKext =
3436 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3437
3438 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003439 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003440 switch (ToolChain.getArch()) {
3441 case llvm::Triple::arm:
3442 case llvm::Triple::armeb:
3443 case llvm::Triple::thumb:
3444 case llvm::Triple::thumbeb:
3445 case llvm::Triple::aarch64:
3446 case llvm::Triple::mips:
3447 case llvm::Triple::mipsel:
3448 case llvm::Triple::mips64:
3449 case llvm::Triple::mips64el:
3450 PIC = true; // "-fpic"
3451 break;
3452
3453 case llvm::Triple::x86:
3454 case llvm::Triple::x86_64:
3455 PIC = true; // "-fPIC"
3456 IsPICLevelTwo = true;
3457 break;
3458
3459 default:
3460 break;
3461 }
3462 }
3463
3464 // OpenBSD-specific defaults for PIE
3465 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3466 switch (ToolChain.getArch()) {
3467 case llvm::Triple::mips64:
3468 case llvm::Triple::mips64el:
3469 case llvm::Triple::sparcel:
3470 case llvm::Triple::x86:
3471 case llvm::Triple::x86_64:
3472 IsPICLevelTwo = false; // "-fpie"
3473 break;
3474
3475 case llvm::Triple::ppc:
3476 case llvm::Triple::sparc:
3477 case llvm::Triple::sparcv9:
3478 IsPICLevelTwo = true; // "-fPIE"
3479 break;
3480
3481 default:
3482 break;
3483 }
3484 }
3485
3486 // The last argument relating to either PIC or PIE wins, and no
3487 // other argument is used. If the last argument is any flavor of the
3488 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3489 // option implicitly enables PIC at the same level.
3490 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3491 options::OPT_fpic, options::OPT_fno_pic,
3492 options::OPT_fPIE, options::OPT_fno_PIE,
3493 options::OPT_fpie, options::OPT_fno_pie);
3494 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3495 // is forced, then neither PIC nor PIE flags will have no effect.
3496 if (!ToolChain.isPICDefaultForced()) {
3497 if (LastPICArg) {
3498 Option O = LastPICArg->getOption();
3499 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3500 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3501 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3502 PIC =
3503 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3504 IsPICLevelTwo =
3505 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3506 } else {
3507 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003508 if (Triple.isPS4CPU()) {
3509 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3510 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3511 if (Model != "kernel") {
3512 PIC = true;
3513 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3514 << LastPICArg->getSpelling();
3515 }
3516 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003517 }
3518 }
3519 }
3520
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003521 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3522 // PIC level would've been set to level 1, force it back to level 2 PIC
3523 // instead.
3524 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003525 IsPICLevelTwo |= ToolChain.isPICDefault();
3526
James Y Knightc4015d32015-08-21 04:14:55 +00003527 // This kernel flags are a trump-card: they will disable PIC/PIE
3528 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003529 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3530 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003531 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003532
3533 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3534 // This is a very special mode. It trumps the other modes, almost no one
3535 // uses it, and it isn't even valid on any OS but Darwin.
3536 if (!ToolChain.getTriple().isOSDarwin())
3537 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3538 << A->getSpelling() << ToolChain.getTriple().str();
3539
3540 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3541
3542 // Only a forced PIC mode can cause the actual compile to have PIC defines
3543 // etc., no flags are sufficient. This behavior was selected to closely
3544 // match that of llvm-gcc and Apple GCC before that.
3545 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3546
3547 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3548 }
3549
3550 if (PIC)
3551 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3552
3553 return std::make_tuple(llvm::Reloc::Static, 0, false);
3554}
3555
3556static const char *RelocationModelName(llvm::Reloc::Model Model) {
3557 switch (Model) {
3558 case llvm::Reloc::Default:
3559 return nullptr;
3560 case llvm::Reloc::Static:
3561 return "static";
3562 case llvm::Reloc::PIC_:
3563 return "pic";
3564 case llvm::Reloc::DynamicNoPIC:
3565 return "dynamic-no-pic";
3566 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003567 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003568}
3569
3570static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3571 ArgStringList &CmdArgs) {
3572 llvm::Reloc::Model RelocationModel;
3573 unsigned PICLevel;
3574 bool IsPIE;
3575 std::tie(RelocationModel, PICLevel, IsPIE) =
3576 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3577
3578 if (RelocationModel != llvm::Reloc::Static)
3579 CmdArgs.push_back("-KPIC");
3580}
3581
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003582void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003583 const InputInfo &Output, const InputInfoList &Inputs,
3584 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003585 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3586 const llvm::Triple Triple(TripleStr);
3587
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003588 bool KernelOrKext =
3589 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003590 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003591 ArgStringList CmdArgs;
3592
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003593 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003594 bool IsWindowsCygnus =
3595 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003596 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003597 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003598
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003599 // Check number of inputs for sanity. We need at least one input.
3600 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003601 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003602 // CUDA compilation may have multiple inputs (source file + results of
3603 // device-side compilations). All other jobs are expected to have exactly one
3604 // input.
3605 bool IsCuda = types::isCuda(Input.getType());
3606 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003607
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003608 // Invoke ourselves in -cc1 mode.
3609 //
3610 // FIXME: Implement custom jobs for internal actions.
3611 CmdArgs.push_back("-cc1");
3612
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003613 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003614 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003615 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003616
Artem Belevichfa11ab52015-11-17 22:28:46 +00003617 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003618 if (IsCuda) {
3619 // FIXME: We need a (better) way to pass information about
3620 // particular compilation pass we're constructing here. For now we
3621 // can check which toolchain we're using and pick the other one to
3622 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003623 if (&getToolChain() == C.getCudaDeviceToolChain())
3624 AuxToolChain = C.getCudaHostToolChain();
3625 else if (&getToolChain() == C.getCudaHostToolChain())
3626 AuxToolChain = C.getCudaDeviceToolChain();
3627 else
3628 llvm_unreachable("Can't figure out CUDA compilation mode.");
3629 assert(AuxToolChain != nullptr && "No aux toolchain.");
3630 CmdArgs.push_back("-aux-triple");
3631 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3632 }
3633
James Y Knight2db38f32015-08-15 03:45:25 +00003634 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3635 Triple.getArch() == llvm::Triple::thumb)) {
3636 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003637 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003638 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003639 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003640 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003641 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003642 }
3643
Tim Northover336f1892014-03-29 13:16:12 +00003644 // Push all default warning arguments that are specific to
3645 // the given target. These come before user provided warning options
3646 // are provided.
3647 getToolChain().addClangWarningOptions(CmdArgs);
3648
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003649 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003650 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003651
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003652 if (isa<AnalyzeJobAction>(JA)) {
3653 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3654 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003655 } else if (isa<MigrateJobAction>(JA)) {
3656 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003657 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003658 if (Output.getType() == types::TY_Dependencies)
3659 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003660 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003661 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003662 if (Args.hasArg(options::OPT_rewrite_objc) &&
3663 !Args.hasArg(options::OPT_g_Group))
3664 CmdArgs.push_back("-P");
3665 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003666 } else if (isa<AssembleJobAction>(JA)) {
3667 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003668
David Blaikie9260ed62013-07-25 21:19:01 +00003669 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003670
3671 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003672 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003673 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003674 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003675 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003676
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003677 if (JA.getType() == types::TY_Nothing)
3678 CmdArgs.push_back("-fsyntax-only");
3679 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003680 CmdArgs.push_back("-emit-pch");
3681 else
3682 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003683 } else if (isa<VerifyPCHJobAction>(JA)) {
3684 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003685 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003686 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3687 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003688 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003689 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003690 } else if (JA.getType() == types::TY_LLVM_IR ||
3691 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003692 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003693 } else if (JA.getType() == types::TY_LLVM_BC ||
3694 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003695 CmdArgs.push_back("-emit-llvm-bc");
3696 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003697 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003698 } else if (JA.getType() == types::TY_AST) {
3699 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003700 } else if (JA.getType() == types::TY_ModuleFile) {
3701 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003702 } else if (JA.getType() == types::TY_RewrittenObjC) {
3703 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003704 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003705 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3706 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003707 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003708 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003709 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003710 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003711
3712 // Preserve use-list order by default when emitting bitcode, so that
3713 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3714 // same result as running passes here. For LTO, we don't need to preserve
3715 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003716 if (JA.getType() == types::TY_LLVM_BC)
3717 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003718
3719 if (D.isUsingLTO())
3720 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003721 }
3722
Teresa Johnsonaff22322015-12-07 19:21:34 +00003723 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3724 if (!types::isLLVMIR(Input.getType()))
3725 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3726 << "-x ir";
3727 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3728 }
3729
Steven Wu574b0f22016-03-01 01:07:58 +00003730 // Embed-bitcode option.
3731 if (C.getDriver().embedBitcodeEnabled() &&
3732 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3733 // Add flags implied by -fembed-bitcode.
3734 CmdArgs.push_back("-fembed-bitcode");
3735 // Disable all llvm IR level optimizations.
3736 CmdArgs.push_back("-disable-llvm-optzns");
3737 }
3738 if (C.getDriver().embedBitcodeMarkerOnly())
3739 CmdArgs.push_back("-fembed-bitcode-marker");
3740
Justin Bognera88f0122014-06-20 22:59:50 +00003741 // We normally speed up the clang process a bit by skipping destructors at
3742 // exit, but when we're generating diagnostics we can rely on some of the
3743 // cleanup.
3744 if (!C.isForDiagnostics())
3745 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003746
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003747// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003748#ifdef NDEBUG
3749 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003750 // Discard LLVM value names in -asserts builds.
3751 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003752#endif
3753
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003754 // Set the main file name, so that debug info works even with
3755 // -save-temps.
3756 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003757 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003758
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003759 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003760 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003761 if (Args.hasArg(options::OPT_static))
3762 CmdArgs.push_back("-static-define");
3763
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003764 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003765 // Enable region store model by default.
3766 CmdArgs.push_back("-analyzer-store=region");
3767
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003768 // Treat blocks as analysis entry points.
3769 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3770
Ted Kremenek49c79792011-03-24 00:28:47 +00003771 CmdArgs.push_back("-analyzer-eagerly-assume");
3772
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003773 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003774 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003775 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003776
Devin Coughlin65c77082016-01-21 20:09:49 +00003777 if (!IsWindowsMSVC) {
3778 CmdArgs.push_back("-analyzer-checker=unix");
3779 } else {
3780 // Enable "unix" checkers that also work on Windows.
3781 CmdArgs.push_back("-analyzer-checker=unix.API");
3782 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3783 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3784 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3785 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3786 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3787 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003788
Sean Evesonb38c32b2016-01-06 10:03:58 +00003789 // Disable some unix checkers for PS4.
3790 if (IsPS4CPU) {
3791 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3792 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3793 }
3794
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003795 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003796 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003797
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003798 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003799
Artem Belevichba558952015-05-06 18:20:23 +00003800 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003801 CmdArgs.push_back("-analyzer-checker=cplusplus");
3802
Sean Evesonb38c32b2016-01-06 10:03:58 +00003803 if (!IsPS4CPU) {
3804 CmdArgs.push_back(
3805 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3806 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3807 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3808 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3809 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3810 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3811 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003812
3813 // Default nullability checks.
3814 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3815 CmdArgs.push_back(
3816 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003817 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003818
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003819 // Set the output format. The default is plist, for (lame) historical
3820 // reasons.
3821 CmdArgs.push_back("-analyzer-output");
3822 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003823 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003824 else
3825 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003826
Ted Kremenekfe449a22010-03-22 22:32:05 +00003827 // Disable the presentation of standard compiler warnings when
3828 // using --analyze. We only want to show static analyzer diagnostics
3829 // or frontend errors.
3830 CmdArgs.push_back("-w");
3831
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003832 // Add -Xanalyzer arguments when running as analyzer.
3833 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003834 }
3835
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003836 CheckCodeGenerationOptions(D, Args);
3837
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003838 llvm::Reloc::Model RelocationModel;
3839 unsigned PICLevel;
3840 bool IsPIE;
3841 std::tie(RelocationModel, PICLevel, IsPIE) =
3842 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003843
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003844 const char *RMName = RelocationModelName(RelocationModel);
3845 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003846 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003847 CmdArgs.push_back(RMName);
3848 }
3849 if (PICLevel > 0) {
3850 CmdArgs.push_back("-pic-level");
3851 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3852 if (IsPIE) {
3853 CmdArgs.push_back("-pie-level");
3854 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003855 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003856 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003857
Renato Golin4854d802015-11-09 12:40:41 +00003858 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3859 CmdArgs.push_back("-meabi");
3860 CmdArgs.push_back(A->getValue());
3861 }
3862
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003863 CmdArgs.push_back("-mthread-model");
3864 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3865 CmdArgs.push_back(A->getValue());
3866 else
3867 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3868
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003869 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3870
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003871 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3872 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003873 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003874
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003875 // LLVM Code Generator Options.
3876
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003877 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3878 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003879 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3880 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003881 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003882 CmdArgs.push_back(A->getValue());
3883 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003884 }
3885 }
3886
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003887 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3888 StringRef v = A->getValue();
3889 CmdArgs.push_back("-mllvm");
3890 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3891 A->claim();
3892 }
3893
Nirav Daved2f44d82016-04-05 17:50:43 +00003894 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
3895 true))
3896 CmdArgs.push_back("-fno-jump-tables");
3897
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003898 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3899 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003900 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003901 }
3902
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003903 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3904 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003905 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003906 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003907 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003908 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3909 CmdArgs.push_back("-fpcc-struct-return");
3910 } else {
3911 assert(A->getOption().matches(options::OPT_freg_struct_return));
3912 CmdArgs.push_back("-freg-struct-return");
3913 }
3914 }
3915
Roman Divacky65b88cd2011-03-01 17:40:53 +00003916 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3917 CmdArgs.push_back("-mrtd");
3918
Rafael Espindola224dd632011-12-14 21:02:23 +00003919 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003920 CmdArgs.push_back("-mdisable-fp-elim");
3921 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3922 options::OPT_fno_zero_initialized_in_bss))
3923 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003924
3925 bool OFastEnabled = isOptimizationLevelFast(Args);
3926 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3927 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003928 OptSpecifier StrictAliasingAliasOption =
3929 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003930 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3931 // doesn't do any TBAA.
3932 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003933 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003934 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003935 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003936 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3937 options::OPT_fno_struct_path_tbaa))
3938 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003939 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3940 false))
3941 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003942 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3943 options::OPT_fno_strict_vtable_pointers,
3944 false))
3945 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003946 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3947 options::OPT_fno_optimize_sibling_calls))
3948 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003949
Eric Christopher006208c2013-04-04 06:29:47 +00003950 // Handle segmented stacks.
3951 if (Args.hasArg(options::OPT_fsplit_stack))
3952 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003953
3954 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3955 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003956 OptSpecifier FastMathAliasOption =
3957 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3958
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003959 // Handle various floating point optimization flags, mapping them to the
3960 // appropriate LLVM code generation flags. The pattern for all of these is to
3961 // default off the codegen optimizations, and if any flag enables them and no
3962 // flag disables them after the flag enabling them, enable the codegen
3963 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003964 if (Arg *A = Args.getLastArg(
3965 options::OPT_ffast_math, FastMathAliasOption,
3966 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3967 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3968 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003969 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3970 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003971 A->getOption().getID() != options::OPT_fhonor_infinities)
3972 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003973 if (Arg *A = Args.getLastArg(
3974 options::OPT_ffast_math, FastMathAliasOption,
3975 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3976 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3977 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003978 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3979 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003980 A->getOption().getID() != options::OPT_fhonor_nans)
3981 CmdArgs.push_back("-menable-no-nans");
3982
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003983 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3984 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003985 if (Arg *A =
3986 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3987 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3988 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003989 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3990 // However, turning *off* -ffast_math merely restores the toolchain default
3991 // (which may be false).
3992 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3993 A->getOption().getID() == options::OPT_ffast_math ||
3994 A->getOption().getID() == options::OPT_Ofast)
3995 MathErrno = false;
3996 else if (A->getOption().getID() == options::OPT_fmath_errno)
3997 MathErrno = true;
3998 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003999 if (MathErrno)
4000 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004001
4002 // There are several flags which require disabling very specific
4003 // optimizations. Any of these being disabled forces us to turn off the
4004 // entire set of LLVM optimizations, so collect them through all the flag
4005 // madness.
4006 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004007 if (Arg *A = Args.getLastArg(
4008 options::OPT_ffast_math, FastMathAliasOption,
4009 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4010 options::OPT_fno_unsafe_math_optimizations,
4011 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004012 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4013 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004014 A->getOption().getID() != options::OPT_fno_associative_math)
4015 AssociativeMath = true;
4016 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004017 if (Arg *A = Args.getLastArg(
4018 options::OPT_ffast_math, FastMathAliasOption,
4019 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4020 options::OPT_fno_unsafe_math_optimizations,
4021 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004022 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4023 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004024 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4025 ReciprocalMath = true;
4026 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004027 if (Arg *A = Args.getLastArg(
4028 options::OPT_ffast_math, FastMathAliasOption,
4029 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4030 options::OPT_fno_unsafe_math_optimizations,
4031 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004032 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4033 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004034 A->getOption().getID() != options::OPT_fsigned_zeros)
4035 SignedZeros = false;
4036 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004037 if (Arg *A = Args.getLastArg(
4038 options::OPT_ffast_math, FastMathAliasOption,
4039 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4040 options::OPT_fno_unsafe_math_optimizations,
4041 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004042 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4043 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004044 A->getOption().getID() != options::OPT_ftrapping_math)
4045 TrappingMath = false;
4046 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4047 !TrappingMath)
4048 CmdArgs.push_back("-menable-unsafe-fp-math");
4049
Sanjay Patel76c9e092015-01-23 16:40:50 +00004050 if (!SignedZeros)
4051 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004052
Sanjay Patel359b1052015-04-09 15:03:23 +00004053 if (ReciprocalMath)
4054 CmdArgs.push_back("-freciprocal-math");
4055
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004056 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004057 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004058 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004059 options::OPT_ffp_contract)) {
4060 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004061 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004062 if (Val == "fast" || Val == "on" || Val == "off") {
4063 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4064 } else {
4065 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004066 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004067 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004068 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4069 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004070 // If fast-math is set then set the fp-contract mode to fast.
4071 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4072 }
4073 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004074
Sanjay Patel2987c292015-06-11 14:53:41 +00004075 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004076
Bob Wilson6a039162012-07-19 03:52:53 +00004077 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4078 // and if we find them, tell the frontend to provide the appropriate
4079 // preprocessor macros. This is distinct from enabling any optimizations as
4080 // these options induce language changes which must survive serialization
4081 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004082 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4083 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004084 if (!A->getOption().matches(options::OPT_fno_fast_math))
4085 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004086 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4087 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004088 if (A->getOption().matches(options::OPT_ffinite_math_only))
4089 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004090
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004091 // Decide whether to use verbose asm. Verbose assembly is the default on
4092 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004093 bool IsIntegratedAssemblerDefault =
4094 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004095 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004096 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004097 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004098 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004099
Rafael Espindolab8a12932015-05-22 20:44:03 +00004100 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4101 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004102 CmdArgs.push_back("-no-integrated-as");
4103
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004104 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4105 CmdArgs.push_back("-mdebug-pass");
4106 CmdArgs.push_back("Structure");
4107 }
4108 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4109 CmdArgs.push_back("-mdebug-pass");
4110 CmdArgs.push_back("Arguments");
4111 }
4112
Justin Lebar710a35f2016-01-25 22:36:35 +00004113 // Enable -mconstructor-aliases except on darwin, where we have to work around
4114 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4115 // aliases aren't supported.
4116 if (!getToolChain().getTriple().isOSDarwin() &&
4117 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004118 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004119
John McCall7ef5cb32011-03-18 02:56:14 +00004120 // Darwin's kernel doesn't support guard variables; just die if we
4121 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004122 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004123 CmdArgs.push_back("-fforbid-guard-variables");
4124
Akira Hatanaka02028482015-11-12 17:21:22 +00004125 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4126 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004127 CmdArgs.push_back("-mms-bitfields");
4128 }
John McCall8517abc2010-02-19 02:45:38 +00004129
Daniel Dunbar306945d2009-09-16 06:17:29 +00004130 // This is a coarse approximation of what llvm-gcc actually does, both
4131 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4132 // complicated ways.
4133 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004134 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4135 options::OPT_fno_asynchronous_unwind_tables,
4136 (getToolChain().IsUnwindTablesDefault() ||
4137 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4138 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004139 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4140 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004141 CmdArgs.push_back("-munwind-tables");
4142
Chandler Carruth05fb5852012-11-21 23:40:23 +00004143 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004144
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004145 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4146 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004147 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004148 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004149
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004150 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004151 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004152
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004153 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004154 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004155 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004156 }
4157
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004158 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004159 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004160 if (!CPU.empty()) {
4161 CmdArgs.push_back("-target-cpu");
4162 CmdArgs.push_back(Args.MakeArgString(CPU));
4163 }
4164
Rafael Espindolaeb265472013-08-21 21:59:03 +00004165 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4166 CmdArgs.push_back("-mfpmath");
4167 CmdArgs.push_back(A->getValue());
4168 }
4169
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004170 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004171 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004172
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004173 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004174 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004175 default:
4176 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004177
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004178 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004179 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004180 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004181 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004182 // Use the effective triple, which takes into account the deployment target.
4183 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004184 break;
4185
Tim Northover573cbee2014-05-24 12:52:07 +00004186 case llvm::Triple::aarch64:
4187 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004188 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004189 break;
4190
Eric Christopher0b26a612010-03-02 02:41:08 +00004191 case llvm::Triple::mips:
4192 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004193 case llvm::Triple::mips64:
4194 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004195 AddMIPSTargetArgs(Args, CmdArgs);
4196 break;
4197
Ulrich Weigand8afad612014-07-28 13:17:52 +00004198 case llvm::Triple::ppc:
4199 case llvm::Triple::ppc64:
4200 case llvm::Triple::ppc64le:
4201 AddPPCTargetArgs(Args, CmdArgs);
4202 break;
4203
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004204 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004205 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004206 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004207 AddSparcTargetArgs(Args, CmdArgs);
4208 break;
4209
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004210 case llvm::Triple::x86:
4211 case llvm::Triple::x86_64:
4212 AddX86TargetArgs(Args, CmdArgs);
4213 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004214
Jacques Pienaard964cc22016-03-28 21:02:54 +00004215 case llvm::Triple::lanai:
4216 AddLanaiTargetArgs(Args, CmdArgs);
4217 break;
4218
Tony Linthicum76329bf2011-12-12 21:14:55 +00004219 case llvm::Triple::hexagon:
4220 AddHexagonTargetArgs(Args, CmdArgs);
4221 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004222
4223 case llvm::Triple::wasm32:
4224 case llvm::Triple::wasm64:
4225 AddWebAssemblyTargetArgs(Args, CmdArgs);
4226 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004227 }
4228
Douglas Katzman3459ce22015-10-08 04:24:12 +00004229 // The 'g' groups options involve a somewhat intricate sequence of decisions
4230 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004231 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004232 // * what level of debug info to generate
4233 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004234 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004235 // This avoids having to monkey around further in cc1 other than to disable
4236 // codeview if not running in a Windows environment. Perhaps even that
4237 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004238 unsigned DwarfVersion = 0;
4239 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4240 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004241 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004242 bool EmitCodeView = false;
4243
Hans Wennborg75958c42013-08-08 00:17:41 +00004244 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004245 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004246 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004247 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004248
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004249 // Pass the linker version in use.
4250 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4251 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004252 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004253 }
4254
Eric Christopherb7d97e92013-04-03 01:58:53 +00004255 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004256 CmdArgs.push_back("-momit-leaf-frame-pointer");
4257
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004258 // Explicitly error on some things we know we don't support and can't just
4259 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004260 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4261 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004262 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004263 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004264 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4265 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004266 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004267 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004268 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004269 }
4270
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004271 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004272 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004273 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004274 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004275 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4276 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004277 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004278 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004279 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004280
Chad Rosierbe10f982011-08-02 17:58:04 +00004281 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004282 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004283 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4284 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004285 }
4286
Rafael Espindola08a692a2010-03-07 04:46:18 +00004287 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004288 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004289 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004290 // If the last option explicitly specified a debug-info level, use it.
4291 if (A->getOption().matches(options::OPT_gN_Group)) {
4292 DebugInfoKind = DebugLevelToInfoKind(*A);
4293 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4294 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4295 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004296 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004297 A->getIndex() > SplitDwarfArg->getIndex())
4298 SplitDwarfArg = nullptr;
4299 } else
4300 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004301 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004302 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004303
Paul Robinson0334a042015-12-19 19:41:48 +00004304 // If a debugger tuning argument appeared, remember it.
4305 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4306 options::OPT_ggdbN_Group)) {
4307 if (A->getOption().matches(options::OPT_glldb))
4308 DebuggerTuning = llvm::DebuggerKind::LLDB;
4309 else if (A->getOption().matches(options::OPT_gsce))
4310 DebuggerTuning = llvm::DebuggerKind::SCE;
4311 else
4312 DebuggerTuning = llvm::DebuggerKind::GDB;
4313 }
4314
4315 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004316 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004317 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004318 DwarfVersion = DwarfVersionNum(A->getSpelling());
4319
Reid Kleckner124955a2015-08-05 18:51:13 +00004320 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004321 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4322 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4323 // DwarfVersion remains at 0 if no explicit choice was made.
4324 CmdArgs.push_back("-gcodeview");
4325 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004326 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004327 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4328 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004329
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004330 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4331 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004332
4333 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004334 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004335 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004336 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004337
Eric Christopher138c32b2013-09-13 22:37:55 +00004338 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004339 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004340 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004341 CmdArgs.push_back("-dwarf-ext-refs");
4342 CmdArgs.push_back("-fmodule-format=obj");
4343 }
4344
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004345 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4346 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004347 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004348 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004349 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004350 CmdArgs.push_back("-backend-option");
4351 CmdArgs.push_back("-split-dwarf=Enable");
4352 }
4353
Douglas Katzman3459ce22015-10-08 04:24:12 +00004354 // After we've dealt with all combinations of things that could
4355 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4356 // figure out if we need to "upgrade" it to standalone debug info.
4357 // We parse these two '-f' options whether or not they will be used,
4358 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4359 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4360 options::OPT_fno_standalone_debug,
4361 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004362 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4363 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004364 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4365 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004366
Eric Christopher138c32b2013-09-13 22:37:55 +00004367 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4368 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4369 CmdArgs.push_back("-backend-option");
4370 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4371 }
Eric Christophereec89c22013-06-18 00:03:50 +00004372
Eric Christopher0d403d22014-02-14 01:27:03 +00004373 // -gdwarf-aranges turns on the emission of the aranges section in the
4374 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004375 // Always enabled on the PS4.
4376 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004377 CmdArgs.push_back("-backend-option");
4378 CmdArgs.push_back("-generate-arange-section");
4379 }
4380
David Blaikief36d9ba2014-01-27 18:52:43 +00004381 if (Args.hasFlag(options::OPT_fdebug_types_section,
4382 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004383 CmdArgs.push_back("-backend-option");
4384 CmdArgs.push_back("-generate-type-units");
4385 }
Eric Christophereec89c22013-06-18 00:03:50 +00004386
Dan Gohmana5b804b2016-01-07 00:50:27 +00004387 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4388 // default.
4389 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4390 Triple.getArch() == llvm::Triple::wasm32 ||
4391 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004392
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004393 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004394 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004395 CmdArgs.push_back("-ffunction-sections");
4396 }
4397
Peter Collingbourneceef1452016-02-24 22:03:06 +00004398 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4399 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004400 if (!D.isUsingLTO())
4401 D.Diag(diag::err_drv_argument_only_allowed_with)
4402 << "-fwhole-program-vtables"
4403 << "-flto";
4404 CmdArgs.push_back("-fwhole-program-vtables");
4405
4406 clang::SmallString<64> Path(D.ResourceDir);
4407 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4408 if (llvm::sys::fs::exists(Path)) {
4409 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4410 BlacklistOpt += Path.str();
4411 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4412 }
4413
4414 for (const Arg *A :
4415 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4416 A->claim();
4417 if (!llvm::sys::fs::exists(A->getValue()))
4418 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4419 }
4420
4421 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4422 }
4423
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004424 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4425 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004426 CmdArgs.push_back("-fdata-sections");
4427 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004428
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004429 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004430 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004431 CmdArgs.push_back("-fno-unique-section-names");
4432
Chris Lattner3c77a352010-06-22 00:03:40 +00004433 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4434
Diego Novilloa0545962015-07-10 18:00:07 +00004435 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004436
Paul Robinsond083b9a2015-12-16 17:25:27 +00004437 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4438 if (getToolChain().getTriple().isPS4CPU())
4439 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4440
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004441 // Pass options for controlling the default header search paths.
4442 if (Args.hasArg(options::OPT_nostdinc)) {
4443 CmdArgs.push_back("-nostdsysteminc");
4444 CmdArgs.push_back("-nobuiltininc");
4445 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004446 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004447 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004448 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4449 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4450 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004451
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004452 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004453 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004454 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004455
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004456 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4457
Ted Kremenekf7639e12012-03-06 20:06:33 +00004458 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004459 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004460 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004461 options::OPT_ccc_arcmt_modify,
4462 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004463 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004464 switch (A->getOption().getID()) {
4465 default:
4466 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004467 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004468 CmdArgs.push_back("-arcmt-check");
4469 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004470 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004471 CmdArgs.push_back("-arcmt-modify");
4472 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004473 case options::OPT_ccc_arcmt_migrate:
4474 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004475 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004476 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004477
4478 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4479 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004480 break;
John McCalld70fb982011-06-15 23:25:17 +00004481 }
4482 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004483 } else {
4484 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4485 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4486 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004487 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004488
Ted Kremenekf7639e12012-03-06 20:06:33 +00004489 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4490 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004491 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4492 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004493 }
4494 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004495 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004496
4497 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004498 options::OPT_objcmt_migrate_subscripting,
4499 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004500 // None specified, means enable them all.
4501 CmdArgs.push_back("-objcmt-migrate-literals");
4502 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004503 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004504 } else {
4505 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4506 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004507 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004508 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004509 } else {
4510 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4511 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4512 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4513 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4514 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4515 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004516 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004517 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4518 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4519 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4520 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4521 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4522 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4523 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004524 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004525 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004526 }
4527
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004528 // Add preprocessing options like -I, -D, etc. if we are using the
4529 // preprocessor.
4530 //
4531 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004532 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004533 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4534 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004535
Rafael Espindolaa7431922011-07-21 23:40:37 +00004536 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4537 // that "The compiler can only warn and ignore the option if not recognized".
4538 // When building with ccache, it will pass -D options to clang even on
4539 // preprocessed inputs and configure concludes that -fPIC is not supported.
4540 Args.ClaimAllArgs(options::OPT_D);
4541
Alp Toker7874bdc2013-11-15 20:40:58 +00004542 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004543 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4544 if (A->getOption().matches(options::OPT_O4)) {
4545 CmdArgs.push_back("-O3");
4546 D.Diag(diag::warn_O4_is_O3);
4547 } else {
4548 A->render(Args, CmdArgs);
4549 }
4550 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004551
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004552 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004553 for (const Arg *A :
4554 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4555 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004556 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004557 }
4558
Rafael Espindola577637a2015-01-03 00:06:04 +00004559 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004560
Richard Smith3be1cb22014-08-07 00:24:21 +00004561 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004562 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004563 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4564 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004565 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004566 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004567
4568 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004569 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004570 //
4571 // If a std is supplied, only add -trigraphs if it follows the
4572 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004573 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004574 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4575 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004576 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004577 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004578 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004579 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004580 else
4581 Std->render(Args, CmdArgs);
4582
Nico Weber00721502014-12-23 22:32:37 +00004583 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004584 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004585 options::OPT_ftrigraphs,
4586 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004587 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004588 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004589 } else {
4590 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004591 //
4592 // FIXME: Clang doesn't correctly handle -std= when the input language
4593 // doesn't match. For the time being just ignore this for C++ inputs;
4594 // eventually we want to do all the standard defaulting here instead of
4595 // splitting it between the driver and clang -cc1.
4596 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004597 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4598 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004599 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004600 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004601
Nico Weber00721502014-12-23 22:32:37 +00004602 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4603 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004604 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004605
Richard Smith282b4492013-09-04 22:50:31 +00004606 // GCC's behavior for -Wwrite-strings is a bit strange:
4607 // * In C, this "warning flag" changes the types of string literals from
4608 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4609 // for the discarded qualifier.
4610 // * In C++, this is just a normal warning flag.
4611 //
4612 // Implementing this warning correctly in C is hard, so we follow GCC's
4613 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4614 // a non-const char* in C, rather than using this crude hack.
4615 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004616 // FIXME: This should behave just like a warning flag, and thus should also
4617 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4618 Arg *WriteStrings =
4619 Args.getLastArg(options::OPT_Wwrite_strings,
4620 options::OPT_Wno_write_strings, options::OPT_w);
4621 if (WriteStrings &&
4622 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004623 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004624 }
4625
Chandler Carruth61fbf622011-04-23 09:27:53 +00004626 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004627 // during C++ compilation, which it is by default. GCC keeps this define even
4628 // in the presence of '-w', match this behavior bug-for-bug.
4629 if (types::isCXX(InputType) &&
4630 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4631 true)) {
4632 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004633 }
4634
Chandler Carruthe0391482010-05-22 02:21:53 +00004635 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4636 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4637 if (Asm->getOption().matches(options::OPT_fasm))
4638 CmdArgs.push_back("-fgnu-keywords");
4639 else
4640 CmdArgs.push_back("-fno-gnu-keywords");
4641 }
4642
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004643 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4644 CmdArgs.push_back("-fno-dwarf-directory-asm");
4645
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004646 if (ShouldDisableAutolink(Args, getToolChain()))
4647 CmdArgs.push_back("-fno-autolink");
4648
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004649 // Add in -fdebug-compilation-dir if necessary.
4650 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004651
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004652 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4653 StringRef Map = A->getValue();
4654 if (Map.find('=') == StringRef::npos)
4655 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4656 else
4657 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4658 A->claim();
4659 }
4660
Richard Smith9a568822011-11-21 19:36:32 +00004661 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4662 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004663 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004664 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004665 }
4666
Richard Smith79c927b2013-11-06 19:31:51 +00004667 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4668 CmdArgs.push_back("-foperator-arrow-depth");
4669 CmdArgs.push_back(A->getValue());
4670 }
4671
Richard Smith9a568822011-11-21 19:36:32 +00004672 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4673 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004674 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004675 }
4676
Richard Smitha3d3bd22013-05-08 02:12:03 +00004677 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4678 CmdArgs.push_back("-fconstexpr-steps");
4679 CmdArgs.push_back(A->getValue());
4680 }
4681
Richard Smithb3a14522013-02-22 01:59:51 +00004682 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4683 CmdArgs.push_back("-fbracket-depth");
4684 CmdArgs.push_back(A->getValue());
4685 }
4686
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004687 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4688 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004689 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004690 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004691 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4692 } else
4693 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004694 }
4695
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004696 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004697 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004698
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004699 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4700 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004701 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004702 }
David Chisnall5778fce2009-08-31 16:41:57 +00004703
Chris Lattnere23003d2010-01-09 21:54:33 +00004704 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4705 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004706 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004707 }
4708
Chris Lattnerb35583d2010-04-07 20:49:23 +00004709 CmdArgs.push_back("-ferror-limit");
4710 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004711 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004712 else
4713 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004714
Chandler Carrutha77a7272010-05-06 04:55:18 +00004715 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4716 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004717 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004718 }
4719
4720 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4721 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004722 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004723 }
4724
Richard Smithf6f003a2011-12-16 19:06:07 +00004725 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4726 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004727 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004728 }
4729
Nick Lewycky24653262014-12-16 21:39:02 +00004730 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4731 CmdArgs.push_back("-fspell-checking-limit");
4732 CmdArgs.push_back(A->getValue());
4733 }
4734
Daniel Dunbar2c978472009-11-04 06:24:47 +00004735 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004736 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004737 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004738 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004739 } else {
4740 // If -fmessage-length=N was not specified, determine whether this is a
4741 // terminal and, if so, implicitly define -fmessage-length appropriately.
4742 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004743 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004744 }
4745
John McCallb4a99d32013-02-19 01:57:35 +00004746 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4747 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4748 options::OPT_fvisibility_ms_compat)) {
4749 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4750 CmdArgs.push_back("-fvisibility");
4751 CmdArgs.push_back(A->getValue());
4752 } else {
4753 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4754 CmdArgs.push_back("-fvisibility");
4755 CmdArgs.push_back("hidden");
4756 CmdArgs.push_back("-ftype-visibility");
4757 CmdArgs.push_back("default");
4758 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004759 }
4760
Douglas Gregor08329632010-06-15 17:05:35 +00004761 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004762
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004763 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4764
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004765 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004766 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4767 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004768 CmdArgs.push_back("-ffreestanding");
4769
Daniel Dunbare357d562009-12-03 18:42:11 +00004770 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004771 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004772 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004773 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004774 // Emulated TLS is enabled by default on Android, and can be enabled manually
4775 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004776 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004777 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4778 EmulatedTLSDefault))
4779 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004780 // AltiVec-like language extensions aren't relevant for assembling.
4781 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004782 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004783 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4784 }
Richard Trieu91844232012-06-26 18:18:47 +00004785 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4786 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004787
Alexey Bataevdb390212015-05-20 04:24:19 +00004788 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004789 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4790 options::OPT_fno_openmp, false))
4791 switch (getOpenMPRuntime(getToolChain(), Args)) {
4792 case OMPRT_OMP:
4793 case OMPRT_IOMP5:
4794 // Clang can generate useful OpenMP code for these two runtime libraries.
4795 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004796
4797 // If no option regarding the use of TLS in OpenMP codegeneration is
4798 // given, decide a default based on the target. Otherwise rely on the
4799 // options and pass the right information to the frontend.
4800 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004801 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004802 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004803 break;
4804 default:
4805 // By default, if Clang doesn't know how to generate useful OpenMP code
4806 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4807 // down to the actual compilation.
4808 // FIXME: It would be better to have a mode which *only* omits IR
4809 // generation based on the OpenMP support so that we get consistent
4810 // semantic analysis, etc.
4811 break;
4812 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004813
Peter Collingbourne32701642013-11-01 18:16:25 +00004814 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004815 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004816
Eric Christopher459d2712013-02-19 06:16:53 +00004817 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004818 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4819 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4820 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4821 Arch == llvm::Triple::ppc64le))
4822 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4823 << "ppc/ppc64/ppc64le";
4824 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004825
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004826 // -fzvector is incompatible with -faltivec.
4827 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4828 if (Args.hasArg(options::OPT_faltivec))
4829 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4830 << "-faltivec";
4831
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004832 if (getToolChain().SupportsProfiling())
4833 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004834
4835 // -flax-vector-conversions is default.
4836 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4837 options::OPT_fno_lax_vector_conversions))
4838 CmdArgs.push_back("-fno-lax-vector-conversions");
4839
John Brawna7b4ec02015-08-10 11:11:28 +00004840 if (Args.getLastArg(options::OPT_fapple_kext) ||
4841 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004842 CmdArgs.push_back("-fapple-kext");
4843
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004844 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004845 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004846 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004847 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4848 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004849
4850 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4851 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004852 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004853 }
4854
Bob Wilson14adb362012-02-03 06:27:22 +00004855 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004856
Chandler Carruth6e501032011-03-27 00:04:55 +00004857 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4858 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004859 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004860 if (A->getOption().matches(options::OPT_fwrapv))
4861 CmdArgs.push_back("-fwrapv");
4862 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4863 options::OPT_fno_strict_overflow)) {
4864 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4865 CmdArgs.push_back("-fwrapv");
4866 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004867
4868 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4869 options::OPT_fno_reroll_loops))
4870 if (A->getOption().matches(options::OPT_freroll_loops))
4871 CmdArgs.push_back("-freroll-loops");
4872
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004873 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004874 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4875 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004876
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004877 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4878
Daniel Dunbar4930e332009-11-17 08:07:36 +00004879 // -stack-protector=0 is default.
4880 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004881 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4882 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4883 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4884 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4885 Args.ClaimAllArgs(options::OPT_fstack_protector);
4886 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004887 options::OPT_fstack_protector_all,
4888 options::OPT_fstack_protector_strong,
4889 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004890 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004891 StackProtectorLevel = std::max<unsigned>(
4892 LangOptions::SSPOn,
4893 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004894 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004895 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004896 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004897 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004898 } else {
4899 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004900 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004901 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004902 if (StackProtectorLevel) {
4903 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004904 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004905 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004906
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004907 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004908 for (const Arg *A : Args.filtered(options::OPT__param)) {
4909 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004910 if (Str.startswith("ssp-buffer-size=")) {
4911 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004912 CmdArgs.push_back("-stack-protector-buffer-size");
4913 // FIXME: Verify the argument is a valid integer.
4914 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004915 }
Sean Silva14facf32015-06-09 01:57:17 +00004916 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004917 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004918 }
4919
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004920 // Translate -mstackrealign
4921 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004922 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004923 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004924
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004925 if (Args.hasArg(options::OPT_mstack_alignment)) {
4926 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4927 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004928 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004929
Hans Wennborg77dc2362015-01-20 19:45:50 +00004930 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4931 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4932
4933 if (!Size.empty())
4934 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4935 else
4936 CmdArgs.push_back("-mstack-probe-size=0");
4937 }
4938
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004939 switch (getToolChain().getArch()) {
4940 case llvm::Triple::aarch64:
4941 case llvm::Triple::aarch64_be:
4942 case llvm::Triple::arm:
4943 case llvm::Triple::armeb:
4944 case llvm::Triple::thumb:
4945 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004946 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004947 break;
4948
4949 default:
4950 break;
4951 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004952
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004953 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4954 options::OPT_mno_restrict_it)) {
4955 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4956 CmdArgs.push_back("-backend-option");
4957 CmdArgs.push_back("-arm-restrict-it");
4958 } else {
4959 CmdArgs.push_back("-backend-option");
4960 CmdArgs.push_back("-arm-no-restrict-it");
4961 }
James Y Knight2db38f32015-08-15 03:45:25 +00004962 } else if (Triple.isOSWindows() &&
4963 (Triple.getArch() == llvm::Triple::arm ||
4964 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004965 // Windows on ARM expects restricted IT blocks
4966 CmdArgs.push_back("-backend-option");
4967 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004968 }
4969
Daniel Dunbard18049a2009-04-07 21:16:11 +00004970 // Forward -f options with positive and negative forms; we translate
4971 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004972 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4973 StringRef fname = A->getValue();
4974 if (!llvm::sys::fs::exists(fname))
4975 D.Diag(diag::err_drv_no_such_file) << fname;
4976 else
4977 A->render(Args, CmdArgs);
4978 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004979
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004980 // -fbuiltin is default unless -mkernel is used.
4981 bool UseBuiltins =
4982 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4983 !Args.hasArg(options::OPT_mkernel));
4984 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004985 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004986
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004987 // -ffreestanding implies -fno-builtin.
4988 if (Args.hasArg(options::OPT_ffreestanding))
4989 UseBuiltins = false;
4990
4991 // Process the -fno-builtin-* options.
4992 for (const auto &Arg : Args) {
4993 const Option &O = Arg->getOption();
4994 if (!O.matches(options::OPT_fno_builtin_))
4995 continue;
4996
4997 Arg->claim();
4998 // If -fno-builtin is specified, then there's no need to pass the option to
4999 // the frontend.
5000 if (!UseBuiltins)
5001 continue;
5002
5003 StringRef FuncName = Arg->getValue();
5004 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5005 }
5006
Nuno Lopes13c88c72009-12-16 16:59:22 +00005007 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5008 options::OPT_fno_assume_sane_operator_new))
5009 CmdArgs.push_back("-fno-assume-sane-operator-new");
5010
Daniel Dunbar4930e332009-11-17 08:07:36 +00005011 // -fblocks=0 is default.
5012 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005013 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005014 (Args.hasArg(options::OPT_fgnu_runtime) &&
5015 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5016 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005017 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005018
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005019 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005020 !getToolChain().hasBlocksRuntime())
5021 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005022 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005023
Richard Smith47972af2015-06-16 00:08:24 +00005024 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005025 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005026 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005027 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005028 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005029 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5030 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005031 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005032 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005033 HaveModules = true;
5034 }
5035 }
5036
Richard Smith47972af2015-06-16 00:08:24 +00005037 // -fmodule-maps enables implicit reading of module map files. By default,
5038 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005039 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5040 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005041 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005042 }
5043
Daniel Jasperac42b752013-10-21 06:34:34 +00005044 // -fmodules-decluse checks that modules used are declared so (off by
5045 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005046 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005047 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005048 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005049 }
5050
Daniel Jasper962b38e2014-04-11 11:47:45 +00005051 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5052 // all #included headers are part of modules.
5053 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005054 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005055 CmdArgs.push_back("-fmodules-strict-decluse");
5056 }
5057
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005058 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5059 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5060 options::OPT_fno_implicit_modules)) {
5061 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005062 } else if (HaveModules) {
5063 // -fmodule-cache-path specifies where our implicitly-built module files
5064 // should be written.
5065 SmallString<128> Path;
5066 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5067 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005068 if (C.isForDiagnostics()) {
5069 // When generating crash reports, we want to emit the modules along with
5070 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005071 Path = Output.getFilename();
5072 llvm::sys::path::replace_extension(Path, ".cache");
5073 llvm::sys::path::append(Path, "modules");
5074 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005075 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005076 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005077 llvm::sys::path::append(Path, "org.llvm.clang.");
5078 appendUserToPath(Path);
5079 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005080 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005081 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005082 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5083 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005084 }
5085
Richard Smith8d83d6d2016-03-21 19:06:06 +00005086 // -fmodule-name specifies the module that is currently being built (or
5087 // used for header checking by -fmodule-maps).
5088 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5089
5090 // -fmodule-map-file can be used to specify files containing module
5091 // definitions.
5092 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5093
5094 // -fmodule-file can be used to specify files containing precompiled modules.
5095 if (HaveModules)
5096 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5097 else
5098 Args.ClaimAllArgs(options::OPT_fmodule_file);
5099
Justin Bognera88f0122014-06-20 22:59:50 +00005100 // When building modules and generating crashdumps, we need to dump a module
5101 // dependency VFS alongside the output.
5102 if (HaveModules && C.isForDiagnostics()) {
5103 SmallString<128> VFSDir(Output.getFilename());
5104 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005105 // Add the cache directory as a temp so the crash diagnostics pick it up.
5106 C.addTempFile(Args.MakeArgString(VFSDir));
5107
Justin Bognera88f0122014-06-20 22:59:50 +00005108 llvm::sys::path::append(VFSDir, "vfs");
5109 CmdArgs.push_back("-module-dependency-dir");
5110 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005111 }
5112
Richard Smith9887d792014-10-17 01:42:53 +00005113 if (HaveModules)
5114 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005115
Douglas Gregor35b04d62013-02-07 19:01:24 +00005116 // Pass through all -fmodules-ignore-macro arguments.
5117 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005118 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5119 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005120
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005121 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5122
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005123 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5124 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5125 D.Diag(diag::err_drv_argument_not_allowed_with)
5126 << A->getAsString(Args) << "-fbuild-session-timestamp";
5127
5128 llvm::sys::fs::file_status Status;
5129 if (llvm::sys::fs::status(A->getValue(), Status))
5130 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005131 CmdArgs.push_back(Args.MakeArgString(
5132 "-fbuild-session-timestamp=" +
5133 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005134 }
5135
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005136 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005137 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5138 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005139 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5140
5141 Args.AddLastArg(CmdArgs,
5142 options::OPT_fmodules_validate_once_per_build_session);
5143 }
5144
Ben Langmuirdcf73862014-03-12 00:06:17 +00005145 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5146
John McCalldfea9982010-04-09 19:12:06 +00005147 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005148 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005149 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005150 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005151
Anders Carlssond470fef2010-11-21 00:09:52 +00005152 // -felide-constructors is the default.
5153 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005154 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005155 CmdArgs.push_back("-fno-elide-constructors");
5156
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005157 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005158
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005159 if (KernelOrKext || (types::isCXX(InputType) &&
5160 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5161 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005162 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005163
Tony Linthicum76329bf2011-12-12 21:14:55 +00005164 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005165 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5166 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005167 CmdArgs.push_back("-fshort-enums");
5168
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005169 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005170 if (Arg *A = Args.getLastArg(
5171 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5172 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5173 if (A->getOption().matches(options::OPT_funsigned_char) ||
5174 A->getOption().matches(options::OPT_fno_signed_char)) {
5175 CmdArgs.push_back("-fno-signed-char");
5176 }
5177 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005178 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005179 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005180
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005181 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005182 if (!Args.hasFlag(
5183 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5184 !IsWindowsCygnus && !IsWindowsGNU &&
5185 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5186 getToolChain().getArch() != llvm::Triple::hexagon &&
5187 getToolChain().getArch() != llvm::Triple::xcore &&
5188 ((getToolChain().getTriple().getVendor() !=
5189 llvm::Triple::MipsTechnologies) ||
5190 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005191 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005192 CmdArgs.push_back("-fno-use-cxa-atexit");
5193
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005194 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005195 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005196 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005197 CmdArgs.push_back("-fms-extensions");
5198
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005199 // -fno-use-line-directives is default.
5200 if (Args.hasFlag(options::OPT_fuse_line_directives,
5201 options::OPT_fno_use_line_directives, false))
5202 CmdArgs.push_back("-fuse-line-directives");
5203
Francois Pichet1b4f1632011-09-17 04:32:15 +00005204 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005205 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005206 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005207 (IsWindowsMSVC &&
5208 Args.hasFlag(options::OPT_fms_extensions,
5209 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005210 CmdArgs.push_back("-fms-compatibility");
5211
David Majnemerc371ff02015-03-22 08:39:22 +00005212 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005213 VersionTuple MSVT = visualstudio::getMSVCVersion(
5214 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5215 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005216 CmdArgs.push_back(
5217 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005218
David Majnemer8db91762015-05-18 04:49:30 +00005219 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5220 if (ImplyVCPPCXXVer) {
5221 if (IsMSVC2015Compatible)
5222 CmdArgs.push_back("-std=c++14");
5223 else
5224 CmdArgs.push_back("-std=c++11");
5225 }
5226
Eric Christopher5ecce122013-02-18 00:38:31 +00005227 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005228 if (Args.hasFlag(options::OPT_fborland_extensions,
5229 options::OPT_fno_borland_extensions, false))
5230 CmdArgs.push_back("-fborland-extensions");
5231
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005232 // -fno-declspec is default, except for PS4.
5233 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5234 getToolChain().getTriple().isPS4()))
5235 CmdArgs.push_back("-fdeclspec");
5236 else if (Args.hasArg(options::OPT_fno_declspec))
5237 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5238
David Majnemerc371ff02015-03-22 08:39:22 +00005239 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5240 // than 19.
5241 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5242 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005243 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005244 CmdArgs.push_back("-fno-threadsafe-statics");
5245
Francois Pichet02744872011-09-01 16:38:08 +00005246 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5247 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005248 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005249 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005250 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005251
Chandler Carruthe03aa552010-04-17 20:17:31 +00005252 // -fgnu-keywords default varies depending on language; only pass if
5253 // specified.
5254 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005255 options::OPT_fno_gnu_keywords))
5256 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005258 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005259 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005260 CmdArgs.push_back("-fgnu89-inline");
5261
Chad Rosier9c76d242012-03-15 22:31:42 +00005262 if (Args.hasArg(options::OPT_fno_inline))
5263 CmdArgs.push_back("-fno-inline");
5264
Chad Rosier64d6be92012-03-06 21:17:19 +00005265 if (Args.hasArg(options::OPT_fno_inline_functions))
5266 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005267
John McCall5fb5df92012-06-20 06:18:46 +00005268 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005269
John McCall5fb5df92012-06-20 06:18:46 +00005270 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005271 // legacy is the default. Except for deployment taget of 10.5,
5272 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5273 // gets ignored silently.
5274 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005275 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5276 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005277 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005278 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005279 if (getToolChain().UseObjCMixedDispatch())
5280 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5281 else
5282 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5283 }
5284 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005285
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005286 // When ObjectiveC legacy runtime is in effect on MacOSX,
5287 // turn on the option to do Array/Dictionary subscripting
5288 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005289 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005290 getToolChain().getTriple().isMacOSX() &&
5291 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5292 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005293 objcRuntime.isNeXTFamily())
5294 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005295
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005296 // -fencode-extended-block-signature=1 is default.
5297 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5298 CmdArgs.push_back("-fencode-extended-block-signature");
5299 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005300
John McCall24fc0de2011-07-06 00:26:06 +00005301 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5302 // NOTE: This logic is duplicated in ToolChains.cpp.
5303 bool ARC = isObjCAutoRefCount(Args);
5304 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005305 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005306
John McCall24fc0de2011-07-06 00:26:06 +00005307 CmdArgs.push_back("-fobjc-arc");
5308
Chandler Carruth491db322011-11-04 07:34:47 +00005309 // FIXME: It seems like this entire block, and several around it should be
5310 // wrapped in isObjC, but for now we just use it here as this is where it
5311 // was being used previously.
5312 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5313 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5314 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5315 else
5316 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5317 }
5318
John McCall24fc0de2011-07-06 00:26:06 +00005319 // Allow the user to enable full exceptions code emission.
5320 // We define off for Objective-CC, on for Objective-C++.
5321 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5322 options::OPT_fno_objc_arc_exceptions,
5323 /*default*/ types::isCXX(InputType)))
5324 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005325
John McCall24fc0de2011-07-06 00:26:06 +00005326 }
5327
5328 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5329 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005330 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005331 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005332
John McCall24fc0de2011-07-06 00:26:06 +00005333 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5334 // takes precedence.
5335 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5336 if (!GCArg)
5337 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5338 if (GCArg) {
5339 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005340 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005341 } else if (getToolChain().SupportsObjCGC()) {
5342 GCArg->render(Args, CmdArgs);
5343 } else {
5344 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005345 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005346 }
5347 }
5348
John McCallfbe5ed72015-11-05 19:19:56 +00005349 // Pass down -fobjc-weak or -fno-objc-weak if present.
5350 if (types::isObjC(InputType)) {
5351 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5352 options::OPT_fno_objc_weak);
5353 if (!WeakArg) {
5354 // nothing to do
5355 } else if (GCArg) {
5356 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5357 D.Diag(diag::err_objc_weak_with_gc);
5358 } else if (!objcRuntime.allowsWeak()) {
5359 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5360 D.Diag(diag::err_objc_weak_unsupported);
5361 } else {
5362 WeakArg->render(Args, CmdArgs);
5363 }
5364 }
5365
Bob Wilsonb111ec92015-03-02 19:01:14 +00005366 if (Args.hasFlag(options::OPT_fapplication_extension,
5367 options::OPT_fno_application_extension, false))
5368 CmdArgs.push_back("-fapplication-extension");
5369
Reid Klecknerc542d372014-06-27 17:02:02 +00005370 // Handle GCC-style exception args.
5371 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005372 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5373 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005374
Tim Northovere931f9f2015-10-30 16:30:41 +00005375 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005376 CmdArgs.push_back("-fsjlj-exceptions");
5377
5378 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005379 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5380 options::OPT_fno_assume_sane_operator_new))
5381 CmdArgs.push_back("-fno-assume-sane-operator-new");
5382
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005383 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5384 // most platforms.
5385 if (Args.hasFlag(options::OPT_fsized_deallocation,
5386 options::OPT_fno_sized_deallocation, false))
5387 CmdArgs.push_back("-fsized-deallocation");
5388
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005389 // -fconstant-cfstrings is default, and may be subject to argument translation
5390 // on Darwin.
5391 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5392 options::OPT_fno_constant_cfstrings) ||
5393 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5394 options::OPT_mno_constant_cfstrings))
5395 CmdArgs.push_back("-fno-constant-cfstrings");
5396
John Thompsoned4e2952009-11-05 20:14:16 +00005397 // -fshort-wchar default varies depending on platform; only
5398 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005399 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5400 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005401 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005402
Hans Wennborg28c96312013-07-31 23:39:13 +00005403 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005404 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005405 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005406 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005407
Daniel Dunbar096ed292011-10-05 21:04:55 +00005408 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5409 // -fno-pack-struct doesn't apply to -fpack-struct=.
5410 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005411 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005412 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005413 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005414 } else if (Args.hasFlag(options::OPT_fpack_struct,
5415 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005416 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005417 }
5418
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005419 // Handle -fmax-type-align=N and -fno-type-align
5420 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5421 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5422 if (!SkipMaxTypeAlign) {
5423 std::string MaxTypeAlignStr = "-fmax-type-align=";
5424 MaxTypeAlignStr += A->getValue();
5425 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5426 }
5427 } else if (getToolChain().getTriple().isOSDarwin()) {
5428 if (!SkipMaxTypeAlign) {
5429 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5430 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5431 }
5432 }
5433
John Brawna7b4ec02015-08-10 11:11:28 +00005434 // -fcommon is the default unless compiling kernel code or the target says so
5435 bool NoCommonDefault =
5436 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5437 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5438 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005439 CmdArgs.push_back("-fno-common");
5440
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005441 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005442 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005443 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005444 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005445 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005446 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005447
Daniel Dunbar6358d682010-10-15 22:30:42 +00005448 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005449 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005450 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005451 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005452
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005453 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005454 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5455 StringRef value = inputCharset->getValue();
5456 if (value != "UTF-8")
5457 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5458 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005459 }
5460
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005461 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005462 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5463 StringRef value = execCharset->getValue();
5464 if (value != "UTF-8")
5465 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5466 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005467 }
5468
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005469 // -fcaret-diagnostics is default.
5470 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5471 options::OPT_fno_caret_diagnostics, true))
5472 CmdArgs.push_back("-fno-caret-diagnostics");
5473
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005474 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005475 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005476 options::OPT_fno_diagnostics_fixit_info))
5477 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005478
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005479 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005480 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005481 options::OPT_fno_diagnostics_show_option))
5482 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005483
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005484 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005485 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005486 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005487 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005488 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005489
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005490 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005491 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005492 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005493 }
5494
Chandler Carruthb6766f02011-03-27 01:50:55 +00005495 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005496 options::OPT_fdiagnostics_show_note_include_stack,
5497 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005498 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005499 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005500 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5501 else
5502 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5503 }
5504
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005505 // Color diagnostics are the default, unless the terminal doesn't support
5506 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005507 // Support both clang's -f[no-]color-diagnostics and gcc's
5508 // -f[no-]diagnostics-colors[=never|always|auto].
5509 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005510 for (const auto &Arg : Args) {
5511 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005512 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5513 !O.matches(options::OPT_fdiagnostics_color) &&
5514 !O.matches(options::OPT_fno_color_diagnostics) &&
5515 !O.matches(options::OPT_fno_diagnostics_color) &&
5516 !O.matches(options::OPT_fdiagnostics_color_EQ))
5517 continue;
5518
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005519 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005520 if (O.matches(options::OPT_fcolor_diagnostics) ||
5521 O.matches(options::OPT_fdiagnostics_color)) {
5522 ShowColors = Colors_On;
5523 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5524 O.matches(options::OPT_fno_diagnostics_color)) {
5525 ShowColors = Colors_Off;
5526 } else {
5527 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005528 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005529 if (value == "always")
5530 ShowColors = Colors_On;
5531 else if (value == "never")
5532 ShowColors = Colors_Off;
5533 else if (value == "auto")
5534 ShowColors = Colors_Auto;
5535 else
5536 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005537 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005538 }
5539 }
5540 if (ShowColors == Colors_On ||
5541 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005542 CmdArgs.push_back("-fcolor-diagnostics");
5543
Nico Rieck7857d462013-09-11 00:38:02 +00005544 if (Args.hasArg(options::OPT_fansi_escape_codes))
5545 CmdArgs.push_back("-fansi-escape-codes");
5546
Daniel Dunbardb097022009-06-08 21:13:54 +00005547 if (!Args.hasFlag(options::OPT_fshow_source_location,
5548 options::OPT_fno_show_source_location))
5549 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005550
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005551 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005552 true))
5553 CmdArgs.push_back("-fno-show-column");
5554
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005555 if (!Args.hasFlag(options::OPT_fspell_checking,
5556 options::OPT_fno_spell_checking))
5557 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005558
Chad Rosierc8e56e82012-12-05 21:08:21 +00005559 // -fno-asm-blocks is default.
5560 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5561 false))
5562 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005563
Steven Wucb0d13f2015-01-16 23:05:28 +00005564 // -fgnu-inline-asm is default.
5565 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5566 options::OPT_fno_gnu_inline_asm, true))
5567 CmdArgs.push_back("-fno-gnu-inline-asm");
5568
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005569 // Enable vectorization per default according to the optimization level
5570 // selected. For optimization levels that want vectorization we use the alias
5571 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005572 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005573 OptSpecifier VectorizeAliasOption =
5574 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005575 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005576 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005577 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005578
Chad Rosier136d67d2014-04-28 19:30:57 +00005579 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005580 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005581 OptSpecifier SLPVectAliasOption =
5582 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005583 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005584 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005585 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005586
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005587 // -fno-slp-vectorize-aggressive is default.
5588 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005589 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005590 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005591
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005592 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5593 A->render(Args, CmdArgs);
5594
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005595 // -fdollars-in-identifiers default varies depending on platform and
5596 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005597 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005598 options::OPT_fno_dollars_in_identifiers)) {
5599 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005600 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005601 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005602 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005603 }
5604
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005605 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5606 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005607 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005608 options::OPT_fno_unit_at_a_time)) {
5609 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005610 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005611 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005612
Eli Friedman055c9702011-11-02 01:53:16 +00005613 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5614 options::OPT_fno_apple_pragma_pack, false))
5615 CmdArgs.push_back("-fapple-pragma-pack");
5616
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005617 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005618 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5619 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005620 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005621 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005622 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005623
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005624// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5625//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005626// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005627#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005628 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005629 (getToolChain().getArch() == llvm::Triple::arm ||
5630 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005631 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5632 CmdArgs.push_back("-fno-builtin-strcat");
5633 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5634 CmdArgs.push_back("-fno-builtin-strcpy");
5635 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005636#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005637
Justin Bognera88f0122014-06-20 22:59:50 +00005638 // Enable rewrite includes if the user's asked for it or if we're generating
5639 // diagnostics.
5640 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5641 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005642 if (Args.hasFlag(options::OPT_frewrite_includes,
5643 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005644 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005645 CmdArgs.push_back("-frewrite-includes");
5646
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005647 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005648 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005649 options::OPT_traditional_cpp)) {
5650 if (isa<PreprocessJobAction>(JA))
5651 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005652 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005653 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005654 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005655
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005656 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005657 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005658
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005659 // Handle serialized diagnostics.
5660 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5661 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005662 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005663 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005664
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005665 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5666 CmdArgs.push_back("-fretain-comments-from-system-headers");
5667
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005668 // Forward -fcomment-block-commands to -cc1.
5669 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005670 // Forward -fparse-all-comments to -cc1.
5671 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005672
John Brawnad31ace2015-09-23 13:55:40 +00005673 // Turn -fplugin=name.so into -load name.so
5674 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5675 CmdArgs.push_back("-load");
5676 CmdArgs.push_back(A->getValue());
5677 A->claim();
5678 }
5679
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005680 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5681 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005682 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005683 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5684 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005685
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005686 // We translate this by hand to the -cc1 argument, since nightly test uses
5687 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005688 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005689 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005690 } else
Sean Silva14facf32015-06-09 01:57:17 +00005691 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005692 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005693
Bob Wilson23a55f12014-12-21 07:00:00 +00005694 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005695 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5696 // by the frontend.
5697 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5698 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005699
Daniel Dunbard67a3222009-03-30 06:36:42 +00005700 if (Output.getType() == types::TY_Dependencies) {
5701 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005702 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005703 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005704 CmdArgs.push_back(Output.getFilename());
5705 } else {
5706 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005707 }
5708
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005709 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005710
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005711 if (Input.isFilename())
5712 CmdArgs.push_back(Input.getFilename());
5713 else
5714 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005715
Chris Lattnere9d7d782009-11-03 19:50:27 +00005716 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5717
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005718 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005719
5720 // Optionally embed the -cc1 level arguments into the debug info, for build
5721 // analysis.
5722 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005723 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005724 for (const auto &Arg : Args)
5725 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005726
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005727 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005728 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005729 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005730 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005731 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005732 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005733 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005734 }
5735 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005736 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005737 }
5738
Eric Christopherd3804002013-02-22 20:12:52 +00005739 // Add the split debug info name to the command lines here so we
5740 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005741 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005742 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5743 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005744 const char *SplitDwarfOut;
5745 if (SplitDwarf) {
5746 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005747 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005748 CmdArgs.push_back(SplitDwarfOut);
5749 }
5750
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005751 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5752 // Include them with -fcuda-include-gpubinary.
5753 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005754 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005755 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005756 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005757 }
5758
Eric Christopherd3804002013-02-22 20:12:52 +00005759 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005760 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005761 Output.getType() == types::TY_Object &&
5762 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005763 auto CLCommand =
5764 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005765 C.addCommand(llvm::make_unique<FallbackCommand>(
5766 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005767 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5768 isa<PrecompileJobAction>(JA)) {
5769 // In /fallback builds, run the main compilation even if the pch generation
5770 // fails, so that the main compilation's fallback to cl.exe runs.
5771 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5772 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005773 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005774 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005775 }
5776
Eric Christopherf1545832013-02-22 23:50:16 +00005777 // Handle the debug info splitting at object creation time if we're
5778 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005779 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005780 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005781 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005782
Roman Divacky178e01602011-02-10 16:52:03 +00005783 if (Arg *A = Args.getLastArg(options::OPT_pg))
5784 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005785 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5786 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005787
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005788 // Claim some arguments which clang supports automatically.
5789
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005790 // -fpch-preprocess is used with gcc to add a special marker in the output to
5791 // include the PCH file. Clang's PTH solution is completely transparent, so we
5792 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005793 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005794
Daniel Dunbar17731772009-03-23 19:03:36 +00005795 // Claim some arguments which clang doesn't support, but we don't
5796 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005797 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5798 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005799
Rafael Espindolab0092d72013-09-04 19:37:35 +00005800 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005801 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005802}
5803
John McCall5fb5df92012-06-20 06:18:46 +00005804/// Add options related to the Objective-C runtime/ABI.
5805///
5806/// Returns true if the runtime is non-fragile.
5807ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5808 ArgStringList &cmdArgs,
5809 RewriteKind rewriteKind) const {
5810 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005811 Arg *runtimeArg =
5812 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5813 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005814
5815 // Just forward -fobjc-runtime= to the frontend. This supercedes
5816 // options about fragility.
5817 if (runtimeArg &&
5818 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5819 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005820 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005821 if (runtime.tryParse(value)) {
5822 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005823 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005824 }
5825
5826 runtimeArg->render(args, cmdArgs);
5827 return runtime;
5828 }
5829
5830 // Otherwise, we'll need the ABI "version". Version numbers are
5831 // slightly confusing for historical reasons:
5832 // 1 - Traditional "fragile" ABI
5833 // 2 - Non-fragile ABI, version 1
5834 // 3 - Non-fragile ABI, version 2
5835 unsigned objcABIVersion = 1;
5836 // If -fobjc-abi-version= is present, use that to set the version.
5837 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005838 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005839 if (value == "1")
5840 objcABIVersion = 1;
5841 else if (value == "2")
5842 objcABIVersion = 2;
5843 else if (value == "3")
5844 objcABIVersion = 3;
5845 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005846 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005847 } else {
5848 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005849 bool nonFragileABIIsDefault =
5850 (rewriteKind == RK_NonFragile ||
5851 (rewriteKind == RK_None &&
5852 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005853 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5854 options::OPT_fno_objc_nonfragile_abi,
5855 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005856// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005857#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5858 unsigned nonFragileABIVersion = 1;
5859#else
5860 unsigned nonFragileABIVersion = 2;
5861#endif
5862
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005863 if (Arg *abiArg =
5864 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005865 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005866 if (value == "1")
5867 nonFragileABIVersion = 1;
5868 else if (value == "2")
5869 nonFragileABIVersion = 2;
5870 else
5871 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005872 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005873 }
5874
5875 objcABIVersion = 1 + nonFragileABIVersion;
5876 } else {
5877 objcABIVersion = 1;
5878 }
5879 }
5880
5881 // We don't actually care about the ABI version other than whether
5882 // it's non-fragile.
5883 bool isNonFragile = objcABIVersion != 1;
5884
5885 // If we have no runtime argument, ask the toolchain for its default runtime.
5886 // However, the rewriter only really supports the Mac runtime, so assume that.
5887 ObjCRuntime runtime;
5888 if (!runtimeArg) {
5889 switch (rewriteKind) {
5890 case RK_None:
5891 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5892 break;
5893 case RK_Fragile:
5894 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5895 break;
5896 case RK_NonFragile:
5897 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5898 break;
5899 }
5900
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005901 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005902 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5903 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005904 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005905 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5906
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005907 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005908 } else {
5909 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5910 }
5911
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005912 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005913 } else {
5914 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005915 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005916 // non-fragile mode or the GCC runtime in fragile mode.
5917 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005918 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005919 else
5920 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005921 }
5922
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005923 cmdArgs.push_back(
5924 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005925 return runtime;
5926}
5927
Reid Klecknerc542d372014-06-27 17:02:02 +00005928static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5929 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5930 I += HaveDash;
5931 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005932}
Reid Klecknerc542d372014-06-27 17:02:02 +00005933
Benjamin Kramere003ca22015-10-28 13:54:16 +00005934namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005935struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005936 bool Synch = false;
5937 bool Asynch = false;
5938 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005939};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005940} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005941
5942/// /EH controls whether to run destructor cleanups when exceptions are
5943/// thrown. There are three modifiers:
5944/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5945/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5946/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005947/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005948/// The default is /EHs-c-, meaning cleanups are disabled.
5949static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5950 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005951
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005952 std::vector<std::string> EHArgs =
5953 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005954 for (auto EHVal : EHArgs) {
5955 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5956 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005957 case 'a':
5958 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005959 if (EH.Asynch)
5960 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005961 continue;
5962 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005963 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005964 continue;
5965 case 's':
5966 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005967 if (EH.Synch)
5968 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005969 continue;
5970 default:
5971 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005972 }
5973 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5974 break;
5975 }
5976 }
David Majnemerb8809092016-02-20 09:23:44 +00005977 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005978 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005979 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005980 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5981 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005982 EH.Synch = true;
5983 EH.NoUnwindC = true;
5984 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005985
Reid Klecknerc542d372014-06-27 17:02:02 +00005986 return EH;
5987}
5988
David Majnemercd5855e2016-02-29 01:40:36 +00005989void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
5990 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005991 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005992 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005993 unsigned RTOptionID = options::OPT__SLASH_MT;
5994
Hans Wennborgf1a74252013-09-10 20:18:04 +00005995 if (Args.hasArg(options::OPT__SLASH_LDd))
5996 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5997 // but defining _DEBUG is sticky.
5998 RTOptionID = options::OPT__SLASH_MTd;
5999
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006000 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006001 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006002
David Majnemere2afb472015-07-24 06:49:13 +00006003 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006004 switch (RTOptionID) {
6005 case options::OPT__SLASH_MD:
6006 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006007 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006008 CmdArgs.push_back("-D_MT");
6009 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006010 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006011 break;
6012 case options::OPT__SLASH_MDd:
6013 CmdArgs.push_back("-D_DEBUG");
6014 CmdArgs.push_back("-D_MT");
6015 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006016 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006017 break;
6018 case options::OPT__SLASH_MT:
6019 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006020 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006021 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006022 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006023 break;
6024 case options::OPT__SLASH_MTd:
6025 CmdArgs.push_back("-D_DEBUG");
6026 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006027 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006028 break;
6029 default:
6030 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006031 }
6032
David Majnemere2afb472015-07-24 06:49:13 +00006033 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6034 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6035 } else {
6036 CmdArgs.push_back(FlagForCRT.data());
6037
6038 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6039 // users want. The /Za flag to cl.exe turns this off, but it's not
6040 // implemented in clang.
6041 CmdArgs.push_back("--dependent-lib=oldnames");
6042 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006043
Hans Wennborg8858a032014-07-21 23:42:07 +00006044 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6045 // would produce interleaved output, so ignore /showIncludes in such cases.
6046 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6047 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6048 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006049
David Majnemerf6072342014-07-01 22:24:56 +00006050 // This controls whether or not we emit RTTI data for polymorphic types.
6051 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6052 /*default=*/false))
6053 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006054
Reid Kleckner124955a2015-08-05 18:51:13 +00006055 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006056 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006057 if (*EmitCodeView)
6058 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006059 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006060 CmdArgs.push_back("-gcodeview");
6061
Reid Klecknerc542d372014-06-27 17:02:02 +00006062 const Driver &D = getToolChain().getDriver();
6063 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006064 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006065 if (types::isCXX(InputType))
6066 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006067 CmdArgs.push_back("-fexceptions");
6068 }
David Majnemercd5855e2016-02-29 01:40:36 +00006069 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6070 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006071
Hans Wennborge50cec32014-06-13 20:59:54 +00006072 // /EP should expand to -E -P.
6073 if (Args.hasArg(options::OPT__SLASH_EP)) {
6074 CmdArgs.push_back("-E");
6075 CmdArgs.push_back("-P");
6076 }
6077
David Majnemera5b195a2015-02-14 01:35:12 +00006078 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006079 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6080 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006081 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6082 else
6083 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6084
6085 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6086 VolatileOptionID = A->getOption().getID();
6087
6088 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6089 CmdArgs.push_back("-fms-volatile");
6090
David Majnemer86c318f2014-02-11 21:05:00 +00006091 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6092 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6093 if (MostGeneralArg && BestCaseArg)
6094 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6095 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6096
6097 if (MostGeneralArg) {
6098 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6099 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6100 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6101
6102 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6103 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6104 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6105 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6106 << FirstConflict->getAsString(Args)
6107 << SecondConflict->getAsString(Args);
6108
6109 if (SingleArg)
6110 CmdArgs.push_back("-fms-memptr-rep=single");
6111 else if (MultipleArg)
6112 CmdArgs.push_back("-fms-memptr-rep=multiple");
6113 else
6114 CmdArgs.push_back("-fms-memptr-rep=virtual");
6115 }
6116
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006117 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6118 A->render(Args, CmdArgs);
6119
Hans Wennborg81f74482013-09-10 01:07:07 +00006120 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6121 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006122 if (Args.hasArg(options::OPT__SLASH_fallback))
6123 CmdArgs.push_back("msvc-fallback");
6124 else
6125 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006126 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006127}
6128
Douglas Katzman95354292015-06-23 20:42:09 +00006129visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006130 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006131 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006132 return CLFallback.get();
6133}
6134
Daniel Sanders7f933f42015-01-30 17:35:23 +00006135void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6136 ArgStringList &CmdArgs) const {
6137 StringRef CPUName;
6138 StringRef ABIName;
6139 const llvm::Triple &Triple = getToolChain().getTriple();
6140 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6141
6142 CmdArgs.push_back("-target-abi");
6143 CmdArgs.push_back(ABIName.data());
6144}
6145
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006146void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006147 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006148 const ArgList &Args,
6149 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006150 ArgStringList CmdArgs;
6151
6152 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6153 const InputInfo &Input = Inputs[0];
6154
James Y Knight2db38f32015-08-15 03:45:25 +00006155 std::string TripleStr =
6156 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6157 const llvm::Triple Triple(TripleStr);
6158
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006159 // Don't warn about "clang -w -c foo.s"
6160 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006161 // and "clang -emit-llvm -c foo.s"
6162 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006163
Rafael Espindola577637a2015-01-03 00:06:04 +00006164 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006165
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006166 // Invoke ourselves in -cc1as mode.
6167 //
6168 // FIXME: Implement custom jobs for internal actions.
6169 CmdArgs.push_back("-cc1as");
6170
6171 // Add the "effective" target triple.
6172 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006173 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6174
6175 // Set the output mode, we currently only expect to be used as a real
6176 // assembler.
6177 CmdArgs.push_back("-filetype");
6178 CmdArgs.push_back("obj");
6179
Eric Christopher45f2e712012-12-18 00:31:10 +00006180 // Set the main file name, so that debug info works even with
6181 // -save-temps or preprocessed assembly.
6182 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006183 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006184
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006185 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006186 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006187 if (!CPU.empty()) {
6188 CmdArgs.push_back("-target-cpu");
6189 CmdArgs.push_back(Args.MakeArgString(CPU));
6190 }
6191
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006192 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006193 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006194
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006195 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006196 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006197
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006198 // Pass along any -I options so we get proper .include search paths.
6199 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6200
Eric Christopherfc3ee562012-01-10 00:38:01 +00006201 // Determine the original source input.
6202 const Action *SourceAction = &JA;
6203 while (SourceAction->getKind() != Action::InputClass) {
6204 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6205 SourceAction = SourceAction->getInputs()[0];
6206 }
6207
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006208 // Forward -g and handle debug info related flags, assuming we are dealing
6209 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006210 if (SourceAction->getType() == types::TY_Asm ||
6211 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006212 bool WantDebug = false;
6213 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006214 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006215 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006216 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6217 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006218 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006219 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006220 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006221 if (DwarfVersion == 0)
6222 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006223 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006224 (WantDebug ? codegenoptions::LimitedDebugInfo
6225 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006226 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006227
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006228 // Add the -fdebug-compilation-dir flag if needed.
6229 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006230
6231 // Set the AT_producer to the clang version when using the integrated
6232 // assembler on assembly source files.
6233 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopesb741e102016-03-30 00:25:57 +00006234 std::string QuotedClangVersion("'" + getClangFullVersion() + "'");
6235 CmdArgs.push_back(Args.MakeArgString(QuotedClangVersion));
Renato Golina74bbc72015-07-22 15:32:36 +00006236
6237 // And pass along -I options
6238 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006239 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006240
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006241 // Handle -fPIC et al -- the relocation-model affects the assembler
6242 // for some targets.
6243 llvm::Reloc::Model RelocationModel;
6244 unsigned PICLevel;
6245 bool IsPIE;
6246 std::tie(RelocationModel, PICLevel, IsPIE) =
6247 ParsePICArgs(getToolChain(), Triple, Args);
6248
6249 const char *RMName = RelocationModelName(RelocationModel);
6250 if (RMName) {
6251 CmdArgs.push_back("-mrelocation-model");
6252 CmdArgs.push_back(RMName);
6253 }
6254
Kevin Enderby292dc082011-12-22 19:31:58 +00006255 // Optionally embed the -cc1as level arguments into the debug info, for build
6256 // analysis.
6257 if (getToolChain().UseDwarfDebugFlags()) {
6258 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006259 for (const auto &Arg : Args)
6260 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006261
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006262 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006263 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6264 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006265 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006266 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006267 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006268 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006269 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006270 }
6271 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006272 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006273 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006274
6275 // FIXME: Add -static support, once we have it.
6276
Daniel Sanders7f933f42015-01-30 17:35:23 +00006277 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006278 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006279 default:
6280 break;
6281
6282 case llvm::Triple::mips:
6283 case llvm::Triple::mipsel:
6284 case llvm::Triple::mips64:
6285 case llvm::Triple::mips64el:
6286 AddMIPSTargetArgs(Args, CmdArgs);
6287 break;
6288 }
6289
David Blaikie372d9502014-01-17 03:17:40 +00006290 // Consume all the warning flags. Usually this would be handled more
6291 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6292 // doesn't handle that so rather than warning about unused flags that are
6293 // actually used, we'll lie by omission instead.
6294 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006295 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006296
David Blaikie9260ed62013-07-25 21:19:01 +00006297 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6298 getToolChain().getDriver());
6299
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006300 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006301
6302 assert(Output.isFilename() && "Unexpected lipo output.");
6303 CmdArgs.push_back("-o");
6304 CmdArgs.push_back(Output.getFilename());
6305
Daniel Dunbarb440f562010-08-02 02:38:21 +00006306 assert(Input.isFilename() && "Invalid input.");
6307 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006308
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006309 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006310 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006311
6312 // Handle the debug info splitting at object creation time if we're
6313 // creating an object.
6314 // TODO: Currently only works on linux with newer objcopy.
6315 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006316 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006317 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006318 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006319}
6320
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006321void GnuTool::anchor() {}
6322
Daniel Dunbara3246a02009-03-18 08:07:30 +00006323void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006324 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006325 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006326 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006327 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006328 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006329
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006330 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006331 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006332 // It is unfortunate that we have to claim here, as this means
6333 // we will basically never report anything interesting for
6334 // platforms using a generic gcc, even if we are just using gcc
6335 // to get to the assembler.
6336 A->claim();
6337
Daniel Dunbar939c1212010-08-03 16:14:14 +00006338 // Don't forward any -g arguments to assembly steps.
6339 if (isa<AssembleJobAction>(JA) &&
6340 A->getOption().matches(options::OPT_g_Group))
6341 continue;
6342
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006343 // Don't forward any -W arguments to assembly and link steps.
6344 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6345 A->getOption().matches(options::OPT_W_Group))
6346 continue;
6347
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006348 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006349 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006350 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006351
Daniel Dunbar4e295052010-01-25 22:35:08 +00006352 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006353
6354 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006355 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006356 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006357 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006358 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006359 }
6360
Daniel Dunbar5716d872009-05-02 21:41:52 +00006361 // Try to force gcc to match the tool chain we want, if we recognize
6362 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006363 //
6364 // FIXME: The triple class should directly provide the information we want
6365 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006366 switch (getToolChain().getArch()) {
6367 default:
6368 break;
6369 case llvm::Triple::x86:
6370 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006371 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006372 break;
6373 case llvm::Triple::x86_64:
6374 case llvm::Triple::ppc64:
6375 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006376 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006377 break;
6378 case llvm::Triple::sparcel:
6379 CmdArgs.push_back("-EL");
6380 break;
6381 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006382
Daniel Dunbarb440f562010-08-02 02:38:21 +00006383 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006384 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006385 CmdArgs.push_back(Output.getFilename());
6386 } else {
6387 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006388 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006389 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006390
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006391 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006392
6393 // Only pass -x if gcc will understand it; otherwise hope gcc
6394 // understands the suffix correctly. The main use case this would go
6395 // wrong in is for linker inputs if they happened to have an odd
6396 // suffix; really the only way to get this to happen is a command
6397 // like '-x foobar a.c' which will treat a.c like a linker input.
6398 //
6399 // FIXME: For the linker case specifically, can we safely convert
6400 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006401 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006402 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006403 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006404 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006405 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006406 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006407 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006408 else if (II.getType() == types::TY_ModuleFile)
6409 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006410 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006411
Daniel Dunbara3246a02009-03-18 08:07:30 +00006412 if (types::canTypeBeUserSpecified(II.getType())) {
6413 CmdArgs.push_back("-x");
6414 CmdArgs.push_back(types::getTypeName(II.getType()));
6415 }
6416
Daniel Dunbarb440f562010-08-02 02:38:21 +00006417 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006418 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006419 else {
6420 const Arg &A = II.getInputArg();
6421
6422 // Reverse translate some rewritten options.
6423 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6424 CmdArgs.push_back("-lstdc++");
6425 continue;
6426 }
6427
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006428 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006429 A.render(Args, CmdArgs);
6430 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006431 }
6432
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006433 const std::string customGCCName = D.getCCCGenericGCCName();
6434 const char *GCCName;
6435 if (!customGCCName.empty())
6436 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006437 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006438 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006439 } else
6440 GCCName = "gcc";
6441
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006442 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006443 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006444}
6445
Douglas Katzman95354292015-06-23 20:42:09 +00006446void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6447 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006448 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006449}
6450
Douglas Katzman95354292015-06-23 20:42:09 +00006451void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6452 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006453 const Driver &D = getToolChain().getDriver();
6454
Eric Christophercc7ff502015-01-29 00:56:17 +00006455 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006456 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006457 case types::TY_LLVM_IR:
6458 case types::TY_LTO_IR:
6459 case types::TY_LLVM_BC:
6460 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006461 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006462 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006463 // We assume we've got an "integrated" assembler in that gcc will produce an
6464 // object file itself.
6465 case types::TY_Object:
6466 CmdArgs.push_back("-c");
6467 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006468 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006469 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006470 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006471 case types::TY_Nothing:
6472 CmdArgs.push_back("-fsyntax-only");
6473 break;
6474 default:
6475 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006476 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006477}
6478
Douglas Katzman95354292015-06-23 20:42:09 +00006479void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6480 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006481 // The types are (hopefully) good enough.
6482}
6483
Tony Linthicum76329bf2011-12-12 21:14:55 +00006484// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006485void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006486 ArgStringList &CmdArgs) const {
6487}
6488
Douglas Katzman95354292015-06-23 20:42:09 +00006489void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6490 const InputInfo &Output,
6491 const InputInfoList &Inputs,
6492 const ArgList &Args,
6493 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006494 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006495
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006496 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6497 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006498 ArgStringList CmdArgs;
6499
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006500 std::string MArchString = "-march=hexagon";
6501 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006502
6503 RenderExtraToolArgs(JA, CmdArgs);
6504
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006505 std::string AsName = "hexagon-llvm-mc";
6506 std::string MCpuString = "-mcpu=hexagon" +
6507 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6508 CmdArgs.push_back("-filetype=obj");
6509 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6510
Tony Linthicum76329bf2011-12-12 21:14:55 +00006511 if (Output.isFilename()) {
6512 CmdArgs.push_back("-o");
6513 CmdArgs.push_back(Output.getFilename());
6514 } else {
6515 assert(Output.isNothing() && "Unexpected output");
6516 CmdArgs.push_back("-fsyntax-only");
6517 }
6518
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006519 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6520 std::string N = llvm::utostr(G.getValue());
6521 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6522 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006523
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006524 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006525
Tony Linthicum76329bf2011-12-12 21:14:55 +00006526 // Only pass -x if gcc will understand it; otherwise hope gcc
6527 // understands the suffix correctly. The main use case this would go
6528 // wrong in is for linker inputs if they happened to have an odd
6529 // suffix; really the only way to get this to happen is a command
6530 // like '-x foobar a.c' which will treat a.c like a linker input.
6531 //
6532 // FIXME: For the linker case specifically, can we safely convert
6533 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006534 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006535 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006536 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006537 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006538 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006539 else if (II.getType() == types::TY_AST)
6540 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006541 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006542 else if (II.getType() == types::TY_ModuleFile)
6543 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006544 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006545
6546 if (II.isFilename())
6547 CmdArgs.push_back(II.getFilename());
6548 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006549 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006550 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006551 II.getInputArg().render(Args, CmdArgs);
6552 }
6553
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006554 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006555 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006556}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006557
Douglas Katzman95354292015-06-23 20:42:09 +00006558void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6559 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006560}
6561
Douglas Katzman54366072015-07-27 16:53:08 +00006562static void
6563constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006564 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006565 const InputInfo &Output, const InputInfoList &Inputs,
6566 const ArgList &Args, ArgStringList &CmdArgs,
6567 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006568
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006569 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006570
Matthew Curtise689b052012-12-06 15:46:07 +00006571 //----------------------------------------------------------------------------
6572 //
6573 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006574 bool IsStatic = Args.hasArg(options::OPT_static);
6575 bool IsShared = Args.hasArg(options::OPT_shared);
6576 bool IsPIE = Args.hasArg(options::OPT_pie);
6577 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6578 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6579 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6580 bool UseG0 = false;
6581 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006582
Matthew Curtise689b052012-12-06 15:46:07 +00006583 //----------------------------------------------------------------------------
6584 // Silence warnings for various options
6585 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006586 Args.ClaimAllArgs(options::OPT_g_Group);
6587 Args.ClaimAllArgs(options::OPT_emit_llvm);
6588 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6589 // handled somewhere else.
6590 Args.ClaimAllArgs(options::OPT_static_libgcc);
6591
6592 //----------------------------------------------------------------------------
6593 //
6594 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006595 if (Args.hasArg(options::OPT_s))
6596 CmdArgs.push_back("-s");
6597
6598 if (Args.hasArg(options::OPT_r))
6599 CmdArgs.push_back("-r");
6600
6601 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006602 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006603
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006604 CmdArgs.push_back("-march=hexagon");
6605 std::string CpuVer =
6606 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6607 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6608 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006609
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006610 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006611 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006612 // The following should be the default, but doing as hexagon-gcc does.
6613 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006614 }
6615
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006616 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006617 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006618
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006619 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006620 CmdArgs.push_back("-pie");
6621
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006622 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6623 std::string N = llvm::utostr(G.getValue());
6624 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6625 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006626 }
6627
Matthew Curtise689b052012-12-06 15:46:07 +00006628 //----------------------------------------------------------------------------
6629 //
6630 //----------------------------------------------------------------------------
6631 CmdArgs.push_back("-o");
6632 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006633
Matthew Curtise689b052012-12-06 15:46:07 +00006634 //----------------------------------------------------------------------------
6635 // moslib
6636 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006637 std::vector<std::string> OsLibs;
6638 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006639
Sean Silva14facf32015-06-09 01:57:17 +00006640 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6641 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006642 OsLibs.emplace_back(A->getValue());
6643 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006644 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006645 if (OsLibs.empty()) {
6646 OsLibs.push_back("standalone");
6647 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006648 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006649
Matthew Curtise689b052012-12-06 15:46:07 +00006650 //----------------------------------------------------------------------------
6651 // Start Files
6652 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006653 const std::string MCpuSuffix = "/" + CpuVer;
6654 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6655 const std::string RootDir =
6656 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6657 const std::string StartSubDir =
6658 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006659
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006660 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6661 const char *Name) -> std::string {
6662 std::string RelName = SubDir + Name;
6663 std::string P = HTC.GetFilePath(RelName.c_str());
6664 if (llvm::sys::fs::exists(P))
6665 return P;
6666 return RootDir + RelName;
6667 };
6668
6669 if (IncStdLib && IncStartFiles) {
6670 if (!IsShared) {
6671 if (HasStandalone) {
6672 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6673 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006674 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006675 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6676 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006677 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006678 std::string Init = UseShared
6679 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6680 : Find(RootDir, StartSubDir, "/init.o");
6681 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006682 }
6683
6684 //----------------------------------------------------------------------------
6685 // Library Search Paths
6686 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006687 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6688 for (const auto &LibPath : LibPaths)
6689 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006690
6691 //----------------------------------------------------------------------------
6692 //
6693 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006694 Args.AddAllArgs(CmdArgs,
6695 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6696 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006697
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006698 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006699
6700 //----------------------------------------------------------------------------
6701 // Libraries
6702 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006703 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006704 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006705 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006706 CmdArgs.push_back("-lm");
6707 }
6708
6709 CmdArgs.push_back("--start-group");
6710
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006711 if (!IsShared) {
6712 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006713 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006714 CmdArgs.push_back("-lc");
6715 }
6716 CmdArgs.push_back("-lgcc");
6717
6718 CmdArgs.push_back("--end-group");
6719 }
6720
6721 //----------------------------------------------------------------------------
6722 // End files
6723 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006724 if (IncStdLib && IncStartFiles) {
6725 std::string Fini = UseShared
6726 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6727 : Find(RootDir, StartSubDir, "/fini.o");
6728 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006729 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006730}
6731
Douglas Katzman95354292015-06-23 20:42:09 +00006732void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6733 const InputInfo &Output,
6734 const InputInfoList &Inputs,
6735 const ArgList &Args,
6736 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006737 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006738
6739 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006740 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006741 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006742
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006743 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006744 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006745 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006746}
6747// Hexagon tools end.
6748
Tom Stellard8fa33092015-07-18 01:49:05 +00006749void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6750 const InputInfo &Output,
6751 const InputInfoList &Inputs,
6752 const ArgList &Args,
6753 const char *LinkingOutput) const {
6754
6755 std::string Linker = getToolChain().GetProgramPath(getShortName());
6756 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006757 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellard8fa33092015-07-18 01:49:05 +00006758 CmdArgs.push_back(Output.getFilename());
6759 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6760 CmdArgs, Inputs));
6761}
6762// AMDGPU tools end.
6763
Dan Gohman52816862015-12-16 23:30:41 +00006764wasm::Linker::Linker(const ToolChain &TC)
6765 : GnuTool("wasm::Linker", "lld", TC) {}
6766
6767bool wasm::Linker::isLinkJob() const {
6768 return true;
6769}
6770
6771bool wasm::Linker::hasIntegratedCPP() const {
6772 return false;
6773}
6774
6775void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6776 const InputInfo &Output,
6777 const InputInfoList &Inputs,
6778 const ArgList &Args,
6779 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006780
6781 const ToolChain &ToolChain = getToolChain();
6782 const Driver &D = ToolChain.getDriver();
6783 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006784 ArgStringList CmdArgs;
6785 CmdArgs.push_back("-flavor");
6786 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006787
6788 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006789 // size is of particular importance. This is significantly facilitated by
6790 // the enabling of -ffunction-sections and -fdata-sections in
6791 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006792 if (areOptimizationsEnabled(Args))
6793 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006794
Dan Gohman57b62c52016-02-22 19:26:15 +00006795 if (Args.hasArg(options::OPT_rdynamic))
6796 CmdArgs.push_back("-export-dynamic");
6797 if (Args.hasArg(options::OPT_s))
6798 CmdArgs.push_back("--strip-all");
6799 if (Args.hasArg(options::OPT_shared))
6800 CmdArgs.push_back("-shared");
6801 if (Args.hasArg(options::OPT_static))
6802 CmdArgs.push_back("-Bstatic");
6803
6804 Args.AddAllArgs(CmdArgs, options::OPT_L);
6805 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6806
6807 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6808 if (Args.hasArg(options::OPT_shared))
6809 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6810 else if (Args.hasArg(options::OPT_pie))
6811 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6812 else
6813 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6814
6815 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6816 }
6817
6818 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6819
6820 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6821 if (D.CCCIsCXX())
6822 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6823
6824 if (Args.hasArg(options::OPT_pthread))
6825 CmdArgs.push_back("-lpthread");
6826
6827 CmdArgs.push_back("-lc");
6828 CmdArgs.push_back("-lcompiler_rt");
6829 }
6830
6831 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6832 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6833
Dan Gohman52816862015-12-16 23:30:41 +00006834 CmdArgs.push_back("-o");
6835 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006836
Dan Gohman52816862015-12-16 23:30:41 +00006837 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6838}
6839
Renato Golin7c542b42015-07-27 23:44:45 +00006840const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006841 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006842 if (!Arch.empty())
6843 MArch = Arch;
6844 else
Bernard Ogden31561762013-12-12 13:27:11 +00006845 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006846 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006847
6848 // Handle -march=native.
6849 if (MArch == "native") {
6850 std::string CPU = llvm::sys::getHostCPUName();
6851 if (CPU != "generic") {
6852 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006853 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006854 // If there is no valid architecture suffix for this CPU we don't know how
6855 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006856 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006857 MArch = "";
6858 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006859 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006860 }
6861 }
6862
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006863 return MArch;
6864}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006865
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006866/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006867StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006868 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006869 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6870 // here means an -march=native that we can't handle, so instead return no CPU.
6871 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006872 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006873
John Brawna95c1a82015-05-08 12:52:18 +00006874 // We need to return an empty string here on invalid MArch values as the
6875 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006876 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006877}
6878
6879/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006880std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006881 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006882 // FIXME: Warn on inconsistent use of -mcpu and -march.
6883 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006884 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006885 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006886 // Handle -mcpu=native.
6887 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006888 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006889 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006890 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006891 }
6892
Renato Goline17c5802015-07-27 23:44:42 +00006893 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006894}
6895
6896/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006897/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006898// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006899StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6900 const llvm::Triple &Triple) {
6901 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006902 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006903 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006904 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006905 if (ArchKind == llvm::ARM::AK_INVALID)
6906 // In case of generic Arch, i.e. "arm",
6907 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006908 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006909 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006910 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6911 // armv7k triple if it's actually been specified via "-arch armv7k".
6912 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006913 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006914 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006915 }
Renato Golin3c007252015-05-28 15:05:53 +00006916 if (ArchKind == llvm::ARM::AK_INVALID)
6917 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006918 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006919}
6920
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006921void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006922 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006923 if (Args.hasArg(options::OPT_r))
6924 return;
6925
John Brawn94fd9632015-05-21 12:19:49 +00006926 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6927 // to generate BE-8 executables.
6928 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6929 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006930}
6931
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006932mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006933 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6934 // was first introduced in Release 3. However, other compilers have
6935 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006936 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6937 .Case("mips1", NanLegacy)
6938 .Case("mips2", NanLegacy)
6939 .Case("mips3", NanLegacy)
6940 .Case("mips4", NanLegacy)
6941 .Case("mips5", NanLegacy)
6942 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006943 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006944 .Case("mips32r3", NanLegacy | Nan2008)
6945 .Case("mips32r5", NanLegacy | Nan2008)
6946 .Case("mips32r6", Nan2008)
6947 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006948 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006949 .Case("mips64r3", NanLegacy | Nan2008)
6950 .Case("mips64r5", NanLegacy | Nan2008)
6951 .Case("mips64r6", Nan2008)
6952 .Default(NanLegacy);
6953}
6954
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006955bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6956 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6957 return A && (A->getValue() == StringRef(Value));
6958}
6959
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006960bool mips::isUCLibc(const ArgList &Args) {
6961 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006962 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006963}
6964
Daniel Sanders2bf13662014-07-10 14:40:57 +00006965bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006966 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6967 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006968 .Case("2008", true)
6969 .Case("legacy", false)
6970 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006971
6972 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006973 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006974 .Cases("mips32r6", "mips64r6", true)
6975 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006976
6977 return false;
6978}
6979
Daniel Sanders379d44b2014-07-16 11:52:23 +00006980bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006981 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006982 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006983 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006984 return false;
6985
6986 if (ABIName != "32")
6987 return false;
6988
Toma Tabacu94ea6862015-06-16 13:54:13 +00006989 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6990 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006991 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006992 return false;
6993
Daniel Sanders379d44b2014-07-16 11:52:23 +00006994 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006995 .Cases("mips2", "mips3", "mips4", "mips5", true)
6996 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6997 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6998 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006999}
7000
Toma Tabacu94ea6862015-06-16 13:54:13 +00007001bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7002 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007003 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007004 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7005
7006 // FPXX shouldn't be used if -msingle-float is present.
7007 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7008 options::OPT_mdouble_float))
7009 if (A->getOption().matches(options::OPT_msingle_float))
7010 UseFPXX = false;
7011
7012 return UseFPXX;
7013}
7014
Tim Northover157d9112014-01-16 08:48:16 +00007015llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007016 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7017 // archs which Darwin doesn't use.
7018
7019 // The matching this routine does is fairly pointless, since it is neither the
7020 // complete architecture list, nor a reasonable subset. The problem is that
7021 // historically the driver driver accepts this and also ties its -march=
7022 // handling to the architecture name, so we need to be careful before removing
7023 // support for it.
7024
7025 // This code must be kept in sync with Clang's Darwin specific argument
7026 // translation.
7027
7028 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007029 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7030 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7031 .Case("ppc64", llvm::Triple::ppc64)
7032 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7033 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7034 llvm::Triple::x86)
7035 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7036 // This is derived from the driver driver.
7037 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7038 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7039 .Cases("armv7s", "xscale", llvm::Triple::arm)
7040 .Case("arm64", llvm::Triple::aarch64)
7041 .Case("r600", llvm::Triple::r600)
7042 .Case("amdgcn", llvm::Triple::amdgcn)
7043 .Case("nvptx", llvm::Triple::nvptx)
7044 .Case("nvptx64", llvm::Triple::nvptx64)
7045 .Case("amdil", llvm::Triple::amdil)
7046 .Case("spir", llvm::Triple::spir)
7047 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007048}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007049
Tim Northover157d9112014-01-16 08:48:16 +00007050void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007051 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007052 T.setArch(Arch);
7053
7054 if (Str == "x86_64h")
7055 T.setArchName(Str);
7056 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7057 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007058 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007059 }
7060}
7061
Bob Wilsondecc03e2012-11-23 06:14:39 +00007062const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007063 const InputInfo &Input) {
7064 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007065}
7066
Bob Wilsondecc03e2012-11-23 06:14:39 +00007067const char *Clang::getBaseInputStem(const ArgList &Args,
7068 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007069 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007070
Chris Lattner906bb902011-01-16 08:14:11 +00007071 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007072 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007073
7074 return Str;
7075}
7076
Bob Wilsondecc03e2012-11-23 06:14:39 +00007077const char *Clang::getDependencyFileName(const ArgList &Args,
7078 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007079 // FIXME: Think about this more.
7080 std::string Res;
7081
7082 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007083 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007084 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007085 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007086 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007087 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007088 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007089}
7090
Douglas Katzman95354292015-06-23 20:42:09 +00007091void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7092 const InputInfo &Output,
7093 const InputInfoList &Inputs,
7094 const ArgList &Args,
7095 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007096 const ToolChain &ToolChain = getToolChain();
7097 const Driver &D = ToolChain.getDriver();
7098 ArgStringList CmdArgs;
7099
7100 // Silence warning for "clang -g foo.o -o foo"
7101 Args.ClaimAllArgs(options::OPT_g_Group);
7102 // and "clang -emit-llvm foo.o -o foo"
7103 Args.ClaimAllArgs(options::OPT_emit_llvm);
7104 // and for "clang -w foo.o -o foo". Other warning options are already
7105 // handled somewhere else.
7106 Args.ClaimAllArgs(options::OPT_w);
7107
7108 if (!D.SysRoot.empty())
7109 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7110
7111 // CloudABI only supports static linkage.
7112 CmdArgs.push_back("-Bstatic");
7113 CmdArgs.push_back("--eh-frame-hdr");
7114 CmdArgs.push_back("--gc-sections");
7115
7116 if (Output.isFilename()) {
7117 CmdArgs.push_back("-o");
7118 CmdArgs.push_back(Output.getFilename());
7119 } else {
7120 assert(Output.isNothing() && "Invalid output.");
7121 }
7122
Douglas Katzman78b37b02015-11-17 20:28:07 +00007123 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007124 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7125 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7126 }
7127
7128 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007129 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007130 Args.AddAllArgs(CmdArgs,
7131 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7132 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007133
Teresa Johnson945bc502015-10-15 20:35:53 +00007134 if (D.isUsingLTO())
7135 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007136
7137 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7138
Douglas Katzman78b37b02015-11-17 20:28:07 +00007139 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007140 if (D.CCCIsCXX())
7141 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7142 CmdArgs.push_back("-lc");
7143 CmdArgs.push_back("-lcompiler_rt");
7144 }
7145
Douglas Katzman78b37b02015-11-17 20:28:07 +00007146 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007147 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7148
7149 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007150 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007151}
7152
Douglas Katzman95354292015-06-23 20:42:09 +00007153void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7154 const InputInfo &Output,
7155 const InputInfoList &Inputs,
7156 const ArgList &Args,
7157 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007158 ArgStringList CmdArgs;
7159
7160 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7161 const InputInfo &Input = Inputs[0];
7162
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007163 // Determine the original source input.
7164 const Action *SourceAction = &JA;
7165 while (SourceAction->getKind() != Action::InputClass) {
7166 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7167 SourceAction = SourceAction->getInputs()[0];
7168 }
7169
Eric Christopherf5a8f492015-12-08 00:10:10 +00007170 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007171 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007172 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7173 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007174 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007175 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007176 const llvm::Triple &T(getToolChain().getTriple());
7177 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007178 CmdArgs.push_back("-Q");
7179 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007180
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007181 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007182 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007183 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007184 if (Args.hasArg(options::OPT_gstabs))
7185 CmdArgs.push_back("--gstabs");
7186 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007187 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007188 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007189
Daniel Dunbarbe220842009-03-20 16:06:39 +00007190 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007191 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007192
Daniel Dunbar6d484762010-07-22 01:47:22 +00007193 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007194 if (getToolChain().getArch() == llvm::Triple::x86 ||
7195 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007196 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7197 CmdArgs.push_back("-force_cpusubtype_ALL");
7198
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007199 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007200 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007201 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007202 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007203 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007204 CmdArgs.push_back("-static");
7205
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007206 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007207
7208 assert(Output.isFilename() && "Unexpected lipo output.");
7209 CmdArgs.push_back("-o");
7210 CmdArgs.push_back(Output.getFilename());
7211
Daniel Dunbarb440f562010-08-02 02:38:21 +00007212 assert(Input.isFilename() && "Invalid input.");
7213 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007214
7215 // asm_final spec is empty.
7216
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007217 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007218 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007219}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007220
Tim Northover157d9112014-01-16 08:48:16 +00007221void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007222
Tim Northover157d9112014-01-16 08:48:16 +00007223void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7224 ArgStringList &CmdArgs) const {
7225 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007226
Daniel Dunbarc1964212009-03-26 16:23:12 +00007227 // Derived from darwin_arch spec.
7228 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007229 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007230
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007231 // FIXME: Is this needed anymore?
7232 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007233 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007234}
7235
Douglas Katzman95354292015-06-23 20:42:09 +00007236bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007237 // We only need to generate a temp path for LTO if we aren't compiling object
7238 // files. When compiling source files, we run 'dsymutil' after linking. We
7239 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007240 for (const auto &Input : Inputs)
7241 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007242 return true;
7243
7244 return false;
7245}
7246
Douglas Katzman95354292015-06-23 20:42:09 +00007247void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7248 ArgStringList &CmdArgs,
7249 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007250 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007251 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007252
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007253 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007254 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007255 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007256 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007257 }
7258
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007259 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007260 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007261 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7262 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007263
Bob Wilson3d27dad2013-08-02 22:25:34 +00007264 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7265 CmdArgs.push_back("-export_dynamic");
7266
Bob Wilsonb111ec92015-03-02 19:01:14 +00007267 // If we are using App Extension restrictions, pass a flag to the linker
7268 // telling it that the compiled code has been audited.
7269 if (Args.hasFlag(options::OPT_fapplication_extension,
7270 options::OPT_fno_application_extension, false))
7271 CmdArgs.push_back("-application_extension");
7272
Teresa Johnson945bc502015-10-15 20:35:53 +00007273 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007274 // If we are using LTO, then automatically create a temporary file path for
7275 // the linker to use, so that it's lifetime will extend past a possible
7276 // dsymutil step.
7277 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7278 const char *TmpPath = C.getArgs().MakeArgString(
7279 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7280 C.addTempFile(TmpPath);
7281 CmdArgs.push_back("-object_path_lto");
7282 CmdArgs.push_back(TmpPath);
7283 }
7284
7285 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7286 // it in clang installed libraries. If not found, the option is not used
7287 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7288 if (Version[0] >= 133) {
7289 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7290 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7291 SmallString<128> LibLTOPath(P);
7292 llvm::sys::path::append(LibLTOPath, "lib");
7293 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7294 if (llvm::sys::fs::exists(LibLTOPath)) {
7295 CmdArgs.push_back("-lto_library");
7296 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7297 } else {
7298 D.Diag(diag::warn_drv_lto_libpath);
7299 }
7300 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007301 }
7302
Daniel Dunbarc1964212009-03-26 16:23:12 +00007303 // Derived from the "link" spec.
7304 Args.AddAllArgs(CmdArgs, options::OPT_static);
7305 if (!Args.hasArg(options::OPT_static))
7306 CmdArgs.push_back("-dynamic");
7307 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7308 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7309 // here. How do we wish to handle such things?
7310 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007311
Daniel Dunbarc1964212009-03-26 16:23:12 +00007312 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007313 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007314 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007315 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007316
7317 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7318 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7319 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7320
7321 Arg *A;
7322 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7323 (A = Args.getLastArg(options::OPT_current__version)) ||
7324 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007325 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7326 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007327
7328 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7329 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7330 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7331 } else {
7332 CmdArgs.push_back("-dylib");
7333
7334 Arg *A;
7335 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7336 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7337 (A = Args.getLastArg(options::OPT_client__name)) ||
7338 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7339 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7340 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007341 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7342 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007343
Daniel Dunbarc1964212009-03-26 16:23:12 +00007344 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7345 "-dylib_compatibility_version");
7346 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7347 "-dylib_current_version");
7348
Tim Northover157d9112014-01-16 08:48:16 +00007349 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007350
7351 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7352 "-dylib_install_name");
7353 }
7354
7355 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7356 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7357 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007358 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007359 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007360 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7361 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7362 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7363 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7364 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7365 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007366 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007367 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7368 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7369 Args.AddAllArgs(CmdArgs, options::OPT_init);
7370
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007371 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007372 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007373
Daniel Dunbarc1964212009-03-26 16:23:12 +00007374 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7375 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7376 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7377 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7378 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007379
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007380 if (const Arg *A =
7381 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7382 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007383 if (A->getOption().matches(options::OPT_fpie) ||
7384 A->getOption().matches(options::OPT_fPIE))
7385 CmdArgs.push_back("-pie");
7386 else
7387 CmdArgs.push_back("-no_pie");
7388 }
Steven Wu574b0f22016-03-01 01:07:58 +00007389 // for embed-bitcode, use -bitcode_bundle in linker command
7390 if (C.getDriver().embedBitcodeEnabled() ||
7391 C.getDriver().embedBitcodeMarkerOnly()) {
7392 // Check if the toolchain supports bitcode build flow.
7393 if (MachOTC.SupportsEmbeddedBitcode())
7394 CmdArgs.push_back("-bitcode_bundle");
7395 else
7396 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7397 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007398
7399 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7400 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7401 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7402 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7403 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7404 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7405 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7406 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7407 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7408 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7409 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7410 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7411 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7412 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7413 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7414 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007415
Daniel Dunbar84384642011-05-02 21:03:47 +00007416 // Give --sysroot= preference, over the Apple specific behavior to also use
7417 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007418 StringRef sysroot = C.getSysRoot();
7419 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007420 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007421 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007422 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7423 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007424 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007425 }
7426
Daniel Dunbarc1964212009-03-26 16:23:12 +00007427 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7428 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7429 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7430 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7431 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007432 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007433 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7434 Args.AddAllArgs(CmdArgs, options::OPT_y);
7435 Args.AddLastArg(CmdArgs, options::OPT_w);
7436 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7437 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7438 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7439 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7440 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7441 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7442 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7443 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7444 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7445 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7446 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7447 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7448}
7449
Douglas Katzman95354292015-06-23 20:42:09 +00007450void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7451 const InputInfo &Output,
7452 const InputInfoList &Inputs,
7453 const ArgList &Args,
7454 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007455 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007456
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007457 // If the number of arguments surpasses the system limits, we will encode the
7458 // input files in a separate file, shortening the command line. To this end,
7459 // build a list of input file names that can be passed via a file with the
7460 // -filelist linker option.
7461 llvm::opt::ArgStringList InputFileList;
7462
Daniel Dunbarc1964212009-03-26 16:23:12 +00007463 // The logic here is derived from gcc's behavior; most of which
7464 // comes from specs (starting with link_command). Consult gcc for
7465 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007466 ArgStringList CmdArgs;
7467
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007468 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7469 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7470 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007471 for (const auto &Arg : Args)
7472 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007473 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007474 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007475 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007476 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007477 return;
7478 }
7479
Daniel Dunbarc1964212009-03-26 16:23:12 +00007480 // I'm not sure why this particular decomposition exists in gcc, but
7481 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007482 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007483
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007484 // It seems that the 'e' option is completely ignored for dynamic executables
7485 // (the default), and with static executables, the last one wins, as expected.
7486 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7487 options::OPT_Z_Flag, options::OPT_u_Group,
7488 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007489
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007490 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7491 // members of static archive libraries which implement Objective-C classes or
7492 // categories.
7493 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7494 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007495
Daniel Dunbarc1964212009-03-26 16:23:12 +00007496 CmdArgs.push_back("-o");
7497 CmdArgs.push_back(Output.getFilename());
7498
Douglas Katzman78b37b02015-11-17 20:28:07 +00007499 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007500 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007501
Peter Collingbournec4122c12015-06-15 21:08:13 +00007502 // SafeStack requires its own runtime libraries
7503 // These libraries should be linked first, to make sure the
7504 // __safestack_init constructor executes before everything else
7505 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7506 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7507 "libclang_rt.safestack_osx.a",
7508 /*AlwaysLink=*/true);
7509 }
7510
Daniel Dunbarc1964212009-03-26 16:23:12 +00007511 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007512
Douglas Gregor9295df02012-05-15 21:00:27 +00007513 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007514 // Build the input file for -filelist (list of linker input files) in case we
7515 // need it later
7516 for (const auto &II : Inputs) {
7517 if (!II.isFilename()) {
7518 // This is a linker input argument.
7519 // We cannot mix input arguments and file names in a -filelist input, thus
7520 // we prematurely stop our list (remaining files shall be passed as
7521 // arguments).
7522 if (InputFileList.size() > 0)
7523 break;
7524
7525 continue;
7526 }
7527
7528 InputFileList.push_back(II.getFilename());
7529 }
7530
Douglas Katzman78b37b02015-11-17 20:28:07 +00007531 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007532 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7533
Douglas Katzman78b37b02015-11-17 20:28:07 +00007534 if (isObjCRuntimeLinked(Args) &&
7535 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007536 // We use arclite library for both ARC and subscripting support.
7537 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7538
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007539 CmdArgs.push_back("-framework");
7540 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007541 // Link libobj.
7542 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007543 }
John McCall31168b02011-06-15 23:02:42 +00007544
Daniel Dunbarc1964212009-03-26 16:23:12 +00007545 if (LinkingOutput) {
7546 CmdArgs.push_back("-arch_multiple");
7547 CmdArgs.push_back("-final_output");
7548 CmdArgs.push_back(LinkingOutput);
7549 }
7550
Daniel Dunbarc1964212009-03-26 16:23:12 +00007551 if (Args.hasArg(options::OPT_fnested_functions))
7552 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007553
Justin Bognerc7701242015-05-12 05:44:36 +00007554 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7555
Douglas Katzman78b37b02015-11-17 20:28:07 +00007556 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007557 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007558 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007559
Daniel Dunbarc1964212009-03-26 16:23:12 +00007560 // link_ssp spec is empty.
7561
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007562 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007563 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007564 }
7565
Douglas Katzman78b37b02015-11-17 20:28:07 +00007566 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007567 // endfile_spec is empty.
7568 }
7569
7570 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7571 Args.AddAllArgs(CmdArgs, options::OPT_F);
7572
Steven Wu3ffb61b2015-02-06 18:08:29 +00007573 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007574 for (const Arg *A : Args.filtered(options::OPT_iframework))
7575 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007576
Douglas Katzman78b37b02015-11-17 20:28:07 +00007577 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007578 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7579 if (A->getValue() == StringRef("Accelerate")) {
7580 CmdArgs.push_back("-framework");
7581 CmdArgs.push_back("Accelerate");
7582 }
7583 }
7584 }
7585
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007586 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007587 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007588 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007589 Cmd->setInputFileList(std::move(InputFileList));
7590 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007591}
7592
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007593void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007594 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007595 const InputInfoList &Inputs,
7596 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007597 const char *LinkingOutput) const {
7598 ArgStringList CmdArgs;
7599
7600 CmdArgs.push_back("-create");
7601 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007602
7603 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007604 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007605
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007606 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007607 assert(II.isFilename() && "Unexpected lipo input.");
7608 CmdArgs.push_back(II.getFilename());
7609 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007610
7611 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007612 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007613}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007614
Daniel Dunbar88299622010-06-04 18:28:36 +00007615void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007616 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007617 const InputInfoList &Inputs,
7618 const ArgList &Args,
7619 const char *LinkingOutput) const {
7620 ArgStringList CmdArgs;
7621
Daniel Dunbareb86b042011-05-09 17:23:16 +00007622 CmdArgs.push_back("-o");
7623 CmdArgs.push_back(Output.getFilename());
7624
Daniel Dunbar88299622010-06-04 18:28:36 +00007625 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7626 const InputInfo &Input = Inputs[0];
7627 assert(Input.isFilename() && "Unexpected dsymutil input.");
7628 CmdArgs.push_back(Input.getFilename());
7629
Daniel Dunbar88299622010-06-04 18:28:36 +00007630 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007631 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007632 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007633}
7634
Eric Christopher551ef452011-08-23 17:56:55 +00007635void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007636 const InputInfo &Output,
7637 const InputInfoList &Inputs,
7638 const ArgList &Args,
7639 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007640 ArgStringList CmdArgs;
7641 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007642 CmdArgs.push_back("--debug-info");
7643 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007644 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007645
7646 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7647 const InputInfo &Input = Inputs[0];
7648 assert(Input.isFilename() && "Unexpected verify input");
7649
7650 // Grabbing the output of the earlier dsymutil run.
7651 CmdArgs.push_back(Input.getFilename());
7652
7653 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007654 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007655 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007656}
7657
Douglas Katzman95354292015-06-23 20:42:09 +00007658void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007659 const InputInfo &Output,
7660 const InputInfoList &Inputs,
7661 const ArgList &Args,
7662 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007663 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007664 ArgStringList CmdArgs;
7665
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007666 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007667
7668 CmdArgs.push_back("-o");
7669 CmdArgs.push_back(Output.getFilename());
7670
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007671 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007672 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007673
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007674 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007675 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007676}
7677
Douglas Katzman95354292015-06-23 20:42:09 +00007678void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7679 const InputInfo &Output,
7680 const InputInfoList &Inputs,
7681 const ArgList &Args,
7682 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007683 ArgStringList CmdArgs;
7684
David Chisnall272a0712012-02-29 15:06:12 +00007685 // Demangle C++ names in errors
7686 CmdArgs.push_back("-C");
7687
Douglas Katzman78b37b02015-11-17 20:28:07 +00007688 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007689 CmdArgs.push_back("-e");
7690 CmdArgs.push_back("_start");
7691 }
7692
7693 if (Args.hasArg(options::OPT_static)) {
7694 CmdArgs.push_back("-Bstatic");
7695 CmdArgs.push_back("-dn");
7696 } else {
7697 CmdArgs.push_back("-Bdynamic");
7698 if (Args.hasArg(options::OPT_shared)) {
7699 CmdArgs.push_back("-shared");
7700 } else {
7701 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007702 CmdArgs.push_back(
7703 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007704 }
7705 }
7706
7707 if (Output.isFilename()) {
7708 CmdArgs.push_back("-o");
7709 CmdArgs.push_back(Output.getFilename());
7710 } else {
7711 assert(Output.isNothing() && "Invalid output.");
7712 }
7713
Douglas Katzman78b37b02015-11-17 20:28:07 +00007714 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007715 if (!Args.hasArg(options::OPT_shared))
7716 CmdArgs.push_back(
7717 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7718
7719 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7720 CmdArgs.push_back(
7721 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7722 CmdArgs.push_back(
7723 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007724 }
7725
Douglas Katzman6059ef92015-11-17 17:41:23 +00007726 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007727
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007728 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7729 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007730
7731 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7732
Douglas Katzman78b37b02015-11-17 20:28:07 +00007733 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007734 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007735 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007736 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007737 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007738 if (!Args.hasArg(options::OPT_shared)) {
7739 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007740 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007741 }
David Chisnallf571cde2012-02-15 13:39:01 +00007742 }
7743
Douglas Katzman78b37b02015-11-17 20:28:07 +00007744 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007745 CmdArgs.push_back(
7746 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007747 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007748 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007749
Xinliang David Li69306c02015-10-22 06:15:31 +00007750 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007752 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007753 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007754}
7755
Douglas Katzman95354292015-06-23 20:42:09 +00007756void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7757 const InputInfo &Output,
7758 const InputInfoList &Inputs,
7759 const ArgList &Args,
7760 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007761 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007762 ArgStringList CmdArgs;
7763
Rafael Espindolacc126272014-02-28 01:55:21 +00007764 switch (getToolChain().getArch()) {
7765 case llvm::Triple::x86:
7766 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7767 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007768 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007769 break;
7770
7771 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007772 CmdArgs.push_back("-mppc");
7773 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007774 break;
7775
7776 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007777 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007778 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007779 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7780 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7781 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007782 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007783 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007784
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007785 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007786 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007787 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7788 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7789 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007790 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007791 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007792
7793 case llvm::Triple::mips64:
7794 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007795 StringRef CPUName;
7796 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007797 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007798
7799 CmdArgs.push_back("-mabi");
7800 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7801
7802 if (getToolChain().getArch() == llvm::Triple::mips64)
7803 CmdArgs.push_back("-EB");
7804 else
7805 CmdArgs.push_back("-EL");
7806
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007807 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007808 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007809 }
7810
Rafael Espindolacc126272014-02-28 01:55:21 +00007811 default:
7812 break;
7813 }
7814
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007815 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007816
7817 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007818 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007819
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007820 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007821 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007822
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007823 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007824 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007825}
7826
Douglas Katzman95354292015-06-23 20:42:09 +00007827void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7828 const InputInfo &Output,
7829 const InputInfoList &Inputs,
7830 const ArgList &Args,
7831 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007832 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007833 ArgStringList CmdArgs;
7834
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007835 // Silence warning for "clang -g foo.o -o foo"
7836 Args.ClaimAllArgs(options::OPT_g_Group);
7837 // and "clang -emit-llvm foo.o -o foo"
7838 Args.ClaimAllArgs(options::OPT_emit_llvm);
7839 // and for "clang -w foo.o -o foo". Other warning options are already
7840 // handled somewhere else.
7841 Args.ClaimAllArgs(options::OPT_w);
7842
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007843 if (getToolChain().getArch() == llvm::Triple::mips64)
7844 CmdArgs.push_back("-EB");
7845 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7846 CmdArgs.push_back("-EL");
7847
Douglas Katzman78b37b02015-11-17 20:28:07 +00007848 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007849 CmdArgs.push_back("-e");
7850 CmdArgs.push_back("__start");
7851 }
7852
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007853 if (Args.hasArg(options::OPT_static)) {
7854 CmdArgs.push_back("-Bstatic");
7855 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007856 if (Args.hasArg(options::OPT_rdynamic))
7857 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007858 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007859 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007860 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007861 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007862 } else {
7863 CmdArgs.push_back("-dynamic-linker");
7864 CmdArgs.push_back("/usr/libexec/ld.so");
7865 }
7866 }
7867
Rafael Espindola044f7832013-06-05 04:28:55 +00007868 if (Args.hasArg(options::OPT_nopie))
7869 CmdArgs.push_back("-nopie");
7870
Daniel Dunbarb440f562010-08-02 02:38:21 +00007871 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007872 CmdArgs.push_back("-o");
7873 CmdArgs.push_back(Output.getFilename());
7874 } else {
7875 assert(Output.isNothing() && "Invalid output.");
7876 }
7877
Douglas Katzman78b37b02015-11-17 20:28:07 +00007878 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007879 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007880 if (Args.hasArg(options::OPT_pg))
7881 CmdArgs.push_back(
7882 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007883 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007884 CmdArgs.push_back(
7885 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7886 CmdArgs.push_back(
7887 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007888 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007889 CmdArgs.push_back(
7890 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007891 }
7892 }
7893
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007894 std::string Triple = getToolChain().getTripleString();
7895 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007896 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007897 CmdArgs.push_back(
7898 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007899
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007900 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7901 options::OPT_e, options::OPT_s, options::OPT_t,
7902 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007903
Daniel Dunbar54423b22010-09-17 00:24:54 +00007904 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007905
Douglas Katzman78b37b02015-11-17 20:28:07 +00007906 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007907 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007908 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007909 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007910 CmdArgs.push_back("-lm_p");
7911 else
7912 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007913 }
7914
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007915 // FIXME: For some reason GCC passes -lgcc before adding
7916 // the default system libraries. Just mimic this for now.
7917 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007918
Eric Christopher17674ec2012-09-13 06:32:34 +00007919 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007920 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7921 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007922 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007923 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007924 }
7925
Chandler Carruth45661652011-12-17 22:32:42 +00007926 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007927 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007928 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007929 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007930 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007931 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007932
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007933 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007934 }
7935
Douglas Katzman78b37b02015-11-17 20:28:07 +00007936 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007937 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007938 CmdArgs.push_back(
7939 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007940 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007941 CmdArgs.push_back(
7942 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007943 }
7944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007945 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007946 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007947}
Ed Schoutene33194b2009-04-02 19:13:12 +00007948
Douglas Katzman95354292015-06-23 20:42:09 +00007949void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7950 const InputInfo &Output,
7951 const InputInfoList &Inputs,
7952 const ArgList &Args,
7953 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007954 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007955 ArgStringList CmdArgs;
7956
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007957 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007958
7959 CmdArgs.push_back("-o");
7960 CmdArgs.push_back(Output.getFilename());
7961
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007962 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007963 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007964
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007965 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007966 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007967}
7968
Douglas Katzman95354292015-06-23 20:42:09 +00007969void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7970 const InputInfo &Output,
7971 const InputInfoList &Inputs,
7972 const ArgList &Args,
7973 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007974 const Driver &D = getToolChain().getDriver();
7975 ArgStringList CmdArgs;
7976
Douglas Katzman78b37b02015-11-17 20:28:07 +00007977 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007978 CmdArgs.push_back("-e");
7979 CmdArgs.push_back("__start");
7980 }
7981
7982 if (Args.hasArg(options::OPT_static)) {
7983 CmdArgs.push_back("-Bstatic");
7984 } else {
7985 if (Args.hasArg(options::OPT_rdynamic))
7986 CmdArgs.push_back("-export-dynamic");
7987 CmdArgs.push_back("--eh-frame-hdr");
7988 CmdArgs.push_back("-Bdynamic");
7989 if (Args.hasArg(options::OPT_shared)) {
7990 CmdArgs.push_back("-shared");
7991 } else {
7992 CmdArgs.push_back("-dynamic-linker");
7993 CmdArgs.push_back("/usr/libexec/ld.so");
7994 }
7995 }
7996
7997 if (Output.isFilename()) {
7998 CmdArgs.push_back("-o");
7999 CmdArgs.push_back(Output.getFilename());
8000 } else {
8001 assert(Output.isNothing() && "Invalid output.");
8002 }
8003
Douglas Katzman78b37b02015-11-17 20:28:07 +00008004 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008005 if (!Args.hasArg(options::OPT_shared)) {
8006 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008007 CmdArgs.push_back(
8008 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008009 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008010 CmdArgs.push_back(
8011 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8012 CmdArgs.push_back(
8013 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008014 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008015 CmdArgs.push_back(
8016 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008017 }
8018 }
8019
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008020 Args.AddAllArgs(CmdArgs,
8021 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008022
8023 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8024
Douglas Katzman78b37b02015-11-17 20:28:07 +00008025 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008026 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008027 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8028 if (Args.hasArg(options::OPT_pg))
8029 CmdArgs.push_back("-lm_p");
8030 else
8031 CmdArgs.push_back("-lm");
8032 }
8033
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008034 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008035 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008036 CmdArgs.push_back("-lpthread_p");
8037 else
8038 CmdArgs.push_back("-lpthread");
8039 }
8040
Eli Friedman9fa28852012-08-08 23:57:20 +00008041 if (!Args.hasArg(options::OPT_shared)) {
8042 if (Args.hasArg(options::OPT_pg))
8043 CmdArgs.push_back("-lc_p");
8044 else
8045 CmdArgs.push_back("-lc");
8046 }
8047
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008048 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008049 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008050 case llvm::Triple::arm:
8051 MyArch = "arm";
8052 break;
8053 case llvm::Triple::x86:
8054 MyArch = "i386";
8055 break;
8056 case llvm::Triple::x86_64:
8057 MyArch = "amd64";
8058 break;
8059 default:
8060 llvm_unreachable("Unsupported architecture");
8061 }
8062 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008063 }
8064
Douglas Katzman78b37b02015-11-17 20:28:07 +00008065 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008066 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008067 CmdArgs.push_back(
8068 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008069 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008070 CmdArgs.push_back(
8071 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008072 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008073
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008074 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008075 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008076}
8077
Douglas Katzman95354292015-06-23 20:42:09 +00008078void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8079 const InputInfo &Output,
8080 const InputInfoList &Inputs,
8081 const ArgList &Args,
8082 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008083 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008084 ArgStringList CmdArgs;
8085
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008086 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8087 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008088 switch (getToolChain().getArch()) {
8089 default:
8090 break;
8091 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008092 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008093 break;
8094 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008095 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008096 break;
8097 case llvm::Triple::mips:
8098 case llvm::Triple::mipsel:
8099 case llvm::Triple::mips64:
8100 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008101 StringRef CPUName;
8102 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008103 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008104
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008105 CmdArgs.push_back("-march");
8106 CmdArgs.push_back(CPUName.data());
8107
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008108 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008109 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008110
8111 if (getToolChain().getArch() == llvm::Triple::mips ||
8112 getToolChain().getArch() == llvm::Triple::mips64)
8113 CmdArgs.push_back("-EB");
8114 else
8115 CmdArgs.push_back("-EL");
8116
Dimitry Andric46f338c2015-12-27 10:36:44 +00008117 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8118 StringRef v = A->getValue();
8119 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8120 A->claim();
8121 }
8122
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008123 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008124 break;
8125 }
8126 case llvm::Triple::arm:
8127 case llvm::Triple::armeb:
8128 case llvm::Triple::thumb:
8129 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008130 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008131
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008132 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008133 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008134 else
Renato Golinf4421f72014-02-19 10:44:07 +00008135 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008136
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008137 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008138 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008139 case llvm::Triple::GNUEABI:
8140 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008141 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008142 break;
8143
8144 default:
8145 CmdArgs.push_back("-matpcs");
8146 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008147 break;
8148 }
8149 case llvm::Triple::sparc:
8150 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008151 case llvm::Triple::sparcv9: {
8152 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8153 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008154 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008155 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008156 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008157 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008158
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008159 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008160
8161 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008162 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008163
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008164 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008165 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008166
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008167 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008168 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008169}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008170
Douglas Katzman95354292015-06-23 20:42:09 +00008171void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8172 const InputInfo &Output,
8173 const InputInfoList &Inputs,
8174 const ArgList &Args,
8175 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008176 const toolchains::FreeBSD &ToolChain =
8177 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008178 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008179 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008180 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008181 !Args.hasArg(options::OPT_shared) &&
8182 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008183 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008184
8185 // Silence warning for "clang -g foo.o -o foo"
8186 Args.ClaimAllArgs(options::OPT_g_Group);
8187 // and "clang -emit-llvm foo.o -o foo"
8188 Args.ClaimAllArgs(options::OPT_emit_llvm);
8189 // and for "clang -w foo.o -o foo". Other warning options are already
8190 // handled somewhere else.
8191 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008192
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008193 if (!D.SysRoot.empty())
8194 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8195
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008196 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008197 CmdArgs.push_back("-pie");
8198
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008199 if (Args.hasArg(options::OPT_static)) {
8200 CmdArgs.push_back("-Bstatic");
8201 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008202 if (Args.hasArg(options::OPT_rdynamic))
8203 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008204 CmdArgs.push_back("--eh-frame-hdr");
8205 if (Args.hasArg(options::OPT_shared)) {
8206 CmdArgs.push_back("-Bshareable");
8207 } else {
8208 CmdArgs.push_back("-dynamic-linker");
8209 CmdArgs.push_back("/libexec/ld-elf.so.1");
8210 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008211 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008212 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8213 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8214 CmdArgs.push_back("--hash-style=both");
8215 }
8216 }
8217 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008218 }
8219
8220 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8221 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008222 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008223 CmdArgs.push_back("-m");
8224 CmdArgs.push_back("elf_i386_fbsd");
8225 }
8226
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008227 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008228 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008229 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008230 }
8231
Dimitry Andric904895f2015-12-27 06:47:09 +00008232 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8233 if (ToolChain.getArch() == llvm::Triple::mips ||
8234 ToolChain.getArch() == llvm::Triple::mipsel ||
8235 ToolChain.getArch() == llvm::Triple::mips64 ||
8236 ToolChain.getArch() == llvm::Triple::mips64el) {
8237 StringRef v = A->getValue();
8238 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8239 A->claim();
8240 }
8241 }
8242
Daniel Dunbarb440f562010-08-02 02:38:21 +00008243 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008244 CmdArgs.push_back("-o");
8245 CmdArgs.push_back(Output.getFilename());
8246 } else {
8247 assert(Output.isNothing() && "Invalid output.");
8248 }
8249
Douglas Katzman78b37b02015-11-17 20:28:07 +00008250 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008251 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008252 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008253 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008254 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008255 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008256 crt1 = "Scrt1.o";
8257 else
8258 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008259 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008260 if (crt1)
8261 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8262
8263 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8264
Craig Topper92fc2df2014-05-17 16:56:41 +00008265 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008266 if (Args.hasArg(options::OPT_static))
8267 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008268 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008269 crtbegin = "crtbeginS.o";
8270 else
8271 crtbegin = "crtbegin.o";
8272
8273 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008274 }
8275
8276 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008277 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008278 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8279 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008280 Args.AddAllArgs(CmdArgs, options::OPT_s);
8281 Args.AddAllArgs(CmdArgs, options::OPT_t);
8282 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8283 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008284
Teresa Johnson945bc502015-10-15 20:35:53 +00008285 if (D.isUsingLTO())
8286 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008287
Alexey Samsonov52550342014-09-15 19:58:40 +00008288 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008289 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008290
Douglas Katzman78b37b02015-11-17 20:28:07 +00008291 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008292 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008293 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008294 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008295 if (Args.hasArg(options::OPT_pg))
8296 CmdArgs.push_back("-lm_p");
8297 else
8298 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008299 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008300 if (NeedsSanitizerDeps)
8301 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008302 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8303 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008304 if (Args.hasArg(options::OPT_pg))
8305 CmdArgs.push_back("-lgcc_p");
8306 else
8307 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008308 if (Args.hasArg(options::OPT_static)) {
8309 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008310 } else if (Args.hasArg(options::OPT_pg)) {
8311 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008312 } else {
8313 CmdArgs.push_back("--as-needed");
8314 CmdArgs.push_back("-lgcc_s");
8315 CmdArgs.push_back("--no-as-needed");
8316 }
8317
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008318 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008319 if (Args.hasArg(options::OPT_pg))
8320 CmdArgs.push_back("-lpthread_p");
8321 else
8322 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008323 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008324
Roman Divacky66f22762011-02-10 16:59:40 +00008325 if (Args.hasArg(options::OPT_pg)) {
8326 if (Args.hasArg(options::OPT_shared))
8327 CmdArgs.push_back("-lc");
8328 else
8329 CmdArgs.push_back("-lc_p");
8330 CmdArgs.push_back("-lgcc_p");
8331 } else {
8332 CmdArgs.push_back("-lc");
8333 CmdArgs.push_back("-lgcc");
8334 }
8335
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008336 if (Args.hasArg(options::OPT_static)) {
8337 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008338 } else if (Args.hasArg(options::OPT_pg)) {
8339 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008340 } else {
8341 CmdArgs.push_back("--as-needed");
8342 CmdArgs.push_back("-lgcc_s");
8343 CmdArgs.push_back("--no-as-needed");
8344 }
8345 }
8346
Douglas Katzman78b37b02015-11-17 20:28:07 +00008347 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008348 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008349 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008350 else
8351 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008352 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008353 }
8354
Xinliang David Li69306c02015-10-22 06:15:31 +00008355 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008356
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008357 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008358 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008359}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008360
Douglas Katzman95354292015-06-23 20:42:09 +00008361void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008362 const InputInfo &Output,
8363 const InputInfoList &Inputs,
8364 const ArgList &Args,
8365 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008366 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008367 ArgStringList CmdArgs;
8368
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008369 // GNU as needs different flags for creating the correct output format
8370 // on architectures with different ABIs or optional feature sets.
8371 switch (getToolChain().getArch()) {
8372 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008373 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008374 break;
8375 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008376 case llvm::Triple::armeb:
8377 case llvm::Triple::thumb:
8378 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008379 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008380 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8381 std::string Arch =
8382 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008383 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008384 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008385 }
8386
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008387 case llvm::Triple::mips:
8388 case llvm::Triple::mipsel:
8389 case llvm::Triple::mips64:
8390 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008391 StringRef CPUName;
8392 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008393 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008394
8395 CmdArgs.push_back("-march");
8396 CmdArgs.push_back(CPUName.data());
8397
8398 CmdArgs.push_back("-mabi");
8399 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8400
8401 if (getToolChain().getArch() == llvm::Triple::mips ||
8402 getToolChain().getArch() == llvm::Triple::mips64)
8403 CmdArgs.push_back("-EB");
8404 else
8405 CmdArgs.push_back("-EL");
8406
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008407 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008408 break;
8409 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008410
8411 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008412 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008413 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008414 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8415 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008416 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008417 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008418 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008419
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008420 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008421 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008422 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8423 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008424 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008425 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008426 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008427
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008428 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008429 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008430 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008431
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008432 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008433
8434 CmdArgs.push_back("-o");
8435 CmdArgs.push_back(Output.getFilename());
8436
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008437 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008438 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008439
David Chisnallddbd68f2011-09-27 22:03:18 +00008440 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008441 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008442}
8443
Douglas Katzman95354292015-06-23 20:42:09 +00008444void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8445 const InputInfo &Output,
8446 const InputInfoList &Inputs,
8447 const ArgList &Args,
8448 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008449 const Driver &D = getToolChain().getDriver();
8450 ArgStringList CmdArgs;
8451
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008452 if (!D.SysRoot.empty())
8453 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8454
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008455 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008456 if (Args.hasArg(options::OPT_static)) {
8457 CmdArgs.push_back("-Bstatic");
8458 } else {
8459 if (Args.hasArg(options::OPT_rdynamic))
8460 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008461 if (Args.hasArg(options::OPT_shared)) {
8462 CmdArgs.push_back("-Bshareable");
8463 } else {
8464 CmdArgs.push_back("-dynamic-linker");
8465 CmdArgs.push_back("/libexec/ld.elf_so");
8466 }
8467 }
8468
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008469 // Many NetBSD architectures support more than one ABI.
8470 // Determine the correct emulation for ld.
8471 switch (getToolChain().getArch()) {
8472 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008473 CmdArgs.push_back("-m");
8474 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008475 break;
8476 case llvm::Triple::arm:
8477 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008478 CmdArgs.push_back("-m");
8479 switch (getToolChain().getTriple().getEnvironment()) {
8480 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008481 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008482 CmdArgs.push_back("armelf_nbsd_eabi");
8483 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008484 case llvm::Triple::EABIHF:
8485 case llvm::Triple::GNUEABIHF:
8486 CmdArgs.push_back("armelf_nbsd_eabihf");
8487 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008488 default:
8489 CmdArgs.push_back("armelf_nbsd");
8490 break;
8491 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008492 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008493 case llvm::Triple::armeb:
8494 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008495 arm::appendEBLinkFlags(
8496 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008497 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008498 CmdArgs.push_back("-m");
8499 switch (getToolChain().getTriple().getEnvironment()) {
8500 case llvm::Triple::EABI:
8501 case llvm::Triple::GNUEABI:
8502 CmdArgs.push_back("armelfb_nbsd_eabi");
8503 break;
8504 case llvm::Triple::EABIHF:
8505 case llvm::Triple::GNUEABIHF:
8506 CmdArgs.push_back("armelfb_nbsd_eabihf");
8507 break;
8508 default:
8509 CmdArgs.push_back("armelfb_nbsd");
8510 break;
8511 }
8512 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008513 case llvm::Triple::mips64:
8514 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008515 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008516 CmdArgs.push_back("-m");
8517 if (getToolChain().getArch() == llvm::Triple::mips64)
8518 CmdArgs.push_back("elf32btsmip");
8519 else
8520 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008521 } else if (mips::hasMipsAbiArg(Args, "64")) {
8522 CmdArgs.push_back("-m");
8523 if (getToolChain().getArch() == llvm::Triple::mips64)
8524 CmdArgs.push_back("elf64btsmip");
8525 else
8526 CmdArgs.push_back("elf64ltsmip");
8527 }
8528 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008529 case llvm::Triple::ppc:
8530 CmdArgs.push_back("-m");
8531 CmdArgs.push_back("elf32ppc_nbsd");
8532 break;
8533
8534 case llvm::Triple::ppc64:
8535 case llvm::Triple::ppc64le:
8536 CmdArgs.push_back("-m");
8537 CmdArgs.push_back("elf64ppc");
8538 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008539
8540 case llvm::Triple::sparc:
8541 CmdArgs.push_back("-m");
8542 CmdArgs.push_back("elf32_sparc");
8543 break;
8544
8545 case llvm::Triple::sparcv9:
8546 CmdArgs.push_back("-m");
8547 CmdArgs.push_back("elf64_sparc");
8548 break;
8549
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008550 default:
8551 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008552 }
8553
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008554 if (Output.isFilename()) {
8555 CmdArgs.push_back("-o");
8556 CmdArgs.push_back(Output.getFilename());
8557 } else {
8558 assert(Output.isNothing() && "Invalid output.");
8559 }
8560
Douglas Katzman78b37b02015-11-17 20:28:07 +00008561 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008562 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008563 CmdArgs.push_back(
8564 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8565 CmdArgs.push_back(
8566 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8567 CmdArgs.push_back(
8568 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008569 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008570 CmdArgs.push_back(
8571 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8572 CmdArgs.push_back(
8573 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008574 }
8575 }
8576
8577 Args.AddAllArgs(CmdArgs, options::OPT_L);
8578 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8579 Args.AddAllArgs(CmdArgs, options::OPT_e);
8580 Args.AddAllArgs(CmdArgs, options::OPT_s);
8581 Args.AddAllArgs(CmdArgs, options::OPT_t);
8582 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8583 Args.AddAllArgs(CmdArgs, options::OPT_r);
8584
8585 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8586
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008587 unsigned Major, Minor, Micro;
8588 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8589 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008590 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008591 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008592 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008593 case llvm::Triple::arm:
8594 case llvm::Triple::armeb:
8595 case llvm::Triple::thumb:
8596 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008597 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008598 case llvm::Triple::ppc64:
8599 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008600 case llvm::Triple::sparc:
8601 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008602 case llvm::Triple::x86:
8603 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008604 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008605 break;
8606 default:
8607 break;
8608 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008609 }
8610
Douglas Katzman78b37b02015-11-17 20:28:07 +00008611 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008612 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008613 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008614 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8615 CmdArgs.push_back("-lm");
8616 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008617 if (Args.hasArg(options::OPT_pthread))
8618 CmdArgs.push_back("-lpthread");
8619 CmdArgs.push_back("-lc");
8620
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008621 if (useLibgcc) {
8622 if (Args.hasArg(options::OPT_static)) {
8623 // libgcc_eh depends on libc, so resolve as much as possible,
8624 // pull in any new requirements from libc and then get the rest
8625 // of libgcc.
8626 CmdArgs.push_back("-lgcc_eh");
8627 CmdArgs.push_back("-lc");
8628 CmdArgs.push_back("-lgcc");
8629 } else {
8630 CmdArgs.push_back("-lgcc");
8631 CmdArgs.push_back("--as-needed");
8632 CmdArgs.push_back("-lgcc_s");
8633 CmdArgs.push_back("--no-as-needed");
8634 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008635 }
8636 }
8637
Douglas Katzman78b37b02015-11-17 20:28:07 +00008638 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008639 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008640 CmdArgs.push_back(
8641 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008642 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008643 CmdArgs.push_back(
8644 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8645 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008646 }
8647
Xinliang David Li69306c02015-10-22 06:15:31 +00008648 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008649
Logan Chieneb9162f2014-06-26 14:23:45 +00008650 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008651 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008652}
8653
Douglas Katzman95354292015-06-23 20:42:09 +00008654void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8655 const InputInfo &Output,
8656 const InputInfoList &Inputs,
8657 const ArgList &Args,
8658 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008659 claimNoWarnArgs(Args);
8660
James Y Knight2db38f32015-08-15 03:45:25 +00008661 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8662 llvm::Triple Triple = llvm::Triple(TripleStr);
8663
Rafael Espindola92b00932010-08-10 00:25:48 +00008664 ArgStringList CmdArgs;
8665
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008666 llvm::Reloc::Model RelocationModel;
8667 unsigned PICLevel;
8668 bool IsPIE;
8669 std::tie(RelocationModel, PICLevel, IsPIE) =
8670 ParsePICArgs(getToolChain(), Triple, Args);
8671
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008672 switch (getToolChain().getArch()) {
8673 default:
8674 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008675 // Add --32/--64 to make sure we get the format we want.
8676 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008677 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008678 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008679 break;
8680 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008681 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8682 CmdArgs.push_back("--x32");
8683 else
8684 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008685 break;
8686 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008687 CmdArgs.push_back("-a32");
8688 CmdArgs.push_back("-mppc");
8689 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008690 break;
8691 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008692 CmdArgs.push_back("-a64");
8693 CmdArgs.push_back("-mppc64");
8694 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008695 break;
8696 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008697 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008698 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008699 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008700 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008701 break;
8702 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008703 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008704 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008705 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8706 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8707 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008708 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008709 }
8710 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008711 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008712 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8713 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8714 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008715 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008716 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008717 case llvm::Triple::arm:
8718 case llvm::Triple::armeb:
8719 case llvm::Triple::thumb:
8720 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008721 const llvm::Triple &Triple2 = getToolChain().getTriple();
8722 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008723 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008724 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008725 break;
8726 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008727 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008728 break;
8729 default:
8730 break;
8731 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008732
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008733 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008734 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8735 case arm::FloatABI::Soft:
8736 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8737 break;
8738 case arm::FloatABI::SoftFP:
8739 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8740 break;
8741 case arm::FloatABI::Hard:
8742 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8743 break;
8744 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008745
8746 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008747
8748 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008749 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008750 // march from being picked in the absence of a cpu flag.
8751 Arg *A;
8752 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008753 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008754 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008755 else
8756 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008757 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008758 break;
8759 }
8760 case llvm::Triple::mips:
8761 case llvm::Triple::mipsel:
8762 case llvm::Triple::mips64:
8763 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008764 StringRef CPUName;
8765 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008766 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008767 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008768
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008769 CmdArgs.push_back("-march");
8770 CmdArgs.push_back(CPUName.data());
8771
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008772 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008773 CmdArgs.push_back(ABIName.data());
8774
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008775 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8776 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008777 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008778 CmdArgs.push_back("-mno-shared");
8779
Daniel Sanders379d44b2014-07-16 11:52:23 +00008780 // LLVM doesn't support -mplt yet and acts as if it is always given.
8781 // However, -mplt has no effect with the N64 ABI.
8782 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008783
8784 if (getToolChain().getArch() == llvm::Triple::mips ||
8785 getToolChain().getArch() == llvm::Triple::mips64)
8786 CmdArgs.push_back("-EB");
8787 else
8788 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008789
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008790 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8791 if (StringRef(A->getValue()) == "2008")
8792 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8793 }
8794
Daniel Sanders379d44b2014-07-16 11:52:23 +00008795 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8796 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8797 options::OPT_mfp64)) {
8798 A->claim();
8799 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008800 } else if (mips::shouldUseFPXX(
8801 Args, getToolChain().getTriple(), CPUName, ABIName,
8802 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008803 CmdArgs.push_back("-mfpxx");
8804
8805 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8806 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008807 if (Arg *A =
8808 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008809 if (A->getOption().matches(options::OPT_mips16)) {
8810 A->claim();
8811 A->render(Args, CmdArgs);
8812 } else {
8813 A->claim();
8814 CmdArgs.push_back("-no-mips16");
8815 }
8816 }
8817
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008818 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8819 options::OPT_mno_micromips);
8820 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8821 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8822
Simon Atanasyanbd986632013-11-26 11:58:04 +00008823 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8824 // Do not use AddLastArg because not all versions of MIPS assembler
8825 // support -mmsa / -mno-msa options.
8826 if (A->getOption().matches(options::OPT_mmsa))
8827 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8828 }
8829
Daniel Sanders379d44b2014-07-16 11:52:23 +00008830 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8831 options::OPT_msoft_float);
8832
Toma Tabacub36d6102015-06-11 12:13:18 +00008833 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8834 options::OPT_msingle_float);
8835
Daniel Sanders379d44b2014-07-16 11:52:23 +00008836 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8837 options::OPT_mno_odd_spreg);
8838
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008839 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008840 break;
8841 }
8842 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008843 // Always pass an -march option, since our default of z10 is later
8844 // than the GNU assembler's default.
8845 StringRef CPUName = getSystemZTargetCPU(Args);
8846 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008847 break;
8848 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008849 }
8850
Renato Golina74bbc72015-07-22 15:32:36 +00008851 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008852 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008853
8854 CmdArgs.push_back("-o");
8855 CmdArgs.push_back(Output.getFilename());
8856
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008857 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008858 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008859
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008860 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008861 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008862
8863 // Handle the debug info splitting at object creation time if we're
8864 // creating an object.
8865 // TODO: Currently only works on linux with newer objcopy.
8866 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008867 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008868 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008869 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008870}
8871
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008872static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008873 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008874 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008875 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008876 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8877 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008878 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008879 CmdArgs.push_back("-lgcc");
8880
Logan Chien3d3373c2012-11-19 12:04:11 +00008881 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008882 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008883 CmdArgs.push_back("-lgcc");
8884 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008885 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008886 CmdArgs.push_back("--as-needed");
8887 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008888 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008889 CmdArgs.push_back("--no-as-needed");
8890 }
8891
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008892 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008893 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008894 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008895 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008896
8897 // According to Android ABI, we have to link with libdl if we are
8898 // linking with non-static libgcc.
8899 //
8900 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8901 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8902 if (isAndroid && !StaticLibgcc)
8903 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008904}
8905
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008906static std::string getLinuxDynamicLinker(const ArgList &Args,
8907 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008908 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8909
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008910 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008911 if (ToolChain.getTriple().isArch64Bit())
8912 return "/system/bin/linker64";
8913 else
8914 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008915 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8916 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008917 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008918 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008919 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008920 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008921 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008922 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008923 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008924 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008925 return "/lib/ld-linux-armhf.so.3";
8926 else
8927 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008928 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8929 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008930 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008931 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008932 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008933 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008934 return "/lib/ld-linux.so.3";
8935 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8936 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008937 std::string LibDir =
8938 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008939 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008940 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008941 if (mips::isUCLibc(Args))
8942 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008943 else if (!ToolChain.getTriple().hasEnvironment()) {
8944 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8945 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8946 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8947 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008948 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008949
8950 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008951 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008952 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008953 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008954 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8955 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008956 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008957 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008958 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8959 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008960 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008961 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008962 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008963 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008964 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008965 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008966 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8967 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008968 else
8969 return "/lib64/ld-linux-x86-64.so.2";
8970}
8971
Renato Golinc4b49242014-02-13 10:01:16 +00008972static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008973 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008974 // Make use of compiler-rt if --rtlib option is used
8975 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8976
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008977 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008978 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008979 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008980 default:
8981 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008982 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008983 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008984 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008985 break;
8986 }
Renato Golinc4b49242014-02-13 10:01:16 +00008987 break;
8988 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00008989 // Make sure libgcc is not used under MSVC environment by default
8990 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
8991 // Issue error diagnostic if libgcc is explicitly specified
8992 // through command line as --rtlib option argument.
8993 if (Args.hasArg(options::OPT_rtlib_EQ)) {
8994 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
8995 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
8996 }
8997 } else
8998 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00008999 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009000 }
9001}
9002
Rafael Espindola1e085772014-08-15 17:14:35 +00009003static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9004 switch (T.getArch()) {
9005 case llvm::Triple::x86:
9006 return "elf_i386";
9007 case llvm::Triple::aarch64:
9008 return "aarch64linux";
9009 case llvm::Triple::aarch64_be:
9010 return "aarch64_be_linux";
9011 case llvm::Triple::arm:
9012 case llvm::Triple::thumb:
9013 return "armelf_linux_eabi";
9014 case llvm::Triple::armeb:
9015 case llvm::Triple::thumbeb:
9016 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9017 case llvm::Triple::ppc:
9018 return "elf32ppclinux";
9019 case llvm::Triple::ppc64:
9020 return "elf64ppc";
9021 case llvm::Triple::ppc64le:
9022 return "elf64lppc";
9023 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009024 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009025 return "elf32_sparc";
9026 case llvm::Triple::sparcv9:
9027 return "elf64_sparc";
9028 case llvm::Triple::mips:
9029 return "elf32btsmip";
9030 case llvm::Triple::mipsel:
9031 return "elf32ltsmip";
9032 case llvm::Triple::mips64:
9033 if (mips::hasMipsAbiArg(Args, "n32"))
9034 return "elf32btsmipn32";
9035 return "elf64btsmip";
9036 case llvm::Triple::mips64el:
9037 if (mips::hasMipsAbiArg(Args, "n32"))
9038 return "elf32ltsmipn32";
9039 return "elf64ltsmip";
9040 case llvm::Triple::systemz:
9041 return "elf64_s390";
9042 case llvm::Triple::x86_64:
9043 if (T.getEnvironment() == llvm::Triple::GNUX32)
9044 return "elf32_x86_64";
9045 return "elf_x86_64";
9046 default:
9047 llvm_unreachable("Unexpected arch");
9048 }
9049}
9050
Douglas Katzman95354292015-06-23 20:42:09 +00009051void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9052 const InputInfo &Output,
9053 const InputInfoList &Inputs,
9054 const ArgList &Args,
9055 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009056 const toolchains::Linux &ToolChain =
9057 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009058 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009059
9060 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9061 llvm::Triple Triple = llvm::Triple(TripleStr);
9062
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009063 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009064 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009065 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009066 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9067 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009068 const bool HasCRTBeginEndFiles =
9069 ToolChain.getTriple().hasEnvironment() ||
9070 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009071
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009072 ArgStringList CmdArgs;
9073
Rafael Espindolad1002f62010-11-15 18:28:16 +00009074 // Silence warning for "clang -g foo.o -o foo"
9075 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009076 // and "clang -emit-llvm foo.o -o foo"
9077 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009078 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009079 // handled somewhere else.
9080 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009081
Peter Collingbourne39719a72015-11-20 20:49:39 +00009082 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9083 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009084 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009085 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009086 CmdArgs.push_back("-target");
9087 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9088 }
9089
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009090 if (!D.SysRoot.empty())
9091 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009092
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009093 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009094 CmdArgs.push_back("-pie");
9095
Rafael Espindola1c76c592010-11-07 22:57:16 +00009096 if (Args.hasArg(options::OPT_rdynamic))
9097 CmdArgs.push_back("-export-dynamic");
9098
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009099 if (Args.hasArg(options::OPT_s))
9100 CmdArgs.push_back("-s");
9101
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009102 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009103 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009104
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009105 for (const auto &Opt : ToolChain.ExtraOpts)
9106 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009107
9108 if (!Args.hasArg(options::OPT_static)) {
9109 CmdArgs.push_back("--eh-frame-hdr");
9110 }
9111
9112 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009113 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009114
9115 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009116 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9117 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009118 CmdArgs.push_back("-Bstatic");
9119 else
9120 CmdArgs.push_back("-static");
9121 } else if (Args.hasArg(options::OPT_shared)) {
9122 CmdArgs.push_back("-shared");
9123 }
9124
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009125 if (!Args.hasArg(options::OPT_static)) {
9126 if (Args.hasArg(options::OPT_rdynamic))
9127 CmdArgs.push_back("-export-dynamic");
9128
9129 if (!Args.hasArg(options::OPT_shared)) {
9130 const std::string Loader =
9131 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9132 CmdArgs.push_back("-dynamic-linker");
9133 CmdArgs.push_back(Args.MakeArgString(Loader));
9134 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009135 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009136
9137 CmdArgs.push_back("-o");
9138 CmdArgs.push_back(Output.getFilename());
9139
Douglas Katzman78b37b02015-11-17 20:28:07 +00009140 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009141 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009142 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009143 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009144 if (Args.hasArg(options::OPT_pg))
9145 crt1 = "gcrt1.o";
9146 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009147 crt1 = "Scrt1.o";
9148 else
9149 crt1 = "crt1.o";
9150 }
9151 if (crt1)
9152 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009153
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009154 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9155 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009156
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009157 const char *crtbegin;
9158 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009159 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009160 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009161 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009162 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009163 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009164 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009165 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009166
9167 if (HasCRTBeginEndFiles)
9168 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009169
9170 // Add crtfastmath.o if available and fast math is enabled.
9171 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009172 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009173
9174 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009175 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009176
Douglas Katzman6059ef92015-11-17 17:41:23 +00009177 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009178
Teresa Johnson945bc502015-10-15 20:35:53 +00009179 if (D.isUsingLTO())
9180 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009181
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009182 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9183 CmdArgs.push_back("--no-demangle");
9184
Alexey Samsonov52550342014-09-15 19:58:40 +00009185 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009186 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009187 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009188 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009189
Douglas Katzman78b37b02015-11-17 20:28:07 +00009190 if (D.CCCIsCXX() &&
9191 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009192 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009193 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009194 if (OnlyLibstdcxxStatic)
9195 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009196 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009197 if (OnlyLibstdcxxStatic)
9198 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009199 CmdArgs.push_back("-lm");
9200 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009201 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9202 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009203
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009204 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009205 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9206 if (Args.hasArg(options::OPT_static))
9207 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009208
Alexey Samsonov52550342014-09-15 19:58:40 +00009209 if (NeedsSanitizerDeps)
9210 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9211
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009212 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9213 Args.hasArg(options::OPT_pthreads);
9214
9215 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9216 options::OPT_fno_openmp, false)) {
9217 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9218 // FIXME: Does this really make sense for all GNU toolchains?
9219 WantPthread = true;
9220
9221 // Also link the particular OpenMP runtimes.
9222 switch (getOpenMPRuntime(ToolChain, Args)) {
9223 case OMPRT_OMP:
9224 CmdArgs.push_back("-lomp");
9225 break;
9226 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009227 CmdArgs.push_back("-lgomp");
9228
9229 // FIXME: Exclude this for platforms with libgomp that don't require
9230 // librt. Most modern Linux platforms require it, but some may not.
9231 CmdArgs.push_back("-lrt");
9232 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009233 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009234 CmdArgs.push_back("-liomp5");
9235 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009236 case OMPRT_Unknown:
9237 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009238 break;
9239 }
Chandler Carruth01538002013-01-17 13:19:29 +00009240 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009241
Renato Golinc4b49242014-02-13 10:01:16 +00009242 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009243
Richard Smith31d1de22015-05-20 22:48:44 +00009244 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009245 CmdArgs.push_back("-lpthread");
9246
Rafael Espindolab17bc532016-01-25 18:29:16 +00009247 if (Args.hasArg(options::OPT_fsplit_stack))
9248 CmdArgs.push_back("--wrap=pthread_create");
9249
Chandler Carruth94a32012012-05-14 18:31:18 +00009250 CmdArgs.push_back("-lc");
9251
9252 if (Args.hasArg(options::OPT_static))
9253 CmdArgs.push_back("--end-group");
9254 else
Renato Golinc4b49242014-02-13 10:01:16 +00009255 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009256 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009257
Rafael Espindola81937ec2010-12-01 01:52:43 +00009258 if (!Args.hasArg(options::OPT_nostartfiles)) {
9259 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009260 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009261 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009262 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009263 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009264 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009265 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009266
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009267 if (HasCRTBeginEndFiles)
9268 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009269 if (!isAndroid)
9270 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009271 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009272 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009273
Peter Collingbourne39719a72015-11-20 20:49:39 +00009274 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009275}
9276
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009277// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9278// for the various SFI requirements like register masking. The assembly tool
9279// inserts the file containing the macros as an input into all the assembly
9280// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009281void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9282 const InputInfo &Output,
9283 const InputInfoList &Inputs,
9284 const ArgList &Args,
9285 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009286 const toolchains::NaClToolChain &ToolChain =
9287 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009288 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009289 "nacl-arm-macros.s");
9290 InputInfoList NewInputs;
9291 NewInputs.push_back(NaClMacros);
9292 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009293 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9294 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009295}
9296
Douglas Katzman750cfc52015-06-29 18:42:16 +00009297// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009298// we use static by default, do not yet support sanitizers or LTO, and a few
9299// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009300// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009301void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9302 const InputInfo &Output,
9303 const InputInfoList &Inputs,
9304 const ArgList &Args,
9305 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009306
Douglas Katzman54366072015-07-27 16:53:08 +00009307 const toolchains::NaClToolChain &ToolChain =
9308 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009309 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009310 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009311 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009312 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009313
9314 ArgStringList CmdArgs;
9315
9316 // Silence warning for "clang -g foo.o -o foo"
9317 Args.ClaimAllArgs(options::OPT_g_Group);
9318 // and "clang -emit-llvm foo.o -o foo"
9319 Args.ClaimAllArgs(options::OPT_emit_llvm);
9320 // and for "clang -w foo.o -o foo". Other warning options are already
9321 // handled somewhere else.
9322 Args.ClaimAllArgs(options::OPT_w);
9323
9324 if (!D.SysRoot.empty())
9325 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9326
9327 if (Args.hasArg(options::OPT_rdynamic))
9328 CmdArgs.push_back("-export-dynamic");
9329
9330 if (Args.hasArg(options::OPT_s))
9331 CmdArgs.push_back("-s");
9332
Douglas Katzman54366072015-07-27 16:53:08 +00009333 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9334 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009335 CmdArgs.push_back("--build-id");
9336
9337 if (!IsStatic)
9338 CmdArgs.push_back("--eh-frame-hdr");
9339
9340 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009341 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009342 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009343 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009344 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009345 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009346 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009347 else if (Arch == llvm::Triple::mipsel)
9348 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009349 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009350 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9351 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009352
9353 if (IsStatic)
9354 CmdArgs.push_back("-static");
9355 else if (Args.hasArg(options::OPT_shared))
9356 CmdArgs.push_back("-shared");
9357
9358 CmdArgs.push_back("-o");
9359 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009360 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009361 if (!Args.hasArg(options::OPT_shared))
9362 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9363 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9364
9365 const char *crtbegin;
9366 if (IsStatic)
9367 crtbegin = "crtbeginT.o";
9368 else if (Args.hasArg(options::OPT_shared))
9369 crtbegin = "crtbeginS.o";
9370 else
9371 crtbegin = "crtbegin.o";
9372 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9373 }
9374
9375 Args.AddAllArgs(CmdArgs, options::OPT_L);
9376 Args.AddAllArgs(CmdArgs, options::OPT_u);
9377
Douglas Katzman6059ef92015-11-17 17:41:23 +00009378 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009379
9380 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9381 CmdArgs.push_back("--no-demangle");
9382
9383 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9384
Douglas Katzman78b37b02015-11-17 20:28:07 +00009385 if (D.CCCIsCXX() &&
9386 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009387 bool OnlyLibstdcxxStatic =
9388 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009389 if (OnlyLibstdcxxStatic)
9390 CmdArgs.push_back("-Bstatic");
9391 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9392 if (OnlyLibstdcxxStatic)
9393 CmdArgs.push_back("-Bdynamic");
9394 CmdArgs.push_back("-lm");
9395 }
9396
9397 if (!Args.hasArg(options::OPT_nostdlib)) {
9398 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9399 // Always use groups, since it has no effect on dynamic libraries.
9400 CmdArgs.push_back("--start-group");
9401 CmdArgs.push_back("-lc");
9402 // NaCl's libc++ currently requires libpthread, so just always include it
9403 // in the group for C++.
9404 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009405 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009406 // Gold, used by Mips, handles nested groups differently than ld, and
9407 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9408 // which is not a desired behaviour here.
9409 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9410 if (getToolChain().getArch() == llvm::Triple::mipsel)
9411 CmdArgs.push_back("-lnacl");
9412
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009413 CmdArgs.push_back("-lpthread");
9414 }
9415
9416 CmdArgs.push_back("-lgcc");
9417 CmdArgs.push_back("--as-needed");
9418 if (IsStatic)
9419 CmdArgs.push_back("-lgcc_eh");
9420 else
9421 CmdArgs.push_back("-lgcc_s");
9422 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009423
9424 // Mips needs to create and use pnacl_legacy library that contains
9425 // definitions from bitcode/pnaclmm.c and definitions for
9426 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9427 if (getToolChain().getArch() == llvm::Triple::mipsel)
9428 CmdArgs.push_back("-lpnacl_legacy");
9429
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009430 CmdArgs.push_back("--end-group");
9431 }
9432
9433 if (!Args.hasArg(options::OPT_nostartfiles)) {
9434 const char *crtend;
9435 if (Args.hasArg(options::OPT_shared))
9436 crtend = "crtendS.o";
9437 else
9438 crtend = "crtend.o";
9439
9440 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9441 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9442 }
9443 }
9444
Peter Collingbourne39719a72015-11-20 20:49:39 +00009445 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9446 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009447}
9448
Douglas Katzman95354292015-06-23 20:42:09 +00009449void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9450 const InputInfo &Output,
9451 const InputInfoList &Inputs,
9452 const ArgList &Args,
9453 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009454 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009455 ArgStringList CmdArgs;
9456
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009457 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009458
9459 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009460 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009461
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009462 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009463 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009464
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009465 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009466 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009467}
9468
Douglas Katzman95354292015-06-23 20:42:09 +00009469void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9470 const InputInfo &Output,
9471 const InputInfoList &Inputs,
9472 const ArgList &Args,
9473 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009474 const Driver &D = getToolChain().getDriver();
9475 ArgStringList CmdArgs;
9476
Daniel Dunbarb440f562010-08-02 02:38:21 +00009477 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009478 CmdArgs.push_back("-o");
9479 CmdArgs.push_back(Output.getFilename());
9480 } else {
9481 assert(Output.isNothing() && "Invalid output.");
9482 }
9483
Douglas Katzman78b37b02015-11-17 20:28:07 +00009484 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009485 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9486 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9487 CmdArgs.push_back(
9488 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9489 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009490 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009491
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009492 Args.AddAllArgs(CmdArgs,
9493 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009494
Daniel Dunbar54423b22010-09-17 00:24:54 +00009495 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009496
Xinliang David Li69306c02015-10-22 06:15:31 +00009497 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009498
Douglas Katzman78b37b02015-11-17 20:28:07 +00009499 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009500 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009501 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009502 CmdArgs.push_back("-lm");
9503 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009504 }
9505
Douglas Katzman78b37b02015-11-17 20:28:07 +00009506 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009507 if (Args.hasArg(options::OPT_pthread))
9508 CmdArgs.push_back("-lpthread");
9509 CmdArgs.push_back("-lc");
9510 CmdArgs.push_back("-lCompilerRT-Generic");
9511 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9512 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009513 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009514 }
9515
Logan Chieneb9162f2014-06-26 14:23:45 +00009516 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009517 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009518}
9519
Daniel Dunbarcc912342009-05-02 18:28:39 +00009520/// DragonFly Tools
9521
9522// For now, DragonFly Assemble does just about the same as for
9523// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009524void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9525 const InputInfo &Output,
9526 const InputInfoList &Inputs,
9527 const ArgList &Args,
9528 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009529 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009530 ArgStringList CmdArgs;
9531
9532 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9533 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009534 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009535 CmdArgs.push_back("--32");
9536
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009537 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009538
9539 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009540 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009541
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009542 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009543 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009544
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009545 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009546 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009547}
9548
Douglas Katzman95354292015-06-23 20:42:09 +00009549void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9550 const InputInfo &Output,
9551 const InputInfoList &Inputs,
9552 const ArgList &Args,
9553 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009554 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009555 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009556
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009557 if (!D.SysRoot.empty())
9558 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9559
John McCall65b8da02013-04-11 22:55:55 +00009560 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009561 if (Args.hasArg(options::OPT_static)) {
9562 CmdArgs.push_back("-Bstatic");
9563 } else {
John McCall65b8da02013-04-11 22:55:55 +00009564 if (Args.hasArg(options::OPT_rdynamic))
9565 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009566 if (Args.hasArg(options::OPT_shared))
9567 CmdArgs.push_back("-Bshareable");
9568 else {
9569 CmdArgs.push_back("-dynamic-linker");
9570 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9571 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009572 CmdArgs.push_back("--hash-style=gnu");
9573 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009574 }
9575
9576 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9577 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009578 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009579 CmdArgs.push_back("-m");
9580 CmdArgs.push_back("elf_i386");
9581 }
9582
Daniel Dunbarb440f562010-08-02 02:38:21 +00009583 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009584 CmdArgs.push_back("-o");
9585 CmdArgs.push_back(Output.getFilename());
9586 } else {
9587 assert(Output.isNothing() && "Invalid output.");
9588 }
9589
Douglas Katzman78b37b02015-11-17 20:28:07 +00009590 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009591 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009592 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009593 CmdArgs.push_back(
9594 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009595 else {
9596 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009597 CmdArgs.push_back(
9598 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009599 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009600 CmdArgs.push_back(
9601 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009602 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009603 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009604 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009605 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009606 CmdArgs.push_back(
9607 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009608 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009609 CmdArgs.push_back(
9610 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009611 }
9612
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009613 Args.AddAllArgs(CmdArgs,
9614 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009615
Daniel Dunbar54423b22010-09-17 00:24:54 +00009616 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009617
Douglas Katzman78b37b02015-11-17 20:28:07 +00009618 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009619 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009620
9621 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009622 CmdArgs.push_back("-rpath");
9623 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009624 }
9625
Hans Wennborg70850d82013-07-18 20:29:38 +00009626 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009627 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009628 CmdArgs.push_back("-lm");
9629 }
9630
Daniel Dunbarcc912342009-05-02 18:28:39 +00009631 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009632 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009633
9634 if (!Args.hasArg(options::OPT_nolibc)) {
9635 CmdArgs.push_back("-lc");
9636 }
9637
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009638 if (Args.hasArg(options::OPT_static) ||
9639 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009640 CmdArgs.push_back("-lgcc");
9641 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009642 } else {
9643 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009644 CmdArgs.push_back("-lgcc_pic");
9645 if (!Args.hasArg(options::OPT_shared))
9646 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009647 } else {
John McCall65b8da02013-04-11 22:55:55 +00009648 CmdArgs.push_back("-lgcc");
9649 CmdArgs.push_back("--as-needed");
9650 CmdArgs.push_back("-lgcc_pic");
9651 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009652 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009653 }
9654 }
9655
Douglas Katzman78b37b02015-11-17 20:28:07 +00009656 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009657 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009658 CmdArgs.push_back(
9659 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009660 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009661 CmdArgs.push_back(
9662 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9663 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009664 }
9665
Xinliang David Li69306c02015-10-22 06:15:31 +00009666 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009667
Logan Chieneb9162f2014-06-26 14:23:45 +00009668 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009669 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009670}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009671
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009672// Try to find Exe from a Visual Studio distribution. This first tries to find
9673// an installed copy of Visual Studio and, failing that, looks in the PATH,
9674// making sure that whatever executable that's found is not a same-named exe
9675// from clang itself to prevent clang from falling back to itself.
9676static std::string FindVisualStudioExecutable(const ToolChain &TC,
9677 const char *Exe,
9678 const char *ClangProgramPath) {
9679 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9680 std::string visualStudioBinDir;
9681 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9682 visualStudioBinDir)) {
9683 SmallString<128> FilePath(visualStudioBinDir);
9684 llvm::sys::path::append(FilePath, Exe);
9685 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9686 return FilePath.str();
9687 }
9688
9689 return Exe;
9690}
9691
Douglas Katzman95354292015-06-23 20:42:09 +00009692void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9693 const InputInfo &Output,
9694 const InputInfoList &Inputs,
9695 const ArgList &Args,
9696 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009697 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009698 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009699
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009700 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9701 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009702 CmdArgs.push_back(
9703 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009704
Douglas Katzman78b37b02015-11-17 20:28:07 +00009705 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9706 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009707 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009708
Zachary Turner10d75b22014-10-22 20:40:43 +00009709 if (!llvm::sys::Process::GetEnv("LIB")) {
9710 // If the VC environment hasn't been configured (perhaps because the user
9711 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009712 // the environment variable is set however, assume the user knows what
9713 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009714 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009715 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009716 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9717 SmallString<128> LibDir(VisualStudioDir);
9718 llvm::sys::path::append(LibDir, "VC", "lib");
9719 switch (MSVC.getArch()) {
9720 case llvm::Triple::x86:
9721 // x86 just puts the libraries directly in lib
9722 break;
9723 case llvm::Triple::x86_64:
9724 llvm::sys::path::append(LibDir, "amd64");
9725 break;
9726 case llvm::Triple::arm:
9727 llvm::sys::path::append(LibDir, "arm");
9728 break;
9729 default:
9730 break;
9731 }
9732 CmdArgs.push_back(
9733 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009734
9735 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9736 std::string UniversalCRTLibPath;
9737 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9738 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9739 UniversalCRTLibPath.c_str()));
9740 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009741 }
9742
9743 std::string WindowsSdkLibPath;
9744 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9745 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9746 WindowsSdkLibPath.c_str()));
9747 }
9748
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009749 CmdArgs.push_back("-nologo");
9750
Reid Kleckner124955a2015-08-05 18:51:13 +00009751 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009752 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009753
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009754 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009755 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009756 if (DLL) {
9757 CmdArgs.push_back(Args.MakeArgString("-dll"));
9758
9759 SmallString<128> ImplibName(Output.getFilename());
9760 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009761 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009762 }
9763
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009764 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009765 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009766 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009767 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009768 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9769 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009770 // Make sure the dynamic runtime thunk is not optimized out at link time
9771 // to ensure proper SEH handling.
9772 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009773 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009774 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009775 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009776 for (const auto &Lib : {"asan", "asan_cxx"})
9777 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009778 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009779 }
9780
Hans Wennborg2e274592013-08-13 23:38:57 +00009781 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009782
Alexey Bataevc7e84352015-08-19 04:49:01 +00009783 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9784 options::OPT_fno_openmp, false)) {
9785 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9786 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9787 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9788 TC.getDriver().Dir + "/../lib"));
9789 switch (getOpenMPRuntime(getToolChain(), Args)) {
9790 case OMPRT_OMP:
9791 CmdArgs.push_back("-defaultlib:libomp.lib");
9792 break;
9793 case OMPRT_IOMP5:
9794 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9795 break;
9796 case OMPRT_GOMP:
9797 break;
9798 case OMPRT_Unknown:
9799 // Already diagnosed.
9800 break;
9801 }
9802 }
9803
Andrey Turetskiya4868572016-03-14 11:19:43 +00009804 // Add compiler-rt lib in case if it was explicitly
9805 // specified as an argument for --rtlib option.
9806 if (!Args.hasArg(options::OPT_nostdlib)) {
9807 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9808 }
9809
Reid Kleckner337188f2014-09-16 19:22:00 +00009810 // Add filenames, libraries, and other linker inputs.
9811 for (const auto &Input : Inputs) {
9812 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009813 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009814 continue;
9815 }
9816
9817 const Arg &A = Input.getInputArg();
9818
9819 // Render -l options differently for the MSVC linker.
9820 if (A.getOption().matches(options::OPT_l)) {
9821 StringRef Lib = A.getValue();
9822 const char *LinkLibArg;
9823 if (Lib.endswith(".lib"))
9824 LinkLibArg = Args.MakeArgString(Lib);
9825 else
9826 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9827 CmdArgs.push_back(LinkLibArg);
9828 continue;
9829 }
9830
9831 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9832 // or -L. Render it, even if MSVC doesn't understand it.
9833 A.renderAsInput(Args, CmdArgs);
9834 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009835
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009836 TC.addProfileRTLibs(Args, CmdArgs);
9837
Zachary Turner719f58c2014-12-01 23:06:47 +00009838 // We need to special case some linker paths. In the case of lld, we need to
9839 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9840 // linker, we need to use a special search algorithm.
9841 llvm::SmallString<128> linkPath;
9842 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9843 if (Linker.equals_lower("lld"))
9844 Linker = "lld-link";
9845
9846 if (Linker.equals_lower("link")) {
9847 // If we're using the MSVC linker, it's not sufficient to just use link
9848 // from the program PATH, because other environments like GnuWin32 install
9849 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009850 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009851 C.getDriver().getClangProgramPath());
9852 } else {
9853 linkPath = Linker;
9854 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009855 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009856 }
9857
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009858 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009859 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009860}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009861
Douglas Katzman95354292015-06-23 20:42:09 +00009862void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9863 const InputInfo &Output,
9864 const InputInfoList &Inputs,
9865 const ArgList &Args,
9866 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009867 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9868}
9869
Douglas Katzman95354292015-06-23 20:42:09 +00009870std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009871 Compilation &C, const JobAction &JA, const InputInfo &Output,
9872 const InputInfoList &Inputs, const ArgList &Args,
9873 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009874 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009875 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009876 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009877 CmdArgs.push_back("/W0"); // No warnings.
9878
9879 // The goal is to be able to invoke this tool correctly based on
9880 // any flag accepted by clang-cl.
9881
9882 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009883 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009884
9885 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009886 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9887 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9888 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009889 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9890 if (A->getOption().getID() == options::OPT_O0) {
9891 CmdArgs.push_back("/Od");
9892 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009893 CmdArgs.push_back("/Og");
9894
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009895 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009896 if (OptLevel == "s" || OptLevel == "z")
9897 CmdArgs.push_back("/Os");
9898 else
9899 CmdArgs.push_back("/Ot");
9900
9901 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009902 }
9903 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009904 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9905 options::OPT_fno_omit_frame_pointer))
9906 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9907 ? "/Oy"
9908 : "/Oy-");
9909 if (!Args.hasArg(options::OPT_fwritable_strings))
9910 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009911
Nico Weber3f8dafb2015-03-12 19:37:10 +00009912 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009913 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9914
David Majnemerf6072342014-07-01 22:24:56 +00009915 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9916 /*default=*/false))
9917 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009918 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9919 options::OPT_fno_function_sections))
9920 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9921 ? "/Gy"
9922 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009923 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9924 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009925 CmdArgs.push_back(
9926 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009927 if (Args.hasArg(options::OPT_fsyntax_only))
9928 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009929 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9930 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009931 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009932
Nico Weber3f8dafb2015-03-12 19:37:10 +00009933 std::vector<std::string> Includes =
9934 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009935 for (const auto &Include : Includes)
9936 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009937
Hans Wennborg87cfa712013-09-19 20:32:16 +00009938 // Flags that can simply be passed through.
9939 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9940 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009941 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9942 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009943 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009944 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009945
9946 // The order of these flags is relevant, so pick the last one.
9947 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9948 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9949 A->render(Args, CmdArgs);
9950
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009951 // Pass through all unknown arguments so that the fallback command can see
9952 // them too.
9953 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9954
Hans Wennborg87cfa712013-09-19 20:32:16 +00009955 // Input filename.
9956 assert(Inputs.size() == 1);
9957 const InputInfo &II = Inputs[0];
9958 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9959 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9960 if (II.isFilename())
9961 CmdArgs.push_back(II.getFilename());
9962 else
9963 II.getInputArg().renderAsInput(Args, CmdArgs);
9964
9965 // Output filename.
9966 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009967 const char *Fo =
9968 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009969 CmdArgs.push_back(Fo);
9970
Hans Wennborg188382e2013-09-20 18:16:35 +00009971 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009972 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9973 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009974 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009975 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009976}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009977
Yaron Keren1c0070c2015-07-02 04:45:27 +00009978/// MinGW Tools
9979void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9980 const InputInfo &Output,
9981 const InputInfoList &Inputs,
9982 const ArgList &Args,
9983 const char *LinkingOutput) const {
9984 claimNoWarnArgs(Args);
9985 ArgStringList CmdArgs;
9986
9987 if (getToolChain().getArch() == llvm::Triple::x86) {
9988 CmdArgs.push_back("--32");
9989 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9990 CmdArgs.push_back("--64");
9991 }
9992
9993 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9994
9995 CmdArgs.push_back("-o");
9996 CmdArgs.push_back(Output.getFilename());
9997
9998 for (const auto &II : Inputs)
9999 CmdArgs.push_back(II.getFilename());
10000
10001 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010002 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010003
10004 if (Args.hasArg(options::OPT_gsplit_dwarf))
10005 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10006 SplitDebugName(Args, Inputs[0]));
10007}
10008
10009void MinGW::Linker::AddLibGCC(const ArgList &Args,
10010 ArgStringList &CmdArgs) const {
10011 if (Args.hasArg(options::OPT_mthreads))
10012 CmdArgs.push_back("-lmingwthrd");
10013 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010014
Yaron Kerenaa281332015-08-09 00:24:07 +000010015 // Make use of compiler-rt if --rtlib option is used
10016 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10017 if (RLT == ToolChain::RLT_Libgcc) {
10018 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10019 Args.hasArg(options::OPT_static);
10020 bool Shared = Args.hasArg(options::OPT_shared);
10021 bool CXX = getToolChain().getDriver().CCCIsCXX();
10022
10023 if (Static || (!CXX && !Shared)) {
10024 CmdArgs.push_back("-lgcc");
10025 CmdArgs.push_back("-lgcc_eh");
10026 } else {
10027 CmdArgs.push_back("-lgcc_s");
10028 CmdArgs.push_back("-lgcc");
10029 }
10030 } else {
10031 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10032 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010033
Yaron Keren1c0070c2015-07-02 04:45:27 +000010034 CmdArgs.push_back("-lmoldname");
10035 CmdArgs.push_back("-lmingwex");
10036 CmdArgs.push_back("-lmsvcrt");
10037}
10038
10039void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10040 const InputInfo &Output,
10041 const InputInfoList &Inputs,
10042 const ArgList &Args,
10043 const char *LinkingOutput) const {
10044 const ToolChain &TC = getToolChain();
10045 const Driver &D = TC.getDriver();
10046 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10047
10048 ArgStringList CmdArgs;
10049
10050 // Silence warning for "clang -g foo.o -o foo"
10051 Args.ClaimAllArgs(options::OPT_g_Group);
10052 // and "clang -emit-llvm foo.o -o foo"
10053 Args.ClaimAllArgs(options::OPT_emit_llvm);
10054 // and for "clang -w foo.o -o foo". Other warning options are already
10055 // handled somewhere else.
10056 Args.ClaimAllArgs(options::OPT_w);
10057
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010058 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10059 if (LinkerName.equals_lower("lld")) {
10060 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010061 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010062 } else if (!LinkerName.equals_lower("ld")) {
10063 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010064 }
10065
Yaron Keren1c0070c2015-07-02 04:45:27 +000010066 if (!D.SysRoot.empty())
10067 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10068
10069 if (Args.hasArg(options::OPT_s))
10070 CmdArgs.push_back("-s");
10071
10072 CmdArgs.push_back("-m");
10073 if (TC.getArch() == llvm::Triple::x86)
10074 CmdArgs.push_back("i386pe");
10075 if (TC.getArch() == llvm::Triple::x86_64)
10076 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010077 if (TC.getArch() == llvm::Triple::arm)
10078 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010079
10080 if (Args.hasArg(options::OPT_mwindows)) {
10081 CmdArgs.push_back("--subsystem");
10082 CmdArgs.push_back("windows");
10083 } else if (Args.hasArg(options::OPT_mconsole)) {
10084 CmdArgs.push_back("--subsystem");
10085 CmdArgs.push_back("console");
10086 }
10087
10088 if (Args.hasArg(options::OPT_static))
10089 CmdArgs.push_back("-Bstatic");
10090 else {
10091 if (Args.hasArg(options::OPT_mdll))
10092 CmdArgs.push_back("--dll");
10093 else if (Args.hasArg(options::OPT_shared))
10094 CmdArgs.push_back("--shared");
10095 CmdArgs.push_back("-Bdynamic");
10096 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10097 CmdArgs.push_back("-e");
10098 if (TC.getArch() == llvm::Triple::x86)
10099 CmdArgs.push_back("_DllMainCRTStartup@12");
10100 else
10101 CmdArgs.push_back("DllMainCRTStartup");
10102 CmdArgs.push_back("--enable-auto-image-base");
10103 }
10104 }
10105
10106 CmdArgs.push_back("-o");
10107 CmdArgs.push_back(Output.getFilename());
10108
10109 Args.AddAllArgs(CmdArgs, options::OPT_e);
10110 // FIXME: add -N, -n flags
10111 Args.AddLastArg(CmdArgs, options::OPT_r);
10112 Args.AddLastArg(CmdArgs, options::OPT_s);
10113 Args.AddLastArg(CmdArgs, options::OPT_t);
10114 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10115 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10116
Douglas Katzman78b37b02015-11-17 20:28:07 +000010117 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010118 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10119 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10120 } else {
10121 if (Args.hasArg(options::OPT_municode))
10122 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10123 else
10124 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10125 }
10126 if (Args.hasArg(options::OPT_pg))
10127 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10128 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10129 }
10130
10131 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010132 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010133 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10134
10135 // TODO: Add ASan stuff here
10136
10137 // TODO: Add profile stuff here
10138
Douglas Katzman78b37b02015-11-17 20:28:07 +000010139 if (D.CCCIsCXX() &&
10140 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010141 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10142 !Args.hasArg(options::OPT_static);
10143 if (OnlyLibstdcxxStatic)
10144 CmdArgs.push_back("-Bstatic");
10145 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10146 if (OnlyLibstdcxxStatic)
10147 CmdArgs.push_back("-Bdynamic");
10148 }
10149
10150 if (!Args.hasArg(options::OPT_nostdlib)) {
10151 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10152 if (Args.hasArg(options::OPT_static))
10153 CmdArgs.push_back("--start-group");
10154
10155 if (Args.hasArg(options::OPT_fstack_protector) ||
10156 Args.hasArg(options::OPT_fstack_protector_strong) ||
10157 Args.hasArg(options::OPT_fstack_protector_all)) {
10158 CmdArgs.push_back("-lssp_nonshared");
10159 CmdArgs.push_back("-lssp");
10160 }
10161 if (Args.hasArg(options::OPT_fopenmp))
10162 CmdArgs.push_back("-lgomp");
10163
10164 AddLibGCC(Args, CmdArgs);
10165
10166 if (Args.hasArg(options::OPT_pg))
10167 CmdArgs.push_back("-lgmon");
10168
Yaron Kerenadce68e2015-07-06 18:52:19 +000010169 if (Args.hasArg(options::OPT_pthread))
10170 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010171
10172 // add system libraries
10173 if (Args.hasArg(options::OPT_mwindows)) {
10174 CmdArgs.push_back("-lgdi32");
10175 CmdArgs.push_back("-lcomdlg32");
10176 }
10177 CmdArgs.push_back("-ladvapi32");
10178 CmdArgs.push_back("-lshell32");
10179 CmdArgs.push_back("-luser32");
10180 CmdArgs.push_back("-lkernel32");
10181
10182 if (Args.hasArg(options::OPT_static))
10183 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010184 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010185 AddLibGCC(Args, CmdArgs);
10186 }
10187
10188 if (!Args.hasArg(options::OPT_nostartfiles)) {
10189 // Add crtfastmath.o if available and fast math is enabled.
10190 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10191
10192 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10193 }
10194 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010195 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010196 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010197}
10198
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010199/// XCore Tools
10200// We pass assemble and link construction to the xcc tool.
10201
Douglas Katzman95354292015-06-23 20:42:09 +000010202void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10203 const InputInfo &Output,
10204 const InputInfoList &Inputs,
10205 const ArgList &Args,
10206 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010207 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010208 ArgStringList CmdArgs;
10209
10210 CmdArgs.push_back("-o");
10211 CmdArgs.push_back(Output.getFilename());
10212
10213 CmdArgs.push_back("-c");
10214
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010215 if (Args.hasArg(options::OPT_v))
10216 CmdArgs.push_back("-v");
10217
Robert Lytton894d25c2014-05-02 09:33:25 +000010218 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10219 if (!A->getOption().matches(options::OPT_g0))
10220 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010221
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010222 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10223 false))
10224 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010225
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010226 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010227
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010228 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010229 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010230
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010231 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010232 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010233}
10234
Douglas Katzman95354292015-06-23 20:42:09 +000010235void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10236 const InputInfo &Output,
10237 const InputInfoList &Inputs,
10238 const ArgList &Args,
10239 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010240 ArgStringList CmdArgs;
10241
10242 if (Output.isFilename()) {
10243 CmdArgs.push_back("-o");
10244 CmdArgs.push_back(Output.getFilename());
10245 } else {
10246 assert(Output.isNothing() && "Invalid output.");
10247 }
10248
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010249 if (Args.hasArg(options::OPT_v))
10250 CmdArgs.push_back("-v");
10251
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010252 // Pass -fexceptions through to the linker if it was present.
10253 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10254 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010255 CmdArgs.push_back("-fexceptions");
10256
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010257 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10258
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010259 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010260 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010261}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010262
Douglas Katzman95354292015-06-23 20:42:09 +000010263void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10264 const InputInfo &Output,
10265 const InputInfoList &Inputs,
10266 const ArgList &Args,
10267 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010268 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010269 const auto &TC =
10270 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10271 ArgStringList CmdArgs;
10272 const char *Exec;
10273
10274 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010275 default:
10276 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010277 case llvm::Triple::arm:
10278 case llvm::Triple::thumb:
10279 break;
10280 case llvm::Triple::x86:
10281 CmdArgs.push_back("--32");
10282 break;
10283 case llvm::Triple::x86_64:
10284 CmdArgs.push_back("--64");
10285 break;
10286 }
10287
10288 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10289
10290 CmdArgs.push_back("-o");
10291 CmdArgs.push_back(Output.getFilename());
10292
10293 for (const auto &Input : Inputs)
10294 CmdArgs.push_back(Input.getFilename());
10295
10296 const std::string Assembler = TC.GetProgramPath("as");
10297 Exec = Args.MakeArgString(Assembler);
10298
Justin Bognerd3371d82015-07-17 03:35:54 +000010299 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010300}
10301
Douglas Katzman95354292015-06-23 20:42:09 +000010302void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10303 const InputInfo &Output,
10304 const InputInfoList &Inputs,
10305 const ArgList &Args,
10306 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010307 const auto &TC =
10308 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10309 const llvm::Triple &T = TC.getTriple();
10310 const Driver &D = TC.getDriver();
10311 SmallString<128> EntryPoint;
10312 ArgStringList CmdArgs;
10313 const char *Exec;
10314
10315 // Silence warning for "clang -g foo.o -o foo"
10316 Args.ClaimAllArgs(options::OPT_g_Group);
10317 // and "clang -emit-llvm foo.o -o foo"
10318 Args.ClaimAllArgs(options::OPT_emit_llvm);
10319 // and for "clang -w foo.o -o foo"
10320 Args.ClaimAllArgs(options::OPT_w);
10321 // Other warning options are already handled somewhere else.
10322
10323 if (!D.SysRoot.empty())
10324 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10325
10326 if (Args.hasArg(options::OPT_pie))
10327 CmdArgs.push_back("-pie");
10328 if (Args.hasArg(options::OPT_rdynamic))
10329 CmdArgs.push_back("-export-dynamic");
10330 if (Args.hasArg(options::OPT_s))
10331 CmdArgs.push_back("--strip-all");
10332
10333 CmdArgs.push_back("-m");
10334 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010335 default:
10336 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010337 case llvm::Triple::arm:
10338 case llvm::Triple::thumb:
10339 // FIXME: this is incorrect for WinCE
10340 CmdArgs.push_back("thumb2pe");
10341 break;
10342 case llvm::Triple::x86:
10343 CmdArgs.push_back("i386pe");
10344 EntryPoint.append("_");
10345 break;
10346 case llvm::Triple::x86_64:
10347 CmdArgs.push_back("i386pep");
10348 break;
10349 }
10350
10351 if (Args.hasArg(options::OPT_shared)) {
10352 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010353 default:
10354 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010355 case llvm::Triple::arm:
10356 case llvm::Triple::thumb:
10357 case llvm::Triple::x86_64:
10358 EntryPoint.append("_DllMainCRTStartup");
10359 break;
10360 case llvm::Triple::x86:
10361 EntryPoint.append("_DllMainCRTStartup@12");
10362 break;
10363 }
10364
10365 CmdArgs.push_back("-shared");
10366 CmdArgs.push_back("-Bdynamic");
10367
10368 CmdArgs.push_back("--enable-auto-image-base");
10369
10370 CmdArgs.push_back("--entry");
10371 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10372 } else {
10373 EntryPoint.append("mainCRTStartup");
10374
10375 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10376 : "-Bdynamic");
10377
Douglas Katzman78b37b02015-11-17 20:28:07 +000010378 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010379 CmdArgs.push_back("--entry");
10380 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10381 }
10382
10383 // FIXME: handle subsystem
10384 }
10385
10386 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010387 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010388
10389 CmdArgs.push_back("-o");
10390 CmdArgs.push_back(Output.getFilename());
10391
10392 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10393 SmallString<261> ImpLib(Output.getFilename());
10394 llvm::sys::path::replace_extension(ImpLib, ".lib");
10395
10396 CmdArgs.push_back("--out-implib");
10397 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10398 }
10399
Douglas Katzman78b37b02015-11-17 20:28:07 +000010400 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010401 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10402 const char *CRTBegin;
10403
10404 CRTBegin =
10405 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10406 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10407 }
10408
10409 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010410 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010411 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10412
10413 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10414 !Args.hasArg(options::OPT_nodefaultlibs)) {
10415 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10416 !Args.hasArg(options::OPT_static);
10417 if (StaticCXX)
10418 CmdArgs.push_back("-Bstatic");
10419 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10420 if (StaticCXX)
10421 CmdArgs.push_back("-Bdynamic");
10422 }
10423
10424 if (!Args.hasArg(options::OPT_nostdlib)) {
10425 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10426 // TODO handle /MT[d] /MD[d]
10427 CmdArgs.push_back("-lmsvcrt");
10428 AddRunTimeLibs(TC, D, CmdArgs, Args);
10429 }
10430 }
10431
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010432 if (TC.getSanitizerArgs().needsAsanRt()) {
10433 // TODO handle /MT[d] /MD[d]
10434 if (Args.hasArg(options::OPT_shared)) {
10435 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10436 } else {
10437 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10438 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10439 // Make sure the dynamic runtime thunk is not optimized out at link time
10440 // to ensure proper SEH handling.
10441 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10442 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10443 ? "___asan_seh_interceptor"
10444 : "__asan_seh_interceptor"));
10445 }
10446 }
10447
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010448 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010449
Justin Bognerd3371d82015-07-17 03:35:54 +000010450 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010451}
Douglas Katzman84a75642015-06-19 14:55:19 +000010452
Douglas Katzman95354292015-06-23 20:42:09 +000010453void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10454 const InputInfo &Output,
10455 const InputInfoList &Inputs,
10456 const ArgList &Args,
10457 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010458 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010459 assert(Inputs.size() == 1);
10460 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010461 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10462 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010463
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010464 if (JA.getKind() == Action::PreprocessJobClass) {
10465 Args.ClaimAllArgs();
10466 CmdArgs.push_back("-E");
10467 } else {
10468 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10469 CmdArgs.push_back("-S");
10470 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10471 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010472 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010473
Douglas Katzmanf6071112015-08-03 14:34:22 +000010474 // Append all -I, -iquote, -isystem paths, defines/undefines,
10475 // 'f' flags, optimize flags, and warning options.
10476 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010477 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010478 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010479 options::OPT_f_Group, options::OPT_f_clang_Group,
10480 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010481 options::OPT_O_Group, options::OPT_W_Group,
10482 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010483
10484 // If we're producing a dependency file, and assembly is the final action,
10485 // then the name of the target in the dependency file should be the '.o'
10486 // file, not the '.s' file produced by this step. For example, instead of
10487 // /tmp/mumble.s: mumble.c .../someheader.h
10488 // the filename on the lefthand side should be "mumble.o"
10489 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10490 C.getActions().size() == 1 &&
10491 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10492 Arg *A = Args.getLastArg(options::OPT_o);
10493 if (A) {
10494 CmdArgs.push_back("-MT");
10495 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10496 }
10497 }
10498
Douglas Katzman84a75642015-06-19 14:55:19 +000010499 CmdArgs.push_back(II.getFilename());
10500 CmdArgs.push_back("-o");
10501 CmdArgs.push_back(Output.getFilename());
10502
10503 std::string Exec =
10504 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010505 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10506 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010507}
10508
Douglas Katzman95354292015-06-23 20:42:09 +000010509void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10510 const InputInfo &Output,
10511 const InputInfoList &Inputs,
10512 const ArgList &Args,
10513 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010514 ArgStringList CmdArgs;
10515
10516 assert(Inputs.size() == 1);
10517 const InputInfo &II = Inputs[0];
10518 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10519 assert(Output.getType() == types::TY_Object);
10520
10521 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010522 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10523 if (CPUArg)
10524 CmdArgs.push_back(
10525 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010526 CmdArgs.push_back("-noSPrefixing");
10527 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010528 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10529 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10530 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010531 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010532 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010533 }
10534 CmdArgs.push_back("-elf"); // Output format.
10535 CmdArgs.push_back(II.getFilename());
10536 CmdArgs.push_back(
10537 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10538
10539 std::string Exec =
10540 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010541 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10542 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010543}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010544
10545void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10546 const InputInfo &Output,
10547 const InputInfoList &Inputs,
10548 const ArgList &Args,
10549 const char *LinkingOutput) const {
10550 const auto &TC =
10551 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10552 const llvm::Triple &T = TC.getTriple();
10553 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010554 bool UseStartfiles =
10555 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010556 bool UseDefaultLibs =
10557 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010558
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010559 if (T.getArch() == llvm::Triple::sparc)
10560 CmdArgs.push_back("-EB");
10561 else // SHAVE assumes little-endian, and sparcel is expressly so.
10562 CmdArgs.push_back("-EL");
10563
10564 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10565 // but we never pass through a --sysroot option and various other bits.
10566 // For example, there are no sanitizers (yet) nor gold linker.
10567
10568 // Eat some arguments that may be present but have no effect.
10569 Args.ClaimAllArgs(options::OPT_g_Group);
10570 Args.ClaimAllArgs(options::OPT_w);
10571 Args.ClaimAllArgs(options::OPT_static_libgcc);
10572
10573 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10574 CmdArgs.push_back("-s");
10575
10576 CmdArgs.push_back("-o");
10577 CmdArgs.push_back(Output.getFilename());
10578
10579 if (UseStartfiles) {
10580 // If you want startfiles, it means you want the builtin crti and crtbegin,
10581 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010582 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10583 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010584 }
10585
10586 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10587 options::OPT_e, options::OPT_s, options::OPT_t,
10588 options::OPT_Z_Flag, options::OPT_r});
10589
Douglas Katzman674a3122015-11-18 16:24:46 +000010590 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010591
10592 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10593
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010594 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010595 if (C.getDriver().CCCIsCXX())
10596 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010597 if (T.getOS() == llvm::Triple::RTEMS) {
10598 CmdArgs.push_back("--start-group");
10599 CmdArgs.push_back("-lc");
10600 // You must provide your own "-L" option to enable finding these.
10601 CmdArgs.push_back("-lrtemscpu");
10602 CmdArgs.push_back("-lrtemsbsp");
10603 CmdArgs.push_back("--end-group");
10604 } else {
10605 CmdArgs.push_back("-lc");
10606 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010607 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010608 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010609 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010610 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10611 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010612 }
10613
10614 std::string Exec =
10615 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10616 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10617 CmdArgs, Inputs));
10618}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010619
10620void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10621 const InputInfo &Output,
10622 const InputInfoList &Inputs,
10623 const ArgList &Args,
10624 const char *LinkingOutput) const {
10625 claimNoWarnArgs(Args);
10626 ArgStringList CmdArgs;
10627
10628 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10629
10630 CmdArgs.push_back("-o");
10631 CmdArgs.push_back(Output.getFilename());
10632
10633 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10634 const InputInfo &Input = Inputs[0];
10635 assert(Input.isFilename() && "Invalid input.");
10636 CmdArgs.push_back(Input.getFilename());
10637
10638 const char *Exec =
10639 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10640 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10641}
10642
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010643static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10644 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10645 if (SanArgs.needsUbsanRt()) {
10646 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10647 }
10648 if (SanArgs.needsAsanRt()) {
10649 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10650 }
10651}
10652
10653static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10654 const JobAction &JA, const InputInfo &Output,
10655 const InputInfoList &Inputs,
10656 const ArgList &Args,
10657 const char *LinkingOutput) {
10658 const toolchains::FreeBSD &ToolChain =
10659 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10660 const Driver &D = ToolChain.getDriver();
10661 ArgStringList CmdArgs;
10662
10663 // Silence warning for "clang -g foo.o -o foo"
10664 Args.ClaimAllArgs(options::OPT_g_Group);
10665 // and "clang -emit-llvm foo.o -o foo"
10666 Args.ClaimAllArgs(options::OPT_emit_llvm);
10667 // and for "clang -w foo.o -o foo". Other warning options are already
10668 // handled somewhere else.
10669 Args.ClaimAllArgs(options::OPT_w);
10670
10671 if (!D.SysRoot.empty())
10672 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10673
10674 if (Args.hasArg(options::OPT_pie))
10675 CmdArgs.push_back("-pie");
10676
10677 if (Args.hasArg(options::OPT_rdynamic))
10678 CmdArgs.push_back("-export-dynamic");
10679 if (Args.hasArg(options::OPT_shared))
10680 CmdArgs.push_back("--oformat=so");
10681
10682 if (Output.isFilename()) {
10683 CmdArgs.push_back("-o");
10684 CmdArgs.push_back(Output.getFilename());
10685 } else {
10686 assert(Output.isNothing() && "Invalid output.");
10687 }
10688
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010689 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10690
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010691 Args.AddAllArgs(CmdArgs, options::OPT_L);
10692 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10693 Args.AddAllArgs(CmdArgs, options::OPT_e);
10694 Args.AddAllArgs(CmdArgs, options::OPT_s);
10695 Args.AddAllArgs(CmdArgs, options::OPT_t);
10696 Args.AddAllArgs(CmdArgs, options::OPT_r);
10697
10698 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10699 CmdArgs.push_back("--no-demangle");
10700
10701 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10702
10703 if (Args.hasArg(options::OPT_pthread)) {
10704 CmdArgs.push_back("-lpthread");
10705 }
10706
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010707 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10708
10709 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10710}
10711
10712static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10713 const JobAction &JA, const InputInfo &Output,
10714 const InputInfoList &Inputs,
10715 const ArgList &Args,
10716 const char *LinkingOutput) {
10717 const toolchains::FreeBSD &ToolChain =
10718 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10719 const Driver &D = ToolChain.getDriver();
10720 ArgStringList CmdArgs;
10721
10722 // Silence warning for "clang -g foo.o -o foo"
10723 Args.ClaimAllArgs(options::OPT_g_Group);
10724 // and "clang -emit-llvm foo.o -o foo"
10725 Args.ClaimAllArgs(options::OPT_emit_llvm);
10726 // and for "clang -w foo.o -o foo". Other warning options are already
10727 // handled somewhere else.
10728 Args.ClaimAllArgs(options::OPT_w);
10729
10730 if (!D.SysRoot.empty())
10731 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10732
10733 if (Args.hasArg(options::OPT_pie))
10734 CmdArgs.push_back("-pie");
10735
10736 if (Args.hasArg(options::OPT_static)) {
10737 CmdArgs.push_back("-Bstatic");
10738 } else {
10739 if (Args.hasArg(options::OPT_rdynamic))
10740 CmdArgs.push_back("-export-dynamic");
10741 CmdArgs.push_back("--eh-frame-hdr");
10742 if (Args.hasArg(options::OPT_shared)) {
10743 CmdArgs.push_back("-Bshareable");
10744 } else {
10745 CmdArgs.push_back("-dynamic-linker");
10746 CmdArgs.push_back("/libexec/ld-elf.so.1");
10747 }
10748 CmdArgs.push_back("--enable-new-dtags");
10749 }
10750
10751 if (Output.isFilename()) {
10752 CmdArgs.push_back("-o");
10753 CmdArgs.push_back(Output.getFilename());
10754 } else {
10755 assert(Output.isNothing() && "Invalid output.");
10756 }
10757
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010758 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10759
Douglas Katzman78b37b02015-11-17 20:28:07 +000010760 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010761 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010762 if (!Args.hasArg(options::OPT_shared)) {
10763 if (Args.hasArg(options::OPT_pg))
10764 crt1 = "gcrt1.o";
10765 else if (Args.hasArg(options::OPT_pie))
10766 crt1 = "Scrt1.o";
10767 else
10768 crt1 = "crt1.o";
10769 }
10770 if (crt1)
10771 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10772
10773 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10774
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010775 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010776 if (Args.hasArg(options::OPT_static))
10777 crtbegin = "crtbeginT.o";
10778 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10779 crtbegin = "crtbeginS.o";
10780 else
10781 crtbegin = "crtbegin.o";
10782
10783 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10784 }
10785
10786 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010787 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010788 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10789 Args.AddAllArgs(CmdArgs, options::OPT_e);
10790 Args.AddAllArgs(CmdArgs, options::OPT_s);
10791 Args.AddAllArgs(CmdArgs, options::OPT_t);
10792 Args.AddAllArgs(CmdArgs, options::OPT_r);
10793
10794 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10795 CmdArgs.push_back("--no-demangle");
10796
10797 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10798
Douglas Katzman78b37b02015-11-17 20:28:07 +000010799 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010800 // For PS4, we always want to pass libm, libstdc++ and libkernel
10801 // libraries for both C and C++ compilations.
10802 CmdArgs.push_back("-lkernel");
10803 if (D.CCCIsCXX()) {
10804 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10805 if (Args.hasArg(options::OPT_pg))
10806 CmdArgs.push_back("-lm_p");
10807 else
10808 CmdArgs.push_back("-lm");
10809 }
10810 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10811 // the default system libraries. Just mimic this for now.
10812 if (Args.hasArg(options::OPT_pg))
10813 CmdArgs.push_back("-lgcc_p");
10814 else
10815 CmdArgs.push_back("-lcompiler_rt");
10816 if (Args.hasArg(options::OPT_static)) {
10817 CmdArgs.push_back("-lstdc++");
10818 } else if (Args.hasArg(options::OPT_pg)) {
10819 CmdArgs.push_back("-lgcc_eh_p");
10820 } else {
10821 CmdArgs.push_back("--as-needed");
10822 CmdArgs.push_back("-lstdc++");
10823 CmdArgs.push_back("--no-as-needed");
10824 }
10825
10826 if (Args.hasArg(options::OPT_pthread)) {
10827 if (Args.hasArg(options::OPT_pg))
10828 CmdArgs.push_back("-lpthread_p");
10829 else
10830 CmdArgs.push_back("-lpthread");
10831 }
10832
10833 if (Args.hasArg(options::OPT_pg)) {
10834 if (Args.hasArg(options::OPT_shared))
10835 CmdArgs.push_back("-lc");
10836 else {
10837 if (Args.hasArg(options::OPT_static)) {
10838 CmdArgs.push_back("--start-group");
10839 CmdArgs.push_back("-lc_p");
10840 CmdArgs.push_back("-lpthread_p");
10841 CmdArgs.push_back("--end-group");
10842 } else {
10843 CmdArgs.push_back("-lc_p");
10844 }
10845 }
10846 CmdArgs.push_back("-lgcc_p");
10847 } else {
10848 if (Args.hasArg(options::OPT_static)) {
10849 CmdArgs.push_back("--start-group");
10850 CmdArgs.push_back("-lc");
10851 CmdArgs.push_back("-lpthread");
10852 CmdArgs.push_back("--end-group");
10853 } else {
10854 CmdArgs.push_back("-lc");
10855 }
10856 CmdArgs.push_back("-lcompiler_rt");
10857 }
10858
10859 if (Args.hasArg(options::OPT_static)) {
10860 CmdArgs.push_back("-lstdc++");
10861 } else if (Args.hasArg(options::OPT_pg)) {
10862 CmdArgs.push_back("-lgcc_eh_p");
10863 } else {
10864 CmdArgs.push_back("--as-needed");
10865 CmdArgs.push_back("-lstdc++");
10866 CmdArgs.push_back("--no-as-needed");
10867 }
10868 }
10869
Douglas Katzman78b37b02015-11-17 20:28:07 +000010870 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010871 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10872 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10873 else
10874 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10875 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10876 }
10877
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010878 const char *Exec =
10879#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010880 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010881#else
10882 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10883#endif
10884
10885 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10886}
10887
10888void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10889 const InputInfo &Output,
10890 const InputInfoList &Inputs,
10891 const ArgList &Args,
10892 const char *LinkingOutput) const {
10893 const toolchains::FreeBSD &ToolChain =
10894 static_cast<const toolchains::FreeBSD &>(getToolChain());
10895 const Driver &D = ToolChain.getDriver();
10896 bool PS4Linker;
10897 StringRef LinkerOptName;
10898 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10899 LinkerOptName = A->getValue();
10900 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10901 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10902 }
10903
10904 if (LinkerOptName == "gold")
10905 PS4Linker = false;
10906 else if (LinkerOptName == "ps4")
10907 PS4Linker = true;
10908 else
10909 PS4Linker = !Args.hasArg(options::OPT_shared);
10910
10911 if (PS4Linker)
10912 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10913 else
10914 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10915}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010916
10917void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10918 const InputInfo &Output,
10919 const InputInfoList &Inputs,
10920 const ArgList &Args,
10921 const char *LinkingOutput) const {
10922 const auto &TC =
10923 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010924 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010925
10926 std::vector<std::string> gpu_archs =
10927 Args.getAllArgValues(options::OPT_march_EQ);
10928 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10929 const std::string& gpu_arch = gpu_archs[0];
10930
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010931 ArgStringList CmdArgs;
10932 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010933 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10934 // ptxas does not accept -g option if optimization is enabled, so
10935 // we ignore the compiler's -O* options if we want debug info.
10936 CmdArgs.push_back("-g");
10937 CmdArgs.push_back("--dont-merge-basicblocks");
10938 CmdArgs.push_back("--return-at-end");
10939 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10940 // Map the -O we received to -O{0,1,2,3}.
10941 //
10942 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10943 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010944
Justin Lebar2836dcd2016-01-19 19:52:21 +000010945 // -O3 seems like the least-bad option when -Osomething is specified to
10946 // clang but it isn't handled below.
10947 StringRef OOpt = "3";
10948 if (A->getOption().matches(options::OPT_O4) ||
10949 A->getOption().matches(options::OPT_Ofast))
10950 OOpt = "3";
10951 else if (A->getOption().matches(options::OPT_O0))
10952 OOpt = "0";
10953 else if (A->getOption().matches(options::OPT_O)) {
10954 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10955 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10956 .Case("1", "1")
10957 .Case("2", "2")
10958 .Case("3", "3")
10959 .Case("s", "2")
10960 .Case("z", "2")
10961 .Default("2");
10962 }
10963 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10964 } else {
10965 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10966 // to no optimizations, but ptxas's default is -O3.
10967 CmdArgs.push_back("-O0");
10968 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010969
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010970 CmdArgs.push_back("--gpu-name");
10971 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10972 CmdArgs.push_back("--output-file");
10973 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10974 for (const auto& II : Inputs)
10975 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10976
10977 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10978 CmdArgs.push_back(Args.MakeArgString(A));
10979
10980 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10981 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10982}
10983
10984// All inputs to this linker must be from CudaDeviceActions, as we need to look
10985// at the Inputs' Actions in order to figure out which GPU architecture they
10986// correspond to.
10987void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10988 const InputInfo &Output,
10989 const InputInfoList &Inputs,
10990 const ArgList &Args,
10991 const char *LinkingOutput) const {
10992 const auto &TC =
10993 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010994 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010995
10996 ArgStringList CmdArgs;
10997 CmdArgs.push_back("--cuda");
10998 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10999 CmdArgs.push_back(Args.MakeArgString("--create"));
11000 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11001
11002 for (const auto& II : Inputs) {
11003 auto* A = cast<const CudaDeviceAction>(II.getAction());
11004 // We need to pass an Arch of the form "sm_XX" for cubin files and
11005 // "compute_XX" for ptx.
11006 const char *Arch = (II.getType() == types::TY_PP_Asm)
11007 ? A->getComputeArchName()
11008 : A->getGpuArchName();
11009 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11010 Arch + ",file=" + II.getFilename()));
11011 }
11012
11013 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11014 CmdArgs.push_back(Args.MakeArgString(A));
11015
11016 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11017 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11018}