blob: 91f7306bcdca6cf578d8ad6d306616602d50b6bc [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.
Tim Northover99694fe2016-04-13 17:08:51 +0000806 if (Triple.isOSBinFormatMachO() &&
807 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
808 ABI = FloatABI::Hard;
809 else
810 ABI = FloatABI::Soft;
811
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000812 if (Triple.getOS() != llvm::Triple::UnknownOS ||
813 !Triple.isOSBinFormatMachO())
814 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000815 break;
816 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000817 }
818 }
819
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000820 assert(ABI != FloatABI::Invalid && "must select an ABI");
821 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000822}
823
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000824static void getARMTargetFeatures(const ToolChain &TC,
825 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000826 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000827 std::vector<const char *> &Features,
828 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000829 const Driver &D = TC.getDriver();
830
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000831 bool KernelOrKext =
832 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000833 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000834 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
835 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
836
Nico Weber6e0ebae2015-04-29 21:16:40 +0000837 if (!ForAS) {
838 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
839 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
840 // stripped out by the ARM target. We should probably pass this a new
841 // -target-option, which is handled by the -cc1/-cc1as invocation.
842 //
843 // FIXME2: For consistency, it would be ideal if we set up the target
844 // machine state the same when using the frontend or the assembler. We don't
845 // currently do that for the assembler, we pass the options directly to the
846 // backend and never even instantiate the frontend TargetInfo. If we did,
847 // and used its handleTargetFeatures hook, then we could ensure the
848 // assembler and the frontend behave the same.
849
850 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000851 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000852 Features.push_back("+soft-float");
853
854 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000855 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000856 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000857 } else {
858 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
859 // to the assembler correctly.
860 for (const Arg *A :
861 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
862 StringRef Value = A->getValue();
863 if (Value.startswith("-mfpu=")) {
864 WaFPU = A;
865 } else if (Value.startswith("-mcpu=")) {
866 WaCPU = A;
867 } else if (Value.startswith("-mhwdiv=")) {
868 WaHDiv = A;
869 } else if (Value.startswith("-march=")) {
870 WaArch = A;
871 }
872 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000873 }
874
Renato Golin7c542b42015-07-27 23:44:45 +0000875 // Check -march. ClangAs gives preference to -Wa,-march=.
876 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000877 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000878 if (WaArch) {
879 if (ArchArg)
880 D.Diag(clang::diag::warn_drv_unused_argument)
881 << ArchArg->getAsString(Args);
882 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000883 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000884 // FIXME: Set Arch.
885 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
886 } else if (ArchArg) {
887 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000888 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000889 }
890
Renato Golin7c542b42015-07-27 23:44:45 +0000891 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
892 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000893 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000894 if (WaCPU) {
895 if (CPUArg)
896 D.Diag(clang::diag::warn_drv_unused_argument)
897 << CPUArg->getAsString(Args);
898 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000899 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000900 } else if (CPUArg) {
901 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000902 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000903 }
John Brawna95c1a82015-05-08 12:52:18 +0000904
Renato Golin23459c62015-07-30 16:40:17 +0000905 // Add CPU features for generic CPUs
906 if (CPUName == "native") {
907 llvm::StringMap<bool> HostFeatures;
908 if (llvm::sys::getHostCPUFeatures(HostFeatures))
909 for (auto &F : HostFeatures)
910 Features.push_back(
911 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
912 }
913
914 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
915 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
916 if (WaFPU) {
917 if (FPUArg)
918 D.Diag(clang::diag::warn_drv_unused_argument)
919 << FPUArg->getAsString(Args);
920 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
921 Features);
922 } else if (FPUArg) {
923 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
924 }
925
926 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
927 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
928 if (WaHDiv) {
929 if (HDivArg)
930 D.Diag(clang::diag::warn_drv_unused_argument)
931 << HDivArg->getAsString(Args);
932 getARMHWDivFeatures(D, WaHDiv, Args,
933 StringRef(WaHDiv->getValue()).substr(8), Features);
934 } else if (HDivArg)
935 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
936
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000937 // Setting -msoft-float effectively disables NEON because of the GCC
938 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000939 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000940 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000941 // Also need to explicitly disable features which imply NEON.
942 Features.push_back("-crypto");
943 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000944
Eric Christopher269c2a22015-04-04 03:34:43 +0000945 // En/disable crc code generation.
946 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000947 if (A->getOption().matches(options::OPT_mcrc))
948 Features.push_back("+crc");
949 else
950 Features.push_back("-crc");
951 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000952
Akira Hatanakac2694822015-07-07 08:28:42 +0000953 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
954 // neither options are specified, see if we are compiling for kernel/kext and
955 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000956 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
957 options::OPT_mno_long_calls)) {
958 if (A->getOption().matches(options::OPT_mlong_calls))
959 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000960 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
961 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000962 Features.push_back("+long-calls");
963 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000964
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000965 // Kernel code has more strict alignment requirements.
966 if (KernelOrKext)
967 Features.push_back("+strict-align");
968 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
969 options::OPT_munaligned_access)) {
970 if (A->getOption().matches(options::OPT_munaligned_access)) {
971 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
972 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
973 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000974 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
975 // access either.
976 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
977 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000978 } else
979 Features.push_back("+strict-align");
980 } else {
981 // Assume pre-ARMv6 doesn't support unaligned accesses.
982 //
983 // ARMv6 may or may not support unaligned accesses depending on the
984 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
985 // Darwin and NetBSD targets support unaligned accesses, and others don't.
986 //
987 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
988 // which raises an alignment fault on unaligned accesses. Linux
989 // defaults this bit to 0 and handles it as a system-wide (not
990 // per-process) setting. It is therefore safe to assume that ARMv7+
991 // Linux targets support unaligned accesses. The same goes for NaCl.
992 //
993 // The above behavior is consistent with GCC.
994 int VersionNum = getARMSubArchVersionNumber(Triple);
995 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000996 if (VersionNum < 6 ||
997 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000998 Features.push_back("+strict-align");
999 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
1000 if (VersionNum < 7)
1001 Features.push_back("+strict-align");
1002 } else
1003 Features.push_back("+strict-align");
1004 }
1005
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001006 // llvm does not support reserving registers in general. There is support
1007 // for reserving r9 on ARM though (defined as a platform-specific register
1008 // in ARM EABI).
1009 if (Args.hasArg(options::OPT_ffixed_r9))
1010 Features.push_back("+reserve-r9");
1011
Dimitry Andric08107392016-01-06 07:42:18 +00001012 // The kext linker doesn't know how to deal with movw/movt.
1013 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001014 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001015}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001016
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001017void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1018 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001019 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001020 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001021 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001022 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001023 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001024 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001025 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001026 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001027 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001028 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001029 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001030 } else {
1031 ABIName = "apcs-gnu";
1032 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001033 } else if (Triple.isOSWindows()) {
1034 // FIXME: this is invalid for WindowsCE
1035 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001036 } else {
1037 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001038 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001039 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001040 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001041 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001042 ABIName = "aapcs-linux";
1043 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001044 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001045 case llvm::Triple::EABI:
1046 ABIName = "aapcs";
1047 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001048 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001049 if (Triple.getOS() == llvm::Triple::NetBSD)
1050 ABIName = "apcs-gnu";
1051 else
1052 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001053 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001054 }
1055 }
1056 CmdArgs.push_back("-target-abi");
1057 CmdArgs.push_back(ABIName);
1058
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001059 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001060 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001061 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001062 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001064 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001065 CmdArgs.push_back("-mfloat-abi");
1066 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001067 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001068 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001069 CmdArgs.push_back("-mfloat-abi");
1070 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001071 } else {
1072 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001073 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001074 CmdArgs.push_back("-mfloat-abi");
1075 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001076 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001077
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001078 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001079 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1080 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001081 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001082 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001083 CmdArgs.push_back("-arm-global-merge=false");
1084 else
1085 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001086 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001087
Bob Wilson9c8af452013-04-11 18:53:25 +00001088 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001089 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001090 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001091}
Renato Goline17c5802015-07-27 23:44:42 +00001092// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001093
Tim Northover573cbee2014-05-24 12:52:07 +00001094/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1095/// targeting.
1096static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001097 Arg *A;
1098 std::string CPU;
1099 // If we have -mtune or -mcpu, use that.
1100 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001101 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001102 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001103 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001104 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001105 }
1106
Kevin Qin110db6f2014-07-18 07:03:22 +00001107 // Handle CPU name is 'native'.
1108 if (CPU == "native")
1109 return llvm::sys::getHostCPUName();
1110 else if (CPU.size())
1111 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001112
James Molloy9b1586b2014-04-17 12:51:17 +00001113 // Make sure we pick "cyclone" if -arch is used.
1114 // FIXME: Should this be picked by checking the target triple instead?
1115 if (Args.getLastArg(options::OPT_arch))
1116 return "cyclone";
1117
1118 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001119}
1120
Tim Northover573cbee2014-05-24 12:52:07 +00001121void Clang::AddAArch64TargetArgs(const ArgList &Args,
1122 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001123 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1124 llvm::Triple Triple(TripleStr);
1125
1126 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1127 Args.hasArg(options::OPT_mkernel) ||
1128 Args.hasArg(options::OPT_fapple_kext))
1129 CmdArgs.push_back("-disable-red-zone");
1130
1131 if (!Args.hasFlag(options::OPT_mimplicit_float,
1132 options::OPT_mno_implicit_float, true))
1133 CmdArgs.push_back("-no-implicit-float");
1134
Craig Topper92fc2df2014-05-17 16:56:41 +00001135 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001136 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1137 ABIName = A->getValue();
1138 else if (Triple.isOSDarwin())
1139 ABIName = "darwinpcs";
1140 else
1141 ABIName = "aapcs";
1142
1143 CmdArgs.push_back("-target-abi");
1144 CmdArgs.push_back(ABIName);
1145
Bradley Smith9ff64332014-10-13 10:16:06 +00001146 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1147 options::OPT_mno_fix_cortex_a53_835769)) {
1148 CmdArgs.push_back("-backend-option");
1149 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1150 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1151 else
1152 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001153 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001154 // Enabled A53 errata (835769) workaround by default on android
1155 CmdArgs.push_back("-backend-option");
1156 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001157 }
1158
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001159 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1161 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001162 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001163 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001164 CmdArgs.push_back("-aarch64-global-merge=false");
1165 else
1166 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001167 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001168}
1169
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001170// Get CPU and ABI names. They are not independent
1171// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001172void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1173 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001174 const char *DefMips32CPU = "mips32r2";
1175 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001176
Daniel Sanders2bf13662014-07-10 14:40:57 +00001177 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1178 // default for mips64(el)?-img-linux-gnu.
1179 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1180 Triple.getEnvironment() == llvm::Triple::GNU) {
1181 DefMips32CPU = "mips32r6";
1182 DefMips64CPU = "mips64r6";
1183 }
Renato Golin7c542b42015-07-27 23:44:45 +00001184
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001185 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001186 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001187 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001188
Brad Smithba26f582015-01-06 02:53:17 +00001189 // MIPS3 is the default for mips64*-unknown-openbsd.
1190 if (Triple.getOS() == llvm::Triple::OpenBSD)
1191 DefMips64CPU = "mips3";
1192
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001194 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001195
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001196 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001197 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001198 // Convert a GNU style Mips ABI name to the name
1199 // accepted by LLVM Mips backend.
1200 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001201 .Case("32", "o32")
1202 .Case("64", "n64")
1203 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001204 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001205
1206 // Setup default CPU and ABI names.
1207 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001208 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001209 default:
1210 llvm_unreachable("Unexpected triple arch name");
1211 case llvm::Triple::mips:
1212 case llvm::Triple::mipsel:
1213 CPUName = DefMips32CPU;
1214 break;
1215 case llvm::Triple::mips64:
1216 case llvm::Triple::mips64el:
1217 CPUName = DefMips64CPU;
1218 break;
1219 }
1220 }
1221
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001222 if (ABIName.empty()) {
1223 // Deduce ABI name from the target triple.
1224 if (Triple.getArch() == llvm::Triple::mips ||
1225 Triple.getArch() == llvm::Triple::mipsel)
1226 ABIName = "o32";
1227 else
1228 ABIName = "n64";
1229 }
1230
1231 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001232 // Deduce CPU name from ABI name.
1233 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001234 .Cases("o32", "eabi", DefMips32CPU)
1235 .Cases("n32", "n64", DefMips64CPU)
1236 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001237 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001238
1239 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001240}
1241
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001242std::string mips::getMipsABILibSuffix(const ArgList &Args,
1243 const llvm::Triple &Triple) {
1244 StringRef CPUName, ABIName;
1245 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1246 return llvm::StringSwitch<std::string>(ABIName)
1247 .Case("o32", "")
1248 .Case("n32", "32")
1249 .Case("n64", "64");
1250}
1251
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001252// Convert ABI name to the GNU tools acceptable variant.
1253static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1254 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001255 .Case("o32", "32")
1256 .Case("n64", "64")
1257 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001258}
1259
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001260// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1261// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001262static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1263 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001264 if (Arg *A =
1265 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1266 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001267 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001268 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001269 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001270 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001271 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001272 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1273 .Case("soft", mips::FloatABI::Soft)
1274 .Case("hard", mips::FloatABI::Hard)
1275 .Default(mips::FloatABI::Invalid);
1276 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001277 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001278 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001279 }
1280 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001281 }
1282
1283 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001284 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001285 // Assume "hard", because it's a default value used by gcc.
1286 // When we start to recognize specific target MIPS processors,
1287 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001288 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001289 }
1290
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001291 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1292 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001293}
1294
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001295static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001296 std::vector<const char *> &Features,
1297 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001298 StringRef FeatureName) {
1299 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001300 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001301 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001302 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001303 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001304 }
1305}
1306
Daniel Sanders379d44b2014-07-16 11:52:23 +00001307static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1308 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001309 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001310 StringRef CPUName;
1311 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001312 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001313 ABIName = getGnuCompatibleMipsABIName(ABIName);
1314
Daniel Sandersfeb61302014-08-08 15:47:17 +00001315 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1316 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001317
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001318 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1319 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001320 // FIXME: Note, this is a hack. We need to pass the selected float
1321 // mode to the MipsTargetInfoBase to define appropriate macros there.
1322 // Now it is the only method.
1323 Features.push_back("+soft-float");
1324 }
1325
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001326 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001327 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001328 if (Val == "2008") {
1329 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1330 Features.push_back("+nan2008");
1331 else {
1332 Features.push_back("-nan2008");
1333 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1334 }
1335 } else if (Val == "legacy") {
1336 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1337 Features.push_back("-nan2008");
1338 else {
1339 Features.push_back("+nan2008");
1340 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1341 }
1342 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001343 D.Diag(diag::err_drv_unsupported_option_argument)
1344 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001345 }
1346
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001347 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1348 options::OPT_mdouble_float, "single-float");
1349 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1350 "mips16");
1351 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1352 options::OPT_mno_micromips, "micromips");
1353 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1354 "dsp");
1355 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1356 "dspr2");
1357 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1358 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001359
1360 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1361 // pass -mfpxx
1362 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1363 options::OPT_mfp64)) {
1364 if (A->getOption().matches(options::OPT_mfp32))
1365 Features.push_back(Args.MakeArgString("-fp64"));
1366 else if (A->getOption().matches(options::OPT_mfpxx)) {
1367 Features.push_back(Args.MakeArgString("+fpxx"));
1368 Features.push_back(Args.MakeArgString("+nooddspreg"));
1369 } else
1370 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001371 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001372 Features.push_back(Args.MakeArgString("+fpxx"));
1373 Features.push_back(Args.MakeArgString("+nooddspreg"));
1374 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001375
Daniel Sanders28e5d392014-07-10 10:39:51 +00001376 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1377 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001378}
1379
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001380void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001381 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001382 const Driver &D = getToolChain().getDriver();
1383 StringRef CPUName;
1384 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001385 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001386 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001387
1388 CmdArgs.push_back("-target-abi");
1389 CmdArgs.push_back(ABIName.data());
1390
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001391 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1392 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001393 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001394 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001395 CmdArgs.push_back("-mfloat-abi");
1396 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001397 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001398 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001399 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001400 CmdArgs.push_back("-mfloat-abi");
1401 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001402 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001403
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001404 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1405 if (A->getOption().matches(options::OPT_mxgot)) {
1406 CmdArgs.push_back("-mllvm");
1407 CmdArgs.push_back("-mxgot");
1408 }
1409 }
1410
Simon Atanasyanc580b322013-05-11 06:33:44 +00001411 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1412 options::OPT_mno_ldc1_sdc1)) {
1413 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1414 CmdArgs.push_back("-mllvm");
1415 CmdArgs.push_back("-mno-ldc1-sdc1");
1416 }
1417 }
1418
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001419 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1420 options::OPT_mno_check_zero_division)) {
1421 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1422 CmdArgs.push_back("-mllvm");
1423 CmdArgs.push_back("-mno-check-zero-division");
1424 }
1425 }
1426
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001427 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001428 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001429 CmdArgs.push_back("-mllvm");
1430 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1431 A->claim();
1432 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001433}
1434
Hal Finkel8eb59282012-06-11 22:35:19 +00001435/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1436static std::string getPPCTargetCPU(const ArgList &Args) {
1437 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001438 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001439
1440 if (CPUName == "native") {
1441 std::string CPU = llvm::sys::getHostCPUName();
1442 if (!CPU.empty() && CPU != "generic")
1443 return CPU;
1444 else
1445 return "";
1446 }
1447
1448 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001449 .Case("common", "generic")
1450 .Case("440", "440")
1451 .Case("440fp", "440")
1452 .Case("450", "450")
1453 .Case("601", "601")
1454 .Case("602", "602")
1455 .Case("603", "603")
1456 .Case("603e", "603e")
1457 .Case("603ev", "603ev")
1458 .Case("604", "604")
1459 .Case("604e", "604e")
1460 .Case("620", "620")
1461 .Case("630", "pwr3")
1462 .Case("G3", "g3")
1463 .Case("7400", "7400")
1464 .Case("G4", "g4")
1465 .Case("7450", "7450")
1466 .Case("G4+", "g4+")
1467 .Case("750", "750")
1468 .Case("970", "970")
1469 .Case("G5", "g5")
1470 .Case("a2", "a2")
1471 .Case("a2q", "a2q")
1472 .Case("e500mc", "e500mc")
1473 .Case("e5500", "e5500")
1474 .Case("power3", "pwr3")
1475 .Case("power4", "pwr4")
1476 .Case("power5", "pwr5")
1477 .Case("power5x", "pwr5x")
1478 .Case("power6", "pwr6")
1479 .Case("power6x", "pwr6x")
1480 .Case("power7", "pwr7")
1481 .Case("power8", "pwr8")
1482 .Case("pwr3", "pwr3")
1483 .Case("pwr4", "pwr4")
1484 .Case("pwr5", "pwr5")
1485 .Case("pwr5x", "pwr5x")
1486 .Case("pwr6", "pwr6")
1487 .Case("pwr6x", "pwr6x")
1488 .Case("pwr7", "pwr7")
1489 .Case("pwr8", "pwr8")
1490 .Case("powerpc", "ppc")
1491 .Case("powerpc64", "ppc64")
1492 .Case("powerpc64le", "ppc64le")
1493 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001494 }
1495
1496 return "";
1497}
1498
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001499static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1500 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001501 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001502 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001503
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001504 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1505 if (FloatABI == ppc::FloatABI::Soft &&
1506 !(Triple.getArch() == llvm::Triple::ppc64 ||
1507 Triple.getArch() == llvm::Triple::ppc64le))
1508 Features.push_back("+soft-float");
1509 else if (FloatABI == ppc::FloatABI::Soft &&
1510 (Triple.getArch() == llvm::Triple::ppc64 ||
1511 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001512 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001513 << "soft float is not supported for ppc64";
1514
Eric Christopher643bb6a2013-10-16 20:40:08 +00001515 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001516 AddTargetFeature(Args, Features, options::OPT_faltivec,
1517 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001518}
1519
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001520ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1521 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1522 if (Arg *A =
1523 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1524 options::OPT_mfloat_abi_EQ)) {
1525 if (A->getOption().matches(options::OPT_msoft_float))
1526 ABI = ppc::FloatABI::Soft;
1527 else if (A->getOption().matches(options::OPT_mhard_float))
1528 ABI = ppc::FloatABI::Hard;
1529 else {
1530 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1531 .Case("soft", ppc::FloatABI::Soft)
1532 .Case("hard", ppc::FloatABI::Hard)
1533 .Default(ppc::FloatABI::Invalid);
1534 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1535 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1536 ABI = ppc::FloatABI::Hard;
1537 }
1538 }
1539 }
1540
1541 // If unspecified, choose the default based on the platform.
1542 if (ABI == ppc::FloatABI::Invalid) {
1543 ABI = ppc::FloatABI::Hard;
1544 }
1545
1546 return ABI;
1547}
1548
Ulrich Weigand8afad612014-07-28 13:17:52 +00001549void Clang::AddPPCTargetArgs(const ArgList &Args,
1550 ArgStringList &CmdArgs) const {
1551 // Select the ABI to use.
1552 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001553 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001554 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001555 case llvm::Triple::ppc64: {
1556 // When targeting a processor that supports QPX, or if QPX is
1557 // specifically enabled, default to using the ABI that supports QPX (so
1558 // long as it is not specifically disabled).
1559 bool HasQPX = false;
1560 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1561 HasQPX = A->getValue() == StringRef("a2q");
1562 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1563 if (HasQPX) {
1564 ABIName = "elfv1-qpx";
1565 break;
1566 }
1567
Ulrich Weigand8afad612014-07-28 13:17:52 +00001568 ABIName = "elfv1";
1569 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001570 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001571 case llvm::Triple::ppc64le:
1572 ABIName = "elfv2";
1573 break;
1574 default:
1575 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001576 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001577
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001578 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1579 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1580 // the option if given as we don't have backend support for any targets
1581 // that don't use the altivec abi.
1582 if (StringRef(A->getValue()) != "altivec")
1583 ABIName = A->getValue();
1584
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001585 ppc::FloatABI FloatABI =
1586 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1587
1588 if (FloatABI == ppc::FloatABI::Soft) {
1589 // Floating point operations and argument passing are soft.
1590 CmdArgs.push_back("-msoft-float");
1591 CmdArgs.push_back("-mfloat-abi");
1592 CmdArgs.push_back("soft");
1593 } else {
1594 // Floating point operations and argument passing are hard.
1595 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1596 CmdArgs.push_back("-mfloat-abi");
1597 CmdArgs.push_back("hard");
1598 }
1599
Ulrich Weigand8afad612014-07-28 13:17:52 +00001600 if (ABIName) {
1601 CmdArgs.push_back("-target-abi");
1602 CmdArgs.push_back(ABIName);
1603 }
1604}
1605
1606bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1607 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1608 return A && (A->getValue() == StringRef(Value));
1609}
1610
Tom Stellard6674c702013-04-01 20:56:53 +00001611/// Get the (LLVM) name of the R600 gpu we are targeting.
1612static std::string getR600TargetGPU(const ArgList &Args) {
1613 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001614 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001615 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001616 .Cases("rv630", "rv635", "r600")
1617 .Cases("rv610", "rv620", "rs780", "rs880")
1618 .Case("rv740", "rv770")
1619 .Case("palm", "cedar")
1620 .Cases("sumo", "sumo2", "sumo")
1621 .Case("hemlock", "cypress")
1622 .Case("aruba", "cayman")
1623 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001624 }
1625 return "";
1626}
1627
Jacques Pienaard964cc22016-03-28 21:02:54 +00001628static std::string getLanaiTargetCPU(const ArgList &Args) {
1629 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1630 return A->getValue();
1631 }
1632 return "";
1633}
1634
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001635void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001636 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001637 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001638 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001639
James Y Knightb2406522015-06-15 20:51:24 +00001640 bool SoftFloatABI = false;
1641 if (Arg *A =
1642 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001643 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001644 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001645 }
1646
James Y Knightb2406522015-06-15 20:51:24 +00001647 // Only the hard-float ABI on Sparc is standardized, and it is the
1648 // default. GCC also supports a nonstandard soft-float ABI mode, and
1649 // perhaps LLVM should implement that, too. However, since llvm
1650 // currently does not support Sparc soft-float, at all, display an
1651 // error if it's requested.
1652 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001653 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1654 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001655 }
1656}
1657
Richard Sandiford4652d892013-07-19 16:51:51 +00001658static const char *getSystemZTargetCPU(const ArgList &Args) {
1659 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1660 return A->getValue();
1661 return "z10";
1662}
1663
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001664static void getSystemZTargetFeatures(const ArgList &Args,
1665 std::vector<const char *> &Features) {
1666 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001667 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001668 if (A->getOption().matches(options::OPT_mhtm))
1669 Features.push_back("+transactional-execution");
1670 else
1671 Features.push_back("-transactional-execution");
1672 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001673 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001674 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001675 if (A->getOption().matches(options::OPT_mvx))
1676 Features.push_back("+vector");
1677 else
1678 Features.push_back("-vector");
1679 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001680}
1681
Chandler Carruth953fb082013-01-13 11:46:33 +00001682static const char *getX86TargetCPU(const ArgList &Args,
1683 const llvm::Triple &Triple) {
1684 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001685 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001686 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001687 return "core-avx2";
1688
Chandler Carruth953fb082013-01-13 11:46:33 +00001689 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001690 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001691
1692 // FIXME: Reject attempts to use -march=native unless the target matches
1693 // the host.
1694 //
1695 // FIXME: We should also incorporate the detected target features for use
1696 // with -native.
1697 std::string CPU = llvm::sys::getHostCPUName();
1698 if (!CPU.empty() && CPU != "generic")
1699 return Args.MakeArgString(CPU);
1700 }
1701
Reid Kleckner3123eff2015-06-30 16:32:04 +00001702 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1703 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1704 StringRef Arch = A->getValue();
1705 const char *CPU;
1706 if (Triple.getArch() == llvm::Triple::x86) {
1707 CPU = llvm::StringSwitch<const char *>(Arch)
1708 .Case("IA32", "i386")
1709 .Case("SSE", "pentium3")
1710 .Case("SSE2", "pentium4")
1711 .Case("AVX", "sandybridge")
1712 .Case("AVX2", "haswell")
1713 .Default(nullptr);
1714 } else {
1715 CPU = llvm::StringSwitch<const char *>(Arch)
1716 .Case("AVX", "sandybridge")
1717 .Case("AVX2", "haswell")
1718 .Default(nullptr);
1719 }
1720 if (CPU)
1721 return CPU;
1722 }
1723
Chandler Carruth953fb082013-01-13 11:46:33 +00001724 // Select the default CPU if none was given (or detection failed).
1725
1726 if (Triple.getArch() != llvm::Triple::x86_64 &&
1727 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001728 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001729
1730 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1731
1732 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001733 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001734 if (Triple.getArchName() == "x86_64h")
1735 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001736 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001737 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001738
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001739 // Set up default CPU name for PS4 compilers.
1740 if (Triple.isPS4CPU())
1741 return "btver2";
1742
Alexey Bataev286d1b92014-01-31 04:07:13 +00001743 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001744 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001745 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001746
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001747 // Everything else goes to x86-64 in 64-bit mode.
1748 if (Is64Bit)
1749 return "x86-64";
1750
1751 switch (Triple.getOS()) {
1752 case llvm::Triple::FreeBSD:
1753 case llvm::Triple::NetBSD:
1754 case llvm::Triple::OpenBSD:
1755 return "i486";
1756 case llvm::Triple::Haiku:
1757 return "i586";
1758 case llvm::Triple::Bitrig:
1759 return "i686";
1760 default:
1761 // Fallback to p4.
1762 return "pentium4";
1763 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001764}
1765
Dan Gohmanc2853072015-09-03 22:51:53 +00001766/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1767static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1768 // If we have -mcpu=, use that.
1769 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1770 StringRef CPU = A->getValue();
1771
1772#ifdef __wasm__
1773 // Handle "native" by examining the host. "native" isn't meaningful when
1774 // cross compiling, so only support this when the host is also WebAssembly.
1775 if (CPU == "native")
1776 return llvm::sys::getHostCPUName();
1777#endif
1778
1779 return CPU;
1780 }
1781
1782 return "generic";
1783}
1784
Renato Golin7c542b42015-07-27 23:44:45 +00001785static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1786 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001787 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001788 default:
1789 return "";
1790
Amara Emerson703da2e2013-10-31 09:32:33 +00001791 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001792 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001793 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001794
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001795 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001796 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001797 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001798 case llvm::Triple::thumbeb: {
1799 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001800 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001801 return arm::getARMTargetCPU(MCPU, MArch, T);
1802 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001803 case llvm::Triple::mips:
1804 case llvm::Triple::mipsel:
1805 case llvm::Triple::mips64:
1806 case llvm::Triple::mips64el: {
1807 StringRef CPUName;
1808 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001809 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001810 return CPUName;
1811 }
1812
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001813 case llvm::Triple::nvptx:
1814 case llvm::Triple::nvptx64:
1815 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1816 return A->getValue();
1817 return "";
1818
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001819 case llvm::Triple::ppc:
1820 case llvm::Triple::ppc64:
1821 case llvm::Triple::ppc64le: {
1822 std::string TargetCPUName = getPPCTargetCPU(Args);
1823 // LLVM may default to generating code for the native CPU,
1824 // but, like gcc, we default to a more generic option for
1825 // each architecture. (except on Darwin)
1826 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1827 if (T.getArch() == llvm::Triple::ppc64)
1828 TargetCPUName = "ppc64";
1829 else if (T.getArch() == llvm::Triple::ppc64le)
1830 TargetCPUName = "ppc64le";
1831 else
1832 TargetCPUName = "ppc";
1833 }
1834 return TargetCPUName;
1835 }
1836
1837 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001838 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001839 case llvm::Triple::sparcv9:
1840 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001841 return A->getValue();
1842 return "";
1843
1844 case llvm::Triple::x86:
1845 case llvm::Triple::x86_64:
1846 return getX86TargetCPU(Args, T);
1847
1848 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001849 return "hexagon" +
1850 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001851
Jacques Pienaard964cc22016-03-28 21:02:54 +00001852 case llvm::Triple::lanai:
1853 return getLanaiTargetCPU(Args);
1854
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001855 case llvm::Triple::systemz:
1856 return getSystemZTargetCPU(Args);
1857
1858 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001859 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001860 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001861
1862 case llvm::Triple::wasm32:
1863 case llvm::Triple::wasm64:
1864 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001865 }
1866}
1867
Alp Tokerce365ca2013-12-02 12:43:03 +00001868static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001869 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001870 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1871 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1872 // forward.
1873 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001874 std::string Plugin =
1875 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001876 CmdArgs.push_back(Args.MakeArgString(Plugin));
1877
1878 // Try to pass driver level flags relevant to LTO code generation down to
1879 // the plugin.
1880
1881 // Handle flags for selecting CPU variants.
1882 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1883 if (!CPU.empty())
1884 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001885
James Molloyf97fdae2015-12-21 10:44:36 +00001886 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1887 StringRef OOpt;
1888 if (A->getOption().matches(options::OPT_O4) ||
1889 A->getOption().matches(options::OPT_Ofast))
1890 OOpt = "3";
1891 else if (A->getOption().matches(options::OPT_O))
1892 OOpt = A->getValue();
1893 else if (A->getOption().matches(options::OPT_O0))
1894 OOpt = "0";
1895 if (!OOpt.empty())
1896 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1897 }
1898
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001899 if (IsThinLTO)
1900 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001901
1902 // If an explicit debugger tuning argument appeared, pass it along.
1903 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1904 options::OPT_ggdbN_Group)) {
1905 if (A->getOption().matches(options::OPT_glldb))
1906 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1907 else if (A->getOption().matches(options::OPT_gsce))
1908 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1909 else
1910 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1911 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001912}
1913
Sanjay Patel2987c292015-06-11 14:53:41 +00001914/// This is a helper function for validating the optional refinement step
1915/// parameter in reciprocal argument strings. Return false if there is an error
1916/// parsing the refinement step. Otherwise, return true and set the Position
1917/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001918static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001920 const char RefinementStepToken = ':';
1921 Position = In.find(RefinementStepToken);
1922 if (Position != StringRef::npos) {
1923 StringRef Option = A.getOption().getName();
1924 StringRef RefStep = In.substr(Position + 1);
1925 // Allow exactly one numeric character for the additional refinement
1926 // step parameter. This is reasonable for all currently-supported
1927 // operations and architectures because we would expect that a larger value
1928 // of refinement steps would cause the estimate "optimization" to
1929 // under-perform the native operation. Also, if the estimate does not
1930 // converge quickly, it probably will not ever converge, so further
1931 // refinement steps will not produce a better answer.
1932 if (RefStep.size() != 1) {
1933 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1934 return false;
1935 }
1936 char RefStepChar = RefStep[0];
1937 if (RefStepChar < '0' || RefStepChar > '9') {
1938 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1939 return false;
1940 }
1941 }
1942 return true;
1943}
1944
1945/// The -mrecip flag requires processing of many optional parameters.
1946static void ParseMRecip(const Driver &D, const ArgList &Args,
1947 ArgStringList &OutStrings) {
1948 StringRef DisabledPrefixIn = "!";
1949 StringRef DisabledPrefixOut = "!";
1950 StringRef EnabledPrefixOut = "";
1951 StringRef Out = "-mrecip=";
1952
1953 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1954 if (!A)
1955 return;
1956
1957 unsigned NumOptions = A->getNumValues();
1958 if (NumOptions == 0) {
1959 // No option is the same as "all".
1960 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1961 return;
1962 }
1963
1964 // Pass through "all", "none", or "default" with an optional refinement step.
1965 if (NumOptions == 1) {
1966 StringRef Val = A->getValue(0);
1967 size_t RefStepLoc;
1968 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1969 return;
1970 StringRef ValBase = Val.slice(0, RefStepLoc);
1971 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1972 OutStrings.push_back(Args.MakeArgString(Out + Val));
1973 return;
1974 }
1975 }
1976
1977 // Each reciprocal type may be enabled or disabled individually.
1978 // Check each input value for validity, concatenate them all back together,
1979 // and pass through.
1980
1981 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001982 OptionStrings.insert(std::make_pair("divd", false));
1983 OptionStrings.insert(std::make_pair("divf", false));
1984 OptionStrings.insert(std::make_pair("vec-divd", false));
1985 OptionStrings.insert(std::make_pair("vec-divf", false));
1986 OptionStrings.insert(std::make_pair("sqrtd", false));
1987 OptionStrings.insert(std::make_pair("sqrtf", false));
1988 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1989 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001990
1991 for (unsigned i = 0; i != NumOptions; ++i) {
1992 StringRef Val = A->getValue(i);
1993
1994 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1995 // Ignore the disablement token for string matching.
1996 if (IsDisabled)
1997 Val = Val.substr(1);
1998
1999 size_t RefStep;
2000 if (!getRefinementStep(Val, D, *A, RefStep))
2001 return;
2002
2003 StringRef ValBase = Val.slice(0, RefStep);
2004 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2005 if (OptionIter == OptionStrings.end()) {
2006 // Try again specifying float suffix.
2007 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2008 if (OptionIter == OptionStrings.end()) {
2009 // The input name did not match any known option string.
2010 D.Diag(diag::err_drv_unknown_argument) << Val;
2011 return;
2012 }
2013 // The option was specified without a float or double suffix.
2014 // Make sure that the double entry was not already specified.
2015 // The float entry will be checked below.
2016 if (OptionStrings[ValBase.str() + 'd']) {
2017 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2018 return;
2019 }
2020 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002021
Sanjay Patel2987c292015-06-11 14:53:41 +00002022 if (OptionIter->second == true) {
2023 // Duplicate option specified.
2024 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2025 return;
2026 }
2027
2028 // Mark the matched option as found. Do not allow duplicate specifiers.
2029 OptionIter->second = true;
2030
2031 // If the precision was not specified, also mark the double entry as found.
2032 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2033 OptionStrings[ValBase.str() + 'd'] = true;
2034
2035 // Build the output string.
2036 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2037 Out = Args.MakeArgString(Out + Prefix + Val);
2038 if (i != NumOptions - 1)
2039 Out = Args.MakeArgString(Out + ",");
2040 }
2041
2042 OutStrings.push_back(Args.MakeArgString(Out));
2043}
2044
Eric Christopherc54920a2015-03-23 19:26:05 +00002045static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002046 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002047 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002048 // If -march=native, autodetect the feature list.
2049 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2050 if (StringRef(A->getValue()) == "native") {
2051 llvm::StringMap<bool> HostFeatures;
2052 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2053 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002054 Features.push_back(
2055 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002056 }
2057 }
2058
Jim Grosbach82eee262013-11-16 00:53:35 +00002059 if (Triple.getArchName() == "x86_64h") {
2060 // x86_64h implies quite a few of the more modern subtarget features
2061 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2062 Features.push_back("-rdrnd");
2063 Features.push_back("-aes");
2064 Features.push_back("-pclmul");
2065 Features.push_back("-rtm");
2066 Features.push_back("-hle");
2067 Features.push_back("-fsgsbase");
2068 }
2069
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002070 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002071 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002072 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002073 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002074 Features.push_back("+sse4.2");
2075 Features.push_back("+popcnt");
2076 } else
2077 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002078 }
2079
Eric Christopherc54920a2015-03-23 19:26:05 +00002080 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002081 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2082 StringRef Arch = A->getValue();
2083 bool ArchUsed = false;
2084 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002085 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002086 if (Arch == "AVX" || Arch == "AVX2") {
2087 ArchUsed = true;
2088 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2089 }
2090 }
2091 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002092 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002093 if (Arch == "IA32") {
2094 ArchUsed = true;
2095 } else if (Arch == "SSE" || Arch == "SSE2") {
2096 ArchUsed = true;
2097 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2098 }
2099 }
2100 if (!ArchUsed)
2101 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2102 }
2103
Jim Grosbach82eee262013-11-16 00:53:35 +00002104 // Now add any that the user explicitly requested on the command line,
2105 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002106 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002107}
2108
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002109void Clang::AddX86TargetArgs(const ArgList &Args,
2110 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002111 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002112 Args.hasArg(options::OPT_mkernel) ||
2113 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002114 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002115
Bob Wilson2616e2e2013-02-10 16:01:41 +00002116 // Default to avoid implicit floating-point for kernel/kext code, but allow
2117 // that to be overridden with -mno-soft-float.
2118 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2119 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002120 if (Arg *A = Args.getLastArg(
2121 options::OPT_msoft_float, options::OPT_mno_soft_float,
2122 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002123 const Option &O = A->getOption();
2124 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2125 O.matches(options::OPT_msoft_float));
2126 }
2127 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002128 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002129
2130 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2131 StringRef Value = A->getValue();
2132 if (Value == "intel" || Value == "att") {
2133 CmdArgs.push_back("-mllvm");
2134 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2135 } else {
2136 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2137 << A->getOption().getName() << Value;
2138 }
2139 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002140}
2141
Tony Linthicum76329bf2011-12-12 21:14:55 +00002142void Clang::AddHexagonTargetArgs(const ArgList &Args,
2143 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002144 CmdArgs.push_back("-mqdsp6-compat");
2145 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002146
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002147 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2148 std::string N = llvm::utostr(G.getValue());
2149 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002150 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002151 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002152 }
2153
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002154 if (!Args.hasArg(options::OPT_fno_short_enums))
2155 CmdArgs.push_back("-fshort-enums");
2156 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002157 CmdArgs.push_back("-mllvm");
2158 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002159 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002160 CmdArgs.push_back("-mllvm");
2161 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002162}
2163
Jacques Pienaard964cc22016-03-28 21:02:54 +00002164void Clang::AddLanaiTargetArgs(const ArgList &Args,
2165 ArgStringList &CmdArgs) const {
2166 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2167 StringRef CPUName = A->getValue();
2168
2169 CmdArgs.push_back("-target-cpu");
2170 CmdArgs.push_back(Args.MakeArgString(CPUName));
2171 }
2172 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2173 StringRef Value = A->getValue();
2174 // Only support mregparm=4 to support old usage. Report error for all other
2175 // cases.
2176 int Mregparm;
2177 if (Value.getAsInteger(10, Mregparm)) {
2178 if (Mregparm != 4) {
2179 getToolChain().getDriver().Diag(
2180 diag::err_drv_unsupported_option_argument)
2181 << A->getOption().getName() << Value;
2182 }
2183 }
2184 }
2185}
2186
Dan Gohmane3d71e12016-01-07 01:00:21 +00002187void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2188 ArgStringList &CmdArgs) const {
2189 // Default to "hidden" visibility.
2190 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2191 options::OPT_fvisibility_ms_compat)) {
2192 CmdArgs.push_back("-fvisibility");
2193 CmdArgs.push_back("hidden");
2194 }
2195}
2196
Kevin Qin110db6f2014-07-18 07:03:22 +00002197// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002198static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002199 std::vector<const char *> &Features) {
2200 SmallVector<StringRef, 8> Split;
2201 text.split(Split, StringRef("+"), -1, false);
2202
Benjamin Kramer72e64312015-09-24 14:48:49 +00002203 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002204 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002205 .Case("fp", "+fp-armv8")
2206 .Case("simd", "+neon")
2207 .Case("crc", "+crc")
2208 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002209 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002210 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002211 .Case("nofp", "-fp-armv8")
2212 .Case("nosimd", "-neon")
2213 .Case("nocrc", "-crc")
2214 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002215 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002216 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002217 .Default(nullptr);
2218 if (result)
2219 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002220 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002221 D.Diag(diag::err_drv_no_neon_modifier);
2222 else
2223 return false;
2224 }
2225 return true;
2226}
2227
2228// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2229// decode CPU and feature.
2230static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2231 std::vector<const char *> &Features) {
2232 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2233 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002234 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002235 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2236 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002237 Features.push_back("+neon");
2238 Features.push_back("+crc");
2239 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002240 } else if (CPU == "cyclone") {
2241 Features.push_back("+neon");
2242 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002243 } else if (CPU == "generic") {
2244 Features.push_back("+neon");
2245 } else {
2246 return false;
2247 }
2248
2249 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2250 return false;
2251
2252 return true;
2253}
2254
2255static bool
2256getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2257 const ArgList &Args,
2258 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002259 std::string MarchLowerCase = March.lower();
2260 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002261
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002262 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002263 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002264 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002265 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002266 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2267 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002268 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002269 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002270 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002271
2272 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2273 return false;
2274
2275 return true;
2276}
2277
2278static bool
2279getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2280 const ArgList &Args,
2281 std::vector<const char *> &Features) {
2282 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002283 std::string McpuLowerCase = Mcpu.lower();
2284 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002285 return false;
2286
2287 return true;
2288}
2289
2290static bool
2291getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2292 const ArgList &Args,
2293 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002294 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002295 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002296 if (MtuneLowerCase == "native")
2297 MtuneLowerCase = llvm::sys::getHostCPUName();
2298 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002299 Features.push_back("+zcm");
2300 Features.push_back("+zcz");
2301 }
2302 return true;
2303}
2304
2305static bool
2306getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2307 const ArgList &Args,
2308 std::vector<const char *> &Features) {
2309 StringRef CPU;
2310 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002311 std::string McpuLowerCase = Mcpu.lower();
2312 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002313 return false;
2314
2315 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2316}
2317
Justin Bognerf9052562015-11-13 23:07:31 +00002318static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002319 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002320 Arg *A;
2321 bool success = true;
2322 // Enable NEON by default.
2323 Features.push_back("+neon");
2324 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2325 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2326 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2327 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002328 else if (Args.hasArg(options::OPT_arch))
2329 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2330 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002331
2332 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2333 success =
2334 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2335 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2336 success =
2337 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002338 else if (Args.hasArg(options::OPT_arch))
2339 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2340 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002341
2342 if (!success)
2343 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002344
2345 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2346 Features.push_back("-fp-armv8");
2347 Features.push_back("-crypto");
2348 Features.push_back("-neon");
2349 }
Bradley Smith418c5932014-05-02 15:17:51 +00002350
2351 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002352 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002353 if (A->getOption().matches(options::OPT_mcrc))
2354 Features.push_back("+crc");
2355 else
2356 Features.push_back("-crc");
2357 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002358
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002359 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2360 options::OPT_munaligned_access))
2361 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2362 Features.push_back("+strict-align");
2363
Justin Bognerf9052562015-11-13 23:07:31 +00002364 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002365 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002366}
2367
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002368static void getHexagonTargetFeatures(const ArgList &Args,
2369 std::vector<const char *> &Features) {
2370 bool HasHVX = false, HasHVXD = false;
2371
Eric Christopher49062a52015-12-22 03:12:34 +00002372 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2373 // doing dependent option handling here rather than in initFeatureMap or a
2374 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002375 for (auto &A : Args) {
2376 auto &Opt = A->getOption();
2377 if (Opt.matches(options::OPT_mhexagon_hvx))
2378 HasHVX = true;
2379 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2380 HasHVXD = HasHVX = false;
2381 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2382 HasHVXD = HasHVX = true;
2383 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2384 HasHVXD = false;
2385 else
2386 continue;
2387 A->claim();
2388 }
2389
2390 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2391 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2392}
2393
Dan Gohmanc2853072015-09-03 22:51:53 +00002394static void getWebAssemblyTargetFeatures(const ArgList &Args,
2395 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002396 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002397}
2398
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002399static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2400 std::vector<const char *> &Features) {
2401 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2402 StringRef value = dAbi->getValue();
2403 if (value == "1.0") {
2404 Features.push_back("+amdgpu-debugger-insert-nops");
2405 Features.push_back("+amdgpu-debugger-reserve-trap-regs");
2406 } else {
2407 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2408 }
2409 }
2410
2411 handleTargetFeaturesGroup(
2412 Args, Features, options::OPT_m_amdgpu_Features_Group);
2413}
2414
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002415static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002416 const ArgList &Args, ArgStringList &CmdArgs,
2417 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002418 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002419 std::vector<const char *> Features;
2420 switch (Triple.getArch()) {
2421 default:
2422 break;
2423 case llvm::Triple::mips:
2424 case llvm::Triple::mipsel:
2425 case llvm::Triple::mips64:
2426 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002427 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002428 break;
2429
2430 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002431 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002432 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002433 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002434 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002435 break;
2436
2437 case llvm::Triple::ppc:
2438 case llvm::Triple::ppc64:
2439 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002440 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002441 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002442 case llvm::Triple::systemz:
2443 getSystemZTargetFeatures(Args, Features);
2444 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002445 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002446 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002447 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002448 break;
2449 case llvm::Triple::x86:
2450 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002451 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002452 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002453 case llvm::Triple::hexagon:
2454 getHexagonTargetFeatures(Args, Features);
2455 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002456 case llvm::Triple::wasm32:
2457 case llvm::Triple::wasm64:
2458 getWebAssemblyTargetFeatures(Args, Features);
2459 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002460 case llvm::Triple::r600:
2461 case llvm::Triple::amdgcn:
2462 getAMDGPUTargetFeatures(D, Args, Features);
2463 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002464 }
Rafael Espindola43964802013-08-21 17:34:32 +00002465
2466 // Find the last of each feature.
2467 llvm::StringMap<unsigned> LastOpt;
2468 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2469 const char *Name = Features[I];
2470 assert(Name[0] == '-' || Name[0] == '+');
2471 LastOpt[Name + 1] = I;
2472 }
2473
2474 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2475 // If this feature was overridden, ignore it.
2476 const char *Name = Features[I];
2477 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2478 assert(LastI != LastOpt.end());
2479 unsigned Last = LastI->second;
2480 if (Last != I)
2481 continue;
2482
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002483 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002484 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002485 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002486}
2487
David Majnemerae394812014-12-09 00:12:30 +00002488static bool
2489shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2490 const llvm::Triple &Triple) {
2491 // We use the zero-cost exception tables for Objective-C if the non-fragile
2492 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2493 // later.
2494 if (runtime.isNonFragile())
2495 return true;
2496
2497 if (!Triple.isMacOSX())
2498 return false;
2499
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002500 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002501 (Triple.getArch() == llvm::Triple::x86_64 ||
2502 Triple.getArch() == llvm::Triple::arm));
2503}
2504
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002505/// Adds exception related arguments to the driver command arguments. There's a
2506/// master flag, -fexceptions and also language specific flags to enable/disable
2507/// C++ and Objective-C exceptions. This makes it possible to for example
2508/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002509static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002510 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002511 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002512 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002513 const Driver &D = TC.getDriver();
2514 const llvm::Triple &Triple = TC.getTriple();
2515
Chad Rosier4fab82c2012-03-26 22:04:46 +00002516 if (KernelOrKext) {
2517 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2518 // arguments now to avoid warnings about unused arguments.
2519 Args.ClaimAllArgs(options::OPT_fexceptions);
2520 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2521 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2522 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2523 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2524 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002525 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002526 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002527
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002528 // See if the user explicitly enabled exceptions.
2529 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2530 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002531
David Majnemerae394812014-12-09 00:12:30 +00002532 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2533 // is not necessarily sensible, but follows GCC.
2534 if (types::isObjC(InputType) &&
2535 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002536 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002537 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002538
David Majnemerae394812014-12-09 00:12:30 +00002539 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002540 }
2541
2542 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002543 // Disable C++ EH by default on XCore and PS4.
2544 bool CXXExceptionsEnabled =
2545 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002546 Arg *ExceptionArg = Args.getLastArg(
2547 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2548 options::OPT_fexceptions, options::OPT_fno_exceptions);
2549 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002550 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002551 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2552 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002553
2554 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002555 if (Triple.isPS4CPU()) {
2556 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2557 assert(ExceptionArg &&
2558 "On the PS4 exceptions should only be enabled if passing "
2559 "an argument");
2560 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2561 const Arg *RTTIArg = TC.getRTTIArg();
2562 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2563 D.Diag(diag::err_drv_argument_not_allowed_with)
2564 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2565 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2566 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2567 } else
2568 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2569
Anders Carlssone96ab552011-02-28 02:27:16 +00002570 CmdArgs.push_back("-fcxx-exceptions");
2571
David Majnemer8de68642014-12-05 08:11:58 +00002572 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002573 }
2574 }
2575
David Majnemer8de68642014-12-05 08:11:58 +00002576 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002577 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002578}
2579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002580static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002581 bool Default = true;
2582 if (TC.getTriple().isOSDarwin()) {
2583 // The native darwin assembler doesn't support the linker_option directives,
2584 // so we disable them if we think the .s file will be passed to it.
2585 Default = TC.useIntegratedAs();
2586 }
2587 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2588 Default);
2589}
2590
Ted Kremenek62093662013-03-12 17:02:12 +00002591static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2592 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002593 bool UseDwarfDirectory =
2594 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2595 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002596 return !UseDwarfDirectory;
2597}
2598
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002599/// \brief Check whether the given input tree contains any compilation actions.
2600static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002601 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002602 return true;
2603
Nico Weber5a459f82016-02-23 19:30:43 +00002604 for (const auto &AI : A->inputs())
2605 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002606 return true;
2607
2608 return false;
2609}
2610
2611/// \brief Check if -relax-all should be passed to the internal assembler.
2612/// This is done by default when compiling non-assembler source with -O0.
2613static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2614 bool RelaxDefault = true;
2615
2616 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2617 RelaxDefault = A->getOption().matches(options::OPT_O0);
2618
2619 if (RelaxDefault) {
2620 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002621 for (const auto &Act : C.getActions()) {
2622 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002623 RelaxDefault = true;
2624 break;
2625 }
2626 }
2627 }
2628
2629 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002630 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002631}
2632
Paul Robinson0334a042015-12-19 19:41:48 +00002633// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2634// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002635static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002636 assert(A.getOption().matches(options::OPT_gN_Group) &&
2637 "Not a -g option that specifies a debug-info level");
2638 if (A.getOption().matches(options::OPT_g0) ||
2639 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002640 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002641 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2642 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002643 return codegenoptions::DebugLineTablesOnly;
2644 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002645}
2646
Douglas Katzman3459ce22015-10-08 04:24:12 +00002647// Extract the integer N from a string spelled "-dwarf-N", returning 0
2648// on mismatch. The StringRef input (rather than an Arg) allows
2649// for use by the "-Xassembler" option parser.
2650static unsigned DwarfVersionNum(StringRef ArgValue) {
2651 return llvm::StringSwitch<unsigned>(ArgValue)
2652 .Case("-gdwarf-2", 2)
2653 .Case("-gdwarf-3", 3)
2654 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002655 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002656 .Default(0);
2657}
2658
2659static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002660 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002661 unsigned DwarfVersion,
2662 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002663 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002664 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002665 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2666 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002667 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002668 CmdArgs.push_back("-debug-info-kind=limited");
2669 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002670 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002671 CmdArgs.push_back("-debug-info-kind=standalone");
2672 break;
2673 default:
2674 break;
2675 }
2676 if (DwarfVersion > 0)
2677 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002678 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002679 switch (DebuggerTuning) {
2680 case llvm::DebuggerKind::GDB:
2681 CmdArgs.push_back("-debugger-tuning=gdb");
2682 break;
2683 case llvm::DebuggerKind::LLDB:
2684 CmdArgs.push_back("-debugger-tuning=lldb");
2685 break;
2686 case llvm::DebuggerKind::SCE:
2687 CmdArgs.push_back("-debugger-tuning=sce");
2688 break;
2689 default:
2690 break;
2691 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002692}
2693
David Blaikie9260ed62013-07-25 21:19:01 +00002694static void CollectArgsForIntegratedAssembler(Compilation &C,
2695 const ArgList &Args,
2696 ArgStringList &CmdArgs,
2697 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002698 if (UseRelaxAll(C, Args))
2699 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002700
David Majnemer2b9349d2015-12-21 22:09:34 +00002701 // Only default to -mincremental-linker-compatible if we think we are
2702 // targeting the MSVC linker.
2703 bool DefaultIncrementalLinkerCompatible =
2704 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2705 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2706 options::OPT_mno_incremental_linker_compatible,
2707 DefaultIncrementalLinkerCompatible))
2708 CmdArgs.push_back("-mincremental-linker-compatible");
2709
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002710 // When passing -I arguments to the assembler we sometimes need to
2711 // unconditionally take the next argument. For example, when parsing
2712 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2713 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2714 // arg after parsing the '-I' arg.
2715 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002716
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002717 // When using an integrated assembler, translate -Wa, and -Xassembler
2718 // options.
2719 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002720 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002721 for (const Arg *A :
2722 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2723 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002724
Benjamin Kramer72e64312015-09-24 14:48:49 +00002725 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002726 if (TakeNextArg) {
2727 CmdArgs.push_back(Value.data());
2728 TakeNextArg = false;
2729 continue;
2730 }
David Blaikie9260ed62013-07-25 21:19:01 +00002731
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002732 switch (C.getDefaultToolChain().getArch()) {
2733 default:
2734 break;
2735 case llvm::Triple::mips:
2736 case llvm::Triple::mipsel:
2737 case llvm::Triple::mips64:
2738 case llvm::Triple::mips64el:
2739 if (Value == "--trap") {
2740 CmdArgs.push_back("-target-feature");
2741 CmdArgs.push_back("+use-tcc-in-div");
2742 continue;
2743 }
2744 if (Value == "--break") {
2745 CmdArgs.push_back("-target-feature");
2746 CmdArgs.push_back("-use-tcc-in-div");
2747 continue;
2748 }
2749 if (Value.startswith("-msoft-float")) {
2750 CmdArgs.push_back("-target-feature");
2751 CmdArgs.push_back("+soft-float");
2752 continue;
2753 }
2754 if (Value.startswith("-mhard-float")) {
2755 CmdArgs.push_back("-target-feature");
2756 CmdArgs.push_back("-soft-float");
2757 continue;
2758 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002759
2760 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2761 .Case("-mips1", "+mips1")
2762 .Case("-mips2", "+mips2")
2763 .Case("-mips3", "+mips3")
2764 .Case("-mips4", "+mips4")
2765 .Case("-mips5", "+mips5")
2766 .Case("-mips32", "+mips32")
2767 .Case("-mips32r2", "+mips32r2")
2768 .Case("-mips32r3", "+mips32r3")
2769 .Case("-mips32r5", "+mips32r5")
2770 .Case("-mips32r6", "+mips32r6")
2771 .Case("-mips64", "+mips64")
2772 .Case("-mips64r2", "+mips64r2")
2773 .Case("-mips64r3", "+mips64r3")
2774 .Case("-mips64r5", "+mips64r5")
2775 .Case("-mips64r6", "+mips64r6")
2776 .Default(nullptr);
2777 if (MipsTargetFeature)
2778 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002779 }
2780
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002781 if (Value == "-force_cpusubtype_ALL") {
2782 // Do nothing, this is the default and we don't support anything else.
2783 } else if (Value == "-L") {
2784 CmdArgs.push_back("-msave-temp-labels");
2785 } else if (Value == "--fatal-warnings") {
2786 CmdArgs.push_back("-massembler-fatal-warnings");
2787 } else if (Value == "--noexecstack") {
2788 CmdArgs.push_back("-mnoexecstack");
2789 } else if (Value == "-compress-debug-sections" ||
2790 Value == "--compress-debug-sections") {
2791 CompressDebugSections = true;
2792 } else if (Value == "-nocompress-debug-sections" ||
2793 Value == "--nocompress-debug-sections") {
2794 CompressDebugSections = false;
2795 } else if (Value.startswith("-I")) {
2796 CmdArgs.push_back(Value.data());
2797 // We need to consume the next argument if the current arg is a plain
2798 // -I. The next arg will be the include directory.
2799 if (Value == "-I")
2800 TakeNextArg = true;
2801 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002802 // "-gdwarf-N" options are not cc1as options.
2803 unsigned DwarfVersion = DwarfVersionNum(Value);
2804 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2805 CmdArgs.push_back(Value.data());
2806 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002807 RenderDebugEnablingArgs(Args, CmdArgs,
2808 codegenoptions::LimitedDebugInfo,
2809 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002810 }
Renato Golin7c542b42015-07-27 23:44:45 +00002811 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2812 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2813 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002814 } else {
2815 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002816 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002817 }
2818 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002819 }
2820 if (CompressDebugSections) {
2821 if (llvm::zlib::isAvailable())
2822 CmdArgs.push_back("-compress-debug-sections");
2823 else
2824 D.Diag(diag::warn_debug_compression_unavailable);
2825 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002826 if (MipsTargetFeature != nullptr) {
2827 CmdArgs.push_back("-target-feature");
2828 CmdArgs.push_back(MipsTargetFeature);
2829 }
David Blaikie9260ed62013-07-25 21:19:01 +00002830}
2831
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002832// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002833// FIXME: Make sure we can also emit shared objects if they're requested
2834// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002835static void addClangRT(const ToolChain &TC, const ArgList &Args,
2836 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002837 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002838}
2839
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002840namespace {
2841enum OpenMPRuntimeKind {
2842 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2843 /// without knowing what runtime to target.
2844 OMPRT_Unknown,
2845
2846 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2847 /// the default for Clang.
2848 OMPRT_OMP,
2849
2850 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2851 /// this runtime but can swallow the pragmas, and find and link against the
2852 /// runtime library itself.
2853 OMPRT_GOMP,
2854
Chandler Carruthc6625c62015-05-28 21:10:31 +00002855 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002856 /// OpenMP runtime. We support this mode for users with existing dependencies
2857 /// on this runtime library name.
2858 OMPRT_IOMP5
2859};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002860}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002861
2862/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002863static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2864 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002865 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2866
2867 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2868 if (A)
2869 RuntimeName = A->getValue();
2870
2871 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002872 .Case("libomp", OMPRT_OMP)
2873 .Case("libgomp", OMPRT_GOMP)
2874 .Case("libiomp5", OMPRT_IOMP5)
2875 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002876
2877 if (RT == OMPRT_Unknown) {
2878 if (A)
2879 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002880 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002881 else
2882 // FIXME: We could use a nicer diagnostic here.
2883 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2884 }
2885
2886 return RT;
2887}
2888
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002889static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2890 const ArgList &Args) {
2891 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2892 options::OPT_fno_openmp, false))
2893 return;
2894
2895 switch (getOpenMPRuntime(TC, Args)) {
2896 case OMPRT_OMP:
2897 CmdArgs.push_back("-lomp");
2898 break;
2899 case OMPRT_GOMP:
2900 CmdArgs.push_back("-lgomp");
2901 break;
2902 case OMPRT_IOMP5:
2903 CmdArgs.push_back("-liomp5");
2904 break;
2905 case OMPRT_Unknown:
2906 // Already diagnosed.
2907 break;
2908 }
2909}
2910
Alexey Samsonov52550342014-09-15 19:58:40 +00002911static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2912 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002913 bool IsShared, bool IsWhole) {
2914 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002915 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002916 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002917 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002918 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002919}
2920
Alexey Samsonov52550342014-09-15 19:58:40 +00002921// Tries to use a file with the list of dynamic symbols that need to be exported
2922// from the runtime library. Returns true if the file was found.
2923static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2924 ArgStringList &CmdArgs,
2925 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002926 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002927 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2928 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002929 return true;
2930 }
2931 return false;
2932}
2933
2934static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2935 ArgStringList &CmdArgs) {
2936 // Force linking against the system libraries sanitizers depends on
2937 // (see PR15823 why this is necessary).
2938 CmdArgs.push_back("--no-as-needed");
2939 CmdArgs.push_back("-lpthread");
2940 CmdArgs.push_back("-lrt");
2941 CmdArgs.push_back("-lm");
2942 // There's no libdl on FreeBSD.
2943 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2944 CmdArgs.push_back("-ldl");
2945}
2946
2947static void
2948collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2949 SmallVectorImpl<StringRef> &SharedRuntimes,
2950 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002951 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2952 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2953 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002954 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2955 // Collect shared runtimes.
2956 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2957 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002958 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002959 // The stats_client library is also statically linked into DSOs.
2960 if (SanArgs.needsStatsRt())
2961 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002962
Alexey Samsonov52550342014-09-15 19:58:40 +00002963 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002964 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002965 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002966 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002967 }
2968 if (SanArgs.needsAsanRt()) {
2969 if (SanArgs.needsSharedAsanRt()) {
2970 HelperStaticRuntimes.push_back("asan-preinit");
2971 } else {
2972 StaticRuntimes.push_back("asan");
2973 if (SanArgs.linkCXXRuntimes())
2974 StaticRuntimes.push_back("asan_cxx");
2975 }
2976 }
2977 if (SanArgs.needsDfsanRt())
2978 StaticRuntimes.push_back("dfsan");
2979 if (SanArgs.needsLsanRt())
2980 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002981 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002982 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002983 if (SanArgs.linkCXXRuntimes())
2984 StaticRuntimes.push_back("msan_cxx");
2985 }
2986 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002987 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002988 if (SanArgs.linkCXXRuntimes())
2989 StaticRuntimes.push_back("tsan_cxx");
2990 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002991 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002992 StaticRuntimes.push_back("ubsan_standalone");
2993 if (SanArgs.linkCXXRuntimes())
2994 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002995 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002996 if (SanArgs.needsSafeStackRt())
2997 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002998 if (SanArgs.needsCfiRt())
2999 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003000 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00003001 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003002 if (SanArgs.linkCXXRuntimes())
3003 StaticRuntimes.push_back("ubsan_standalone_cxx");
3004 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003005 if (SanArgs.needsStatsRt()) {
3006 NonWholeStaticRuntimes.push_back("stats");
3007 RequiredSymbols.push_back("__sanitizer_stats_register");
3008 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003009}
3010
Alexey Samsonov52550342014-09-15 19:58:40 +00003011// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3012// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3013static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00003014 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003015 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003016 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003017 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003018 NonWholeStaticRuntimes, HelperStaticRuntimes,
3019 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003020 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003021 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003022 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003023 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003024 bool AddExportDynamic = false;
3025 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003026 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003027 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3028 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003029 for (auto RT : NonWholeStaticRuntimes) {
3030 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3031 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3032 }
3033 for (auto S : RequiredSymbols) {
3034 CmdArgs.push_back("-u");
3035 CmdArgs.push_back(Args.MakeArgString(S));
3036 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003037 // If there is a static runtime with no dynamic list, force all the symbols
3038 // to be dynamic to be sure we export sanitizer interface functions.
3039 if (AddExportDynamic)
3040 CmdArgs.push_back("-export-dynamic");
3041 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003042}
3043
Reid Kleckner86ea7702015-02-04 23:45:07 +00003044static bool areOptimizationsEnabled(const ArgList &Args) {
3045 // Find the last -O arg and see if it is non-zero.
3046 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3047 return !A->getOption().matches(options::OPT_O0);
3048 // Defaults to -O0.
3049 return false;
3050}
3051
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003052static bool shouldUseFramePointerForTarget(const ArgList &Args,
3053 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003054 switch (Triple.getArch()) {
3055 case llvm::Triple::xcore:
3056 case llvm::Triple::wasm32:
3057 case llvm::Triple::wasm64:
3058 // XCore never wants frame pointers, regardless of OS.
3059 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003060 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003061 default:
3062 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003063 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003064
3065 if (Triple.isOSLinux()) {
3066 switch (Triple.getArch()) {
3067 // Don't use a frame pointer on linux if optimizing for certain targets.
3068 case llvm::Triple::mips64:
3069 case llvm::Triple::mips64el:
3070 case llvm::Triple::mips:
3071 case llvm::Triple::mipsel:
3072 case llvm::Triple::systemz:
3073 case llvm::Triple::x86:
3074 case llvm::Triple::x86_64:
3075 return !areOptimizationsEnabled(Args);
3076 default:
3077 return true;
3078 }
3079 }
3080
3081 if (Triple.isOSWindows()) {
3082 switch (Triple.getArch()) {
3083 case llvm::Triple::x86:
3084 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003085 case llvm::Triple::x86_64:
3086 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003087 case llvm::Triple::arm:
3088 case llvm::Triple::thumb:
3089 // Windows on ARM builds with FPO disabled to aid fast stack walking
3090 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003091 default:
3092 // All other supported Windows ISAs use xdata unwind information, so frame
3093 // pointers are not generally useful.
3094 return false;
3095 }
3096 }
3097
3098 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003099}
3100
Rafael Espindola224dd632011-12-14 21:02:23 +00003101static bool shouldUseFramePointer(const ArgList &Args,
3102 const llvm::Triple &Triple) {
3103 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3104 options::OPT_fomit_frame_pointer))
3105 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003106 if (Args.hasArg(options::OPT_pg))
3107 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003108
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003109 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003110}
3111
Eric Christopherb7d97e92013-04-03 01:58:53 +00003112static bool shouldUseLeafFramePointer(const ArgList &Args,
3113 const llvm::Triple &Triple) {
3114 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3115 options::OPT_momit_leaf_frame_pointer))
3116 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003117 if (Args.hasArg(options::OPT_pg))
3118 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003119
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003120 if (Triple.isPS4CPU())
3121 return false;
3122
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003123 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003124}
3125
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003126/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003127static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003128 SmallString<128> cwd;
3129 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003130 CmdArgs.push_back("-fdebug-compilation-dir");
3131 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003132 }
3133}
3134
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003135static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003136 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3137 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3138 SmallString<128> T(FinalOutput->getValue());
3139 llvm::sys::path::replace_extension(T, "dwo");
3140 return Args.MakeArgString(T);
3141 } else {
3142 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003143 SmallString<128> T(
3144 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003145 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003146 llvm::sys::path::replace_extension(F, "dwo");
3147 T += F;
3148 return Args.MakeArgString(F);
3149 }
3150}
3151
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003152static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3153 const JobAction &JA, const ArgList &Args,
3154 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003155 ArgStringList ExtractArgs;
3156 ExtractArgs.push_back("--extract-dwo");
3157
3158 ArgStringList StripArgs;
3159 StripArgs.push_back("--strip-dwo");
3160
3161 // Grabbing the output of the earlier compile step.
3162 StripArgs.push_back(Output.getFilename());
3163 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003164 ExtractArgs.push_back(OutFile);
3165
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003166 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003167 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003168
3169 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003170 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003171
3172 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003173 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003174}
3175
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003176/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003177/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3178static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003179 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003180 if (A->getOption().matches(options::OPT_O4) ||
3181 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003182 return true;
3183
3184 if (A->getOption().matches(options::OPT_O0))
3185 return false;
3186
3187 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3188
Rafael Espindola91780de2013-08-26 14:05:41 +00003189 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003190 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003191 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003192 return true;
3193
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003194 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003195 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003196 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003197
3198 unsigned OptLevel = 0;
3199 if (S.getAsInteger(10, OptLevel))
3200 return false;
3201
3202 return OptLevel > 1;
3203 }
3204
3205 return false;
3206}
3207
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003208/// Add -x lang to \p CmdArgs for \p Input.
3209static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3210 ArgStringList &CmdArgs) {
3211 // When using -verify-pch, we don't want to provide the type
3212 // 'precompiled-header' if it was inferred from the file extension
3213 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3214 return;
3215
3216 CmdArgs.push_back("-x");
3217 if (Args.hasArg(options::OPT_rewrite_objc))
3218 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3219 else
3220 CmdArgs.push_back(types::getTypeName(Input.getType()));
3221}
3222
David Majnemerc371ff02015-03-22 08:39:22 +00003223static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003224 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003225 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003226
3227 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003228 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003229
3230 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003231 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003232 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003233 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003234}
3235
Rafael Espindola577637a2015-01-03 00:06:04 +00003236// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003237// options that build systems might add but are unused when assembling or only
3238// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003239static void claimNoWarnArgs(const ArgList &Args) {
3240 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003241 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003242 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003243 Args.ClaimAllArgs(options::OPT_flto);
3244 Args.ClaimAllArgs(options::OPT_fno_lto);
3245}
3246
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003247static void appendUserToPath(SmallVectorImpl<char> &Result) {
3248#ifdef LLVM_ON_UNIX
3249 const char *Username = getenv("LOGNAME");
3250#else
3251 const char *Username = getenv("USERNAME");
3252#endif
3253 if (Username) {
3254 // Validate that LoginName can be used in a path, and get its length.
3255 size_t Len = 0;
3256 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003257 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003258 Username = nullptr;
3259 break;
3260 }
3261 }
3262
3263 if (Username && Len > 0) {
3264 Result.append(Username, Username + Len);
3265 return;
3266 }
3267 }
3268
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003269// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003270#ifdef LLVM_ON_UNIX
3271 std::string UID = llvm::utostr(getuid());
3272#else
3273 // FIXME: Windows seems to have an 'SID' that might work.
3274 std::string UID = "9999";
3275#endif
3276 Result.append(UID.begin(), UID.end());
3277}
3278
David Majnemere11d3732015-06-08 00:22:46 +00003279VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3280 const llvm::Triple &Triple,
3281 const llvm::opt::ArgList &Args,
3282 bool IsWindowsMSVC) {
3283 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3284 IsWindowsMSVC) ||
3285 Args.hasArg(options::OPT_fmsc_version) ||
3286 Args.hasArg(options::OPT_fms_compatibility_version)) {
3287 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3288 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003289 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003290
3291 if (MSCVersion && MSCompatibilityVersion) {
3292 if (D)
3293 D->Diag(diag::err_drv_argument_not_allowed_with)
3294 << MSCVersion->getAsString(Args)
3295 << MSCompatibilityVersion->getAsString(Args);
3296 return VersionTuple();
3297 }
3298
3299 if (MSCompatibilityVersion) {
3300 VersionTuple MSVT;
3301 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3302 D->Diag(diag::err_drv_invalid_value)
3303 << MSCompatibilityVersion->getAsString(Args)
3304 << MSCompatibilityVersion->getValue();
3305 return MSVT;
3306 }
3307
3308 if (MSCVersion) {
3309 unsigned Version = 0;
3310 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3311 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3312 << MSCVersion->getValue();
3313 return getMSCompatibilityVersion(Version);
3314 }
3315
3316 unsigned Major, Minor, Micro;
3317 Triple.getEnvironmentVersion(Major, Minor, Micro);
3318 if (Major || Minor || Micro)
3319 return VersionTuple(Major, Minor, Micro);
3320
Nico Weber9a952752016-03-23 23:26:59 +00003321 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
David Majnemere11d3732015-06-08 00:22:46 +00003322 return VersionTuple(18);
3323 }
3324 return VersionTuple();
3325}
3326
Diego Novilloa0545962015-07-10 18:00:07 +00003327static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3328 const InputInfo &Output, const ArgList &Args,
3329 ArgStringList &CmdArgs) {
3330 auto *ProfileGenerateArg = Args.getLastArg(
3331 options::OPT_fprofile_instr_generate,
3332 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003333 options::OPT_fprofile_generate_EQ,
3334 options::OPT_fno_profile_instr_generate);
3335 if (ProfileGenerateArg &&
3336 ProfileGenerateArg->getOption().matches(
3337 options::OPT_fno_profile_instr_generate))
3338 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003339
3340 auto *ProfileUseArg = Args.getLastArg(
3341 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003342 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3343 options::OPT_fno_profile_instr_use);
3344 if (ProfileUseArg &&
3345 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3346 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003347
3348 if (ProfileGenerateArg && ProfileUseArg)
3349 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003350 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003351
Diego Novillo758f3f52015-08-05 21:49:51 +00003352 if (ProfileGenerateArg) {
3353 if (ProfileGenerateArg->getOption().matches(
3354 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003355 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3356 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003357 else if (ProfileGenerateArg->getOption().matches(
3358 options::OPT_fprofile_generate_EQ)) {
3359 SmallString<128> Path(ProfileGenerateArg->getValue());
3360 llvm::sys::path::append(Path, "default.profraw");
3361 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003362 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3363 }
3364 // The default is to use Clang Instrumentation.
3365 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003366 }
Diego Novilloa0545962015-07-10 18:00:07 +00003367
Diego Novillo758f3f52015-08-05 21:49:51 +00003368 if (ProfileUseArg) {
3369 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003370 CmdArgs.push_back(Args.MakeArgString(
3371 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003372 else if ((ProfileUseArg->getOption().matches(
3373 options::OPT_fprofile_use_EQ) ||
3374 ProfileUseArg->getOption().matches(
3375 options::OPT_fprofile_instr_use))) {
3376 SmallString<128> Path(
3377 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3378 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3379 llvm::sys::path::append(Path, "default.profdata");
3380 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003381 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003382 }
Diego Novilloa0545962015-07-10 18:00:07 +00003383 }
3384
3385 if (Args.hasArg(options::OPT_ftest_coverage) ||
3386 Args.hasArg(options::OPT_coverage))
3387 CmdArgs.push_back("-femit-coverage-notes");
3388 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3389 false) ||
3390 Args.hasArg(options::OPT_coverage))
3391 CmdArgs.push_back("-femit-coverage-data");
3392
Diego Novilloc4b94da2015-08-05 23:27:40 +00003393 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3394 options::OPT_fno_coverage_mapping, false) &&
3395 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003396 D.Diag(diag::err_drv_argument_only_allowed_with)
3397 << "-fcoverage-mapping"
3398 << "-fprofile-instr-generate";
3399
Diego Novilloc4b94da2015-08-05 23:27:40 +00003400 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3401 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003402 CmdArgs.push_back("-fcoverage-mapping");
3403
3404 if (C.getArgs().hasArg(options::OPT_c) ||
3405 C.getArgs().hasArg(options::OPT_S)) {
3406 if (Output.isFilename()) {
3407 CmdArgs.push_back("-coverage-file");
3408 SmallString<128> CoverageFilename;
3409 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3410 CoverageFilename = FinalOutput->getValue();
3411 } else {
3412 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3413 }
3414 if (llvm::sys::path::is_relative(CoverageFilename)) {
3415 SmallString<128> Pwd;
3416 if (!llvm::sys::fs::current_path(Pwd)) {
3417 llvm::sys::path::append(Pwd, CoverageFilename);
3418 CoverageFilename.swap(Pwd);
3419 }
3420 }
3421 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3422 }
3423 }
3424}
3425
Paul Robinsond083b9a2015-12-16 17:25:27 +00003426static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3427 ArgStringList &CmdArgs) {
3428 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3429 false) ||
3430 Args.hasFlag(options::OPT_fprofile_generate,
3431 options::OPT_fno_profile_instr_generate, false) ||
3432 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3433 options::OPT_fno_profile_instr_generate, false) ||
3434 Args.hasFlag(options::OPT_fprofile_instr_generate,
3435 options::OPT_fno_profile_instr_generate, false) ||
3436 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3437 options::OPT_fno_profile_instr_generate, false) ||
3438 Args.hasArg(options::OPT_fcreate_profile) ||
3439 Args.hasArg(options::OPT_coverage)))
3440 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3441}
3442
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003443/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3444/// smooshes them together with platform defaults, to decide whether
3445/// this compile should be using PIC mode or not. Returns a tuple of
3446/// (RelocationModel, PICLevel, IsPIE).
3447static std::tuple<llvm::Reloc::Model, unsigned, bool>
3448ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3449 const ArgList &Args) {
3450 // FIXME: why does this code...and so much everywhere else, use both
3451 // ToolChain.getTriple() and Triple?
3452 bool PIE = ToolChain.isPIEDefault();
3453 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003454 // The Darwin/MachO default to use PIC does not apply when using -static.
3455 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3456 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003457 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003458 bool IsPICLevelTwo = PIC;
3459
3460 bool KernelOrKext =
3461 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3462
3463 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003464 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003465 switch (ToolChain.getArch()) {
3466 case llvm::Triple::arm:
3467 case llvm::Triple::armeb:
3468 case llvm::Triple::thumb:
3469 case llvm::Triple::thumbeb:
3470 case llvm::Triple::aarch64:
3471 case llvm::Triple::mips:
3472 case llvm::Triple::mipsel:
3473 case llvm::Triple::mips64:
3474 case llvm::Triple::mips64el:
3475 PIC = true; // "-fpic"
3476 break;
3477
3478 case llvm::Triple::x86:
3479 case llvm::Triple::x86_64:
3480 PIC = true; // "-fPIC"
3481 IsPICLevelTwo = true;
3482 break;
3483
3484 default:
3485 break;
3486 }
3487 }
3488
3489 // OpenBSD-specific defaults for PIE
3490 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3491 switch (ToolChain.getArch()) {
3492 case llvm::Triple::mips64:
3493 case llvm::Triple::mips64el:
3494 case llvm::Triple::sparcel:
3495 case llvm::Triple::x86:
3496 case llvm::Triple::x86_64:
3497 IsPICLevelTwo = false; // "-fpie"
3498 break;
3499
3500 case llvm::Triple::ppc:
3501 case llvm::Triple::sparc:
3502 case llvm::Triple::sparcv9:
3503 IsPICLevelTwo = true; // "-fPIE"
3504 break;
3505
3506 default:
3507 break;
3508 }
3509 }
3510
3511 // The last argument relating to either PIC or PIE wins, and no
3512 // other argument is used. If the last argument is any flavor of the
3513 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3514 // option implicitly enables PIC at the same level.
3515 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3516 options::OPT_fpic, options::OPT_fno_pic,
3517 options::OPT_fPIE, options::OPT_fno_PIE,
3518 options::OPT_fpie, options::OPT_fno_pie);
3519 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3520 // is forced, then neither PIC nor PIE flags will have no effect.
3521 if (!ToolChain.isPICDefaultForced()) {
3522 if (LastPICArg) {
3523 Option O = LastPICArg->getOption();
3524 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3525 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3526 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3527 PIC =
3528 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3529 IsPICLevelTwo =
3530 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3531 } else {
3532 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003533 if (Triple.isPS4CPU()) {
3534 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3535 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3536 if (Model != "kernel") {
3537 PIC = true;
3538 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3539 << LastPICArg->getSpelling();
3540 }
3541 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003542 }
3543 }
3544 }
3545
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003546 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3547 // PIC level would've been set to level 1, force it back to level 2 PIC
3548 // instead.
3549 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003550 IsPICLevelTwo |= ToolChain.isPICDefault();
3551
James Y Knightc4015d32015-08-21 04:14:55 +00003552 // This kernel flags are a trump-card: they will disable PIC/PIE
3553 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003554 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3555 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003556 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003557
3558 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3559 // This is a very special mode. It trumps the other modes, almost no one
3560 // uses it, and it isn't even valid on any OS but Darwin.
3561 if (!ToolChain.getTriple().isOSDarwin())
3562 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3563 << A->getSpelling() << ToolChain.getTriple().str();
3564
3565 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3566
3567 // Only a forced PIC mode can cause the actual compile to have PIC defines
3568 // etc., no flags are sufficient. This behavior was selected to closely
3569 // match that of llvm-gcc and Apple GCC before that.
3570 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3571
3572 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3573 }
3574
3575 if (PIC)
3576 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3577
3578 return std::make_tuple(llvm::Reloc::Static, 0, false);
3579}
3580
3581static const char *RelocationModelName(llvm::Reloc::Model Model) {
3582 switch (Model) {
3583 case llvm::Reloc::Default:
3584 return nullptr;
3585 case llvm::Reloc::Static:
3586 return "static";
3587 case llvm::Reloc::PIC_:
3588 return "pic";
3589 case llvm::Reloc::DynamicNoPIC:
3590 return "dynamic-no-pic";
3591 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003592 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003593}
3594
3595static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3596 ArgStringList &CmdArgs) {
3597 llvm::Reloc::Model RelocationModel;
3598 unsigned PICLevel;
3599 bool IsPIE;
3600 std::tie(RelocationModel, PICLevel, IsPIE) =
3601 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3602
3603 if (RelocationModel != llvm::Reloc::Static)
3604 CmdArgs.push_back("-KPIC");
3605}
3606
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003607void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003608 const InputInfo &Output, const InputInfoList &Inputs,
3609 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003610 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3611 const llvm::Triple Triple(TripleStr);
3612
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003613 bool KernelOrKext =
3614 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003615 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003616 ArgStringList CmdArgs;
3617
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003618 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003619 bool IsWindowsCygnus =
3620 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003621 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003622 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003623
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003624 // Check number of inputs for sanity. We need at least one input.
3625 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003626 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003627 // CUDA compilation may have multiple inputs (source file + results of
3628 // device-side compilations). All other jobs are expected to have exactly one
3629 // input.
3630 bool IsCuda = types::isCuda(Input.getType());
3631 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003632
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003633 // Invoke ourselves in -cc1 mode.
3634 //
3635 // FIXME: Implement custom jobs for internal actions.
3636 CmdArgs.push_back("-cc1");
3637
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003638 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003639 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003640 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003641
Artem Belevichfa11ab52015-11-17 22:28:46 +00003642 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003643 if (IsCuda) {
3644 // FIXME: We need a (better) way to pass information about
3645 // particular compilation pass we're constructing here. For now we
3646 // can check which toolchain we're using and pick the other one to
3647 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003648 if (&getToolChain() == C.getCudaDeviceToolChain())
3649 AuxToolChain = C.getCudaHostToolChain();
3650 else if (&getToolChain() == C.getCudaHostToolChain())
3651 AuxToolChain = C.getCudaDeviceToolChain();
3652 else
3653 llvm_unreachable("Can't figure out CUDA compilation mode.");
3654 assert(AuxToolChain != nullptr && "No aux toolchain.");
3655 CmdArgs.push_back("-aux-triple");
3656 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3657 }
3658
James Y Knight2db38f32015-08-15 03:45:25 +00003659 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3660 Triple.getArch() == llvm::Triple::thumb)) {
3661 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003662 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003663 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003664 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003665 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003666 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003667 }
3668
Tim Northover336f1892014-03-29 13:16:12 +00003669 // Push all default warning arguments that are specific to
3670 // the given target. These come before user provided warning options
3671 // are provided.
3672 getToolChain().addClangWarningOptions(CmdArgs);
3673
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003674 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003675 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003676
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003677 if (isa<AnalyzeJobAction>(JA)) {
3678 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3679 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003680 } else if (isa<MigrateJobAction>(JA)) {
3681 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003682 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003683 if (Output.getType() == types::TY_Dependencies)
3684 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003685 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003686 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003687 if (Args.hasArg(options::OPT_rewrite_objc) &&
3688 !Args.hasArg(options::OPT_g_Group))
3689 CmdArgs.push_back("-P");
3690 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003691 } else if (isa<AssembleJobAction>(JA)) {
3692 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003693
David Blaikie9260ed62013-07-25 21:19:01 +00003694 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003695
3696 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003697 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003698 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003699 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003700 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003701
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003702 if (JA.getType() == types::TY_Nothing)
3703 CmdArgs.push_back("-fsyntax-only");
3704 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003705 CmdArgs.push_back("-emit-pch");
3706 else
3707 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003708 } else if (isa<VerifyPCHJobAction>(JA)) {
3709 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003710 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003711 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3712 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003713 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003714 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003715 } else if (JA.getType() == types::TY_LLVM_IR ||
3716 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003717 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003718 } else if (JA.getType() == types::TY_LLVM_BC ||
3719 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003720 CmdArgs.push_back("-emit-llvm-bc");
3721 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003722 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003723 } else if (JA.getType() == types::TY_AST) {
3724 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003725 } else if (JA.getType() == types::TY_ModuleFile) {
3726 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003727 } else if (JA.getType() == types::TY_RewrittenObjC) {
3728 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003729 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003730 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3731 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003732 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003733 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003734 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003735 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003736
3737 // Preserve use-list order by default when emitting bitcode, so that
3738 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3739 // same result as running passes here. For LTO, we don't need to preserve
3740 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003741 if (JA.getType() == types::TY_LLVM_BC)
3742 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003743
3744 if (D.isUsingLTO())
3745 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003746 }
3747
Teresa Johnsonaff22322015-12-07 19:21:34 +00003748 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3749 if (!types::isLLVMIR(Input.getType()))
3750 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3751 << "-x ir";
3752 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3753 }
3754
Steven Wu574b0f22016-03-01 01:07:58 +00003755 // Embed-bitcode option.
3756 if (C.getDriver().embedBitcodeEnabled() &&
3757 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3758 // Add flags implied by -fembed-bitcode.
3759 CmdArgs.push_back("-fembed-bitcode");
3760 // Disable all llvm IR level optimizations.
3761 CmdArgs.push_back("-disable-llvm-optzns");
3762 }
3763 if (C.getDriver().embedBitcodeMarkerOnly())
3764 CmdArgs.push_back("-fembed-bitcode-marker");
3765
Justin Bognera88f0122014-06-20 22:59:50 +00003766 // We normally speed up the clang process a bit by skipping destructors at
3767 // exit, but when we're generating diagnostics we can rely on some of the
3768 // cleanup.
3769 if (!C.isForDiagnostics())
3770 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003771
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003772// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003773#ifdef NDEBUG
3774 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003775 // Discard LLVM value names in -asserts builds.
3776 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003777#endif
3778
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003779 // Set the main file name, so that debug info works even with
3780 // -save-temps.
3781 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003782 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003783
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003784 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003785 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003786 if (Args.hasArg(options::OPT_static))
3787 CmdArgs.push_back("-static-define");
3788
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003789 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003790 // Enable region store model by default.
3791 CmdArgs.push_back("-analyzer-store=region");
3792
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003793 // Treat blocks as analysis entry points.
3794 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3795
Ted Kremenek49c79792011-03-24 00:28:47 +00003796 CmdArgs.push_back("-analyzer-eagerly-assume");
3797
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003798 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003799 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003800 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003801
Devin Coughlin65c77082016-01-21 20:09:49 +00003802 if (!IsWindowsMSVC) {
3803 CmdArgs.push_back("-analyzer-checker=unix");
3804 } else {
3805 // Enable "unix" checkers that also work on Windows.
3806 CmdArgs.push_back("-analyzer-checker=unix.API");
3807 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3808 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3809 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3810 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3811 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3812 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003813
Sean Evesonb38c32b2016-01-06 10:03:58 +00003814 // Disable some unix checkers for PS4.
3815 if (IsPS4CPU) {
3816 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3817 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3818 }
3819
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003820 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003821 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003822
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003823 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003824
Artem Belevichba558952015-05-06 18:20:23 +00003825 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003826 CmdArgs.push_back("-analyzer-checker=cplusplus");
3827
Sean Evesonb38c32b2016-01-06 10:03:58 +00003828 if (!IsPS4CPU) {
3829 CmdArgs.push_back(
3830 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3831 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3832 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3833 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3834 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3835 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3836 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003837
3838 // Default nullability checks.
3839 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3840 CmdArgs.push_back(
3841 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003842 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003843
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003844 // Set the output format. The default is plist, for (lame) historical
3845 // reasons.
3846 CmdArgs.push_back("-analyzer-output");
3847 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003848 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003849 else
3850 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003851
Ted Kremenekfe449a22010-03-22 22:32:05 +00003852 // Disable the presentation of standard compiler warnings when
3853 // using --analyze. We only want to show static analyzer diagnostics
3854 // or frontend errors.
3855 CmdArgs.push_back("-w");
3856
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003857 // Add -Xanalyzer arguments when running as analyzer.
3858 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003859 }
3860
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003861 CheckCodeGenerationOptions(D, Args);
3862
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003863 llvm::Reloc::Model RelocationModel;
3864 unsigned PICLevel;
3865 bool IsPIE;
3866 std::tie(RelocationModel, PICLevel, IsPIE) =
3867 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003868
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003869 const char *RMName = RelocationModelName(RelocationModel);
3870 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003871 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003872 CmdArgs.push_back(RMName);
3873 }
3874 if (PICLevel > 0) {
3875 CmdArgs.push_back("-pic-level");
3876 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3877 if (IsPIE) {
3878 CmdArgs.push_back("-pie-level");
3879 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003880 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003881 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003882
Renato Golin4854d802015-11-09 12:40:41 +00003883 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3884 CmdArgs.push_back("-meabi");
3885 CmdArgs.push_back(A->getValue());
3886 }
3887
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003888 CmdArgs.push_back("-mthread-model");
3889 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3890 CmdArgs.push_back(A->getValue());
3891 else
3892 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3893
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003894 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3895
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003896 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3897 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003898 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003899
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003900 // LLVM Code Generator Options.
3901
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003902 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3903 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003904 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3905 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003906 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003907 CmdArgs.push_back(A->getValue());
3908 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003909 }
3910 }
3911
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003912 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3913 StringRef v = A->getValue();
3914 CmdArgs.push_back("-mllvm");
3915 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3916 A->claim();
3917 }
3918
Nirav Daved2f44d82016-04-05 17:50:43 +00003919 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
3920 true))
3921 CmdArgs.push_back("-fno-jump-tables");
3922
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003923 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3924 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003925 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003926 }
3927
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003928 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3929 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003930 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003931 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003932 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003933 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3934 CmdArgs.push_back("-fpcc-struct-return");
3935 } else {
3936 assert(A->getOption().matches(options::OPT_freg_struct_return));
3937 CmdArgs.push_back("-freg-struct-return");
3938 }
3939 }
3940
Roman Divacky65b88cd2011-03-01 17:40:53 +00003941 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3942 CmdArgs.push_back("-mrtd");
3943
Rafael Espindola224dd632011-12-14 21:02:23 +00003944 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003945 CmdArgs.push_back("-mdisable-fp-elim");
3946 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3947 options::OPT_fno_zero_initialized_in_bss))
3948 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003949
3950 bool OFastEnabled = isOptimizationLevelFast(Args);
3951 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3952 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003953 OptSpecifier StrictAliasingAliasOption =
3954 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003955 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3956 // doesn't do any TBAA.
3957 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003958 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003959 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003960 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003961 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3962 options::OPT_fno_struct_path_tbaa))
3963 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003964 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3965 false))
3966 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003967 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3968 options::OPT_fno_strict_vtable_pointers,
3969 false))
3970 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003971 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3972 options::OPT_fno_optimize_sibling_calls))
3973 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003974
Eric Christopher006208c2013-04-04 06:29:47 +00003975 // Handle segmented stacks.
3976 if (Args.hasArg(options::OPT_fsplit_stack))
3977 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003978
3979 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3980 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003981 OptSpecifier FastMathAliasOption =
3982 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3983
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003984 // Handle various floating point optimization flags, mapping them to the
3985 // appropriate LLVM code generation flags. The pattern for all of these is to
3986 // default off the codegen optimizations, and if any flag enables them and no
3987 // flag disables them after the flag enabling them, enable the codegen
3988 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003989 if (Arg *A = Args.getLastArg(
3990 options::OPT_ffast_math, FastMathAliasOption,
3991 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3992 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3993 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003994 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3995 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003996 A->getOption().getID() != options::OPT_fhonor_infinities)
3997 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003998 if (Arg *A = Args.getLastArg(
3999 options::OPT_ffast_math, FastMathAliasOption,
4000 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4001 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4002 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004003 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4004 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004005 A->getOption().getID() != options::OPT_fhonor_nans)
4006 CmdArgs.push_back("-menable-no-nans");
4007
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004008 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4009 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004010 if (Arg *A =
4011 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4012 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4013 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004014 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4015 // However, turning *off* -ffast_math merely restores the toolchain default
4016 // (which may be false).
4017 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4018 A->getOption().getID() == options::OPT_ffast_math ||
4019 A->getOption().getID() == options::OPT_Ofast)
4020 MathErrno = false;
4021 else if (A->getOption().getID() == options::OPT_fmath_errno)
4022 MathErrno = true;
4023 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004024 if (MathErrno)
4025 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004026
4027 // There are several flags which require disabling very specific
4028 // optimizations. Any of these being disabled forces us to turn off the
4029 // entire set of LLVM optimizations, so collect them through all the flag
4030 // madness.
4031 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004032 if (Arg *A = Args.getLastArg(
4033 options::OPT_ffast_math, FastMathAliasOption,
4034 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4035 options::OPT_fno_unsafe_math_optimizations,
4036 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004037 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4038 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004039 A->getOption().getID() != options::OPT_fno_associative_math)
4040 AssociativeMath = true;
4041 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004042 if (Arg *A = Args.getLastArg(
4043 options::OPT_ffast_math, FastMathAliasOption,
4044 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4045 options::OPT_fno_unsafe_math_optimizations,
4046 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004047 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4048 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004049 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4050 ReciprocalMath = true;
4051 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004052 if (Arg *A = Args.getLastArg(
4053 options::OPT_ffast_math, FastMathAliasOption,
4054 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4055 options::OPT_fno_unsafe_math_optimizations,
4056 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004057 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4058 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004059 A->getOption().getID() != options::OPT_fsigned_zeros)
4060 SignedZeros = false;
4061 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004062 if (Arg *A = Args.getLastArg(
4063 options::OPT_ffast_math, FastMathAliasOption,
4064 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4065 options::OPT_fno_unsafe_math_optimizations,
4066 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004067 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4068 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004069 A->getOption().getID() != options::OPT_ftrapping_math)
4070 TrappingMath = false;
4071 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4072 !TrappingMath)
4073 CmdArgs.push_back("-menable-unsafe-fp-math");
4074
Sanjay Patel76c9e092015-01-23 16:40:50 +00004075 if (!SignedZeros)
4076 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004077
Sanjay Patel359b1052015-04-09 15:03:23 +00004078 if (ReciprocalMath)
4079 CmdArgs.push_back("-freciprocal-math");
4080
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004081 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004082 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004083 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004084 options::OPT_ffp_contract)) {
4085 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004086 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004087 if (Val == "fast" || Val == "on" || Val == "off") {
4088 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4089 } else {
4090 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004091 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004092 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004093 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4094 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004095 // If fast-math is set then set the fp-contract mode to fast.
4096 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4097 }
4098 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004099
Sanjay Patel2987c292015-06-11 14:53:41 +00004100 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004101
Bob Wilson6a039162012-07-19 03:52:53 +00004102 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4103 // and if we find them, tell the frontend to provide the appropriate
4104 // preprocessor macros. This is distinct from enabling any optimizations as
4105 // these options induce language changes which must survive serialization
4106 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004107 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4108 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004109 if (!A->getOption().matches(options::OPT_fno_fast_math))
4110 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004111 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4112 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004113 if (A->getOption().matches(options::OPT_ffinite_math_only))
4114 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004115
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004116 // Decide whether to use verbose asm. Verbose assembly is the default on
4117 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004118 bool IsIntegratedAssemblerDefault =
4119 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004120 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004121 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004122 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004123 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004124
Rafael Espindolab8a12932015-05-22 20:44:03 +00004125 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4126 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004127 CmdArgs.push_back("-no-integrated-as");
4128
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004129 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4130 CmdArgs.push_back("-mdebug-pass");
4131 CmdArgs.push_back("Structure");
4132 }
4133 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4134 CmdArgs.push_back("-mdebug-pass");
4135 CmdArgs.push_back("Arguments");
4136 }
4137
Justin Lebar710a35f2016-01-25 22:36:35 +00004138 // Enable -mconstructor-aliases except on darwin, where we have to work around
4139 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4140 // aliases aren't supported.
4141 if (!getToolChain().getTriple().isOSDarwin() &&
4142 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004143 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004144
John McCall7ef5cb32011-03-18 02:56:14 +00004145 // Darwin's kernel doesn't support guard variables; just die if we
4146 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004147 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004148 CmdArgs.push_back("-fforbid-guard-variables");
4149
Akira Hatanaka02028482015-11-12 17:21:22 +00004150 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4151 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004152 CmdArgs.push_back("-mms-bitfields");
4153 }
John McCall8517abc2010-02-19 02:45:38 +00004154
Daniel Dunbar306945d2009-09-16 06:17:29 +00004155 // This is a coarse approximation of what llvm-gcc actually does, both
4156 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4157 // complicated ways.
4158 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004159 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4160 options::OPT_fno_asynchronous_unwind_tables,
4161 (getToolChain().IsUnwindTablesDefault() ||
4162 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4163 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004164 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4165 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004166 CmdArgs.push_back("-munwind-tables");
4167
Chandler Carruth05fb5852012-11-21 23:40:23 +00004168 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004169
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004170 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4171 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004172 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004173 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004174
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004175 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004176 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004177
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004178 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004179 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004180 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004181 }
4182
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004183 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004184 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004185 if (!CPU.empty()) {
4186 CmdArgs.push_back("-target-cpu");
4187 CmdArgs.push_back(Args.MakeArgString(CPU));
4188 }
4189
Rafael Espindolaeb265472013-08-21 21:59:03 +00004190 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4191 CmdArgs.push_back("-mfpmath");
4192 CmdArgs.push_back(A->getValue());
4193 }
4194
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004195 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004196 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004197
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004198 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004199 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004200 default:
4201 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004202
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004203 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004204 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004205 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004206 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004207 // Use the effective triple, which takes into account the deployment target.
4208 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004209 break;
4210
Tim Northover573cbee2014-05-24 12:52:07 +00004211 case llvm::Triple::aarch64:
4212 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004213 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004214 break;
4215
Eric Christopher0b26a612010-03-02 02:41:08 +00004216 case llvm::Triple::mips:
4217 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004218 case llvm::Triple::mips64:
4219 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004220 AddMIPSTargetArgs(Args, CmdArgs);
4221 break;
4222
Ulrich Weigand8afad612014-07-28 13:17:52 +00004223 case llvm::Triple::ppc:
4224 case llvm::Triple::ppc64:
4225 case llvm::Triple::ppc64le:
4226 AddPPCTargetArgs(Args, CmdArgs);
4227 break;
4228
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004229 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004230 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004231 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004232 AddSparcTargetArgs(Args, CmdArgs);
4233 break;
4234
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004235 case llvm::Triple::x86:
4236 case llvm::Triple::x86_64:
4237 AddX86TargetArgs(Args, CmdArgs);
4238 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004239
Jacques Pienaard964cc22016-03-28 21:02:54 +00004240 case llvm::Triple::lanai:
4241 AddLanaiTargetArgs(Args, CmdArgs);
4242 break;
4243
Tony Linthicum76329bf2011-12-12 21:14:55 +00004244 case llvm::Triple::hexagon:
4245 AddHexagonTargetArgs(Args, CmdArgs);
4246 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004247
4248 case llvm::Triple::wasm32:
4249 case llvm::Triple::wasm64:
4250 AddWebAssemblyTargetArgs(Args, CmdArgs);
4251 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004252 }
4253
Douglas Katzman3459ce22015-10-08 04:24:12 +00004254 // The 'g' groups options involve a somewhat intricate sequence of decisions
4255 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004256 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004257 // * what level of debug info to generate
4258 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004259 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004260 // This avoids having to monkey around further in cc1 other than to disable
4261 // codeview if not running in a Windows environment. Perhaps even that
4262 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004263 unsigned DwarfVersion = 0;
4264 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4265 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004266 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004267 bool EmitCodeView = false;
4268
Hans Wennborg75958c42013-08-08 00:17:41 +00004269 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004270 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004271 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004272 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004273
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004274 // Pass the linker version in use.
4275 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4276 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004277 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004278 }
4279
Eric Christopherb7d97e92013-04-03 01:58:53 +00004280 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004281 CmdArgs.push_back("-momit-leaf-frame-pointer");
4282
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004283 // Explicitly error on some things we know we don't support and can't just
4284 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004285 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4286 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004287 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004288 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004289 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4290 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004291 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004292 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004293 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004294 }
4295
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004296 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004297 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004298 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004299 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004300 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4301 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004302 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004303 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004304 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004305
Chad Rosierbe10f982011-08-02 17:58:04 +00004306 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004307 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004308 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4309 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004310 }
4311
Rafael Espindola08a692a2010-03-07 04:46:18 +00004312 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004313 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004314 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004315 // If the last option explicitly specified a debug-info level, use it.
4316 if (A->getOption().matches(options::OPT_gN_Group)) {
4317 DebugInfoKind = DebugLevelToInfoKind(*A);
4318 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4319 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4320 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004321 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004322 A->getIndex() > SplitDwarfArg->getIndex())
4323 SplitDwarfArg = nullptr;
4324 } else
4325 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004326 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004327 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004328
Paul Robinson0334a042015-12-19 19:41:48 +00004329 // If a debugger tuning argument appeared, remember it.
4330 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4331 options::OPT_ggdbN_Group)) {
4332 if (A->getOption().matches(options::OPT_glldb))
4333 DebuggerTuning = llvm::DebuggerKind::LLDB;
4334 else if (A->getOption().matches(options::OPT_gsce))
4335 DebuggerTuning = llvm::DebuggerKind::SCE;
4336 else
4337 DebuggerTuning = llvm::DebuggerKind::GDB;
4338 }
4339
4340 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004341 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004342 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004343 DwarfVersion = DwarfVersionNum(A->getSpelling());
4344
Reid Kleckner124955a2015-08-05 18:51:13 +00004345 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004346 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4347 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4348 // DwarfVersion remains at 0 if no explicit choice was made.
4349 CmdArgs.push_back("-gcodeview");
4350 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004351 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004352 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4353 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004354
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004355 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4356 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004357
4358 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004359 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004360 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004361 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004362
Eric Christopher138c32b2013-09-13 22:37:55 +00004363 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004364 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004365 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004366 CmdArgs.push_back("-dwarf-ext-refs");
4367 CmdArgs.push_back("-fmodule-format=obj");
4368 }
4369
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004370 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4371 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004372 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004373 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004374 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004375 CmdArgs.push_back("-backend-option");
4376 CmdArgs.push_back("-split-dwarf=Enable");
4377 }
4378
Douglas Katzman3459ce22015-10-08 04:24:12 +00004379 // After we've dealt with all combinations of things that could
4380 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4381 // figure out if we need to "upgrade" it to standalone debug info.
4382 // We parse these two '-f' options whether or not they will be used,
4383 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4384 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4385 options::OPT_fno_standalone_debug,
4386 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004387 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4388 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004389 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4390 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004391
Eric Christopher138c32b2013-09-13 22:37:55 +00004392 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4393 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4394 CmdArgs.push_back("-backend-option");
4395 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4396 }
Eric Christophereec89c22013-06-18 00:03:50 +00004397
Eric Christopher0d403d22014-02-14 01:27:03 +00004398 // -gdwarf-aranges turns on the emission of the aranges section in the
4399 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004400 // Always enabled on the PS4.
4401 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004402 CmdArgs.push_back("-backend-option");
4403 CmdArgs.push_back("-generate-arange-section");
4404 }
4405
David Blaikief36d9ba2014-01-27 18:52:43 +00004406 if (Args.hasFlag(options::OPT_fdebug_types_section,
4407 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004408 CmdArgs.push_back("-backend-option");
4409 CmdArgs.push_back("-generate-type-units");
4410 }
Eric Christophereec89c22013-06-18 00:03:50 +00004411
Dan Gohmana5b804b2016-01-07 00:50:27 +00004412 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4413 // default.
4414 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4415 Triple.getArch() == llvm::Triple::wasm32 ||
4416 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004417
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004418 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004419 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004420 CmdArgs.push_back("-ffunction-sections");
4421 }
4422
Peter Collingbourneceef1452016-02-24 22:03:06 +00004423 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4424 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004425 if (!D.isUsingLTO())
4426 D.Diag(diag::err_drv_argument_only_allowed_with)
4427 << "-fwhole-program-vtables"
4428 << "-flto";
4429 CmdArgs.push_back("-fwhole-program-vtables");
4430
4431 clang::SmallString<64> Path(D.ResourceDir);
4432 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4433 if (llvm::sys::fs::exists(Path)) {
4434 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4435 BlacklistOpt += Path.str();
4436 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4437 }
4438
4439 for (const Arg *A :
4440 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4441 A->claim();
4442 if (!llvm::sys::fs::exists(A->getValue()))
4443 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4444 }
4445
4446 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4447 }
4448
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004449 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4450 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004451 CmdArgs.push_back("-fdata-sections");
4452 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004453
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004454 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004455 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004456 CmdArgs.push_back("-fno-unique-section-names");
4457
Chris Lattner3c77a352010-06-22 00:03:40 +00004458 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4459
Diego Novilloa0545962015-07-10 18:00:07 +00004460 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004461
Paul Robinsond083b9a2015-12-16 17:25:27 +00004462 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4463 if (getToolChain().getTriple().isPS4CPU())
4464 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4465
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004466 // Pass options for controlling the default header search paths.
4467 if (Args.hasArg(options::OPT_nostdinc)) {
4468 CmdArgs.push_back("-nostdsysteminc");
4469 CmdArgs.push_back("-nobuiltininc");
4470 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004471 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004472 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004473 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4474 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4475 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004476
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004477 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004478 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004479 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004480
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004481 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4482
Ted Kremenekf7639e12012-03-06 20:06:33 +00004483 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004484 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004485 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004486 options::OPT_ccc_arcmt_modify,
4487 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004488 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004489 switch (A->getOption().getID()) {
4490 default:
4491 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004492 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004493 CmdArgs.push_back("-arcmt-check");
4494 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004495 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004496 CmdArgs.push_back("-arcmt-modify");
4497 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004498 case options::OPT_ccc_arcmt_migrate:
4499 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004500 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004501 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004502
4503 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4504 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004505 break;
John McCalld70fb982011-06-15 23:25:17 +00004506 }
4507 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004508 } else {
4509 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4510 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4511 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004512 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004513
Ted Kremenekf7639e12012-03-06 20:06:33 +00004514 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4515 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004516 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4517 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004518 }
4519 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004520 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004521
4522 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004523 options::OPT_objcmt_migrate_subscripting,
4524 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004525 // None specified, means enable them all.
4526 CmdArgs.push_back("-objcmt-migrate-literals");
4527 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004528 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004529 } else {
4530 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4531 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004532 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004533 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004534 } else {
4535 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4536 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4537 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4538 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4540 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004541 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004542 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4543 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4546 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4547 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4548 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004549 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004550 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004551 }
4552
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004553 // Add preprocessing options like -I, -D, etc. if we are using the
4554 // preprocessor.
4555 //
4556 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004557 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004558 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4559 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004560
Rafael Espindolaa7431922011-07-21 23:40:37 +00004561 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4562 // that "The compiler can only warn and ignore the option if not recognized".
4563 // When building with ccache, it will pass -D options to clang even on
4564 // preprocessed inputs and configure concludes that -fPIC is not supported.
4565 Args.ClaimAllArgs(options::OPT_D);
4566
Alp Toker7874bdc2013-11-15 20:40:58 +00004567 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004568 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4569 if (A->getOption().matches(options::OPT_O4)) {
4570 CmdArgs.push_back("-O3");
4571 D.Diag(diag::warn_O4_is_O3);
4572 } else {
4573 A->render(Args, CmdArgs);
4574 }
4575 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004576
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004577 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004578 for (const Arg *A :
4579 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4580 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004581 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004582 }
4583
Rafael Espindola577637a2015-01-03 00:06:04 +00004584 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004585
Richard Smith3be1cb22014-08-07 00:24:21 +00004586 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004587 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004588 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4589 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004590 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004591 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004592
4593 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004594 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004595 //
4596 // If a std is supplied, only add -trigraphs if it follows the
4597 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004598 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004599 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4600 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004601 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004602 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004603 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004604 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004605 else
4606 Std->render(Args, CmdArgs);
4607
Nico Weber00721502014-12-23 22:32:37 +00004608 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004609 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004610 options::OPT_ftrigraphs,
4611 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004612 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004613 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004614 } else {
4615 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004616 //
4617 // FIXME: Clang doesn't correctly handle -std= when the input language
4618 // doesn't match. For the time being just ignore this for C++ inputs;
4619 // eventually we want to do all the standard defaulting here instead of
4620 // splitting it between the driver and clang -cc1.
4621 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004622 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4623 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004624 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004625 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004626
Nico Weber00721502014-12-23 22:32:37 +00004627 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4628 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004629 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004630
Richard Smith282b4492013-09-04 22:50:31 +00004631 // GCC's behavior for -Wwrite-strings is a bit strange:
4632 // * In C, this "warning flag" changes the types of string literals from
4633 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4634 // for the discarded qualifier.
4635 // * In C++, this is just a normal warning flag.
4636 //
4637 // Implementing this warning correctly in C is hard, so we follow GCC's
4638 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4639 // a non-const char* in C, rather than using this crude hack.
4640 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004641 // FIXME: This should behave just like a warning flag, and thus should also
4642 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4643 Arg *WriteStrings =
4644 Args.getLastArg(options::OPT_Wwrite_strings,
4645 options::OPT_Wno_write_strings, options::OPT_w);
4646 if (WriteStrings &&
4647 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004648 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004649 }
4650
Chandler Carruth61fbf622011-04-23 09:27:53 +00004651 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004652 // during C++ compilation, which it is by default. GCC keeps this define even
4653 // in the presence of '-w', match this behavior bug-for-bug.
4654 if (types::isCXX(InputType) &&
4655 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4656 true)) {
4657 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004658 }
4659
Chandler Carruthe0391482010-05-22 02:21:53 +00004660 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4661 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4662 if (Asm->getOption().matches(options::OPT_fasm))
4663 CmdArgs.push_back("-fgnu-keywords");
4664 else
4665 CmdArgs.push_back("-fno-gnu-keywords");
4666 }
4667
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004668 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4669 CmdArgs.push_back("-fno-dwarf-directory-asm");
4670
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004671 if (ShouldDisableAutolink(Args, getToolChain()))
4672 CmdArgs.push_back("-fno-autolink");
4673
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004674 // Add in -fdebug-compilation-dir if necessary.
4675 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004676
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004677 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4678 StringRef Map = A->getValue();
4679 if (Map.find('=') == StringRef::npos)
4680 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4681 else
4682 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4683 A->claim();
4684 }
4685
Richard Smith9a568822011-11-21 19:36:32 +00004686 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4687 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004688 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004689 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004690 }
4691
Richard Smith79c927b2013-11-06 19:31:51 +00004692 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4693 CmdArgs.push_back("-foperator-arrow-depth");
4694 CmdArgs.push_back(A->getValue());
4695 }
4696
Richard Smith9a568822011-11-21 19:36:32 +00004697 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4698 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004699 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004700 }
4701
Richard Smitha3d3bd22013-05-08 02:12:03 +00004702 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4703 CmdArgs.push_back("-fconstexpr-steps");
4704 CmdArgs.push_back(A->getValue());
4705 }
4706
Richard Smithb3a14522013-02-22 01:59:51 +00004707 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4708 CmdArgs.push_back("-fbracket-depth");
4709 CmdArgs.push_back(A->getValue());
4710 }
4711
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004712 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4713 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004714 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004715 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004716 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4717 } else
4718 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004719 }
4720
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004721 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004722 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004723
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004724 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4725 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004726 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004727 }
David Chisnall5778fce2009-08-31 16:41:57 +00004728
Chris Lattnere23003d2010-01-09 21:54:33 +00004729 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4730 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004731 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004732 }
4733
Chris Lattnerb35583d2010-04-07 20:49:23 +00004734 CmdArgs.push_back("-ferror-limit");
4735 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004736 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004737 else
4738 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004739
Chandler Carrutha77a7272010-05-06 04:55:18 +00004740 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4741 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004742 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004743 }
4744
4745 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4746 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004747 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004748 }
4749
Richard Smithf6f003a2011-12-16 19:06:07 +00004750 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4751 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004752 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004753 }
4754
Nick Lewycky24653262014-12-16 21:39:02 +00004755 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4756 CmdArgs.push_back("-fspell-checking-limit");
4757 CmdArgs.push_back(A->getValue());
4758 }
4759
Daniel Dunbar2c978472009-11-04 06:24:47 +00004760 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004761 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004762 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004763 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004764 } else {
4765 // If -fmessage-length=N was not specified, determine whether this is a
4766 // terminal and, if so, implicitly define -fmessage-length appropriately.
4767 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004768 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004769 }
4770
John McCallb4a99d32013-02-19 01:57:35 +00004771 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4772 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4773 options::OPT_fvisibility_ms_compat)) {
4774 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4775 CmdArgs.push_back("-fvisibility");
4776 CmdArgs.push_back(A->getValue());
4777 } else {
4778 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4779 CmdArgs.push_back("-fvisibility");
4780 CmdArgs.push_back("hidden");
4781 CmdArgs.push_back("-ftype-visibility");
4782 CmdArgs.push_back("default");
4783 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004784 }
4785
Douglas Gregor08329632010-06-15 17:05:35 +00004786 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004787
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004788 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4789
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004790 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004791 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4792 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004793 CmdArgs.push_back("-ffreestanding");
4794
Daniel Dunbare357d562009-12-03 18:42:11 +00004795 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004796 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004797 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004798 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004799 // Emulated TLS is enabled by default on Android, and can be enabled manually
4800 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004801 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004802 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4803 EmulatedTLSDefault))
4804 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004805 // AltiVec-like language extensions aren't relevant for assembling.
4806 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004807 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004808 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4809 }
Richard Trieu91844232012-06-26 18:18:47 +00004810 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4811 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004812
Alexey Bataevdb390212015-05-20 04:24:19 +00004813 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004814 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4815 options::OPT_fno_openmp, false))
4816 switch (getOpenMPRuntime(getToolChain(), Args)) {
4817 case OMPRT_OMP:
4818 case OMPRT_IOMP5:
4819 // Clang can generate useful OpenMP code for these two runtime libraries.
4820 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004821
4822 // If no option regarding the use of TLS in OpenMP codegeneration is
4823 // given, decide a default based on the target. Otherwise rely on the
4824 // options and pass the right information to the frontend.
4825 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004826 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004827 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004828 break;
4829 default:
4830 // By default, if Clang doesn't know how to generate useful OpenMP code
4831 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4832 // down to the actual compilation.
4833 // FIXME: It would be better to have a mode which *only* omits IR
4834 // generation based on the OpenMP support so that we get consistent
4835 // semantic analysis, etc.
4836 break;
4837 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004838
Peter Collingbourne32701642013-11-01 18:16:25 +00004839 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004840 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004841
Eric Christopher459d2712013-02-19 06:16:53 +00004842 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004843 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4844 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4845 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4846 Arch == llvm::Triple::ppc64le))
4847 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4848 << "ppc/ppc64/ppc64le";
4849 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004850
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004851 // -fzvector is incompatible with -faltivec.
4852 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4853 if (Args.hasArg(options::OPT_faltivec))
4854 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4855 << "-faltivec";
4856
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004857 if (getToolChain().SupportsProfiling())
4858 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004859
4860 // -flax-vector-conversions is default.
4861 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4862 options::OPT_fno_lax_vector_conversions))
4863 CmdArgs.push_back("-fno-lax-vector-conversions");
4864
John Brawna7b4ec02015-08-10 11:11:28 +00004865 if (Args.getLastArg(options::OPT_fapple_kext) ||
4866 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004867 CmdArgs.push_back("-fapple-kext");
4868
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004869 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004870 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004871 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004872 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4873 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004874
4875 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4876 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004877 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004878 }
4879
Bob Wilson14adb362012-02-03 06:27:22 +00004880 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004881
Chandler Carruth6e501032011-03-27 00:04:55 +00004882 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4883 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004884 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004885 if (A->getOption().matches(options::OPT_fwrapv))
4886 CmdArgs.push_back("-fwrapv");
4887 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4888 options::OPT_fno_strict_overflow)) {
4889 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4890 CmdArgs.push_back("-fwrapv");
4891 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004892
4893 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4894 options::OPT_fno_reroll_loops))
4895 if (A->getOption().matches(options::OPT_freroll_loops))
4896 CmdArgs.push_back("-freroll-loops");
4897
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004898 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004899 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4900 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004901
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004902 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4903
Daniel Dunbar4930e332009-11-17 08:07:36 +00004904 // -stack-protector=0 is default.
4905 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00004906 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
4907 options::OPT_fstack_protector_all,
4908 options::OPT_fstack_protector_strong,
4909 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004910 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004911 StackProtectorLevel = std::max<unsigned>(
4912 LangOptions::SSPOn,
4913 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004914 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004915 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004916 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004917 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004918 } else {
4919 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004920 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004921 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004922 if (StackProtectorLevel) {
4923 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004924 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004925 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004926
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004927 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004928 for (const Arg *A : Args.filtered(options::OPT__param)) {
4929 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004930 if (Str.startswith("ssp-buffer-size=")) {
4931 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004932 CmdArgs.push_back("-stack-protector-buffer-size");
4933 // FIXME: Verify the argument is a valid integer.
4934 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004935 }
Sean Silva14facf32015-06-09 01:57:17 +00004936 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004937 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004938 }
4939
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004940 // Translate -mstackrealign
4941 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004942 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004943 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004944
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004945 if (Args.hasArg(options::OPT_mstack_alignment)) {
4946 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4947 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004948 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004949
Hans Wennborg77dc2362015-01-20 19:45:50 +00004950 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4951 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4952
4953 if (!Size.empty())
4954 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4955 else
4956 CmdArgs.push_back("-mstack-probe-size=0");
4957 }
4958
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004959 switch (getToolChain().getArch()) {
4960 case llvm::Triple::aarch64:
4961 case llvm::Triple::aarch64_be:
4962 case llvm::Triple::arm:
4963 case llvm::Triple::armeb:
4964 case llvm::Triple::thumb:
4965 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004966 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004967 break;
4968
4969 default:
4970 break;
4971 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004972
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004973 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4974 options::OPT_mno_restrict_it)) {
4975 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4976 CmdArgs.push_back("-backend-option");
4977 CmdArgs.push_back("-arm-restrict-it");
4978 } else {
4979 CmdArgs.push_back("-backend-option");
4980 CmdArgs.push_back("-arm-no-restrict-it");
4981 }
James Y Knight2db38f32015-08-15 03:45:25 +00004982 } else if (Triple.isOSWindows() &&
4983 (Triple.getArch() == llvm::Triple::arm ||
4984 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004985 // Windows on ARM expects restricted IT blocks
4986 CmdArgs.push_back("-backend-option");
4987 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004988 }
4989
Daniel Dunbard18049a2009-04-07 21:16:11 +00004990 // Forward -f options with positive and negative forms; we translate
4991 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004992 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4993 StringRef fname = A->getValue();
4994 if (!llvm::sys::fs::exists(fname))
4995 D.Diag(diag::err_drv_no_such_file) << fname;
4996 else
4997 A->render(Args, CmdArgs);
4998 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004999
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005000 // -fbuiltin is default unless -mkernel is used.
5001 bool UseBuiltins =
5002 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
5003 !Args.hasArg(options::OPT_mkernel));
5004 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005005 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005006
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005007 // -ffreestanding implies -fno-builtin.
5008 if (Args.hasArg(options::OPT_ffreestanding))
5009 UseBuiltins = false;
5010
5011 // Process the -fno-builtin-* options.
5012 for (const auto &Arg : Args) {
5013 const Option &O = Arg->getOption();
5014 if (!O.matches(options::OPT_fno_builtin_))
5015 continue;
5016
5017 Arg->claim();
5018 // If -fno-builtin is specified, then there's no need to pass the option to
5019 // the frontend.
5020 if (!UseBuiltins)
5021 continue;
5022
5023 StringRef FuncName = Arg->getValue();
5024 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5025 }
5026
Nuno Lopes13c88c72009-12-16 16:59:22 +00005027 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5028 options::OPT_fno_assume_sane_operator_new))
5029 CmdArgs.push_back("-fno-assume-sane-operator-new");
5030
Daniel Dunbar4930e332009-11-17 08:07:36 +00005031 // -fblocks=0 is default.
5032 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005033 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005034 (Args.hasArg(options::OPT_fgnu_runtime) &&
5035 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5036 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005037 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005038
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005039 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005040 !getToolChain().hasBlocksRuntime())
5041 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005042 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005043
Richard Smith47972af2015-06-16 00:08:24 +00005044 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005045 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005046 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005047 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005048 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005049 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5050 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005051 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005052 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005053 HaveModules = true;
5054 }
5055 }
5056
Richard Smith47972af2015-06-16 00:08:24 +00005057 // -fmodule-maps enables implicit reading of module map files. By default,
5058 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005059 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5060 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005061 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005062 }
5063
Daniel Jasperac42b752013-10-21 06:34:34 +00005064 // -fmodules-decluse checks that modules used are declared so (off by
5065 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005066 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005067 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005068 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005069 }
5070
Daniel Jasper962b38e2014-04-11 11:47:45 +00005071 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5072 // all #included headers are part of modules.
5073 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005074 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005075 CmdArgs.push_back("-fmodules-strict-decluse");
5076 }
5077
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005078 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5079 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5080 options::OPT_fno_implicit_modules)) {
5081 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005082 } else if (HaveModules) {
5083 // -fmodule-cache-path specifies where our implicitly-built module files
5084 // should be written.
5085 SmallString<128> Path;
5086 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5087 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005088 if (C.isForDiagnostics()) {
5089 // When generating crash reports, we want to emit the modules along with
5090 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005091 Path = Output.getFilename();
5092 llvm::sys::path::replace_extension(Path, ".cache");
5093 llvm::sys::path::append(Path, "modules");
5094 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005095 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005096 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005097 llvm::sys::path::append(Path, "org.llvm.clang.");
5098 appendUserToPath(Path);
5099 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005100 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005101 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005102 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5103 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005104 }
5105
Richard Smith8d83d6d2016-03-21 19:06:06 +00005106 // -fmodule-name specifies the module that is currently being built (or
5107 // used for header checking by -fmodule-maps).
5108 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5109
5110 // -fmodule-map-file can be used to specify files containing module
5111 // definitions.
5112 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5113
5114 // -fmodule-file can be used to specify files containing precompiled modules.
5115 if (HaveModules)
5116 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5117 else
5118 Args.ClaimAllArgs(options::OPT_fmodule_file);
5119
Justin Bognera88f0122014-06-20 22:59:50 +00005120 // When building modules and generating crashdumps, we need to dump a module
5121 // dependency VFS alongside the output.
5122 if (HaveModules && C.isForDiagnostics()) {
5123 SmallString<128> VFSDir(Output.getFilename());
5124 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005125 // Add the cache directory as a temp so the crash diagnostics pick it up.
5126 C.addTempFile(Args.MakeArgString(VFSDir));
5127
Justin Bognera88f0122014-06-20 22:59:50 +00005128 llvm::sys::path::append(VFSDir, "vfs");
5129 CmdArgs.push_back("-module-dependency-dir");
5130 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005131 }
5132
Richard Smith9887d792014-10-17 01:42:53 +00005133 if (HaveModules)
5134 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005135
Douglas Gregor35b04d62013-02-07 19:01:24 +00005136 // Pass through all -fmodules-ignore-macro arguments.
5137 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005138 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5139 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005140
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005141 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5142
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005143 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5144 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5145 D.Diag(diag::err_drv_argument_not_allowed_with)
5146 << A->getAsString(Args) << "-fbuild-session-timestamp";
5147
5148 llvm::sys::fs::file_status Status;
5149 if (llvm::sys::fs::status(A->getValue(), Status))
5150 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005151 CmdArgs.push_back(Args.MakeArgString(
5152 "-fbuild-session-timestamp=" +
5153 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005154 }
5155
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005156 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005157 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5158 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005159 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5160
5161 Args.AddLastArg(CmdArgs,
5162 options::OPT_fmodules_validate_once_per_build_session);
5163 }
5164
Ben Langmuirdcf73862014-03-12 00:06:17 +00005165 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5166
John McCalldfea9982010-04-09 19:12:06 +00005167 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005168 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005169 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005170 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005171
Anders Carlssond470fef2010-11-21 00:09:52 +00005172 // -felide-constructors is the default.
5173 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005174 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005175 CmdArgs.push_back("-fno-elide-constructors");
5176
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005177 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005178
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005179 if (KernelOrKext || (types::isCXX(InputType) &&
5180 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5181 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005182 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005183
Tony Linthicum76329bf2011-12-12 21:14:55 +00005184 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005185 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5186 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005187 CmdArgs.push_back("-fshort-enums");
5188
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005189 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005190 if (Arg *A = Args.getLastArg(
5191 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5192 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5193 if (A->getOption().matches(options::OPT_funsigned_char) ||
5194 A->getOption().matches(options::OPT_fno_signed_char)) {
5195 CmdArgs.push_back("-fno-signed-char");
5196 }
5197 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005198 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005199 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005200
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005201 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005202 if (!Args.hasFlag(
5203 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5204 !IsWindowsCygnus && !IsWindowsGNU &&
5205 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5206 getToolChain().getArch() != llvm::Triple::hexagon &&
5207 getToolChain().getArch() != llvm::Triple::xcore &&
5208 ((getToolChain().getTriple().getVendor() !=
5209 llvm::Triple::MipsTechnologies) ||
5210 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005211 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005212 CmdArgs.push_back("-fno-use-cxa-atexit");
5213
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005214 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005215 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005216 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005217 CmdArgs.push_back("-fms-extensions");
5218
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005219 // -fno-use-line-directives is default.
5220 if (Args.hasFlag(options::OPT_fuse_line_directives,
5221 options::OPT_fno_use_line_directives, false))
5222 CmdArgs.push_back("-fuse-line-directives");
5223
Francois Pichet1b4f1632011-09-17 04:32:15 +00005224 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005225 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005226 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005227 (IsWindowsMSVC &&
5228 Args.hasFlag(options::OPT_fms_extensions,
5229 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005230 CmdArgs.push_back("-fms-compatibility");
5231
David Majnemerc371ff02015-03-22 08:39:22 +00005232 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005233 VersionTuple MSVT = visualstudio::getMSVCVersion(
5234 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5235 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005236 CmdArgs.push_back(
5237 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005238
David Majnemer8db91762015-05-18 04:49:30 +00005239 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5240 if (ImplyVCPPCXXVer) {
5241 if (IsMSVC2015Compatible)
5242 CmdArgs.push_back("-std=c++14");
5243 else
5244 CmdArgs.push_back("-std=c++11");
5245 }
5246
Eric Christopher5ecce122013-02-18 00:38:31 +00005247 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005248 if (Args.hasFlag(options::OPT_fborland_extensions,
5249 options::OPT_fno_borland_extensions, false))
5250 CmdArgs.push_back("-fborland-extensions");
5251
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005252 // -fno-declspec is default, except for PS4.
5253 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5254 getToolChain().getTriple().isPS4()))
5255 CmdArgs.push_back("-fdeclspec");
5256 else if (Args.hasArg(options::OPT_fno_declspec))
5257 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5258
David Majnemerc371ff02015-03-22 08:39:22 +00005259 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5260 // than 19.
5261 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5262 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005263 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005264 CmdArgs.push_back("-fno-threadsafe-statics");
5265
Francois Pichet02744872011-09-01 16:38:08 +00005266 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5267 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005268 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005269 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005270 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005271
Chandler Carruthe03aa552010-04-17 20:17:31 +00005272 // -fgnu-keywords default varies depending on language; only pass if
5273 // specified.
5274 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005275 options::OPT_fno_gnu_keywords))
5276 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005277
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005278 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005279 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005280 CmdArgs.push_back("-fgnu89-inline");
5281
Chad Rosier9c76d242012-03-15 22:31:42 +00005282 if (Args.hasArg(options::OPT_fno_inline))
5283 CmdArgs.push_back("-fno-inline");
5284
Chad Rosier64d6be92012-03-06 21:17:19 +00005285 if (Args.hasArg(options::OPT_fno_inline_functions))
5286 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005287
John McCall5fb5df92012-06-20 06:18:46 +00005288 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005289
John McCall5fb5df92012-06-20 06:18:46 +00005290 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005291 // legacy is the default. Except for deployment taget of 10.5,
5292 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5293 // gets ignored silently.
5294 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005295 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5296 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005297 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005298 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005299 if (getToolChain().UseObjCMixedDispatch())
5300 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5301 else
5302 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5303 }
5304 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005305
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005306 // When ObjectiveC legacy runtime is in effect on MacOSX,
5307 // turn on the option to do Array/Dictionary subscripting
5308 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005309 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005310 getToolChain().getTriple().isMacOSX() &&
5311 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5312 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005313 objcRuntime.isNeXTFamily())
5314 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005315
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005316 // -fencode-extended-block-signature=1 is default.
5317 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5318 CmdArgs.push_back("-fencode-extended-block-signature");
5319 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005320
John McCall24fc0de2011-07-06 00:26:06 +00005321 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5322 // NOTE: This logic is duplicated in ToolChains.cpp.
5323 bool ARC = isObjCAutoRefCount(Args);
5324 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005325 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005326
John McCall24fc0de2011-07-06 00:26:06 +00005327 CmdArgs.push_back("-fobjc-arc");
5328
Chandler Carruth491db322011-11-04 07:34:47 +00005329 // FIXME: It seems like this entire block, and several around it should be
5330 // wrapped in isObjC, but for now we just use it here as this is where it
5331 // was being used previously.
5332 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5333 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5334 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5335 else
5336 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5337 }
5338
John McCall24fc0de2011-07-06 00:26:06 +00005339 // Allow the user to enable full exceptions code emission.
5340 // We define off for Objective-CC, on for Objective-C++.
5341 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5342 options::OPT_fno_objc_arc_exceptions,
5343 /*default*/ types::isCXX(InputType)))
5344 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005345
John McCall24fc0de2011-07-06 00:26:06 +00005346 }
5347
5348 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5349 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005350 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005351 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005352
John McCall24fc0de2011-07-06 00:26:06 +00005353 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5354 // takes precedence.
5355 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5356 if (!GCArg)
5357 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5358 if (GCArg) {
5359 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005360 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005361 } else if (getToolChain().SupportsObjCGC()) {
5362 GCArg->render(Args, CmdArgs);
5363 } else {
5364 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005365 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005366 }
5367 }
5368
John McCallfbe5ed72015-11-05 19:19:56 +00005369 // Pass down -fobjc-weak or -fno-objc-weak if present.
5370 if (types::isObjC(InputType)) {
5371 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5372 options::OPT_fno_objc_weak);
5373 if (!WeakArg) {
5374 // nothing to do
5375 } else if (GCArg) {
5376 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5377 D.Diag(diag::err_objc_weak_with_gc);
5378 } else if (!objcRuntime.allowsWeak()) {
5379 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5380 D.Diag(diag::err_objc_weak_unsupported);
5381 } else {
5382 WeakArg->render(Args, CmdArgs);
5383 }
5384 }
5385
Bob Wilsonb111ec92015-03-02 19:01:14 +00005386 if (Args.hasFlag(options::OPT_fapplication_extension,
5387 options::OPT_fno_application_extension, false))
5388 CmdArgs.push_back("-fapplication-extension");
5389
Reid Klecknerc542d372014-06-27 17:02:02 +00005390 // Handle GCC-style exception args.
5391 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005392 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5393 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005394
Tim Northovere931f9f2015-10-30 16:30:41 +00005395 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005396 CmdArgs.push_back("-fsjlj-exceptions");
5397
5398 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005399 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5400 options::OPT_fno_assume_sane_operator_new))
5401 CmdArgs.push_back("-fno-assume-sane-operator-new");
5402
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005403 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5404 // most platforms.
5405 if (Args.hasFlag(options::OPT_fsized_deallocation,
5406 options::OPT_fno_sized_deallocation, false))
5407 CmdArgs.push_back("-fsized-deallocation");
5408
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005409 // -fconstant-cfstrings is default, and may be subject to argument translation
5410 // on Darwin.
5411 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5412 options::OPT_fno_constant_cfstrings) ||
5413 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5414 options::OPT_mno_constant_cfstrings))
5415 CmdArgs.push_back("-fno-constant-cfstrings");
5416
John Thompsoned4e2952009-11-05 20:14:16 +00005417 // -fshort-wchar default varies depending on platform; only
5418 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005419 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5420 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005421 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005422
Hans Wennborg28c96312013-07-31 23:39:13 +00005423 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005424 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005425 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005426 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005427
Daniel Dunbar096ed292011-10-05 21:04:55 +00005428 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5429 // -fno-pack-struct doesn't apply to -fpack-struct=.
5430 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005431 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005432 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005433 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005434 } else if (Args.hasFlag(options::OPT_fpack_struct,
5435 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005436 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005437 }
5438
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005439 // Handle -fmax-type-align=N and -fno-type-align
5440 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5441 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5442 if (!SkipMaxTypeAlign) {
5443 std::string MaxTypeAlignStr = "-fmax-type-align=";
5444 MaxTypeAlignStr += A->getValue();
5445 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5446 }
5447 } else if (getToolChain().getTriple().isOSDarwin()) {
5448 if (!SkipMaxTypeAlign) {
5449 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5450 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5451 }
5452 }
5453
John Brawna7b4ec02015-08-10 11:11:28 +00005454 // -fcommon is the default unless compiling kernel code or the target says so
5455 bool NoCommonDefault =
5456 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5457 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5458 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005459 CmdArgs.push_back("-fno-common");
5460
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005461 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005462 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005463 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005464 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005465 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005466 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005467
Daniel Dunbar6358d682010-10-15 22:30:42 +00005468 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005469 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005470 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005471 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005472
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005473 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005474 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5475 StringRef value = inputCharset->getValue();
5476 if (value != "UTF-8")
5477 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5478 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005479 }
5480
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005481 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005482 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5483 StringRef value = execCharset->getValue();
5484 if (value != "UTF-8")
5485 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5486 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005487 }
5488
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005489 // -fcaret-diagnostics is default.
5490 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5491 options::OPT_fno_caret_diagnostics, true))
5492 CmdArgs.push_back("-fno-caret-diagnostics");
5493
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005494 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005495 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005496 options::OPT_fno_diagnostics_fixit_info))
5497 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005498
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005499 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005500 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005501 options::OPT_fno_diagnostics_show_option))
5502 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005503
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005504 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005505 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005506 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005507 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005508 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005509
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005510 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005511 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005512 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005513 }
5514
Chandler Carruthb6766f02011-03-27 01:50:55 +00005515 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005516 options::OPT_fdiagnostics_show_note_include_stack,
5517 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005518 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005519 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005520 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5521 else
5522 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5523 }
5524
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005525 // Color diagnostics are the default, unless the terminal doesn't support
5526 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005527 // Support both clang's -f[no-]color-diagnostics and gcc's
5528 // -f[no-]diagnostics-colors[=never|always|auto].
5529 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005530 for (const auto &Arg : Args) {
5531 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005532 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5533 !O.matches(options::OPT_fdiagnostics_color) &&
5534 !O.matches(options::OPT_fno_color_diagnostics) &&
5535 !O.matches(options::OPT_fno_diagnostics_color) &&
5536 !O.matches(options::OPT_fdiagnostics_color_EQ))
5537 continue;
5538
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005539 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005540 if (O.matches(options::OPT_fcolor_diagnostics) ||
5541 O.matches(options::OPT_fdiagnostics_color)) {
5542 ShowColors = Colors_On;
5543 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5544 O.matches(options::OPT_fno_diagnostics_color)) {
5545 ShowColors = Colors_Off;
5546 } else {
5547 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005548 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005549 if (value == "always")
5550 ShowColors = Colors_On;
5551 else if (value == "never")
5552 ShowColors = Colors_Off;
5553 else if (value == "auto")
5554 ShowColors = Colors_Auto;
5555 else
5556 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005557 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005558 }
5559 }
5560 if (ShowColors == Colors_On ||
5561 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005562 CmdArgs.push_back("-fcolor-diagnostics");
5563
Nico Rieck7857d462013-09-11 00:38:02 +00005564 if (Args.hasArg(options::OPT_fansi_escape_codes))
5565 CmdArgs.push_back("-fansi-escape-codes");
5566
Daniel Dunbardb097022009-06-08 21:13:54 +00005567 if (!Args.hasFlag(options::OPT_fshow_source_location,
5568 options::OPT_fno_show_source_location))
5569 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005570
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005571 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005572 true))
5573 CmdArgs.push_back("-fno-show-column");
5574
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005575 if (!Args.hasFlag(options::OPT_fspell_checking,
5576 options::OPT_fno_spell_checking))
5577 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005578
Chad Rosierc8e56e82012-12-05 21:08:21 +00005579 // -fno-asm-blocks is default.
5580 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5581 false))
5582 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005583
Steven Wucb0d13f2015-01-16 23:05:28 +00005584 // -fgnu-inline-asm is default.
5585 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5586 options::OPT_fno_gnu_inline_asm, true))
5587 CmdArgs.push_back("-fno-gnu-inline-asm");
5588
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005589 // Enable vectorization per default according to the optimization level
5590 // selected. For optimization levels that want vectorization we use the alias
5591 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005592 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005593 OptSpecifier VectorizeAliasOption =
5594 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005595 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005596 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005597 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005598
Chad Rosier136d67d2014-04-28 19:30:57 +00005599 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005600 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005601 OptSpecifier SLPVectAliasOption =
5602 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005603 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005604 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005605 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005606
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005607 // -fno-slp-vectorize-aggressive is default.
5608 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005609 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005610 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005611
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005612 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5613 A->render(Args, CmdArgs);
5614
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005615 // -fdollars-in-identifiers default varies depending on platform and
5616 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005617 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005618 options::OPT_fno_dollars_in_identifiers)) {
5619 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005620 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005621 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005622 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005623 }
5624
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005625 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5626 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005627 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005628 options::OPT_fno_unit_at_a_time)) {
5629 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005630 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005631 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005632
Eli Friedman055c9702011-11-02 01:53:16 +00005633 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5634 options::OPT_fno_apple_pragma_pack, false))
5635 CmdArgs.push_back("-fapple-pragma-pack");
5636
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005637 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005638 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5639 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005640 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005641 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005642 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005644// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5645//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005646// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005647#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005648 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005649 (getToolChain().getArch() == llvm::Triple::arm ||
5650 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005651 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5652 CmdArgs.push_back("-fno-builtin-strcat");
5653 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5654 CmdArgs.push_back("-fno-builtin-strcpy");
5655 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005656#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005657
Justin Bognera88f0122014-06-20 22:59:50 +00005658 // Enable rewrite includes if the user's asked for it or if we're generating
5659 // diagnostics.
5660 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5661 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005662 if (Args.hasFlag(options::OPT_frewrite_includes,
5663 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005664 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005665 CmdArgs.push_back("-frewrite-includes");
5666
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005667 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005668 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005669 options::OPT_traditional_cpp)) {
5670 if (isa<PreprocessJobAction>(JA))
5671 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005672 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005673 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005674 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005675
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005676 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005677 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005678
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005679 // Handle serialized diagnostics.
5680 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5681 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005682 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005683 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005684
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005685 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5686 CmdArgs.push_back("-fretain-comments-from-system-headers");
5687
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005688 // Forward -fcomment-block-commands to -cc1.
5689 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005690 // Forward -fparse-all-comments to -cc1.
5691 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005692
John Brawnad31ace2015-09-23 13:55:40 +00005693 // Turn -fplugin=name.so into -load name.so
5694 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5695 CmdArgs.push_back("-load");
5696 CmdArgs.push_back(A->getValue());
5697 A->claim();
5698 }
5699
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005700 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5701 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005702 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005703 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5704 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005705
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005706 // We translate this by hand to the -cc1 argument, since nightly test uses
5707 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005708 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005709 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005710 } else
Sean Silva14facf32015-06-09 01:57:17 +00005711 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005712 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005713
Bob Wilson23a55f12014-12-21 07:00:00 +00005714 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005715 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5716 // by the frontend.
5717 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5718 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005719
Daniel Dunbard67a3222009-03-30 06:36:42 +00005720 if (Output.getType() == types::TY_Dependencies) {
5721 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005722 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005723 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005724 CmdArgs.push_back(Output.getFilename());
5725 } else {
5726 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005727 }
5728
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005729 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005730
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005731 if (Input.isFilename())
5732 CmdArgs.push_back(Input.getFilename());
5733 else
5734 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005735
Chris Lattnere9d7d782009-11-03 19:50:27 +00005736 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5737
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005738 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005739
5740 // Optionally embed the -cc1 level arguments into the debug info, for build
5741 // analysis.
5742 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005743 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005744 for (const auto &Arg : Args)
5745 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005746
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005747 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005748 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005749 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005750 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005751 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005752 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005753 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005754 }
5755 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005756 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005757 }
5758
Eric Christopherd3804002013-02-22 20:12:52 +00005759 // Add the split debug info name to the command lines here so we
5760 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005761 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005762 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5763 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005764 const char *SplitDwarfOut;
5765 if (SplitDwarf) {
5766 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005767 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005768 CmdArgs.push_back(SplitDwarfOut);
5769 }
5770
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005771 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5772 // Include them with -fcuda-include-gpubinary.
5773 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005774 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005775 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005776 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005777 }
5778
Eric Christopherd3804002013-02-22 20:12:52 +00005779 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005780 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005781 Output.getType() == types::TY_Object &&
5782 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005783 auto CLCommand =
5784 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005785 C.addCommand(llvm::make_unique<FallbackCommand>(
5786 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005787 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5788 isa<PrecompileJobAction>(JA)) {
5789 // In /fallback builds, run the main compilation even if the pch generation
5790 // fails, so that the main compilation's fallback to cl.exe runs.
5791 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5792 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005793 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005794 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005795 }
5796
Eric Christopherf1545832013-02-22 23:50:16 +00005797 // Handle the debug info splitting at object creation time if we're
5798 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005799 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005800 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005801 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005802
Roman Divacky178e01602011-02-10 16:52:03 +00005803 if (Arg *A = Args.getLastArg(options::OPT_pg))
5804 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005805 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5806 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005807
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005808 // Claim some arguments which clang supports automatically.
5809
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005810 // -fpch-preprocess is used with gcc to add a special marker in the output to
5811 // include the PCH file. Clang's PTH solution is completely transparent, so we
5812 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005813 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005814
Daniel Dunbar17731772009-03-23 19:03:36 +00005815 // Claim some arguments which clang doesn't support, but we don't
5816 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005817 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5818 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005819
Rafael Espindolab0092d72013-09-04 19:37:35 +00005820 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005821 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005822}
5823
John McCall5fb5df92012-06-20 06:18:46 +00005824/// Add options related to the Objective-C runtime/ABI.
5825///
5826/// Returns true if the runtime is non-fragile.
5827ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5828 ArgStringList &cmdArgs,
5829 RewriteKind rewriteKind) const {
5830 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005831 Arg *runtimeArg =
5832 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5833 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005834
5835 // Just forward -fobjc-runtime= to the frontend. This supercedes
5836 // options about fragility.
5837 if (runtimeArg &&
5838 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5839 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005840 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005841 if (runtime.tryParse(value)) {
5842 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005843 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005844 }
5845
5846 runtimeArg->render(args, cmdArgs);
5847 return runtime;
5848 }
5849
5850 // Otherwise, we'll need the ABI "version". Version numbers are
5851 // slightly confusing for historical reasons:
5852 // 1 - Traditional "fragile" ABI
5853 // 2 - Non-fragile ABI, version 1
5854 // 3 - Non-fragile ABI, version 2
5855 unsigned objcABIVersion = 1;
5856 // If -fobjc-abi-version= is present, use that to set the version.
5857 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005858 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005859 if (value == "1")
5860 objcABIVersion = 1;
5861 else if (value == "2")
5862 objcABIVersion = 2;
5863 else if (value == "3")
5864 objcABIVersion = 3;
5865 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005866 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005867 } else {
5868 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005869 bool nonFragileABIIsDefault =
5870 (rewriteKind == RK_NonFragile ||
5871 (rewriteKind == RK_None &&
5872 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005873 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5874 options::OPT_fno_objc_nonfragile_abi,
5875 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005876// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005877#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5878 unsigned nonFragileABIVersion = 1;
5879#else
5880 unsigned nonFragileABIVersion = 2;
5881#endif
5882
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005883 if (Arg *abiArg =
5884 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005885 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005886 if (value == "1")
5887 nonFragileABIVersion = 1;
5888 else if (value == "2")
5889 nonFragileABIVersion = 2;
5890 else
5891 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005892 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005893 }
5894
5895 objcABIVersion = 1 + nonFragileABIVersion;
5896 } else {
5897 objcABIVersion = 1;
5898 }
5899 }
5900
5901 // We don't actually care about the ABI version other than whether
5902 // it's non-fragile.
5903 bool isNonFragile = objcABIVersion != 1;
5904
5905 // If we have no runtime argument, ask the toolchain for its default runtime.
5906 // However, the rewriter only really supports the Mac runtime, so assume that.
5907 ObjCRuntime runtime;
5908 if (!runtimeArg) {
5909 switch (rewriteKind) {
5910 case RK_None:
5911 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5912 break;
5913 case RK_Fragile:
5914 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5915 break;
5916 case RK_NonFragile:
5917 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5918 break;
5919 }
5920
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005921 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005922 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5923 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005924 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005925 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5926
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005927 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005928 } else {
5929 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5930 }
5931
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005932 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005933 } else {
5934 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005935 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005936 // non-fragile mode or the GCC runtime in fragile mode.
5937 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005938 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005939 else
5940 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005941 }
5942
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005943 cmdArgs.push_back(
5944 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005945 return runtime;
5946}
5947
Reid Klecknerc542d372014-06-27 17:02:02 +00005948static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5949 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5950 I += HaveDash;
5951 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005952}
Reid Klecknerc542d372014-06-27 17:02:02 +00005953
Benjamin Kramere003ca22015-10-28 13:54:16 +00005954namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005955struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005956 bool Synch = false;
5957 bool Asynch = false;
5958 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005959};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005960} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005961
5962/// /EH controls whether to run destructor cleanups when exceptions are
5963/// thrown. There are three modifiers:
5964/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5965/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5966/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005967/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005968/// The default is /EHs-c-, meaning cleanups are disabled.
5969static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5970 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005971
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005972 std::vector<std::string> EHArgs =
5973 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005974 for (auto EHVal : EHArgs) {
5975 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5976 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005977 case 'a':
5978 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005979 if (EH.Asynch)
5980 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005981 continue;
5982 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005983 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005984 continue;
5985 case 's':
5986 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005987 if (EH.Synch)
5988 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005989 continue;
5990 default:
5991 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005992 }
5993 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5994 break;
5995 }
5996 }
David Majnemerb8809092016-02-20 09:23:44 +00005997 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005998 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005999 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006000 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6001 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006002 EH.Synch = true;
6003 EH.NoUnwindC = true;
6004 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006005
Reid Klecknerc542d372014-06-27 17:02:02 +00006006 return EH;
6007}
6008
David Majnemercd5855e2016-02-29 01:40:36 +00006009void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6010 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006011 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006012 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006013 unsigned RTOptionID = options::OPT__SLASH_MT;
6014
Hans Wennborgf1a74252013-09-10 20:18:04 +00006015 if (Args.hasArg(options::OPT__SLASH_LDd))
6016 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6017 // but defining _DEBUG is sticky.
6018 RTOptionID = options::OPT__SLASH_MTd;
6019
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006020 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006021 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006022
David Majnemere2afb472015-07-24 06:49:13 +00006023 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006024 switch (RTOptionID) {
6025 case options::OPT__SLASH_MD:
6026 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006027 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006028 CmdArgs.push_back("-D_MT");
6029 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006030 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006031 break;
6032 case options::OPT__SLASH_MDd:
6033 CmdArgs.push_back("-D_DEBUG");
6034 CmdArgs.push_back("-D_MT");
6035 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006036 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006037 break;
6038 case options::OPT__SLASH_MT:
6039 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006040 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006041 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006042 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006043 break;
6044 case options::OPT__SLASH_MTd:
6045 CmdArgs.push_back("-D_DEBUG");
6046 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006047 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006048 break;
6049 default:
6050 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006051 }
6052
David Majnemere2afb472015-07-24 06:49:13 +00006053 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6054 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6055 } else {
6056 CmdArgs.push_back(FlagForCRT.data());
6057
6058 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6059 // users want. The /Za flag to cl.exe turns this off, but it's not
6060 // implemented in clang.
6061 CmdArgs.push_back("--dependent-lib=oldnames");
6062 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006063
Hans Wennborg8858a032014-07-21 23:42:07 +00006064 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6065 // would produce interleaved output, so ignore /showIncludes in such cases.
6066 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6067 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6068 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006069
David Majnemerf6072342014-07-01 22:24:56 +00006070 // This controls whether or not we emit RTTI data for polymorphic types.
6071 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6072 /*default=*/false))
6073 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006074
Reid Kleckner124955a2015-08-05 18:51:13 +00006075 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006076 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006077 if (*EmitCodeView)
6078 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006079 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006080 CmdArgs.push_back("-gcodeview");
6081
Reid Klecknerc542d372014-06-27 17:02:02 +00006082 const Driver &D = getToolChain().getDriver();
6083 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006084 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006085 if (types::isCXX(InputType))
6086 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006087 CmdArgs.push_back("-fexceptions");
6088 }
David Majnemercd5855e2016-02-29 01:40:36 +00006089 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6090 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006091
Hans Wennborge50cec32014-06-13 20:59:54 +00006092 // /EP should expand to -E -P.
6093 if (Args.hasArg(options::OPT__SLASH_EP)) {
6094 CmdArgs.push_back("-E");
6095 CmdArgs.push_back("-P");
6096 }
6097
David Majnemera5b195a2015-02-14 01:35:12 +00006098 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006099 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6100 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006101 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6102 else
6103 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6104
6105 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6106 VolatileOptionID = A->getOption().getID();
6107
6108 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6109 CmdArgs.push_back("-fms-volatile");
6110
David Majnemer86c318f2014-02-11 21:05:00 +00006111 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6112 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6113 if (MostGeneralArg && BestCaseArg)
6114 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6115 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6116
6117 if (MostGeneralArg) {
6118 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6119 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6120 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6121
6122 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6123 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6124 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6125 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6126 << FirstConflict->getAsString(Args)
6127 << SecondConflict->getAsString(Args);
6128
6129 if (SingleArg)
6130 CmdArgs.push_back("-fms-memptr-rep=single");
6131 else if (MultipleArg)
6132 CmdArgs.push_back("-fms-memptr-rep=multiple");
6133 else
6134 CmdArgs.push_back("-fms-memptr-rep=virtual");
6135 }
6136
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006137 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6138 A->render(Args, CmdArgs);
6139
Hans Wennborg81f74482013-09-10 01:07:07 +00006140 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6141 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006142 if (Args.hasArg(options::OPT__SLASH_fallback))
6143 CmdArgs.push_back("msvc-fallback");
6144 else
6145 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006146 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006147}
6148
Douglas Katzman95354292015-06-23 20:42:09 +00006149visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006150 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006151 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006152 return CLFallback.get();
6153}
6154
Daniel Sanders7f933f42015-01-30 17:35:23 +00006155void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6156 ArgStringList &CmdArgs) const {
6157 StringRef CPUName;
6158 StringRef ABIName;
6159 const llvm::Triple &Triple = getToolChain().getTriple();
6160 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6161
6162 CmdArgs.push_back("-target-abi");
6163 CmdArgs.push_back(ABIName.data());
6164}
6165
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006166void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006167 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006168 const ArgList &Args,
6169 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006170 ArgStringList CmdArgs;
6171
6172 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6173 const InputInfo &Input = Inputs[0];
6174
James Y Knight2db38f32015-08-15 03:45:25 +00006175 std::string TripleStr =
6176 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6177 const llvm::Triple Triple(TripleStr);
6178
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006179 // Don't warn about "clang -w -c foo.s"
6180 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006181 // and "clang -emit-llvm -c foo.s"
6182 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006183
Rafael Espindola577637a2015-01-03 00:06:04 +00006184 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006185
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006186 // Invoke ourselves in -cc1as mode.
6187 //
6188 // FIXME: Implement custom jobs for internal actions.
6189 CmdArgs.push_back("-cc1as");
6190
6191 // Add the "effective" target triple.
6192 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006193 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6194
6195 // Set the output mode, we currently only expect to be used as a real
6196 // assembler.
6197 CmdArgs.push_back("-filetype");
6198 CmdArgs.push_back("obj");
6199
Eric Christopher45f2e712012-12-18 00:31:10 +00006200 // Set the main file name, so that debug info works even with
6201 // -save-temps or preprocessed assembly.
6202 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006203 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006204
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006205 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006206 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006207 if (!CPU.empty()) {
6208 CmdArgs.push_back("-target-cpu");
6209 CmdArgs.push_back(Args.MakeArgString(CPU));
6210 }
6211
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006212 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006213 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006214
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006215 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006216 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006217
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006218 // Pass along any -I options so we get proper .include search paths.
6219 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6220
Eric Christopherfc3ee562012-01-10 00:38:01 +00006221 // Determine the original source input.
6222 const Action *SourceAction = &JA;
6223 while (SourceAction->getKind() != Action::InputClass) {
6224 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6225 SourceAction = SourceAction->getInputs()[0];
6226 }
6227
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006228 // Forward -g and handle debug info related flags, assuming we are dealing
6229 // with an actual assembly file.
Douglas Katzman3103f252016-04-19 18:55:53 +00006230 bool WantDebug = false;
6231 unsigned DwarfVersion = 0;
6232 Args.ClaimAllArgs(options::OPT_g_Group);
6233 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6234 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6235 !A->getOption().matches(options::OPT_ggdb0);
6236 if (WantDebug)
6237 DwarfVersion = DwarfVersionNum(A->getSpelling());
6238 }
6239 if (DwarfVersion == 0)
6240 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6241
6242 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6243
Eric Christopherfc3ee562012-01-10 00:38:01 +00006244 if (SourceAction->getType() == types::TY_Asm ||
6245 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3103f252016-04-19 18:55:53 +00006246 // You might think that it would be ok to set DebugInfoKind outside of
6247 // the guard for source type, however there is a test which asserts
6248 // that some assembler invocation receives no -debug-info-kind,
6249 // and it's not clear whether that test is just overly restrictive.
6250 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6251 : codegenoptions::NoDebugInfo);
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006252 // Add the -fdebug-compilation-dir flag if needed.
6253 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006254
6255 // Set the AT_producer to the clang version when using the integrated
6256 // assembler on assembly source files.
6257 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopesb741e102016-03-30 00:25:57 +00006258 std::string QuotedClangVersion("'" + getClangFullVersion() + "'");
6259 CmdArgs.push_back(Args.MakeArgString(QuotedClangVersion));
Renato Golina74bbc72015-07-22 15:32:36 +00006260
6261 // And pass along -I options
6262 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006263 }
Douglas Katzman3103f252016-04-19 18:55:53 +00006264 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6265 llvm::DebuggerKind::Default);
Kevin Enderby292dc082011-12-22 19:31:58 +00006266
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006267 // Handle -fPIC et al -- the relocation-model affects the assembler
6268 // for some targets.
6269 llvm::Reloc::Model RelocationModel;
6270 unsigned PICLevel;
6271 bool IsPIE;
6272 std::tie(RelocationModel, PICLevel, IsPIE) =
6273 ParsePICArgs(getToolChain(), Triple, Args);
6274
6275 const char *RMName = RelocationModelName(RelocationModel);
6276 if (RMName) {
6277 CmdArgs.push_back("-mrelocation-model");
6278 CmdArgs.push_back(RMName);
6279 }
6280
Kevin Enderby292dc082011-12-22 19:31:58 +00006281 // Optionally embed the -cc1as level arguments into the debug info, for build
6282 // analysis.
6283 if (getToolChain().UseDwarfDebugFlags()) {
6284 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006285 for (const auto &Arg : Args)
6286 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006287
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006288 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006289 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6290 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006291 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006292 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006293 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006294 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006295 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006296 }
6297 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006298 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006299 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006300
6301 // FIXME: Add -static support, once we have it.
6302
Daniel Sanders7f933f42015-01-30 17:35:23 +00006303 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006304 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006305 default:
6306 break;
6307
6308 case llvm::Triple::mips:
6309 case llvm::Triple::mipsel:
6310 case llvm::Triple::mips64:
6311 case llvm::Triple::mips64el:
6312 AddMIPSTargetArgs(Args, CmdArgs);
6313 break;
6314 }
6315
David Blaikie372d9502014-01-17 03:17:40 +00006316 // Consume all the warning flags. Usually this would be handled more
6317 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6318 // doesn't handle that so rather than warning about unused flags that are
6319 // actually used, we'll lie by omission instead.
6320 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006321 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006322
David Blaikie9260ed62013-07-25 21:19:01 +00006323 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6324 getToolChain().getDriver());
6325
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006326 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006327
6328 assert(Output.isFilename() && "Unexpected lipo output.");
6329 CmdArgs.push_back("-o");
6330 CmdArgs.push_back(Output.getFilename());
6331
Daniel Dunbarb440f562010-08-02 02:38:21 +00006332 assert(Input.isFilename() && "Invalid input.");
6333 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006334
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006335 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006336 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006337
6338 // Handle the debug info splitting at object creation time if we're
6339 // creating an object.
6340 // TODO: Currently only works on linux with newer objcopy.
6341 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006342 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006343 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006344 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006345}
6346
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006347void GnuTool::anchor() {}
6348
Daniel Dunbara3246a02009-03-18 08:07:30 +00006349void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006350 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006351 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006352 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006353 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006354 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006355
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006356 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006357 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006358 // It is unfortunate that we have to claim here, as this means
6359 // we will basically never report anything interesting for
6360 // platforms using a generic gcc, even if we are just using gcc
6361 // to get to the assembler.
6362 A->claim();
6363
Daniel Dunbar939c1212010-08-03 16:14:14 +00006364 // Don't forward any -g arguments to assembly steps.
6365 if (isa<AssembleJobAction>(JA) &&
6366 A->getOption().matches(options::OPT_g_Group))
6367 continue;
6368
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006369 // Don't forward any -W arguments to assembly and link steps.
6370 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6371 A->getOption().matches(options::OPT_W_Group))
6372 continue;
6373
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006374 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006375 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006376 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006377
Daniel Dunbar4e295052010-01-25 22:35:08 +00006378 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006379
6380 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006381 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006382 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006383 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006384 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006385 }
6386
Daniel Dunbar5716d872009-05-02 21:41:52 +00006387 // Try to force gcc to match the tool chain we want, if we recognize
6388 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006389 //
6390 // FIXME: The triple class should directly provide the information we want
6391 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006392 switch (getToolChain().getArch()) {
6393 default:
6394 break;
6395 case llvm::Triple::x86:
6396 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006397 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006398 break;
6399 case llvm::Triple::x86_64:
6400 case llvm::Triple::ppc64:
6401 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006402 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006403 break;
6404 case llvm::Triple::sparcel:
6405 CmdArgs.push_back("-EL");
6406 break;
6407 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006408
Daniel Dunbarb440f562010-08-02 02:38:21 +00006409 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006410 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006411 CmdArgs.push_back(Output.getFilename());
6412 } else {
6413 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006414 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006415 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006416
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006417 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006418
6419 // Only pass -x if gcc will understand it; otherwise hope gcc
6420 // understands the suffix correctly. The main use case this would go
6421 // wrong in is for linker inputs if they happened to have an odd
6422 // suffix; really the only way to get this to happen is a command
6423 // like '-x foobar a.c' which will treat a.c like a linker input.
6424 //
6425 // FIXME: For the linker case specifically, can we safely convert
6426 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006427 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006428 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006429 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006430 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006431 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006432 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006433 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006434 else if (II.getType() == types::TY_ModuleFile)
6435 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006436 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006437
Daniel Dunbara3246a02009-03-18 08:07:30 +00006438 if (types::canTypeBeUserSpecified(II.getType())) {
6439 CmdArgs.push_back("-x");
6440 CmdArgs.push_back(types::getTypeName(II.getType()));
6441 }
6442
Daniel Dunbarb440f562010-08-02 02:38:21 +00006443 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006444 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006445 else {
6446 const Arg &A = II.getInputArg();
6447
6448 // Reverse translate some rewritten options.
6449 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6450 CmdArgs.push_back("-lstdc++");
6451 continue;
6452 }
6453
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006454 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006455 A.render(Args, CmdArgs);
6456 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006457 }
6458
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006459 const std::string customGCCName = D.getCCCGenericGCCName();
6460 const char *GCCName;
6461 if (!customGCCName.empty())
6462 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006463 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006464 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006465 } else
6466 GCCName = "gcc";
6467
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006468 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006469 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006470}
6471
Douglas Katzman95354292015-06-23 20:42:09 +00006472void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6473 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006474 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006475}
6476
Douglas Katzman95354292015-06-23 20:42:09 +00006477void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6478 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006479 const Driver &D = getToolChain().getDriver();
6480
Eric Christophercc7ff502015-01-29 00:56:17 +00006481 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006482 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006483 case types::TY_LLVM_IR:
6484 case types::TY_LTO_IR:
6485 case types::TY_LLVM_BC:
6486 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006487 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006488 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006489 // We assume we've got an "integrated" assembler in that gcc will produce an
6490 // object file itself.
6491 case types::TY_Object:
6492 CmdArgs.push_back("-c");
6493 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006494 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006495 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006496 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006497 case types::TY_Nothing:
6498 CmdArgs.push_back("-fsyntax-only");
6499 break;
6500 default:
6501 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006502 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006503}
6504
Douglas Katzman95354292015-06-23 20:42:09 +00006505void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6506 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006507 // The types are (hopefully) good enough.
6508}
6509
Tony Linthicum76329bf2011-12-12 21:14:55 +00006510// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006511void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006512 ArgStringList &CmdArgs) const {
6513}
6514
Douglas Katzman95354292015-06-23 20:42:09 +00006515void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6516 const InputInfo &Output,
6517 const InputInfoList &Inputs,
6518 const ArgList &Args,
6519 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006520 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006521
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006522 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6523 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006524 ArgStringList CmdArgs;
6525
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006526 std::string MArchString = "-march=hexagon";
6527 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006528
6529 RenderExtraToolArgs(JA, CmdArgs);
6530
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006531 std::string AsName = "hexagon-llvm-mc";
6532 std::string MCpuString = "-mcpu=hexagon" +
6533 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6534 CmdArgs.push_back("-filetype=obj");
6535 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6536
Tony Linthicum76329bf2011-12-12 21:14:55 +00006537 if (Output.isFilename()) {
6538 CmdArgs.push_back("-o");
6539 CmdArgs.push_back(Output.getFilename());
6540 } else {
6541 assert(Output.isNothing() && "Unexpected output");
6542 CmdArgs.push_back("-fsyntax-only");
6543 }
6544
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006545 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6546 std::string N = llvm::utostr(G.getValue());
6547 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6548 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006549
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006550 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006551
Tony Linthicum76329bf2011-12-12 21:14:55 +00006552 // Only pass -x if gcc will understand it; otherwise hope gcc
6553 // understands the suffix correctly. The main use case this would go
6554 // wrong in is for linker inputs if they happened to have an odd
6555 // suffix; really the only way to get this to happen is a command
6556 // like '-x foobar a.c' which will treat a.c like a linker input.
6557 //
6558 // FIXME: For the linker case specifically, can we safely convert
6559 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006560 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006561 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006562 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006563 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006564 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006565 else if (II.getType() == types::TY_AST)
6566 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006567 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006568 else if (II.getType() == types::TY_ModuleFile)
6569 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006570 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006571
6572 if (II.isFilename())
6573 CmdArgs.push_back(II.getFilename());
6574 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006575 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006576 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006577 II.getInputArg().render(Args, CmdArgs);
6578 }
6579
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006580 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006581 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006582}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006583
Douglas Katzman95354292015-06-23 20:42:09 +00006584void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6585 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006586}
6587
Douglas Katzman54366072015-07-27 16:53:08 +00006588static void
6589constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006590 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006591 const InputInfo &Output, const InputInfoList &Inputs,
6592 const ArgList &Args, ArgStringList &CmdArgs,
6593 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006594
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006595 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006596
Matthew Curtise689b052012-12-06 15:46:07 +00006597 //----------------------------------------------------------------------------
6598 //
6599 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006600 bool IsStatic = Args.hasArg(options::OPT_static);
6601 bool IsShared = Args.hasArg(options::OPT_shared);
6602 bool IsPIE = Args.hasArg(options::OPT_pie);
6603 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6604 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6605 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6606 bool UseG0 = false;
6607 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006608
Matthew Curtise689b052012-12-06 15:46:07 +00006609 //----------------------------------------------------------------------------
6610 // Silence warnings for various options
6611 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006612 Args.ClaimAllArgs(options::OPT_g_Group);
6613 Args.ClaimAllArgs(options::OPT_emit_llvm);
6614 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6615 // handled somewhere else.
6616 Args.ClaimAllArgs(options::OPT_static_libgcc);
6617
6618 //----------------------------------------------------------------------------
6619 //
6620 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006621 if (Args.hasArg(options::OPT_s))
6622 CmdArgs.push_back("-s");
6623
6624 if (Args.hasArg(options::OPT_r))
6625 CmdArgs.push_back("-r");
6626
6627 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006628 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006629
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006630 CmdArgs.push_back("-march=hexagon");
6631 std::string CpuVer =
6632 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6633 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6634 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006635
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006636 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006637 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006638 // The following should be the default, but doing as hexagon-gcc does.
6639 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006640 }
6641
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006642 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006643 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006644
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006645 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006646 CmdArgs.push_back("-pie");
6647
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006648 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6649 std::string N = llvm::utostr(G.getValue());
6650 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6651 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006652 }
6653
Matthew Curtise689b052012-12-06 15:46:07 +00006654 //----------------------------------------------------------------------------
6655 //
6656 //----------------------------------------------------------------------------
6657 CmdArgs.push_back("-o");
6658 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006659
Matthew Curtise689b052012-12-06 15:46:07 +00006660 //----------------------------------------------------------------------------
6661 // moslib
6662 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006663 std::vector<std::string> OsLibs;
6664 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006665
Sean Silva14facf32015-06-09 01:57:17 +00006666 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6667 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006668 OsLibs.emplace_back(A->getValue());
6669 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006670 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006671 if (OsLibs.empty()) {
6672 OsLibs.push_back("standalone");
6673 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006674 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006675
Matthew Curtise689b052012-12-06 15:46:07 +00006676 //----------------------------------------------------------------------------
6677 // Start Files
6678 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006679 const std::string MCpuSuffix = "/" + CpuVer;
6680 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6681 const std::string RootDir =
6682 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6683 const std::string StartSubDir =
6684 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006685
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006686 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6687 const char *Name) -> std::string {
6688 std::string RelName = SubDir + Name;
6689 std::string P = HTC.GetFilePath(RelName.c_str());
6690 if (llvm::sys::fs::exists(P))
6691 return P;
6692 return RootDir + RelName;
6693 };
6694
6695 if (IncStdLib && IncStartFiles) {
6696 if (!IsShared) {
6697 if (HasStandalone) {
6698 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6699 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006700 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006701 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6702 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006703 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006704 std::string Init = UseShared
6705 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6706 : Find(RootDir, StartSubDir, "/init.o");
6707 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006708 }
6709
6710 //----------------------------------------------------------------------------
6711 // Library Search Paths
6712 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006713 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6714 for (const auto &LibPath : LibPaths)
6715 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006716
6717 //----------------------------------------------------------------------------
6718 //
6719 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006720 Args.AddAllArgs(CmdArgs,
6721 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6722 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006723
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006724 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006725
6726 //----------------------------------------------------------------------------
6727 // Libraries
6728 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006729 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006730 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006731 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006732 CmdArgs.push_back("-lm");
6733 }
6734
6735 CmdArgs.push_back("--start-group");
6736
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006737 if (!IsShared) {
6738 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006739 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006740 CmdArgs.push_back("-lc");
6741 }
6742 CmdArgs.push_back("-lgcc");
6743
6744 CmdArgs.push_back("--end-group");
6745 }
6746
6747 //----------------------------------------------------------------------------
6748 // End files
6749 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006750 if (IncStdLib && IncStartFiles) {
6751 std::string Fini = UseShared
6752 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6753 : Find(RootDir, StartSubDir, "/fini.o");
6754 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006755 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006756}
6757
Douglas Katzman95354292015-06-23 20:42:09 +00006758void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6759 const InputInfo &Output,
6760 const InputInfoList &Inputs,
6761 const ArgList &Args,
6762 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006763 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006764
6765 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006766 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006767 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006768
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006769 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006770 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006771 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006772}
6773// Hexagon tools end.
6774
Tom Stellard8fa33092015-07-18 01:49:05 +00006775void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6776 const InputInfo &Output,
6777 const InputInfoList &Inputs,
6778 const ArgList &Args,
6779 const char *LinkingOutput) const {
6780
6781 std::string Linker = getToolChain().GetProgramPath(getShortName());
6782 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006783 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellard8fa33092015-07-18 01:49:05 +00006784 CmdArgs.push_back(Output.getFilename());
6785 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6786 CmdArgs, Inputs));
6787}
6788// AMDGPU tools end.
6789
Dan Gohman52816862015-12-16 23:30:41 +00006790wasm::Linker::Linker(const ToolChain &TC)
6791 : GnuTool("wasm::Linker", "lld", TC) {}
6792
6793bool wasm::Linker::isLinkJob() const {
6794 return true;
6795}
6796
6797bool wasm::Linker::hasIntegratedCPP() const {
6798 return false;
6799}
6800
6801void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6802 const InputInfo &Output,
6803 const InputInfoList &Inputs,
6804 const ArgList &Args,
6805 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006806
6807 const ToolChain &ToolChain = getToolChain();
6808 const Driver &D = ToolChain.getDriver();
6809 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006810 ArgStringList CmdArgs;
6811 CmdArgs.push_back("-flavor");
6812 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006813
6814 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006815 // size is of particular importance. This is significantly facilitated by
6816 // the enabling of -ffunction-sections and -fdata-sections in
6817 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006818 if (areOptimizationsEnabled(Args))
6819 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006820
Dan Gohman57b62c52016-02-22 19:26:15 +00006821 if (Args.hasArg(options::OPT_rdynamic))
6822 CmdArgs.push_back("-export-dynamic");
6823 if (Args.hasArg(options::OPT_s))
6824 CmdArgs.push_back("--strip-all");
6825 if (Args.hasArg(options::OPT_shared))
6826 CmdArgs.push_back("-shared");
6827 if (Args.hasArg(options::OPT_static))
6828 CmdArgs.push_back("-Bstatic");
6829
6830 Args.AddAllArgs(CmdArgs, options::OPT_L);
6831 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6832
6833 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6834 if (Args.hasArg(options::OPT_shared))
6835 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6836 else if (Args.hasArg(options::OPT_pie))
6837 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6838 else
6839 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6840
6841 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6842 }
6843
6844 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6845
6846 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6847 if (D.CCCIsCXX())
6848 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6849
6850 if (Args.hasArg(options::OPT_pthread))
6851 CmdArgs.push_back("-lpthread");
6852
6853 CmdArgs.push_back("-lc");
6854 CmdArgs.push_back("-lcompiler_rt");
6855 }
6856
6857 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6858 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6859
Dan Gohman52816862015-12-16 23:30:41 +00006860 CmdArgs.push_back("-o");
6861 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006862
Dan Gohman52816862015-12-16 23:30:41 +00006863 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6864}
6865
Renato Golin7c542b42015-07-27 23:44:45 +00006866const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006867 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006868 if (!Arch.empty())
6869 MArch = Arch;
6870 else
Bernard Ogden31561762013-12-12 13:27:11 +00006871 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006872 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006873
6874 // Handle -march=native.
6875 if (MArch == "native") {
6876 std::string CPU = llvm::sys::getHostCPUName();
6877 if (CPU != "generic") {
6878 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006879 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006880 // If there is no valid architecture suffix for this CPU we don't know how
6881 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006882 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006883 MArch = "";
6884 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006885 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006886 }
6887 }
6888
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006889 return MArch;
6890}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006891
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006892/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006893StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006894 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006895 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6896 // here means an -march=native that we can't handle, so instead return no CPU.
6897 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006898 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006899
John Brawna95c1a82015-05-08 12:52:18 +00006900 // We need to return an empty string here on invalid MArch values as the
6901 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006902 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006903}
6904
6905/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006906std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006907 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006908 // FIXME: Warn on inconsistent use of -mcpu and -march.
6909 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006910 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006911 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006912 // Handle -mcpu=native.
6913 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006914 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006915 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006916 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006917 }
6918
Renato Goline17c5802015-07-27 23:44:42 +00006919 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006920}
6921
6922/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006923/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006924// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006925StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6926 const llvm::Triple &Triple) {
6927 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006928 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006929 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006930 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006931 if (ArchKind == llvm::ARM::AK_INVALID)
6932 // In case of generic Arch, i.e. "arm",
6933 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006934 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006935 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006936 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6937 // armv7k triple if it's actually been specified via "-arch armv7k".
6938 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006939 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006940 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006941 }
Renato Golin3c007252015-05-28 15:05:53 +00006942 if (ArchKind == llvm::ARM::AK_INVALID)
6943 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006944 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006945}
6946
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006947void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006948 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006949 if (Args.hasArg(options::OPT_r))
6950 return;
6951
John Brawn94fd9632015-05-21 12:19:49 +00006952 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6953 // to generate BE-8 executables.
6954 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6955 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006956}
6957
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006958mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006959 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6960 // was first introduced in Release 3. However, other compilers have
6961 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006962 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6963 .Case("mips1", NanLegacy)
6964 .Case("mips2", NanLegacy)
6965 .Case("mips3", NanLegacy)
6966 .Case("mips4", NanLegacy)
6967 .Case("mips5", NanLegacy)
6968 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006969 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006970 .Case("mips32r3", NanLegacy | Nan2008)
6971 .Case("mips32r5", NanLegacy | Nan2008)
6972 .Case("mips32r6", Nan2008)
6973 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006974 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006975 .Case("mips64r3", NanLegacy | Nan2008)
6976 .Case("mips64r5", NanLegacy | Nan2008)
6977 .Case("mips64r6", Nan2008)
6978 .Default(NanLegacy);
6979}
6980
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006981bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6982 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6983 return A && (A->getValue() == StringRef(Value));
6984}
6985
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006986bool mips::isUCLibc(const ArgList &Args) {
6987 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006988 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006989}
6990
Daniel Sanders2bf13662014-07-10 14:40:57 +00006991bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006992 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6993 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006994 .Case("2008", true)
6995 .Case("legacy", false)
6996 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006997
6998 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006999 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007000 .Cases("mips32r6", "mips64r6", true)
7001 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007002
7003 return false;
7004}
7005
Daniel Sanders379d44b2014-07-16 11:52:23 +00007006bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007007 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007008 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00007009 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00007010 return false;
7011
7012 if (ABIName != "32")
7013 return false;
7014
Toma Tabacu94ea6862015-06-16 13:54:13 +00007015 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7016 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007017 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007018 return false;
7019
Daniel Sanders379d44b2014-07-16 11:52:23 +00007020 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007021 .Cases("mips2", "mips3", "mips4", "mips5", true)
7022 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7023 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7024 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007025}
7026
Toma Tabacu94ea6862015-06-16 13:54:13 +00007027bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7028 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007029 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007030 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7031
7032 // FPXX shouldn't be used if -msingle-float is present.
7033 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7034 options::OPT_mdouble_float))
7035 if (A->getOption().matches(options::OPT_msingle_float))
7036 UseFPXX = false;
7037
7038 return UseFPXX;
7039}
7040
Tim Northover157d9112014-01-16 08:48:16 +00007041llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007042 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7043 // archs which Darwin doesn't use.
7044
7045 // The matching this routine does is fairly pointless, since it is neither the
7046 // complete architecture list, nor a reasonable subset. The problem is that
7047 // historically the driver driver accepts this and also ties its -march=
7048 // handling to the architecture name, so we need to be careful before removing
7049 // support for it.
7050
7051 // This code must be kept in sync with Clang's Darwin specific argument
7052 // translation.
7053
7054 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007055 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7056 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7057 .Case("ppc64", llvm::Triple::ppc64)
7058 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7059 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7060 llvm::Triple::x86)
7061 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7062 // This is derived from the driver driver.
7063 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7064 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7065 .Cases("armv7s", "xscale", llvm::Triple::arm)
7066 .Case("arm64", llvm::Triple::aarch64)
7067 .Case("r600", llvm::Triple::r600)
7068 .Case("amdgcn", llvm::Triple::amdgcn)
7069 .Case("nvptx", llvm::Triple::nvptx)
7070 .Case("nvptx64", llvm::Triple::nvptx64)
7071 .Case("amdil", llvm::Triple::amdil)
7072 .Case("spir", llvm::Triple::spir)
7073 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007074}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007075
Tim Northover157d9112014-01-16 08:48:16 +00007076void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007077 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007078 T.setArch(Arch);
7079
7080 if (Str == "x86_64h")
7081 T.setArchName(Str);
7082 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7083 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007084 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007085 }
7086}
7087
Bob Wilsondecc03e2012-11-23 06:14:39 +00007088const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007089 const InputInfo &Input) {
7090 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007091}
7092
Bob Wilsondecc03e2012-11-23 06:14:39 +00007093const char *Clang::getBaseInputStem(const ArgList &Args,
7094 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007095 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007096
Chris Lattner906bb902011-01-16 08:14:11 +00007097 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007098 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007099
7100 return Str;
7101}
7102
Bob Wilsondecc03e2012-11-23 06:14:39 +00007103const char *Clang::getDependencyFileName(const ArgList &Args,
7104 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007105 // FIXME: Think about this more.
7106 std::string Res;
7107
7108 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007109 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007110 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007111 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007112 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007113 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007114 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007115}
7116
Douglas Katzman95354292015-06-23 20:42:09 +00007117void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7118 const InputInfo &Output,
7119 const InputInfoList &Inputs,
7120 const ArgList &Args,
7121 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007122 const ToolChain &ToolChain = getToolChain();
7123 const Driver &D = ToolChain.getDriver();
7124 ArgStringList CmdArgs;
7125
7126 // Silence warning for "clang -g foo.o -o foo"
7127 Args.ClaimAllArgs(options::OPT_g_Group);
7128 // and "clang -emit-llvm foo.o -o foo"
7129 Args.ClaimAllArgs(options::OPT_emit_llvm);
7130 // and for "clang -w foo.o -o foo". Other warning options are already
7131 // handled somewhere else.
7132 Args.ClaimAllArgs(options::OPT_w);
7133
7134 if (!D.SysRoot.empty())
7135 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7136
7137 // CloudABI only supports static linkage.
7138 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007139
7140 // CloudABI uses Position Independent Executables exclusively.
7141 CmdArgs.push_back("-pie");
7142 CmdArgs.push_back("--no-dynamic-linker");
7143 CmdArgs.push_back("-zrelro");
7144
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007145 CmdArgs.push_back("--eh-frame-hdr");
7146 CmdArgs.push_back("--gc-sections");
7147
7148 if (Output.isFilename()) {
7149 CmdArgs.push_back("-o");
7150 CmdArgs.push_back(Output.getFilename());
7151 } else {
7152 assert(Output.isNothing() && "Invalid output.");
7153 }
7154
Douglas Katzman78b37b02015-11-17 20:28:07 +00007155 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007156 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7157 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7158 }
7159
7160 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007161 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007162 Args.AddAllArgs(CmdArgs,
7163 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7164 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007165
Teresa Johnson945bc502015-10-15 20:35:53 +00007166 if (D.isUsingLTO())
7167 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007168
7169 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7170
Douglas Katzman78b37b02015-11-17 20:28:07 +00007171 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007172 if (D.CCCIsCXX())
7173 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7174 CmdArgs.push_back("-lc");
7175 CmdArgs.push_back("-lcompiler_rt");
7176 }
7177
Douglas Katzman78b37b02015-11-17 20:28:07 +00007178 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007179 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7180
7181 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007182 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007183}
7184
Douglas Katzman95354292015-06-23 20:42:09 +00007185void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7186 const InputInfo &Output,
7187 const InputInfoList &Inputs,
7188 const ArgList &Args,
7189 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007190 ArgStringList CmdArgs;
7191
7192 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7193 const InputInfo &Input = Inputs[0];
7194
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007195 // Determine the original source input.
7196 const Action *SourceAction = &JA;
7197 while (SourceAction->getKind() != Action::InputClass) {
7198 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7199 SourceAction = SourceAction->getInputs()[0];
7200 }
7201
Eric Christopherf5a8f492015-12-08 00:10:10 +00007202 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007203 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007204 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7205 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007206 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007207 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007208 const llvm::Triple &T(getToolChain().getTriple());
7209 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007210 CmdArgs.push_back("-Q");
7211 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007212
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007213 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007214 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007215 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007216 if (Args.hasArg(options::OPT_gstabs))
7217 CmdArgs.push_back("--gstabs");
7218 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007219 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007220 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007221
Daniel Dunbarbe220842009-03-20 16:06:39 +00007222 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007223 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007224
Daniel Dunbar6d484762010-07-22 01:47:22 +00007225 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007226 if (getToolChain().getArch() == llvm::Triple::x86 ||
7227 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007228 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7229 CmdArgs.push_back("-force_cpusubtype_ALL");
7230
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007231 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007232 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007233 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007234 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007235 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007236 CmdArgs.push_back("-static");
7237
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007238 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007239
7240 assert(Output.isFilename() && "Unexpected lipo output.");
7241 CmdArgs.push_back("-o");
7242 CmdArgs.push_back(Output.getFilename());
7243
Daniel Dunbarb440f562010-08-02 02:38:21 +00007244 assert(Input.isFilename() && "Invalid input.");
7245 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007246
7247 // asm_final spec is empty.
7248
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007249 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007250 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007251}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007252
Tim Northover157d9112014-01-16 08:48:16 +00007253void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007254
Tim Northover157d9112014-01-16 08:48:16 +00007255void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7256 ArgStringList &CmdArgs) const {
7257 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007258
Daniel Dunbarc1964212009-03-26 16:23:12 +00007259 // Derived from darwin_arch spec.
7260 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007261 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007262
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007263 // FIXME: Is this needed anymore?
7264 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007265 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007266}
7267
Douglas Katzman95354292015-06-23 20:42:09 +00007268bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007269 // We only need to generate a temp path for LTO if we aren't compiling object
7270 // files. When compiling source files, we run 'dsymutil' after linking. We
7271 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007272 for (const auto &Input : Inputs)
7273 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007274 return true;
7275
7276 return false;
7277}
7278
Douglas Katzman95354292015-06-23 20:42:09 +00007279void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7280 ArgStringList &CmdArgs,
7281 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007282 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007283 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007284
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007285 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007286 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007287 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007288 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007289 }
7290
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007291 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007292 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007293 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7294 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007295
Bob Wilson3d27dad2013-08-02 22:25:34 +00007296 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7297 CmdArgs.push_back("-export_dynamic");
7298
Bob Wilsonb111ec92015-03-02 19:01:14 +00007299 // If we are using App Extension restrictions, pass a flag to the linker
7300 // telling it that the compiled code has been audited.
7301 if (Args.hasFlag(options::OPT_fapplication_extension,
7302 options::OPT_fno_application_extension, false))
7303 CmdArgs.push_back("-application_extension");
7304
Teresa Johnson945bc502015-10-15 20:35:53 +00007305 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007306 // If we are using LTO, then automatically create a temporary file path for
7307 // the linker to use, so that it's lifetime will extend past a possible
7308 // dsymutil step.
7309 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7310 const char *TmpPath = C.getArgs().MakeArgString(
7311 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7312 C.addTempFile(TmpPath);
7313 CmdArgs.push_back("-object_path_lto");
7314 CmdArgs.push_back(TmpPath);
7315 }
7316
7317 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7318 // it in clang installed libraries. If not found, the option is not used
7319 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7320 if (Version[0] >= 133) {
7321 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7322 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7323 SmallString<128> LibLTOPath(P);
7324 llvm::sys::path::append(LibLTOPath, "lib");
7325 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7326 if (llvm::sys::fs::exists(LibLTOPath)) {
7327 CmdArgs.push_back("-lto_library");
7328 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7329 } else {
7330 D.Diag(diag::warn_drv_lto_libpath);
7331 }
7332 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007333 }
7334
Daniel Dunbarc1964212009-03-26 16:23:12 +00007335 // Derived from the "link" spec.
7336 Args.AddAllArgs(CmdArgs, options::OPT_static);
7337 if (!Args.hasArg(options::OPT_static))
7338 CmdArgs.push_back("-dynamic");
7339 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7340 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7341 // here. How do we wish to handle such things?
7342 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007343
Daniel Dunbarc1964212009-03-26 16:23:12 +00007344 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007345 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007346 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007347 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007348
7349 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7350 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7351 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7352
7353 Arg *A;
7354 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7355 (A = Args.getLastArg(options::OPT_current__version)) ||
7356 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007357 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7358 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007359
7360 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7361 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7362 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7363 } else {
7364 CmdArgs.push_back("-dylib");
7365
7366 Arg *A;
7367 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7368 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7369 (A = Args.getLastArg(options::OPT_client__name)) ||
7370 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7371 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7372 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007373 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7374 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007375
Daniel Dunbarc1964212009-03-26 16:23:12 +00007376 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7377 "-dylib_compatibility_version");
7378 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7379 "-dylib_current_version");
7380
Tim Northover157d9112014-01-16 08:48:16 +00007381 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007382
7383 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7384 "-dylib_install_name");
7385 }
7386
7387 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7388 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7389 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007390 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007391 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007392 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7393 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7394 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7395 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7396 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7397 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007398 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007399 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7400 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7401 Args.AddAllArgs(CmdArgs, options::OPT_init);
7402
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007403 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007404 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007405
Daniel Dunbarc1964212009-03-26 16:23:12 +00007406 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7407 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7408 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7409 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7410 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007411
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007412 if (const Arg *A =
7413 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7414 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007415 if (A->getOption().matches(options::OPT_fpie) ||
7416 A->getOption().matches(options::OPT_fPIE))
7417 CmdArgs.push_back("-pie");
7418 else
7419 CmdArgs.push_back("-no_pie");
7420 }
Steven Wu574b0f22016-03-01 01:07:58 +00007421 // for embed-bitcode, use -bitcode_bundle in linker command
7422 if (C.getDriver().embedBitcodeEnabled() ||
7423 C.getDriver().embedBitcodeMarkerOnly()) {
7424 // Check if the toolchain supports bitcode build flow.
7425 if (MachOTC.SupportsEmbeddedBitcode())
7426 CmdArgs.push_back("-bitcode_bundle");
7427 else
7428 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7429 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007430
7431 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7432 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7433 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7434 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7435 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7436 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7437 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7438 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7439 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7440 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7441 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7442 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7443 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7444 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7445 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7446 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007447
Daniel Dunbar84384642011-05-02 21:03:47 +00007448 // Give --sysroot= preference, over the Apple specific behavior to also use
7449 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007450 StringRef sysroot = C.getSysRoot();
7451 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007452 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007453 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007454 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7455 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007456 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007457 }
7458
Daniel Dunbarc1964212009-03-26 16:23:12 +00007459 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7460 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7461 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7462 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7463 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007464 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007465 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7466 Args.AddAllArgs(CmdArgs, options::OPT_y);
7467 Args.AddLastArg(CmdArgs, options::OPT_w);
7468 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7469 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7470 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7471 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7472 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7473 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7474 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7475 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7476 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7477 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7478 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7479 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7480}
7481
Douglas Katzman95354292015-06-23 20:42:09 +00007482void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7483 const InputInfo &Output,
7484 const InputInfoList &Inputs,
7485 const ArgList &Args,
7486 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007487 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007488
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007489 // If the number of arguments surpasses the system limits, we will encode the
7490 // input files in a separate file, shortening the command line. To this end,
7491 // build a list of input file names that can be passed via a file with the
7492 // -filelist linker option.
7493 llvm::opt::ArgStringList InputFileList;
7494
Daniel Dunbarc1964212009-03-26 16:23:12 +00007495 // The logic here is derived from gcc's behavior; most of which
7496 // comes from specs (starting with link_command). Consult gcc for
7497 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007498 ArgStringList CmdArgs;
7499
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007500 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7501 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7502 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007503 for (const auto &Arg : Args)
7504 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007505 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007506 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007507 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007508 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007509 return;
7510 }
7511
Daniel Dunbarc1964212009-03-26 16:23:12 +00007512 // I'm not sure why this particular decomposition exists in gcc, but
7513 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007514 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007515
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007516 // It seems that the 'e' option is completely ignored for dynamic executables
7517 // (the default), and with static executables, the last one wins, as expected.
7518 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7519 options::OPT_Z_Flag, options::OPT_u_Group,
7520 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007521
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007522 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7523 // members of static archive libraries which implement Objective-C classes or
7524 // categories.
7525 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7526 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007527
Daniel Dunbarc1964212009-03-26 16:23:12 +00007528 CmdArgs.push_back("-o");
7529 CmdArgs.push_back(Output.getFilename());
7530
Douglas Katzman78b37b02015-11-17 20:28:07 +00007531 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007532 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007533
Peter Collingbournec4122c12015-06-15 21:08:13 +00007534 // SafeStack requires its own runtime libraries
7535 // These libraries should be linked first, to make sure the
7536 // __safestack_init constructor executes before everything else
7537 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7538 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7539 "libclang_rt.safestack_osx.a",
7540 /*AlwaysLink=*/true);
7541 }
7542
Daniel Dunbarc1964212009-03-26 16:23:12 +00007543 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007544
Douglas Gregor9295df02012-05-15 21:00:27 +00007545 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007546 // Build the input file for -filelist (list of linker input files) in case we
7547 // need it later
7548 for (const auto &II : Inputs) {
7549 if (!II.isFilename()) {
7550 // This is a linker input argument.
7551 // We cannot mix input arguments and file names in a -filelist input, thus
7552 // we prematurely stop our list (remaining files shall be passed as
7553 // arguments).
7554 if (InputFileList.size() > 0)
7555 break;
7556
7557 continue;
7558 }
7559
7560 InputFileList.push_back(II.getFilename());
7561 }
7562
Douglas Katzman78b37b02015-11-17 20:28:07 +00007563 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007564 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7565
Douglas Katzman78b37b02015-11-17 20:28:07 +00007566 if (isObjCRuntimeLinked(Args) &&
7567 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007568 // We use arclite library for both ARC and subscripting support.
7569 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7570
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007571 CmdArgs.push_back("-framework");
7572 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007573 // Link libobj.
7574 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007575 }
John McCall31168b02011-06-15 23:02:42 +00007576
Daniel Dunbarc1964212009-03-26 16:23:12 +00007577 if (LinkingOutput) {
7578 CmdArgs.push_back("-arch_multiple");
7579 CmdArgs.push_back("-final_output");
7580 CmdArgs.push_back(LinkingOutput);
7581 }
7582
Daniel Dunbarc1964212009-03-26 16:23:12 +00007583 if (Args.hasArg(options::OPT_fnested_functions))
7584 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007585
Justin Bognerc7701242015-05-12 05:44:36 +00007586 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7587
Douglas Katzman78b37b02015-11-17 20:28:07 +00007588 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007589 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007590 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007591
Daniel Dunbarc1964212009-03-26 16:23:12 +00007592 // link_ssp spec is empty.
7593
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007594 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007595 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007596 }
7597
Douglas Katzman78b37b02015-11-17 20:28:07 +00007598 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007599 // endfile_spec is empty.
7600 }
7601
7602 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7603 Args.AddAllArgs(CmdArgs, options::OPT_F);
7604
Steven Wu3ffb61b2015-02-06 18:08:29 +00007605 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007606 for (const Arg *A : Args.filtered(options::OPT_iframework))
7607 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007608
Douglas Katzman78b37b02015-11-17 20:28:07 +00007609 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007610 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7611 if (A->getValue() == StringRef("Accelerate")) {
7612 CmdArgs.push_back("-framework");
7613 CmdArgs.push_back("Accelerate");
7614 }
7615 }
7616 }
7617
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007618 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007619 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007620 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007621 Cmd->setInputFileList(std::move(InputFileList));
7622 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007623}
7624
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007625void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007626 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007627 const InputInfoList &Inputs,
7628 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007629 const char *LinkingOutput) const {
7630 ArgStringList CmdArgs;
7631
7632 CmdArgs.push_back("-create");
7633 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007634
7635 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007636 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007637
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007638 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007639 assert(II.isFilename() && "Unexpected lipo input.");
7640 CmdArgs.push_back(II.getFilename());
7641 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007642
7643 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007644 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007645}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007646
Daniel Dunbar88299622010-06-04 18:28:36 +00007647void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007648 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007649 const InputInfoList &Inputs,
7650 const ArgList &Args,
7651 const char *LinkingOutput) const {
7652 ArgStringList CmdArgs;
7653
Daniel Dunbareb86b042011-05-09 17:23:16 +00007654 CmdArgs.push_back("-o");
7655 CmdArgs.push_back(Output.getFilename());
7656
Daniel Dunbar88299622010-06-04 18:28:36 +00007657 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7658 const InputInfo &Input = Inputs[0];
7659 assert(Input.isFilename() && "Unexpected dsymutil input.");
7660 CmdArgs.push_back(Input.getFilename());
7661
Daniel Dunbar88299622010-06-04 18:28:36 +00007662 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007663 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007664 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007665}
7666
Eric Christopher551ef452011-08-23 17:56:55 +00007667void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007668 const InputInfo &Output,
7669 const InputInfoList &Inputs,
7670 const ArgList &Args,
7671 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007672 ArgStringList CmdArgs;
7673 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007674 CmdArgs.push_back("--debug-info");
7675 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007676 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007677
7678 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7679 const InputInfo &Input = Inputs[0];
7680 assert(Input.isFilename() && "Unexpected verify input");
7681
7682 // Grabbing the output of the earlier dsymutil run.
7683 CmdArgs.push_back(Input.getFilename());
7684
7685 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007686 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007687 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007688}
7689
Douglas Katzman95354292015-06-23 20:42:09 +00007690void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007691 const InputInfo &Output,
7692 const InputInfoList &Inputs,
7693 const ArgList &Args,
7694 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007695 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007696 ArgStringList CmdArgs;
7697
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007698 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007699
7700 CmdArgs.push_back("-o");
7701 CmdArgs.push_back(Output.getFilename());
7702
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007703 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007704 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007705
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007706 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007707 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007708}
7709
Douglas Katzman95354292015-06-23 20:42:09 +00007710void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7711 const InputInfo &Output,
7712 const InputInfoList &Inputs,
7713 const ArgList &Args,
7714 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007715 ArgStringList CmdArgs;
7716
David Chisnall272a0712012-02-29 15:06:12 +00007717 // Demangle C++ names in errors
7718 CmdArgs.push_back("-C");
7719
Douglas Katzman78b37b02015-11-17 20:28:07 +00007720 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007721 CmdArgs.push_back("-e");
7722 CmdArgs.push_back("_start");
7723 }
7724
7725 if (Args.hasArg(options::OPT_static)) {
7726 CmdArgs.push_back("-Bstatic");
7727 CmdArgs.push_back("-dn");
7728 } else {
7729 CmdArgs.push_back("-Bdynamic");
7730 if (Args.hasArg(options::OPT_shared)) {
7731 CmdArgs.push_back("-shared");
7732 } else {
7733 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007734 CmdArgs.push_back(
7735 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007736 }
7737 }
7738
7739 if (Output.isFilename()) {
7740 CmdArgs.push_back("-o");
7741 CmdArgs.push_back(Output.getFilename());
7742 } else {
7743 assert(Output.isNothing() && "Invalid output.");
7744 }
7745
Douglas Katzman78b37b02015-11-17 20:28:07 +00007746 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007747 if (!Args.hasArg(options::OPT_shared))
7748 CmdArgs.push_back(
7749 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7750
7751 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7752 CmdArgs.push_back(
7753 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7754 CmdArgs.push_back(
7755 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007756 }
7757
Douglas Katzman6059ef92015-11-17 17:41:23 +00007758 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007759
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007760 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7761 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007762
7763 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7764
Douglas Katzman78b37b02015-11-17 20:28:07 +00007765 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007766 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007767 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007768 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007769 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007770 if (!Args.hasArg(options::OPT_shared)) {
7771 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007772 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007773 }
David Chisnallf571cde2012-02-15 13:39:01 +00007774 }
7775
Douglas Katzman78b37b02015-11-17 20:28:07 +00007776 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007777 CmdArgs.push_back(
7778 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007779 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007780 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007781
Xinliang David Li69306c02015-10-22 06:15:31 +00007782 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007783
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007784 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007785 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007786}
7787
Douglas Katzman95354292015-06-23 20:42:09 +00007788void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7789 const InputInfo &Output,
7790 const InputInfoList &Inputs,
7791 const ArgList &Args,
7792 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007793 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007794 ArgStringList CmdArgs;
7795
Rafael Espindolacc126272014-02-28 01:55:21 +00007796 switch (getToolChain().getArch()) {
7797 case llvm::Triple::x86:
7798 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7799 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007800 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007801 break;
7802
7803 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007804 CmdArgs.push_back("-mppc");
7805 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007806 break;
7807
7808 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007809 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007810 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007811 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7812 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7813 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007814 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007815 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007816
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007817 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007818 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007819 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7820 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7821 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007822 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007823 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007824
7825 case llvm::Triple::mips64:
7826 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007827 StringRef CPUName;
7828 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007829 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007830
7831 CmdArgs.push_back("-mabi");
7832 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7833
7834 if (getToolChain().getArch() == llvm::Triple::mips64)
7835 CmdArgs.push_back("-EB");
7836 else
7837 CmdArgs.push_back("-EL");
7838
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007839 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007840 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007841 }
7842
Rafael Espindolacc126272014-02-28 01:55:21 +00007843 default:
7844 break;
7845 }
7846
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007847 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007848
7849 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007850 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007851
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007852 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007853 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007854
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007855 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007856 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007857}
7858
Douglas Katzman95354292015-06-23 20:42:09 +00007859void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7860 const InputInfo &Output,
7861 const InputInfoList &Inputs,
7862 const ArgList &Args,
7863 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007864 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007865 ArgStringList CmdArgs;
7866
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007867 // Silence warning for "clang -g foo.o -o foo"
7868 Args.ClaimAllArgs(options::OPT_g_Group);
7869 // and "clang -emit-llvm foo.o -o foo"
7870 Args.ClaimAllArgs(options::OPT_emit_llvm);
7871 // and for "clang -w foo.o -o foo". Other warning options are already
7872 // handled somewhere else.
7873 Args.ClaimAllArgs(options::OPT_w);
7874
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007875 if (getToolChain().getArch() == llvm::Triple::mips64)
7876 CmdArgs.push_back("-EB");
7877 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7878 CmdArgs.push_back("-EL");
7879
Douglas Katzman78b37b02015-11-17 20:28:07 +00007880 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007881 CmdArgs.push_back("-e");
7882 CmdArgs.push_back("__start");
7883 }
7884
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007885 if (Args.hasArg(options::OPT_static)) {
7886 CmdArgs.push_back("-Bstatic");
7887 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007888 if (Args.hasArg(options::OPT_rdynamic))
7889 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007890 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007891 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007892 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007893 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007894 } else {
7895 CmdArgs.push_back("-dynamic-linker");
7896 CmdArgs.push_back("/usr/libexec/ld.so");
7897 }
7898 }
7899
Rafael Espindola044f7832013-06-05 04:28:55 +00007900 if (Args.hasArg(options::OPT_nopie))
7901 CmdArgs.push_back("-nopie");
7902
Daniel Dunbarb440f562010-08-02 02:38:21 +00007903 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007904 CmdArgs.push_back("-o");
7905 CmdArgs.push_back(Output.getFilename());
7906 } else {
7907 assert(Output.isNothing() && "Invalid output.");
7908 }
7909
Douglas Katzman78b37b02015-11-17 20:28:07 +00007910 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007911 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007912 if (Args.hasArg(options::OPT_pg))
7913 CmdArgs.push_back(
7914 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007915 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007916 CmdArgs.push_back(
7917 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7918 CmdArgs.push_back(
7919 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007920 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007921 CmdArgs.push_back(
7922 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007923 }
7924 }
7925
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007926 std::string Triple = getToolChain().getTripleString();
7927 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007928 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007929 CmdArgs.push_back(
7930 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007931
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007932 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7933 options::OPT_e, options::OPT_s, options::OPT_t,
7934 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007935
Daniel Dunbar54423b22010-09-17 00:24:54 +00007936 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007937
Douglas Katzman78b37b02015-11-17 20:28:07 +00007938 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007939 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007940 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007941 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007942 CmdArgs.push_back("-lm_p");
7943 else
7944 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007945 }
7946
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007947 // FIXME: For some reason GCC passes -lgcc before adding
7948 // the default system libraries. Just mimic this for now.
7949 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007950
Eric Christopher17674ec2012-09-13 06:32:34 +00007951 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007952 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7953 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007954 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007955 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007956 }
7957
Chandler Carruth45661652011-12-17 22:32:42 +00007958 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007959 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007960 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007961 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007962 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007963 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007964
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007965 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007966 }
7967
Douglas Katzman78b37b02015-11-17 20:28:07 +00007968 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007969 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007970 CmdArgs.push_back(
7971 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007972 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007973 CmdArgs.push_back(
7974 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007975 }
7976
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007977 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007978 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007979}
Ed Schoutene33194b2009-04-02 19:13:12 +00007980
Douglas Katzman95354292015-06-23 20:42:09 +00007981void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7982 const InputInfo &Output,
7983 const InputInfoList &Inputs,
7984 const ArgList &Args,
7985 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007986 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007987 ArgStringList CmdArgs;
7988
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007989 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007990
7991 CmdArgs.push_back("-o");
7992 CmdArgs.push_back(Output.getFilename());
7993
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007994 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007995 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007996
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007997 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007998 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007999}
8000
Douglas Katzman95354292015-06-23 20:42:09 +00008001void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8002 const InputInfo &Output,
8003 const InputInfoList &Inputs,
8004 const ArgList &Args,
8005 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008006 const Driver &D = getToolChain().getDriver();
8007 ArgStringList CmdArgs;
8008
Douglas Katzman78b37b02015-11-17 20:28:07 +00008009 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008010 CmdArgs.push_back("-e");
8011 CmdArgs.push_back("__start");
8012 }
8013
8014 if (Args.hasArg(options::OPT_static)) {
8015 CmdArgs.push_back("-Bstatic");
8016 } else {
8017 if (Args.hasArg(options::OPT_rdynamic))
8018 CmdArgs.push_back("-export-dynamic");
8019 CmdArgs.push_back("--eh-frame-hdr");
8020 CmdArgs.push_back("-Bdynamic");
8021 if (Args.hasArg(options::OPT_shared)) {
8022 CmdArgs.push_back("-shared");
8023 } else {
8024 CmdArgs.push_back("-dynamic-linker");
8025 CmdArgs.push_back("/usr/libexec/ld.so");
8026 }
8027 }
8028
8029 if (Output.isFilename()) {
8030 CmdArgs.push_back("-o");
8031 CmdArgs.push_back(Output.getFilename());
8032 } else {
8033 assert(Output.isNothing() && "Invalid output.");
8034 }
8035
Douglas Katzman78b37b02015-11-17 20:28:07 +00008036 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008037 if (!Args.hasArg(options::OPT_shared)) {
8038 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008039 CmdArgs.push_back(
8040 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008041 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008042 CmdArgs.push_back(
8043 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8044 CmdArgs.push_back(
8045 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008046 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008047 CmdArgs.push_back(
8048 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008049 }
8050 }
8051
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008052 Args.AddAllArgs(CmdArgs,
8053 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008054
8055 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8056
Douglas Katzman78b37b02015-11-17 20:28:07 +00008057 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008058 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008059 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8060 if (Args.hasArg(options::OPT_pg))
8061 CmdArgs.push_back("-lm_p");
8062 else
8063 CmdArgs.push_back("-lm");
8064 }
8065
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008066 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008067 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008068 CmdArgs.push_back("-lpthread_p");
8069 else
8070 CmdArgs.push_back("-lpthread");
8071 }
8072
Eli Friedman9fa28852012-08-08 23:57:20 +00008073 if (!Args.hasArg(options::OPT_shared)) {
8074 if (Args.hasArg(options::OPT_pg))
8075 CmdArgs.push_back("-lc_p");
8076 else
8077 CmdArgs.push_back("-lc");
8078 }
8079
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008080 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008081 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008082 case llvm::Triple::arm:
8083 MyArch = "arm";
8084 break;
8085 case llvm::Triple::x86:
8086 MyArch = "i386";
8087 break;
8088 case llvm::Triple::x86_64:
8089 MyArch = "amd64";
8090 break;
8091 default:
8092 llvm_unreachable("Unsupported architecture");
8093 }
8094 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008095 }
8096
Douglas Katzman78b37b02015-11-17 20:28:07 +00008097 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008098 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008099 CmdArgs.push_back(
8100 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008101 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008102 CmdArgs.push_back(
8103 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008104 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008105
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008106 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008107 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008108}
8109
Douglas Katzman95354292015-06-23 20:42:09 +00008110void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8111 const InputInfo &Output,
8112 const InputInfoList &Inputs,
8113 const ArgList &Args,
8114 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008115 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008116 ArgStringList CmdArgs;
8117
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008118 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8119 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008120 switch (getToolChain().getArch()) {
8121 default:
8122 break;
8123 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008124 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008125 break;
8126 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008127 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008128 break;
8129 case llvm::Triple::mips:
8130 case llvm::Triple::mipsel:
8131 case llvm::Triple::mips64:
8132 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008133 StringRef CPUName;
8134 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008135 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008136
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008137 CmdArgs.push_back("-march");
8138 CmdArgs.push_back(CPUName.data());
8139
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008140 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008141 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008142
8143 if (getToolChain().getArch() == llvm::Triple::mips ||
8144 getToolChain().getArch() == llvm::Triple::mips64)
8145 CmdArgs.push_back("-EB");
8146 else
8147 CmdArgs.push_back("-EL");
8148
Dimitry Andric46f338c2015-12-27 10:36:44 +00008149 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8150 StringRef v = A->getValue();
8151 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8152 A->claim();
8153 }
8154
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008155 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008156 break;
8157 }
8158 case llvm::Triple::arm:
8159 case llvm::Triple::armeb:
8160 case llvm::Triple::thumb:
8161 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008162 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008163
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008164 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008165 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008166 else
Renato Golinf4421f72014-02-19 10:44:07 +00008167 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008168
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008169 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008170 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008171 case llvm::Triple::GNUEABI:
8172 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008173 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008174 break;
8175
8176 default:
8177 CmdArgs.push_back("-matpcs");
8178 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008179 break;
8180 }
8181 case llvm::Triple::sparc:
8182 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008183 case llvm::Triple::sparcv9: {
8184 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8185 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008186 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008187 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008188 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008189 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008190
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008191 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008192
8193 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008194 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008195
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008196 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008197 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008198
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008199 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008200 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008201}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008202
Douglas Katzman95354292015-06-23 20:42:09 +00008203void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8204 const InputInfo &Output,
8205 const InputInfoList &Inputs,
8206 const ArgList &Args,
8207 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008208 const toolchains::FreeBSD &ToolChain =
8209 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008210 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008211 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008212 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008213 !Args.hasArg(options::OPT_shared) &&
8214 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008215 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008216
8217 // Silence warning for "clang -g foo.o -o foo"
8218 Args.ClaimAllArgs(options::OPT_g_Group);
8219 // and "clang -emit-llvm foo.o -o foo"
8220 Args.ClaimAllArgs(options::OPT_emit_llvm);
8221 // and for "clang -w foo.o -o foo". Other warning options are already
8222 // handled somewhere else.
8223 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008224
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008225 if (!D.SysRoot.empty())
8226 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8227
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008228 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008229 CmdArgs.push_back("-pie");
8230
Ed Maste1bc232d2016-04-12 21:11:46 +00008231 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008232 if (Args.hasArg(options::OPT_static)) {
8233 CmdArgs.push_back("-Bstatic");
8234 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008235 if (Args.hasArg(options::OPT_rdynamic))
8236 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008237 if (Args.hasArg(options::OPT_shared)) {
8238 CmdArgs.push_back("-Bshareable");
8239 } else {
8240 CmdArgs.push_back("-dynamic-linker");
8241 CmdArgs.push_back("/libexec/ld-elf.so.1");
8242 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008243 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008244 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8245 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8246 CmdArgs.push_back("--hash-style=both");
8247 }
8248 }
8249 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008250 }
8251
8252 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8253 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008254 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008255 CmdArgs.push_back("-m");
8256 CmdArgs.push_back("elf_i386_fbsd");
8257 }
8258
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008259 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008260 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008261 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008262 }
8263
Dimitry Andric904895f2015-12-27 06:47:09 +00008264 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8265 if (ToolChain.getArch() == llvm::Triple::mips ||
8266 ToolChain.getArch() == llvm::Triple::mipsel ||
8267 ToolChain.getArch() == llvm::Triple::mips64 ||
8268 ToolChain.getArch() == llvm::Triple::mips64el) {
8269 StringRef v = A->getValue();
8270 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8271 A->claim();
8272 }
8273 }
8274
Daniel Dunbarb440f562010-08-02 02:38:21 +00008275 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008276 CmdArgs.push_back("-o");
8277 CmdArgs.push_back(Output.getFilename());
8278 } else {
8279 assert(Output.isNothing() && "Invalid output.");
8280 }
8281
Douglas Katzman78b37b02015-11-17 20:28:07 +00008282 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008283 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008284 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008285 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008286 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008287 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008288 crt1 = "Scrt1.o";
8289 else
8290 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008291 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008292 if (crt1)
8293 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8294
8295 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8296
Craig Topper92fc2df2014-05-17 16:56:41 +00008297 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008298 if (Args.hasArg(options::OPT_static))
8299 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008300 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008301 crtbegin = "crtbeginS.o";
8302 else
8303 crtbegin = "crtbegin.o";
8304
8305 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008306 }
8307
8308 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008309 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008310 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8311 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008312 Args.AddAllArgs(CmdArgs, options::OPT_s);
8313 Args.AddAllArgs(CmdArgs, options::OPT_t);
8314 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8315 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008316
Teresa Johnson945bc502015-10-15 20:35:53 +00008317 if (D.isUsingLTO())
8318 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008319
Alexey Samsonov52550342014-09-15 19:58:40 +00008320 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008321 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008322
Douglas Katzman78b37b02015-11-17 20:28:07 +00008323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008324 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008325 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008326 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008327 if (Args.hasArg(options::OPT_pg))
8328 CmdArgs.push_back("-lm_p");
8329 else
8330 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008331 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008332 if (NeedsSanitizerDeps)
8333 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008334 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8335 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008336 if (Args.hasArg(options::OPT_pg))
8337 CmdArgs.push_back("-lgcc_p");
8338 else
8339 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008340 if (Args.hasArg(options::OPT_static)) {
8341 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008342 } else if (Args.hasArg(options::OPT_pg)) {
8343 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008344 } else {
8345 CmdArgs.push_back("--as-needed");
8346 CmdArgs.push_back("-lgcc_s");
8347 CmdArgs.push_back("--no-as-needed");
8348 }
8349
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008350 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008351 if (Args.hasArg(options::OPT_pg))
8352 CmdArgs.push_back("-lpthread_p");
8353 else
8354 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008355 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008356
Roman Divacky66f22762011-02-10 16:59:40 +00008357 if (Args.hasArg(options::OPT_pg)) {
8358 if (Args.hasArg(options::OPT_shared))
8359 CmdArgs.push_back("-lc");
8360 else
8361 CmdArgs.push_back("-lc_p");
8362 CmdArgs.push_back("-lgcc_p");
8363 } else {
8364 CmdArgs.push_back("-lc");
8365 CmdArgs.push_back("-lgcc");
8366 }
8367
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008368 if (Args.hasArg(options::OPT_static)) {
8369 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008370 } else if (Args.hasArg(options::OPT_pg)) {
8371 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008372 } else {
8373 CmdArgs.push_back("--as-needed");
8374 CmdArgs.push_back("-lgcc_s");
8375 CmdArgs.push_back("--no-as-needed");
8376 }
8377 }
8378
Douglas Katzman78b37b02015-11-17 20:28:07 +00008379 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008380 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008381 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008382 else
8383 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008384 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008385 }
8386
Xinliang David Li69306c02015-10-22 06:15:31 +00008387 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008388
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008389 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008390 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008391}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008392
Douglas Katzman95354292015-06-23 20:42:09 +00008393void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008394 const InputInfo &Output,
8395 const InputInfoList &Inputs,
8396 const ArgList &Args,
8397 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008398 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008399 ArgStringList CmdArgs;
8400
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008401 // GNU as needs different flags for creating the correct output format
8402 // on architectures with different ABIs or optional feature sets.
8403 switch (getToolChain().getArch()) {
8404 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008405 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008406 break;
8407 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008408 case llvm::Triple::armeb:
8409 case llvm::Triple::thumb:
8410 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008411 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008412 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8413 std::string Arch =
8414 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008415 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008416 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008417 }
8418
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008419 case llvm::Triple::mips:
8420 case llvm::Triple::mipsel:
8421 case llvm::Triple::mips64:
8422 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008423 StringRef CPUName;
8424 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008425 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008426
8427 CmdArgs.push_back("-march");
8428 CmdArgs.push_back(CPUName.data());
8429
8430 CmdArgs.push_back("-mabi");
8431 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8432
8433 if (getToolChain().getArch() == llvm::Triple::mips ||
8434 getToolChain().getArch() == llvm::Triple::mips64)
8435 CmdArgs.push_back("-EB");
8436 else
8437 CmdArgs.push_back("-EL");
8438
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008439 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008440 break;
8441 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008442
8443 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008444 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008445 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008446 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8447 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008448 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008449 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008450 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008451
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008452 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008453 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008454 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8455 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008456 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008457 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008458 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008459
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008460 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008461 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008462 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008463
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008464 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008465
8466 CmdArgs.push_back("-o");
8467 CmdArgs.push_back(Output.getFilename());
8468
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008469 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008470 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008471
David Chisnallddbd68f2011-09-27 22:03:18 +00008472 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008473 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008474}
8475
Douglas Katzman95354292015-06-23 20:42:09 +00008476void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8477 const InputInfo &Output,
8478 const InputInfoList &Inputs,
8479 const ArgList &Args,
8480 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008481 const Driver &D = getToolChain().getDriver();
8482 ArgStringList CmdArgs;
8483
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008484 if (!D.SysRoot.empty())
8485 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8486
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008487 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008488 if (Args.hasArg(options::OPT_static)) {
8489 CmdArgs.push_back("-Bstatic");
8490 } else {
8491 if (Args.hasArg(options::OPT_rdynamic))
8492 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008493 if (Args.hasArg(options::OPT_shared)) {
8494 CmdArgs.push_back("-Bshareable");
8495 } else {
8496 CmdArgs.push_back("-dynamic-linker");
8497 CmdArgs.push_back("/libexec/ld.elf_so");
8498 }
8499 }
8500
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008501 // Many NetBSD architectures support more than one ABI.
8502 // Determine the correct emulation for ld.
8503 switch (getToolChain().getArch()) {
8504 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008505 CmdArgs.push_back("-m");
8506 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008507 break;
8508 case llvm::Triple::arm:
8509 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008510 CmdArgs.push_back("-m");
8511 switch (getToolChain().getTriple().getEnvironment()) {
8512 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008513 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008514 CmdArgs.push_back("armelf_nbsd_eabi");
8515 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008516 case llvm::Triple::EABIHF:
8517 case llvm::Triple::GNUEABIHF:
8518 CmdArgs.push_back("armelf_nbsd_eabihf");
8519 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008520 default:
8521 CmdArgs.push_back("armelf_nbsd");
8522 break;
8523 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008524 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008525 case llvm::Triple::armeb:
8526 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008527 arm::appendEBLinkFlags(
8528 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008529 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008530 CmdArgs.push_back("-m");
8531 switch (getToolChain().getTriple().getEnvironment()) {
8532 case llvm::Triple::EABI:
8533 case llvm::Triple::GNUEABI:
8534 CmdArgs.push_back("armelfb_nbsd_eabi");
8535 break;
8536 case llvm::Triple::EABIHF:
8537 case llvm::Triple::GNUEABIHF:
8538 CmdArgs.push_back("armelfb_nbsd_eabihf");
8539 break;
8540 default:
8541 CmdArgs.push_back("armelfb_nbsd");
8542 break;
8543 }
8544 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008545 case llvm::Triple::mips64:
8546 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008547 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008548 CmdArgs.push_back("-m");
8549 if (getToolChain().getArch() == llvm::Triple::mips64)
8550 CmdArgs.push_back("elf32btsmip");
8551 else
8552 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008553 } else if (mips::hasMipsAbiArg(Args, "64")) {
8554 CmdArgs.push_back("-m");
8555 if (getToolChain().getArch() == llvm::Triple::mips64)
8556 CmdArgs.push_back("elf64btsmip");
8557 else
8558 CmdArgs.push_back("elf64ltsmip");
8559 }
8560 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008561 case llvm::Triple::ppc:
8562 CmdArgs.push_back("-m");
8563 CmdArgs.push_back("elf32ppc_nbsd");
8564 break;
8565
8566 case llvm::Triple::ppc64:
8567 case llvm::Triple::ppc64le:
8568 CmdArgs.push_back("-m");
8569 CmdArgs.push_back("elf64ppc");
8570 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008571
8572 case llvm::Triple::sparc:
8573 CmdArgs.push_back("-m");
8574 CmdArgs.push_back("elf32_sparc");
8575 break;
8576
8577 case llvm::Triple::sparcv9:
8578 CmdArgs.push_back("-m");
8579 CmdArgs.push_back("elf64_sparc");
8580 break;
8581
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008582 default:
8583 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008584 }
8585
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008586 if (Output.isFilename()) {
8587 CmdArgs.push_back("-o");
8588 CmdArgs.push_back(Output.getFilename());
8589 } else {
8590 assert(Output.isNothing() && "Invalid output.");
8591 }
8592
Douglas Katzman78b37b02015-11-17 20:28:07 +00008593 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008594 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008595 CmdArgs.push_back(
8596 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8597 CmdArgs.push_back(
8598 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8599 CmdArgs.push_back(
8600 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008601 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008602 CmdArgs.push_back(
8603 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8604 CmdArgs.push_back(
8605 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008606 }
8607 }
8608
8609 Args.AddAllArgs(CmdArgs, options::OPT_L);
8610 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8611 Args.AddAllArgs(CmdArgs, options::OPT_e);
8612 Args.AddAllArgs(CmdArgs, options::OPT_s);
8613 Args.AddAllArgs(CmdArgs, options::OPT_t);
8614 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8615 Args.AddAllArgs(CmdArgs, options::OPT_r);
8616
8617 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8618
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008619 unsigned Major, Minor, Micro;
8620 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8621 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008622 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008623 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008624 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008625 case llvm::Triple::arm:
8626 case llvm::Triple::armeb:
8627 case llvm::Triple::thumb:
8628 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008629 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008630 case llvm::Triple::ppc64:
8631 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008632 case llvm::Triple::sparc:
8633 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008634 case llvm::Triple::x86:
8635 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008636 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008637 break;
8638 default:
8639 break;
8640 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008641 }
8642
Douglas Katzman78b37b02015-11-17 20:28:07 +00008643 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008644 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008645 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008646 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8647 CmdArgs.push_back("-lm");
8648 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008649 if (Args.hasArg(options::OPT_pthread))
8650 CmdArgs.push_back("-lpthread");
8651 CmdArgs.push_back("-lc");
8652
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008653 if (useLibgcc) {
8654 if (Args.hasArg(options::OPT_static)) {
8655 // libgcc_eh depends on libc, so resolve as much as possible,
8656 // pull in any new requirements from libc and then get the rest
8657 // of libgcc.
8658 CmdArgs.push_back("-lgcc_eh");
8659 CmdArgs.push_back("-lc");
8660 CmdArgs.push_back("-lgcc");
8661 } else {
8662 CmdArgs.push_back("-lgcc");
8663 CmdArgs.push_back("--as-needed");
8664 CmdArgs.push_back("-lgcc_s");
8665 CmdArgs.push_back("--no-as-needed");
8666 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008667 }
8668 }
8669
Douglas Katzman78b37b02015-11-17 20:28:07 +00008670 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008671 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008672 CmdArgs.push_back(
8673 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008674 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008675 CmdArgs.push_back(
8676 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8677 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008678 }
8679
Xinliang David Li69306c02015-10-22 06:15:31 +00008680 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008681
Logan Chieneb9162f2014-06-26 14:23:45 +00008682 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008683 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008684}
8685
Douglas Katzman95354292015-06-23 20:42:09 +00008686void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8687 const InputInfo &Output,
8688 const InputInfoList &Inputs,
8689 const ArgList &Args,
8690 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008691 claimNoWarnArgs(Args);
8692
James Y Knight2db38f32015-08-15 03:45:25 +00008693 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8694 llvm::Triple Triple = llvm::Triple(TripleStr);
8695
Rafael Espindola92b00932010-08-10 00:25:48 +00008696 ArgStringList CmdArgs;
8697
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008698 llvm::Reloc::Model RelocationModel;
8699 unsigned PICLevel;
8700 bool IsPIE;
8701 std::tie(RelocationModel, PICLevel, IsPIE) =
8702 ParsePICArgs(getToolChain(), Triple, Args);
8703
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008704 switch (getToolChain().getArch()) {
8705 default:
8706 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008707 // Add --32/--64 to make sure we get the format we want.
8708 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008709 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008710 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008711 break;
8712 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008713 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8714 CmdArgs.push_back("--x32");
8715 else
8716 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008717 break;
8718 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008719 CmdArgs.push_back("-a32");
8720 CmdArgs.push_back("-mppc");
8721 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008722 break;
8723 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008724 CmdArgs.push_back("-a64");
8725 CmdArgs.push_back("-mppc64");
8726 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008727 break;
8728 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008729 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008730 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008731 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008732 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008733 break;
8734 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008735 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008736 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008737 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8738 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8739 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008740 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008741 }
8742 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008743 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008744 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8745 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8746 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008747 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008748 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008749 case llvm::Triple::arm:
8750 case llvm::Triple::armeb:
8751 case llvm::Triple::thumb:
8752 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008753 const llvm::Triple &Triple2 = getToolChain().getTriple();
8754 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008755 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008756 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008757 break;
8758 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008759 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008760 break;
8761 default:
8762 break;
8763 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008764
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008765 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008766 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8767 case arm::FloatABI::Soft:
8768 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8769 break;
8770 case arm::FloatABI::SoftFP:
8771 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8772 break;
8773 case arm::FloatABI::Hard:
8774 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8775 break;
8776 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008777
8778 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008779
8780 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008781 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008782 // march from being picked in the absence of a cpu flag.
8783 Arg *A;
8784 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008785 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008786 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008787 else
8788 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008789 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008790 break;
8791 }
8792 case llvm::Triple::mips:
8793 case llvm::Triple::mipsel:
8794 case llvm::Triple::mips64:
8795 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008796 StringRef CPUName;
8797 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008798 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008799 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008800
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008801 CmdArgs.push_back("-march");
8802 CmdArgs.push_back(CPUName.data());
8803
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008804 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008805 CmdArgs.push_back(ABIName.data());
8806
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008807 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8808 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008809 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008810 CmdArgs.push_back("-mno-shared");
8811
Daniel Sanders379d44b2014-07-16 11:52:23 +00008812 // LLVM doesn't support -mplt yet and acts as if it is always given.
8813 // However, -mplt has no effect with the N64 ABI.
8814 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008815
8816 if (getToolChain().getArch() == llvm::Triple::mips ||
8817 getToolChain().getArch() == llvm::Triple::mips64)
8818 CmdArgs.push_back("-EB");
8819 else
8820 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008821
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008822 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8823 if (StringRef(A->getValue()) == "2008")
8824 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8825 }
8826
Daniel Sanders379d44b2014-07-16 11:52:23 +00008827 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8828 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8829 options::OPT_mfp64)) {
8830 A->claim();
8831 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008832 } else if (mips::shouldUseFPXX(
8833 Args, getToolChain().getTriple(), CPUName, ABIName,
8834 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008835 CmdArgs.push_back("-mfpxx");
8836
8837 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8838 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008839 if (Arg *A =
8840 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008841 if (A->getOption().matches(options::OPT_mips16)) {
8842 A->claim();
8843 A->render(Args, CmdArgs);
8844 } else {
8845 A->claim();
8846 CmdArgs.push_back("-no-mips16");
8847 }
8848 }
8849
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008850 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8851 options::OPT_mno_micromips);
8852 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8853 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8854
Simon Atanasyanbd986632013-11-26 11:58:04 +00008855 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8856 // Do not use AddLastArg because not all versions of MIPS assembler
8857 // support -mmsa / -mno-msa options.
8858 if (A->getOption().matches(options::OPT_mmsa))
8859 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8860 }
8861
Daniel Sanders379d44b2014-07-16 11:52:23 +00008862 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8863 options::OPT_msoft_float);
8864
Toma Tabacub36d6102015-06-11 12:13:18 +00008865 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8866 options::OPT_msingle_float);
8867
Daniel Sanders379d44b2014-07-16 11:52:23 +00008868 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8869 options::OPT_mno_odd_spreg);
8870
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008871 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008872 break;
8873 }
8874 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008875 // Always pass an -march option, since our default of z10 is later
8876 // than the GNU assembler's default.
8877 StringRef CPUName = getSystemZTargetCPU(Args);
8878 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008879 break;
8880 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008881 }
8882
Renato Golina74bbc72015-07-22 15:32:36 +00008883 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008884 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008885
8886 CmdArgs.push_back("-o");
8887 CmdArgs.push_back(Output.getFilename());
8888
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008889 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008890 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008891
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008892 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008893 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008894
8895 // Handle the debug info splitting at object creation time if we're
8896 // creating an object.
8897 // TODO: Currently only works on linux with newer objcopy.
8898 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008899 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008900 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008901 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008902}
8903
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008904static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008905 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008906 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008907 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008908 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8909 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008910 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008911 CmdArgs.push_back("-lgcc");
8912
Logan Chien3d3373c2012-11-19 12:04:11 +00008913 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008914 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008915 CmdArgs.push_back("-lgcc");
8916 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008917 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008918 CmdArgs.push_back("--as-needed");
8919 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008920 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008921 CmdArgs.push_back("--no-as-needed");
8922 }
8923
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008924 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008925 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008926 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008927 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008928
8929 // According to Android ABI, we have to link with libdl if we are
8930 // linking with non-static libgcc.
8931 //
8932 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8933 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8934 if (isAndroid && !StaticLibgcc)
8935 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008936}
8937
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008938static std::string getLinuxDynamicLinker(const ArgList &Args,
8939 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008940 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8941
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008942 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008943 if (ToolChain.getTriple().isArch64Bit())
8944 return "/system/bin/linker64";
8945 else
8946 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008947 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8948 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008949 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008950 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008951 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008952 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008953 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008954 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008955 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008956 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008957 return "/lib/ld-linux-armhf.so.3";
8958 else
8959 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008960 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8961 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008962 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008963 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008964 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008965 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008966 return "/lib/ld-linux.so.3";
8967 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8968 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008969 std::string LibDir =
8970 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008971 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008972 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008973 if (mips::isUCLibc(Args))
8974 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008975 else if (!ToolChain.getTriple().hasEnvironment()) {
8976 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8977 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8978 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8979 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008980 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008981
8982 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008983 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008984 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008985 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008986 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8987 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008988 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008989 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008990 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8991 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008992 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008993 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008994 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008995 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008996 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008997 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008998 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8999 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00009000 else
9001 return "/lib64/ld-linux-x86-64.so.2";
9002}
9003
Renato Golinc4b49242014-02-13 10:01:16 +00009004static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00009005 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009006 // Make use of compiler-rt if --rtlib option is used
9007 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9008
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009009 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009010 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009011 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009012 default:
9013 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009014 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009015 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009016 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009017 break;
9018 }
Renato Golinc4b49242014-02-13 10:01:16 +00009019 break;
9020 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009021 // Make sure libgcc is not used under MSVC environment by default
9022 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9023 // Issue error diagnostic if libgcc is explicitly specified
9024 // through command line as --rtlib option argument.
9025 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9026 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9027 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9028 }
9029 } else
9030 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009031 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009032 }
9033}
9034
Rafael Espindola1e085772014-08-15 17:14:35 +00009035static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9036 switch (T.getArch()) {
9037 case llvm::Triple::x86:
9038 return "elf_i386";
9039 case llvm::Triple::aarch64:
9040 return "aarch64linux";
9041 case llvm::Triple::aarch64_be:
9042 return "aarch64_be_linux";
9043 case llvm::Triple::arm:
9044 case llvm::Triple::thumb:
9045 return "armelf_linux_eabi";
9046 case llvm::Triple::armeb:
9047 case llvm::Triple::thumbeb:
9048 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9049 case llvm::Triple::ppc:
9050 return "elf32ppclinux";
9051 case llvm::Triple::ppc64:
9052 return "elf64ppc";
9053 case llvm::Triple::ppc64le:
9054 return "elf64lppc";
9055 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009056 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009057 return "elf32_sparc";
9058 case llvm::Triple::sparcv9:
9059 return "elf64_sparc";
9060 case llvm::Triple::mips:
9061 return "elf32btsmip";
9062 case llvm::Triple::mipsel:
9063 return "elf32ltsmip";
9064 case llvm::Triple::mips64:
9065 if (mips::hasMipsAbiArg(Args, "n32"))
9066 return "elf32btsmipn32";
9067 return "elf64btsmip";
9068 case llvm::Triple::mips64el:
9069 if (mips::hasMipsAbiArg(Args, "n32"))
9070 return "elf32ltsmipn32";
9071 return "elf64ltsmip";
9072 case llvm::Triple::systemz:
9073 return "elf64_s390";
9074 case llvm::Triple::x86_64:
9075 if (T.getEnvironment() == llvm::Triple::GNUX32)
9076 return "elf32_x86_64";
9077 return "elf_x86_64";
9078 default:
9079 llvm_unreachable("Unexpected arch");
9080 }
9081}
9082
Douglas Katzman95354292015-06-23 20:42:09 +00009083void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9084 const InputInfo &Output,
9085 const InputInfoList &Inputs,
9086 const ArgList &Args,
9087 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009088 const toolchains::Linux &ToolChain =
9089 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009090 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009091
9092 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9093 llvm::Triple Triple = llvm::Triple(TripleStr);
9094
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009095 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009096 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009097 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009098 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9099 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009100 const bool HasCRTBeginEndFiles =
9101 ToolChain.getTriple().hasEnvironment() ||
9102 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009103
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009104 ArgStringList CmdArgs;
9105
Rafael Espindolad1002f62010-11-15 18:28:16 +00009106 // Silence warning for "clang -g foo.o -o foo"
9107 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009108 // and "clang -emit-llvm foo.o -o foo"
9109 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009110 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009111 // handled somewhere else.
9112 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009113
Peter Collingbourne39719a72015-11-20 20:49:39 +00009114 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9115 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009116 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009117 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009118 CmdArgs.push_back("-target");
9119 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9120 }
9121
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009122 if (!D.SysRoot.empty())
9123 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009124
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009125 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009126 CmdArgs.push_back("-pie");
9127
Rafael Espindola1c76c592010-11-07 22:57:16 +00009128 if (Args.hasArg(options::OPT_rdynamic))
9129 CmdArgs.push_back("-export-dynamic");
9130
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009131 if (Args.hasArg(options::OPT_s))
9132 CmdArgs.push_back("-s");
9133
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009134 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009135 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009136
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009137 for (const auto &Opt : ToolChain.ExtraOpts)
9138 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009139
9140 if (!Args.hasArg(options::OPT_static)) {
9141 CmdArgs.push_back("--eh-frame-hdr");
9142 }
9143
9144 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009145 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009146
9147 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009148 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9149 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009150 CmdArgs.push_back("-Bstatic");
9151 else
9152 CmdArgs.push_back("-static");
9153 } else if (Args.hasArg(options::OPT_shared)) {
9154 CmdArgs.push_back("-shared");
9155 }
9156
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009157 if (!Args.hasArg(options::OPT_static)) {
9158 if (Args.hasArg(options::OPT_rdynamic))
9159 CmdArgs.push_back("-export-dynamic");
9160
9161 if (!Args.hasArg(options::OPT_shared)) {
9162 const std::string Loader =
9163 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9164 CmdArgs.push_back("-dynamic-linker");
9165 CmdArgs.push_back(Args.MakeArgString(Loader));
9166 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009167 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009168
9169 CmdArgs.push_back("-o");
9170 CmdArgs.push_back(Output.getFilename());
9171
Douglas Katzman78b37b02015-11-17 20:28:07 +00009172 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009173 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009174 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009175 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009176 if (Args.hasArg(options::OPT_pg))
9177 crt1 = "gcrt1.o";
9178 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009179 crt1 = "Scrt1.o";
9180 else
9181 crt1 = "crt1.o";
9182 }
9183 if (crt1)
9184 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009185
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009186 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9187 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009188
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009189 const char *crtbegin;
9190 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009191 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009192 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009193 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009194 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009195 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009196 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009197 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009198
9199 if (HasCRTBeginEndFiles)
9200 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009201
9202 // Add crtfastmath.o if available and fast math is enabled.
9203 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009204 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009205
9206 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009207 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009208
Douglas Katzman6059ef92015-11-17 17:41:23 +00009209 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009210
Teresa Johnson945bc502015-10-15 20:35:53 +00009211 if (D.isUsingLTO())
9212 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009213
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009214 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9215 CmdArgs.push_back("--no-demangle");
9216
Alexey Samsonov52550342014-09-15 19:58:40 +00009217 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009218 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009219 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009220 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009221
Douglas Katzman78b37b02015-11-17 20:28:07 +00009222 if (D.CCCIsCXX() &&
9223 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009224 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009225 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009226 if (OnlyLibstdcxxStatic)
9227 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009228 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009229 if (OnlyLibstdcxxStatic)
9230 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009231 CmdArgs.push_back("-lm");
9232 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009233 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9234 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009235
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009236 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009237 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9238 if (Args.hasArg(options::OPT_static))
9239 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009240
Alexey Samsonov52550342014-09-15 19:58:40 +00009241 if (NeedsSanitizerDeps)
9242 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9243
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009244 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9245 Args.hasArg(options::OPT_pthreads);
9246
9247 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9248 options::OPT_fno_openmp, false)) {
9249 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9250 // FIXME: Does this really make sense for all GNU toolchains?
9251 WantPthread = true;
9252
9253 // Also link the particular OpenMP runtimes.
9254 switch (getOpenMPRuntime(ToolChain, Args)) {
9255 case OMPRT_OMP:
9256 CmdArgs.push_back("-lomp");
9257 break;
9258 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009259 CmdArgs.push_back("-lgomp");
9260
9261 // FIXME: Exclude this for platforms with libgomp that don't require
9262 // librt. Most modern Linux platforms require it, but some may not.
9263 CmdArgs.push_back("-lrt");
9264 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009265 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009266 CmdArgs.push_back("-liomp5");
9267 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009268 case OMPRT_Unknown:
9269 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009270 break;
9271 }
Chandler Carruth01538002013-01-17 13:19:29 +00009272 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009273
Renato Golinc4b49242014-02-13 10:01:16 +00009274 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009275
Richard Smith31d1de22015-05-20 22:48:44 +00009276 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009277 CmdArgs.push_back("-lpthread");
9278
Rafael Espindolab17bc532016-01-25 18:29:16 +00009279 if (Args.hasArg(options::OPT_fsplit_stack))
9280 CmdArgs.push_back("--wrap=pthread_create");
9281
Chandler Carruth94a32012012-05-14 18:31:18 +00009282 CmdArgs.push_back("-lc");
9283
9284 if (Args.hasArg(options::OPT_static))
9285 CmdArgs.push_back("--end-group");
9286 else
Renato Golinc4b49242014-02-13 10:01:16 +00009287 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009288 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009289
Rafael Espindola81937ec2010-12-01 01:52:43 +00009290 if (!Args.hasArg(options::OPT_nostartfiles)) {
9291 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009292 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009293 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009294 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009295 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009296 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009297 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009298
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009299 if (HasCRTBeginEndFiles)
9300 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009301 if (!isAndroid)
9302 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009303 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009304 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009305
Peter Collingbourne39719a72015-11-20 20:49:39 +00009306 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009307}
9308
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009309// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9310// for the various SFI requirements like register masking. The assembly tool
9311// inserts the file containing the macros as an input into all the assembly
9312// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009313void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9314 const InputInfo &Output,
9315 const InputInfoList &Inputs,
9316 const ArgList &Args,
9317 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009318 const toolchains::NaClToolChain &ToolChain =
9319 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009320 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009321 "nacl-arm-macros.s");
9322 InputInfoList NewInputs;
9323 NewInputs.push_back(NaClMacros);
9324 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009325 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9326 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009327}
9328
Douglas Katzman750cfc52015-06-29 18:42:16 +00009329// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009330// we use static by default, do not yet support sanitizers or LTO, and a few
9331// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009332// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009333void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9334 const InputInfo &Output,
9335 const InputInfoList &Inputs,
9336 const ArgList &Args,
9337 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009338
Douglas Katzman54366072015-07-27 16:53:08 +00009339 const toolchains::NaClToolChain &ToolChain =
9340 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009341 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009342 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009343 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009344 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009345
9346 ArgStringList CmdArgs;
9347
9348 // Silence warning for "clang -g foo.o -o foo"
9349 Args.ClaimAllArgs(options::OPT_g_Group);
9350 // and "clang -emit-llvm foo.o -o foo"
9351 Args.ClaimAllArgs(options::OPT_emit_llvm);
9352 // and for "clang -w foo.o -o foo". Other warning options are already
9353 // handled somewhere else.
9354 Args.ClaimAllArgs(options::OPT_w);
9355
9356 if (!D.SysRoot.empty())
9357 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9358
9359 if (Args.hasArg(options::OPT_rdynamic))
9360 CmdArgs.push_back("-export-dynamic");
9361
9362 if (Args.hasArg(options::OPT_s))
9363 CmdArgs.push_back("-s");
9364
Douglas Katzman54366072015-07-27 16:53:08 +00009365 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9366 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009367 CmdArgs.push_back("--build-id");
9368
9369 if (!IsStatic)
9370 CmdArgs.push_back("--eh-frame-hdr");
9371
9372 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009373 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009374 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009375 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009376 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009377 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009378 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009379 else if (Arch == llvm::Triple::mipsel)
9380 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009381 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009382 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9383 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009384
9385 if (IsStatic)
9386 CmdArgs.push_back("-static");
9387 else if (Args.hasArg(options::OPT_shared))
9388 CmdArgs.push_back("-shared");
9389
9390 CmdArgs.push_back("-o");
9391 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009392 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009393 if (!Args.hasArg(options::OPT_shared))
9394 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9395 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9396
9397 const char *crtbegin;
9398 if (IsStatic)
9399 crtbegin = "crtbeginT.o";
9400 else if (Args.hasArg(options::OPT_shared))
9401 crtbegin = "crtbeginS.o";
9402 else
9403 crtbegin = "crtbegin.o";
9404 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9405 }
9406
9407 Args.AddAllArgs(CmdArgs, options::OPT_L);
9408 Args.AddAllArgs(CmdArgs, options::OPT_u);
9409
Douglas Katzman6059ef92015-11-17 17:41:23 +00009410 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009411
9412 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9413 CmdArgs.push_back("--no-demangle");
9414
9415 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9416
Douglas Katzman78b37b02015-11-17 20:28:07 +00009417 if (D.CCCIsCXX() &&
9418 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009419 bool OnlyLibstdcxxStatic =
9420 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009421 if (OnlyLibstdcxxStatic)
9422 CmdArgs.push_back("-Bstatic");
9423 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9424 if (OnlyLibstdcxxStatic)
9425 CmdArgs.push_back("-Bdynamic");
9426 CmdArgs.push_back("-lm");
9427 }
9428
9429 if (!Args.hasArg(options::OPT_nostdlib)) {
9430 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9431 // Always use groups, since it has no effect on dynamic libraries.
9432 CmdArgs.push_back("--start-group");
9433 CmdArgs.push_back("-lc");
9434 // NaCl's libc++ currently requires libpthread, so just always include it
9435 // in the group for C++.
9436 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009437 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009438 // Gold, used by Mips, handles nested groups differently than ld, and
9439 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9440 // which is not a desired behaviour here.
9441 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9442 if (getToolChain().getArch() == llvm::Triple::mipsel)
9443 CmdArgs.push_back("-lnacl");
9444
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009445 CmdArgs.push_back("-lpthread");
9446 }
9447
9448 CmdArgs.push_back("-lgcc");
9449 CmdArgs.push_back("--as-needed");
9450 if (IsStatic)
9451 CmdArgs.push_back("-lgcc_eh");
9452 else
9453 CmdArgs.push_back("-lgcc_s");
9454 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009455
9456 // Mips needs to create and use pnacl_legacy library that contains
9457 // definitions from bitcode/pnaclmm.c and definitions for
9458 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9459 if (getToolChain().getArch() == llvm::Triple::mipsel)
9460 CmdArgs.push_back("-lpnacl_legacy");
9461
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009462 CmdArgs.push_back("--end-group");
9463 }
9464
9465 if (!Args.hasArg(options::OPT_nostartfiles)) {
9466 const char *crtend;
9467 if (Args.hasArg(options::OPT_shared))
9468 crtend = "crtendS.o";
9469 else
9470 crtend = "crtend.o";
9471
9472 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9473 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9474 }
9475 }
9476
Peter Collingbourne39719a72015-11-20 20:49:39 +00009477 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9478 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009479}
9480
Douglas Katzman95354292015-06-23 20:42:09 +00009481void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9482 const InputInfo &Output,
9483 const InputInfoList &Inputs,
9484 const ArgList &Args,
9485 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009486 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009487 ArgStringList CmdArgs;
9488
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009489 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009490
9491 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009492 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009493
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009494 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009495 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009496
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009497 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009498 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009499}
9500
Douglas Katzman95354292015-06-23 20:42:09 +00009501void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9502 const InputInfo &Output,
9503 const InputInfoList &Inputs,
9504 const ArgList &Args,
9505 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009506 const Driver &D = getToolChain().getDriver();
9507 ArgStringList CmdArgs;
9508
Daniel Dunbarb440f562010-08-02 02:38:21 +00009509 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009510 CmdArgs.push_back("-o");
9511 CmdArgs.push_back(Output.getFilename());
9512 } else {
9513 assert(Output.isNothing() && "Invalid output.");
9514 }
9515
Douglas Katzman78b37b02015-11-17 20:28:07 +00009516 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009517 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9518 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9519 CmdArgs.push_back(
9520 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9521 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009522 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009523
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009524 Args.AddAllArgs(CmdArgs,
9525 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009526
Daniel Dunbar54423b22010-09-17 00:24:54 +00009527 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009528
Xinliang David Li69306c02015-10-22 06:15:31 +00009529 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009530
Douglas Katzman78b37b02015-11-17 20:28:07 +00009531 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009532 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009533 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009534 CmdArgs.push_back("-lm");
9535 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009536 }
9537
Douglas Katzman78b37b02015-11-17 20:28:07 +00009538 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009539 if (Args.hasArg(options::OPT_pthread))
9540 CmdArgs.push_back("-lpthread");
9541 CmdArgs.push_back("-lc");
9542 CmdArgs.push_back("-lCompilerRT-Generic");
9543 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9544 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009545 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009546 }
9547
Logan Chieneb9162f2014-06-26 14:23:45 +00009548 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009549 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009550}
9551
Daniel Dunbarcc912342009-05-02 18:28:39 +00009552/// DragonFly Tools
9553
9554// For now, DragonFly Assemble does just about the same as for
9555// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009556void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9557 const InputInfo &Output,
9558 const InputInfoList &Inputs,
9559 const ArgList &Args,
9560 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009561 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009562 ArgStringList CmdArgs;
9563
9564 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9565 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009566 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009567 CmdArgs.push_back("--32");
9568
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009569 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009570
9571 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009572 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009573
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009574 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009575 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009576
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009577 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009578 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009579}
9580
Douglas Katzman95354292015-06-23 20:42:09 +00009581void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9582 const InputInfo &Output,
9583 const InputInfoList &Inputs,
9584 const ArgList &Args,
9585 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009586 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009587 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009588
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009589 if (!D.SysRoot.empty())
9590 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9591
John McCall65b8da02013-04-11 22:55:55 +00009592 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009593 if (Args.hasArg(options::OPT_static)) {
9594 CmdArgs.push_back("-Bstatic");
9595 } else {
John McCall65b8da02013-04-11 22:55:55 +00009596 if (Args.hasArg(options::OPT_rdynamic))
9597 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009598 if (Args.hasArg(options::OPT_shared))
9599 CmdArgs.push_back("-Bshareable");
9600 else {
9601 CmdArgs.push_back("-dynamic-linker");
9602 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9603 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009604 CmdArgs.push_back("--hash-style=gnu");
9605 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009606 }
9607
9608 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9609 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009610 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009611 CmdArgs.push_back("-m");
9612 CmdArgs.push_back("elf_i386");
9613 }
9614
Daniel Dunbarb440f562010-08-02 02:38:21 +00009615 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009616 CmdArgs.push_back("-o");
9617 CmdArgs.push_back(Output.getFilename());
9618 } else {
9619 assert(Output.isNothing() && "Invalid output.");
9620 }
9621
Douglas Katzman78b37b02015-11-17 20:28:07 +00009622 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009623 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009624 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009625 CmdArgs.push_back(
9626 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009627 else {
9628 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009629 CmdArgs.push_back(
9630 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009631 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009632 CmdArgs.push_back(
9633 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009634 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009635 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009636 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009637 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009638 CmdArgs.push_back(
9639 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009640 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009641 CmdArgs.push_back(
9642 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009643 }
9644
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009645 Args.AddAllArgs(CmdArgs,
9646 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009647
Daniel Dunbar54423b22010-09-17 00:24:54 +00009648 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009649
Douglas Katzman78b37b02015-11-17 20:28:07 +00009650 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009651 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009652
9653 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009654 CmdArgs.push_back("-rpath");
9655 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009656 }
9657
Hans Wennborg70850d82013-07-18 20:29:38 +00009658 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009659 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009660 CmdArgs.push_back("-lm");
9661 }
9662
Daniel Dunbarcc912342009-05-02 18:28:39 +00009663 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009664 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009665
9666 if (!Args.hasArg(options::OPT_nolibc)) {
9667 CmdArgs.push_back("-lc");
9668 }
9669
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009670 if (Args.hasArg(options::OPT_static) ||
9671 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009672 CmdArgs.push_back("-lgcc");
9673 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009674 } else {
9675 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009676 CmdArgs.push_back("-lgcc_pic");
9677 if (!Args.hasArg(options::OPT_shared))
9678 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009679 } else {
John McCall65b8da02013-04-11 22:55:55 +00009680 CmdArgs.push_back("-lgcc");
9681 CmdArgs.push_back("--as-needed");
9682 CmdArgs.push_back("-lgcc_pic");
9683 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009684 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009685 }
9686 }
9687
Douglas Katzman78b37b02015-11-17 20:28:07 +00009688 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009689 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009690 CmdArgs.push_back(
9691 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009692 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009693 CmdArgs.push_back(
9694 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9695 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009696 }
9697
Xinliang David Li69306c02015-10-22 06:15:31 +00009698 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009699
Logan Chieneb9162f2014-06-26 14:23:45 +00009700 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009701 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009702}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009703
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009704// Try to find Exe from a Visual Studio distribution. This first tries to find
9705// an installed copy of Visual Studio and, failing that, looks in the PATH,
9706// making sure that whatever executable that's found is not a same-named exe
9707// from clang itself to prevent clang from falling back to itself.
9708static std::string FindVisualStudioExecutable(const ToolChain &TC,
9709 const char *Exe,
9710 const char *ClangProgramPath) {
9711 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9712 std::string visualStudioBinDir;
9713 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9714 visualStudioBinDir)) {
9715 SmallString<128> FilePath(visualStudioBinDir);
9716 llvm::sys::path::append(FilePath, Exe);
9717 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9718 return FilePath.str();
9719 }
9720
9721 return Exe;
9722}
9723
Douglas Katzman95354292015-06-23 20:42:09 +00009724void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9725 const InputInfo &Output,
9726 const InputInfoList &Inputs,
9727 const ArgList &Args,
9728 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009729 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009730 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009731
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009732 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9733 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009734 CmdArgs.push_back(
9735 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009736
Douglas Katzman78b37b02015-11-17 20:28:07 +00009737 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9738 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009739 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009740
Zachary Turner10d75b22014-10-22 20:40:43 +00009741 if (!llvm::sys::Process::GetEnv("LIB")) {
9742 // If the VC environment hasn't been configured (perhaps because the user
9743 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009744 // the environment variable is set however, assume the user knows what
9745 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009746 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009747 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009748 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9749 SmallString<128> LibDir(VisualStudioDir);
9750 llvm::sys::path::append(LibDir, "VC", "lib");
9751 switch (MSVC.getArch()) {
9752 case llvm::Triple::x86:
9753 // x86 just puts the libraries directly in lib
9754 break;
9755 case llvm::Triple::x86_64:
9756 llvm::sys::path::append(LibDir, "amd64");
9757 break;
9758 case llvm::Triple::arm:
9759 llvm::sys::path::append(LibDir, "arm");
9760 break;
9761 default:
9762 break;
9763 }
9764 CmdArgs.push_back(
9765 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009766
9767 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9768 std::string UniversalCRTLibPath;
9769 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9770 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9771 UniversalCRTLibPath.c_str()));
9772 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009773 }
9774
9775 std::string WindowsSdkLibPath;
9776 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9777 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9778 WindowsSdkLibPath.c_str()));
9779 }
9780
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009781 CmdArgs.push_back("-nologo");
9782
Reid Kleckner124955a2015-08-05 18:51:13 +00009783 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009784 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009785
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009786 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009787 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009788 if (DLL) {
9789 CmdArgs.push_back(Args.MakeArgString("-dll"));
9790
9791 SmallString<128> ImplibName(Output.getFilename());
9792 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009793 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009794 }
9795
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009796 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009797 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009798 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009799 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009800 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9801 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009802 // Make sure the dynamic runtime thunk is not optimized out at link time
9803 // to ensure proper SEH handling.
9804 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009805 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009806 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009807 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009808 for (const auto &Lib : {"asan", "asan_cxx"})
9809 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009810 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009811 }
9812
Hans Wennborg2e274592013-08-13 23:38:57 +00009813 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009814
Alexey Bataevc7e84352015-08-19 04:49:01 +00009815 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9816 options::OPT_fno_openmp, false)) {
9817 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9818 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9819 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9820 TC.getDriver().Dir + "/../lib"));
9821 switch (getOpenMPRuntime(getToolChain(), Args)) {
9822 case OMPRT_OMP:
9823 CmdArgs.push_back("-defaultlib:libomp.lib");
9824 break;
9825 case OMPRT_IOMP5:
9826 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9827 break;
9828 case OMPRT_GOMP:
9829 break;
9830 case OMPRT_Unknown:
9831 // Already diagnosed.
9832 break;
9833 }
9834 }
9835
Andrey Turetskiya4868572016-03-14 11:19:43 +00009836 // Add compiler-rt lib in case if it was explicitly
9837 // specified as an argument for --rtlib option.
9838 if (!Args.hasArg(options::OPT_nostdlib)) {
9839 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9840 }
9841
Reid Kleckner337188f2014-09-16 19:22:00 +00009842 // Add filenames, libraries, and other linker inputs.
9843 for (const auto &Input : Inputs) {
9844 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009845 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009846 continue;
9847 }
9848
9849 const Arg &A = Input.getInputArg();
9850
9851 // Render -l options differently for the MSVC linker.
9852 if (A.getOption().matches(options::OPT_l)) {
9853 StringRef Lib = A.getValue();
9854 const char *LinkLibArg;
9855 if (Lib.endswith(".lib"))
9856 LinkLibArg = Args.MakeArgString(Lib);
9857 else
9858 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9859 CmdArgs.push_back(LinkLibArg);
9860 continue;
9861 }
9862
9863 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9864 // or -L. Render it, even if MSVC doesn't understand it.
9865 A.renderAsInput(Args, CmdArgs);
9866 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009867
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009868 TC.addProfileRTLibs(Args, CmdArgs);
9869
Zachary Turner719f58c2014-12-01 23:06:47 +00009870 // We need to special case some linker paths. In the case of lld, we need to
9871 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9872 // linker, we need to use a special search algorithm.
9873 llvm::SmallString<128> linkPath;
9874 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9875 if (Linker.equals_lower("lld"))
9876 Linker = "lld-link";
9877
9878 if (Linker.equals_lower("link")) {
9879 // If we're using the MSVC linker, it's not sufficient to just use link
9880 // from the program PATH, because other environments like GnuWin32 install
9881 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009882 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009883 C.getDriver().getClangProgramPath());
9884 } else {
9885 linkPath = Linker;
9886 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009887 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009888 }
9889
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009890 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009891 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009892}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009893
Douglas Katzman95354292015-06-23 20:42:09 +00009894void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9895 const InputInfo &Output,
9896 const InputInfoList &Inputs,
9897 const ArgList &Args,
9898 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009899 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9900}
9901
Douglas Katzman95354292015-06-23 20:42:09 +00009902std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009903 Compilation &C, const JobAction &JA, const InputInfo &Output,
9904 const InputInfoList &Inputs, const ArgList &Args,
9905 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009906 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009907 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009908 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009909 CmdArgs.push_back("/W0"); // No warnings.
9910
9911 // The goal is to be able to invoke this tool correctly based on
9912 // any flag accepted by clang-cl.
9913
9914 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009915 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009916
9917 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009918 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9919 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9920 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009921 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9922 if (A->getOption().getID() == options::OPT_O0) {
9923 CmdArgs.push_back("/Od");
9924 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009925 CmdArgs.push_back("/Og");
9926
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009927 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009928 if (OptLevel == "s" || OptLevel == "z")
9929 CmdArgs.push_back("/Os");
9930 else
9931 CmdArgs.push_back("/Ot");
9932
9933 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009934 }
9935 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009936 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9937 options::OPT_fno_omit_frame_pointer))
9938 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9939 ? "/Oy"
9940 : "/Oy-");
9941 if (!Args.hasArg(options::OPT_fwritable_strings))
9942 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009943
Nico Weber3f8dafb2015-03-12 19:37:10 +00009944 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009945 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9946
David Majnemerf6072342014-07-01 22:24:56 +00009947 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9948 /*default=*/false))
9949 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009950 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9951 options::OPT_fno_function_sections))
9952 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9953 ? "/Gy"
9954 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009955 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9956 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009957 CmdArgs.push_back(
9958 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009959 if (Args.hasArg(options::OPT_fsyntax_only))
9960 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009961 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9962 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009963 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009964
Nico Weber3f8dafb2015-03-12 19:37:10 +00009965 std::vector<std::string> Includes =
9966 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009967 for (const auto &Include : Includes)
9968 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009969
Hans Wennborg87cfa712013-09-19 20:32:16 +00009970 // Flags that can simply be passed through.
9971 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9972 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009973 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9974 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009975 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009976 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009977
9978 // The order of these flags is relevant, so pick the last one.
9979 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9980 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9981 A->render(Args, CmdArgs);
9982
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009983 // Pass through all unknown arguments so that the fallback command can see
9984 // them too.
9985 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9986
Hans Wennborg87cfa712013-09-19 20:32:16 +00009987 // Input filename.
9988 assert(Inputs.size() == 1);
9989 const InputInfo &II = Inputs[0];
9990 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9991 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9992 if (II.isFilename())
9993 CmdArgs.push_back(II.getFilename());
9994 else
9995 II.getInputArg().renderAsInput(Args, CmdArgs);
9996
9997 // Output filename.
9998 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009999 const char *Fo =
10000 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +000010001 CmdArgs.push_back(Fo);
10002
Hans Wennborg188382e2013-09-20 18:16:35 +000010003 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010004 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10005 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010006 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010007 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010008}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010009
Yaron Keren1c0070c2015-07-02 04:45:27 +000010010/// MinGW Tools
10011void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10012 const InputInfo &Output,
10013 const InputInfoList &Inputs,
10014 const ArgList &Args,
10015 const char *LinkingOutput) const {
10016 claimNoWarnArgs(Args);
10017 ArgStringList CmdArgs;
10018
10019 if (getToolChain().getArch() == llvm::Triple::x86) {
10020 CmdArgs.push_back("--32");
10021 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10022 CmdArgs.push_back("--64");
10023 }
10024
10025 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10026
10027 CmdArgs.push_back("-o");
10028 CmdArgs.push_back(Output.getFilename());
10029
10030 for (const auto &II : Inputs)
10031 CmdArgs.push_back(II.getFilename());
10032
10033 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010034 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010035
10036 if (Args.hasArg(options::OPT_gsplit_dwarf))
10037 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10038 SplitDebugName(Args, Inputs[0]));
10039}
10040
10041void MinGW::Linker::AddLibGCC(const ArgList &Args,
10042 ArgStringList &CmdArgs) const {
10043 if (Args.hasArg(options::OPT_mthreads))
10044 CmdArgs.push_back("-lmingwthrd");
10045 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010046
Yaron Kerenaa281332015-08-09 00:24:07 +000010047 // Make use of compiler-rt if --rtlib option is used
10048 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10049 if (RLT == ToolChain::RLT_Libgcc) {
10050 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10051 Args.hasArg(options::OPT_static);
10052 bool Shared = Args.hasArg(options::OPT_shared);
10053 bool CXX = getToolChain().getDriver().CCCIsCXX();
10054
10055 if (Static || (!CXX && !Shared)) {
10056 CmdArgs.push_back("-lgcc");
10057 CmdArgs.push_back("-lgcc_eh");
10058 } else {
10059 CmdArgs.push_back("-lgcc_s");
10060 CmdArgs.push_back("-lgcc");
10061 }
10062 } else {
10063 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10064 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010065
Yaron Keren1c0070c2015-07-02 04:45:27 +000010066 CmdArgs.push_back("-lmoldname");
10067 CmdArgs.push_back("-lmingwex");
10068 CmdArgs.push_back("-lmsvcrt");
10069}
10070
10071void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10072 const InputInfo &Output,
10073 const InputInfoList &Inputs,
10074 const ArgList &Args,
10075 const char *LinkingOutput) const {
10076 const ToolChain &TC = getToolChain();
10077 const Driver &D = TC.getDriver();
10078 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10079
10080 ArgStringList CmdArgs;
10081
10082 // Silence warning for "clang -g foo.o -o foo"
10083 Args.ClaimAllArgs(options::OPT_g_Group);
10084 // and "clang -emit-llvm foo.o -o foo"
10085 Args.ClaimAllArgs(options::OPT_emit_llvm);
10086 // and for "clang -w foo.o -o foo". Other warning options are already
10087 // handled somewhere else.
10088 Args.ClaimAllArgs(options::OPT_w);
10089
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010090 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10091 if (LinkerName.equals_lower("lld")) {
10092 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010093 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010094 } else if (!LinkerName.equals_lower("ld")) {
10095 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010096 }
10097
Yaron Keren1c0070c2015-07-02 04:45:27 +000010098 if (!D.SysRoot.empty())
10099 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10100
10101 if (Args.hasArg(options::OPT_s))
10102 CmdArgs.push_back("-s");
10103
10104 CmdArgs.push_back("-m");
10105 if (TC.getArch() == llvm::Triple::x86)
10106 CmdArgs.push_back("i386pe");
10107 if (TC.getArch() == llvm::Triple::x86_64)
10108 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010109 if (TC.getArch() == llvm::Triple::arm)
10110 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010111
10112 if (Args.hasArg(options::OPT_mwindows)) {
10113 CmdArgs.push_back("--subsystem");
10114 CmdArgs.push_back("windows");
10115 } else if (Args.hasArg(options::OPT_mconsole)) {
10116 CmdArgs.push_back("--subsystem");
10117 CmdArgs.push_back("console");
10118 }
10119
10120 if (Args.hasArg(options::OPT_static))
10121 CmdArgs.push_back("-Bstatic");
10122 else {
10123 if (Args.hasArg(options::OPT_mdll))
10124 CmdArgs.push_back("--dll");
10125 else if (Args.hasArg(options::OPT_shared))
10126 CmdArgs.push_back("--shared");
10127 CmdArgs.push_back("-Bdynamic");
10128 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10129 CmdArgs.push_back("-e");
10130 if (TC.getArch() == llvm::Triple::x86)
10131 CmdArgs.push_back("_DllMainCRTStartup@12");
10132 else
10133 CmdArgs.push_back("DllMainCRTStartup");
10134 CmdArgs.push_back("--enable-auto-image-base");
10135 }
10136 }
10137
10138 CmdArgs.push_back("-o");
10139 CmdArgs.push_back(Output.getFilename());
10140
10141 Args.AddAllArgs(CmdArgs, options::OPT_e);
10142 // FIXME: add -N, -n flags
10143 Args.AddLastArg(CmdArgs, options::OPT_r);
10144 Args.AddLastArg(CmdArgs, options::OPT_s);
10145 Args.AddLastArg(CmdArgs, options::OPT_t);
10146 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10147 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10148
Douglas Katzman78b37b02015-11-17 20:28:07 +000010149 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010150 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10151 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10152 } else {
10153 if (Args.hasArg(options::OPT_municode))
10154 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10155 else
10156 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10157 }
10158 if (Args.hasArg(options::OPT_pg))
10159 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10160 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10161 }
10162
10163 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010164 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010165 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10166
10167 // TODO: Add ASan stuff here
10168
10169 // TODO: Add profile stuff here
10170
Douglas Katzman78b37b02015-11-17 20:28:07 +000010171 if (D.CCCIsCXX() &&
10172 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010173 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10174 !Args.hasArg(options::OPT_static);
10175 if (OnlyLibstdcxxStatic)
10176 CmdArgs.push_back("-Bstatic");
10177 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10178 if (OnlyLibstdcxxStatic)
10179 CmdArgs.push_back("-Bdynamic");
10180 }
10181
10182 if (!Args.hasArg(options::OPT_nostdlib)) {
10183 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10184 if (Args.hasArg(options::OPT_static))
10185 CmdArgs.push_back("--start-group");
10186
10187 if (Args.hasArg(options::OPT_fstack_protector) ||
10188 Args.hasArg(options::OPT_fstack_protector_strong) ||
10189 Args.hasArg(options::OPT_fstack_protector_all)) {
10190 CmdArgs.push_back("-lssp_nonshared");
10191 CmdArgs.push_back("-lssp");
10192 }
10193 if (Args.hasArg(options::OPT_fopenmp))
10194 CmdArgs.push_back("-lgomp");
10195
10196 AddLibGCC(Args, CmdArgs);
10197
10198 if (Args.hasArg(options::OPT_pg))
10199 CmdArgs.push_back("-lgmon");
10200
Yaron Kerenadce68e2015-07-06 18:52:19 +000010201 if (Args.hasArg(options::OPT_pthread))
10202 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010203
10204 // add system libraries
10205 if (Args.hasArg(options::OPT_mwindows)) {
10206 CmdArgs.push_back("-lgdi32");
10207 CmdArgs.push_back("-lcomdlg32");
10208 }
10209 CmdArgs.push_back("-ladvapi32");
10210 CmdArgs.push_back("-lshell32");
10211 CmdArgs.push_back("-luser32");
10212 CmdArgs.push_back("-lkernel32");
10213
10214 if (Args.hasArg(options::OPT_static))
10215 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010216 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010217 AddLibGCC(Args, CmdArgs);
10218 }
10219
10220 if (!Args.hasArg(options::OPT_nostartfiles)) {
10221 // Add crtfastmath.o if available and fast math is enabled.
10222 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10223
10224 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10225 }
10226 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010227 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010228 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010229}
10230
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010231/// XCore Tools
10232// We pass assemble and link construction to the xcc tool.
10233
Douglas Katzman95354292015-06-23 20:42:09 +000010234void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10235 const InputInfo &Output,
10236 const InputInfoList &Inputs,
10237 const ArgList &Args,
10238 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010239 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010240 ArgStringList CmdArgs;
10241
10242 CmdArgs.push_back("-o");
10243 CmdArgs.push_back(Output.getFilename());
10244
10245 CmdArgs.push_back("-c");
10246
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010247 if (Args.hasArg(options::OPT_v))
10248 CmdArgs.push_back("-v");
10249
Robert Lytton894d25c2014-05-02 09:33:25 +000010250 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10251 if (!A->getOption().matches(options::OPT_g0))
10252 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010253
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010254 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10255 false))
10256 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010257
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010258 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010259
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010260 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010261 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010262
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010263 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010264 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010265}
10266
Douglas Katzman95354292015-06-23 20:42:09 +000010267void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10268 const InputInfo &Output,
10269 const InputInfoList &Inputs,
10270 const ArgList &Args,
10271 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010272 ArgStringList CmdArgs;
10273
10274 if (Output.isFilename()) {
10275 CmdArgs.push_back("-o");
10276 CmdArgs.push_back(Output.getFilename());
10277 } else {
10278 assert(Output.isNothing() && "Invalid output.");
10279 }
10280
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010281 if (Args.hasArg(options::OPT_v))
10282 CmdArgs.push_back("-v");
10283
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010284 // Pass -fexceptions through to the linker if it was present.
10285 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10286 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010287 CmdArgs.push_back("-fexceptions");
10288
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010289 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10290
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010291 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010292 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010293}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010294
Douglas Katzman95354292015-06-23 20:42:09 +000010295void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10296 const InputInfo &Output,
10297 const InputInfoList &Inputs,
10298 const ArgList &Args,
10299 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010300 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010301 const auto &TC =
10302 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10303 ArgStringList CmdArgs;
10304 const char *Exec;
10305
10306 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010307 default:
10308 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010309 case llvm::Triple::arm:
10310 case llvm::Triple::thumb:
10311 break;
10312 case llvm::Triple::x86:
10313 CmdArgs.push_back("--32");
10314 break;
10315 case llvm::Triple::x86_64:
10316 CmdArgs.push_back("--64");
10317 break;
10318 }
10319
10320 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10321
10322 CmdArgs.push_back("-o");
10323 CmdArgs.push_back(Output.getFilename());
10324
10325 for (const auto &Input : Inputs)
10326 CmdArgs.push_back(Input.getFilename());
10327
10328 const std::string Assembler = TC.GetProgramPath("as");
10329 Exec = Args.MakeArgString(Assembler);
10330
Justin Bognerd3371d82015-07-17 03:35:54 +000010331 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010332}
10333
Douglas Katzman95354292015-06-23 20:42:09 +000010334void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10335 const InputInfo &Output,
10336 const InputInfoList &Inputs,
10337 const ArgList &Args,
10338 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010339 const auto &TC =
10340 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10341 const llvm::Triple &T = TC.getTriple();
10342 const Driver &D = TC.getDriver();
10343 SmallString<128> EntryPoint;
10344 ArgStringList CmdArgs;
10345 const char *Exec;
10346
10347 // Silence warning for "clang -g foo.o -o foo"
10348 Args.ClaimAllArgs(options::OPT_g_Group);
10349 // and "clang -emit-llvm foo.o -o foo"
10350 Args.ClaimAllArgs(options::OPT_emit_llvm);
10351 // and for "clang -w foo.o -o foo"
10352 Args.ClaimAllArgs(options::OPT_w);
10353 // Other warning options are already handled somewhere else.
10354
10355 if (!D.SysRoot.empty())
10356 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10357
10358 if (Args.hasArg(options::OPT_pie))
10359 CmdArgs.push_back("-pie");
10360 if (Args.hasArg(options::OPT_rdynamic))
10361 CmdArgs.push_back("-export-dynamic");
10362 if (Args.hasArg(options::OPT_s))
10363 CmdArgs.push_back("--strip-all");
10364
10365 CmdArgs.push_back("-m");
10366 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010367 default:
10368 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010369 case llvm::Triple::arm:
10370 case llvm::Triple::thumb:
10371 // FIXME: this is incorrect for WinCE
10372 CmdArgs.push_back("thumb2pe");
10373 break;
10374 case llvm::Triple::x86:
10375 CmdArgs.push_back("i386pe");
10376 EntryPoint.append("_");
10377 break;
10378 case llvm::Triple::x86_64:
10379 CmdArgs.push_back("i386pep");
10380 break;
10381 }
10382
10383 if (Args.hasArg(options::OPT_shared)) {
10384 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010385 default:
10386 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010387 case llvm::Triple::arm:
10388 case llvm::Triple::thumb:
10389 case llvm::Triple::x86_64:
10390 EntryPoint.append("_DllMainCRTStartup");
10391 break;
10392 case llvm::Triple::x86:
10393 EntryPoint.append("_DllMainCRTStartup@12");
10394 break;
10395 }
10396
10397 CmdArgs.push_back("-shared");
10398 CmdArgs.push_back("-Bdynamic");
10399
10400 CmdArgs.push_back("--enable-auto-image-base");
10401
10402 CmdArgs.push_back("--entry");
10403 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10404 } else {
10405 EntryPoint.append("mainCRTStartup");
10406
10407 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10408 : "-Bdynamic");
10409
Douglas Katzman78b37b02015-11-17 20:28:07 +000010410 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010411 CmdArgs.push_back("--entry");
10412 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10413 }
10414
10415 // FIXME: handle subsystem
10416 }
10417
10418 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010419 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010420
10421 CmdArgs.push_back("-o");
10422 CmdArgs.push_back(Output.getFilename());
10423
10424 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10425 SmallString<261> ImpLib(Output.getFilename());
10426 llvm::sys::path::replace_extension(ImpLib, ".lib");
10427
10428 CmdArgs.push_back("--out-implib");
10429 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10430 }
10431
Douglas Katzman78b37b02015-11-17 20:28:07 +000010432 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010433 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10434 const char *CRTBegin;
10435
10436 CRTBegin =
10437 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10438 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10439 }
10440
10441 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010442 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010443 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10444
10445 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10446 !Args.hasArg(options::OPT_nodefaultlibs)) {
10447 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10448 !Args.hasArg(options::OPT_static);
10449 if (StaticCXX)
10450 CmdArgs.push_back("-Bstatic");
10451 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10452 if (StaticCXX)
10453 CmdArgs.push_back("-Bdynamic");
10454 }
10455
10456 if (!Args.hasArg(options::OPT_nostdlib)) {
10457 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10458 // TODO handle /MT[d] /MD[d]
10459 CmdArgs.push_back("-lmsvcrt");
10460 AddRunTimeLibs(TC, D, CmdArgs, Args);
10461 }
10462 }
10463
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010464 if (TC.getSanitizerArgs().needsAsanRt()) {
10465 // TODO handle /MT[d] /MD[d]
10466 if (Args.hasArg(options::OPT_shared)) {
10467 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10468 } else {
10469 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10470 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10471 // Make sure the dynamic runtime thunk is not optimized out at link time
10472 // to ensure proper SEH handling.
10473 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10474 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10475 ? "___asan_seh_interceptor"
10476 : "__asan_seh_interceptor"));
10477 }
10478 }
10479
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010480 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010481
Justin Bognerd3371d82015-07-17 03:35:54 +000010482 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010483}
Douglas Katzman84a75642015-06-19 14:55:19 +000010484
Douglas Katzman95354292015-06-23 20:42:09 +000010485void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10486 const InputInfo &Output,
10487 const InputInfoList &Inputs,
10488 const ArgList &Args,
10489 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010490 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010491 assert(Inputs.size() == 1);
10492 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010493 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10494 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010495
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010496 if (JA.getKind() == Action::PreprocessJobClass) {
10497 Args.ClaimAllArgs();
10498 CmdArgs.push_back("-E");
10499 } else {
10500 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10501 CmdArgs.push_back("-S");
10502 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10503 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010504 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010505
Douglas Katzmanf6071112015-08-03 14:34:22 +000010506 // Append all -I, -iquote, -isystem paths, defines/undefines,
10507 // 'f' flags, optimize flags, and warning options.
10508 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010509 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010510 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010511 options::OPT_f_Group, options::OPT_f_clang_Group,
10512 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010513 options::OPT_O_Group, options::OPT_W_Group,
10514 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010515
10516 // If we're producing a dependency file, and assembly is the final action,
10517 // then the name of the target in the dependency file should be the '.o'
10518 // file, not the '.s' file produced by this step. For example, instead of
10519 // /tmp/mumble.s: mumble.c .../someheader.h
10520 // the filename on the lefthand side should be "mumble.o"
10521 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10522 C.getActions().size() == 1 &&
10523 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10524 Arg *A = Args.getLastArg(options::OPT_o);
10525 if (A) {
10526 CmdArgs.push_back("-MT");
10527 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10528 }
10529 }
10530
Douglas Katzman84a75642015-06-19 14:55:19 +000010531 CmdArgs.push_back(II.getFilename());
10532 CmdArgs.push_back("-o");
10533 CmdArgs.push_back(Output.getFilename());
10534
10535 std::string Exec =
10536 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010537 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10538 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010539}
10540
Douglas Katzman95354292015-06-23 20:42:09 +000010541void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10542 const InputInfo &Output,
10543 const InputInfoList &Inputs,
10544 const ArgList &Args,
10545 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010546 ArgStringList CmdArgs;
10547
10548 assert(Inputs.size() == 1);
10549 const InputInfo &II = Inputs[0];
10550 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10551 assert(Output.getType() == types::TY_Object);
10552
10553 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010554 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10555 if (CPUArg)
10556 CmdArgs.push_back(
10557 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010558 CmdArgs.push_back("-noSPrefixing");
10559 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010560 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10561 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10562 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010563 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010564 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010565 }
10566 CmdArgs.push_back("-elf"); // Output format.
10567 CmdArgs.push_back(II.getFilename());
10568 CmdArgs.push_back(
10569 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10570
10571 std::string Exec =
10572 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010573 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10574 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010575}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010576
10577void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10578 const InputInfo &Output,
10579 const InputInfoList &Inputs,
10580 const ArgList &Args,
10581 const char *LinkingOutput) const {
10582 const auto &TC =
10583 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10584 const llvm::Triple &T = TC.getTriple();
10585 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010586 bool UseStartfiles =
10587 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010588 bool UseDefaultLibs =
10589 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010590
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010591 if (T.getArch() == llvm::Triple::sparc)
10592 CmdArgs.push_back("-EB");
10593 else // SHAVE assumes little-endian, and sparcel is expressly so.
10594 CmdArgs.push_back("-EL");
10595
10596 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10597 // but we never pass through a --sysroot option and various other bits.
10598 // For example, there are no sanitizers (yet) nor gold linker.
10599
10600 // Eat some arguments that may be present but have no effect.
10601 Args.ClaimAllArgs(options::OPT_g_Group);
10602 Args.ClaimAllArgs(options::OPT_w);
10603 Args.ClaimAllArgs(options::OPT_static_libgcc);
10604
10605 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10606 CmdArgs.push_back("-s");
10607
10608 CmdArgs.push_back("-o");
10609 CmdArgs.push_back(Output.getFilename());
10610
10611 if (UseStartfiles) {
10612 // If you want startfiles, it means you want the builtin crti and crtbegin,
10613 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010614 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10615 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010616 }
10617
10618 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10619 options::OPT_e, options::OPT_s, options::OPT_t,
10620 options::OPT_Z_Flag, options::OPT_r});
10621
Douglas Katzman674a3122015-11-18 16:24:46 +000010622 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010623
10624 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10625
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010626 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010627 if (C.getDriver().CCCIsCXX())
10628 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010629 if (T.getOS() == llvm::Triple::RTEMS) {
10630 CmdArgs.push_back("--start-group");
10631 CmdArgs.push_back("-lc");
10632 // You must provide your own "-L" option to enable finding these.
10633 CmdArgs.push_back("-lrtemscpu");
10634 CmdArgs.push_back("-lrtemsbsp");
10635 CmdArgs.push_back("--end-group");
10636 } else {
10637 CmdArgs.push_back("-lc");
10638 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010639 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010640 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010641 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010642 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10643 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010644 }
10645
10646 std::string Exec =
10647 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10648 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10649 CmdArgs, Inputs));
10650}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010651
10652void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10653 const InputInfo &Output,
10654 const InputInfoList &Inputs,
10655 const ArgList &Args,
10656 const char *LinkingOutput) const {
10657 claimNoWarnArgs(Args);
10658 ArgStringList CmdArgs;
10659
10660 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10661
10662 CmdArgs.push_back("-o");
10663 CmdArgs.push_back(Output.getFilename());
10664
10665 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10666 const InputInfo &Input = Inputs[0];
10667 assert(Input.isFilename() && "Invalid input.");
10668 CmdArgs.push_back(Input.getFilename());
10669
10670 const char *Exec =
10671 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10672 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10673}
10674
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010675static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10676 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10677 if (SanArgs.needsUbsanRt()) {
10678 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10679 }
10680 if (SanArgs.needsAsanRt()) {
10681 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10682 }
10683}
10684
10685static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10686 const JobAction &JA, const InputInfo &Output,
10687 const InputInfoList &Inputs,
10688 const ArgList &Args,
10689 const char *LinkingOutput) {
10690 const toolchains::FreeBSD &ToolChain =
10691 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10692 const Driver &D = ToolChain.getDriver();
10693 ArgStringList CmdArgs;
10694
10695 // Silence warning for "clang -g foo.o -o foo"
10696 Args.ClaimAllArgs(options::OPT_g_Group);
10697 // and "clang -emit-llvm foo.o -o foo"
10698 Args.ClaimAllArgs(options::OPT_emit_llvm);
10699 // and for "clang -w foo.o -o foo". Other warning options are already
10700 // handled somewhere else.
10701 Args.ClaimAllArgs(options::OPT_w);
10702
10703 if (!D.SysRoot.empty())
10704 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10705
10706 if (Args.hasArg(options::OPT_pie))
10707 CmdArgs.push_back("-pie");
10708
10709 if (Args.hasArg(options::OPT_rdynamic))
10710 CmdArgs.push_back("-export-dynamic");
10711 if (Args.hasArg(options::OPT_shared))
10712 CmdArgs.push_back("--oformat=so");
10713
10714 if (Output.isFilename()) {
10715 CmdArgs.push_back("-o");
10716 CmdArgs.push_back(Output.getFilename());
10717 } else {
10718 assert(Output.isNothing() && "Invalid output.");
10719 }
10720
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010721 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10722
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010723 Args.AddAllArgs(CmdArgs, options::OPT_L);
10724 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10725 Args.AddAllArgs(CmdArgs, options::OPT_e);
10726 Args.AddAllArgs(CmdArgs, options::OPT_s);
10727 Args.AddAllArgs(CmdArgs, options::OPT_t);
10728 Args.AddAllArgs(CmdArgs, options::OPT_r);
10729
10730 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10731 CmdArgs.push_back("--no-demangle");
10732
10733 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10734
10735 if (Args.hasArg(options::OPT_pthread)) {
10736 CmdArgs.push_back("-lpthread");
10737 }
10738
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010739 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10740
10741 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10742}
10743
10744static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10745 const JobAction &JA, const InputInfo &Output,
10746 const InputInfoList &Inputs,
10747 const ArgList &Args,
10748 const char *LinkingOutput) {
10749 const toolchains::FreeBSD &ToolChain =
10750 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10751 const Driver &D = ToolChain.getDriver();
10752 ArgStringList CmdArgs;
10753
10754 // Silence warning for "clang -g foo.o -o foo"
10755 Args.ClaimAllArgs(options::OPT_g_Group);
10756 // and "clang -emit-llvm foo.o -o foo"
10757 Args.ClaimAllArgs(options::OPT_emit_llvm);
10758 // and for "clang -w foo.o -o foo". Other warning options are already
10759 // handled somewhere else.
10760 Args.ClaimAllArgs(options::OPT_w);
10761
10762 if (!D.SysRoot.empty())
10763 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10764
10765 if (Args.hasArg(options::OPT_pie))
10766 CmdArgs.push_back("-pie");
10767
10768 if (Args.hasArg(options::OPT_static)) {
10769 CmdArgs.push_back("-Bstatic");
10770 } else {
10771 if (Args.hasArg(options::OPT_rdynamic))
10772 CmdArgs.push_back("-export-dynamic");
10773 CmdArgs.push_back("--eh-frame-hdr");
10774 if (Args.hasArg(options::OPT_shared)) {
10775 CmdArgs.push_back("-Bshareable");
10776 } else {
10777 CmdArgs.push_back("-dynamic-linker");
10778 CmdArgs.push_back("/libexec/ld-elf.so.1");
10779 }
10780 CmdArgs.push_back("--enable-new-dtags");
10781 }
10782
10783 if (Output.isFilename()) {
10784 CmdArgs.push_back("-o");
10785 CmdArgs.push_back(Output.getFilename());
10786 } else {
10787 assert(Output.isNothing() && "Invalid output.");
10788 }
10789
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010790 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10791
Douglas Katzman78b37b02015-11-17 20:28:07 +000010792 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010793 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010794 if (!Args.hasArg(options::OPT_shared)) {
10795 if (Args.hasArg(options::OPT_pg))
10796 crt1 = "gcrt1.o";
10797 else if (Args.hasArg(options::OPT_pie))
10798 crt1 = "Scrt1.o";
10799 else
10800 crt1 = "crt1.o";
10801 }
10802 if (crt1)
10803 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10804
10805 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10806
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010807 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010808 if (Args.hasArg(options::OPT_static))
10809 crtbegin = "crtbeginT.o";
10810 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10811 crtbegin = "crtbeginS.o";
10812 else
10813 crtbegin = "crtbegin.o";
10814
10815 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10816 }
10817
10818 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010819 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010820 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10821 Args.AddAllArgs(CmdArgs, options::OPT_e);
10822 Args.AddAllArgs(CmdArgs, options::OPT_s);
10823 Args.AddAllArgs(CmdArgs, options::OPT_t);
10824 Args.AddAllArgs(CmdArgs, options::OPT_r);
10825
10826 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10827 CmdArgs.push_back("--no-demangle");
10828
10829 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10830
Douglas Katzman78b37b02015-11-17 20:28:07 +000010831 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010832 // For PS4, we always want to pass libm, libstdc++ and libkernel
10833 // libraries for both C and C++ compilations.
10834 CmdArgs.push_back("-lkernel");
10835 if (D.CCCIsCXX()) {
10836 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10837 if (Args.hasArg(options::OPT_pg))
10838 CmdArgs.push_back("-lm_p");
10839 else
10840 CmdArgs.push_back("-lm");
10841 }
10842 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10843 // the default system libraries. Just mimic this for now.
10844 if (Args.hasArg(options::OPT_pg))
10845 CmdArgs.push_back("-lgcc_p");
10846 else
10847 CmdArgs.push_back("-lcompiler_rt");
10848 if (Args.hasArg(options::OPT_static)) {
10849 CmdArgs.push_back("-lstdc++");
10850 } else if (Args.hasArg(options::OPT_pg)) {
10851 CmdArgs.push_back("-lgcc_eh_p");
10852 } else {
10853 CmdArgs.push_back("--as-needed");
10854 CmdArgs.push_back("-lstdc++");
10855 CmdArgs.push_back("--no-as-needed");
10856 }
10857
10858 if (Args.hasArg(options::OPT_pthread)) {
10859 if (Args.hasArg(options::OPT_pg))
10860 CmdArgs.push_back("-lpthread_p");
10861 else
10862 CmdArgs.push_back("-lpthread");
10863 }
10864
10865 if (Args.hasArg(options::OPT_pg)) {
10866 if (Args.hasArg(options::OPT_shared))
10867 CmdArgs.push_back("-lc");
10868 else {
10869 if (Args.hasArg(options::OPT_static)) {
10870 CmdArgs.push_back("--start-group");
10871 CmdArgs.push_back("-lc_p");
10872 CmdArgs.push_back("-lpthread_p");
10873 CmdArgs.push_back("--end-group");
10874 } else {
10875 CmdArgs.push_back("-lc_p");
10876 }
10877 }
10878 CmdArgs.push_back("-lgcc_p");
10879 } else {
10880 if (Args.hasArg(options::OPT_static)) {
10881 CmdArgs.push_back("--start-group");
10882 CmdArgs.push_back("-lc");
10883 CmdArgs.push_back("-lpthread");
10884 CmdArgs.push_back("--end-group");
10885 } else {
10886 CmdArgs.push_back("-lc");
10887 }
10888 CmdArgs.push_back("-lcompiler_rt");
10889 }
10890
10891 if (Args.hasArg(options::OPT_static)) {
10892 CmdArgs.push_back("-lstdc++");
10893 } else if (Args.hasArg(options::OPT_pg)) {
10894 CmdArgs.push_back("-lgcc_eh_p");
10895 } else {
10896 CmdArgs.push_back("--as-needed");
10897 CmdArgs.push_back("-lstdc++");
10898 CmdArgs.push_back("--no-as-needed");
10899 }
10900 }
10901
Douglas Katzman78b37b02015-11-17 20:28:07 +000010902 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010903 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10904 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10905 else
10906 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10907 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10908 }
10909
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010910 const char *Exec =
10911#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010912 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010913#else
10914 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10915#endif
10916
10917 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10918}
10919
10920void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10921 const InputInfo &Output,
10922 const InputInfoList &Inputs,
10923 const ArgList &Args,
10924 const char *LinkingOutput) const {
10925 const toolchains::FreeBSD &ToolChain =
10926 static_cast<const toolchains::FreeBSD &>(getToolChain());
10927 const Driver &D = ToolChain.getDriver();
10928 bool PS4Linker;
10929 StringRef LinkerOptName;
10930 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10931 LinkerOptName = A->getValue();
10932 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10933 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10934 }
10935
10936 if (LinkerOptName == "gold")
10937 PS4Linker = false;
10938 else if (LinkerOptName == "ps4")
10939 PS4Linker = true;
10940 else
10941 PS4Linker = !Args.hasArg(options::OPT_shared);
10942
10943 if (PS4Linker)
10944 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10945 else
10946 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10947}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010948
10949void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10950 const InputInfo &Output,
10951 const InputInfoList &Inputs,
10952 const ArgList &Args,
10953 const char *LinkingOutput) const {
10954 const auto &TC =
10955 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010956 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010957
10958 std::vector<std::string> gpu_archs =
10959 Args.getAllArgValues(options::OPT_march_EQ);
10960 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10961 const std::string& gpu_arch = gpu_archs[0];
10962
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010963 ArgStringList CmdArgs;
10964 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Justin Lebarb41f33c2016-04-19 02:27:11 +000010965 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
10966 options::OPT_no_cuda_noopt_device_debug, false)) {
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010967 // ptxas does not accept -g option if optimization is enabled, so
10968 // we ignore the compiler's -O* options if we want debug info.
10969 CmdArgs.push_back("-g");
10970 CmdArgs.push_back("--dont-merge-basicblocks");
10971 CmdArgs.push_back("--return-at-end");
10972 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10973 // Map the -O we received to -O{0,1,2,3}.
10974 //
10975 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10976 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010977
Justin Lebar2836dcd2016-01-19 19:52:21 +000010978 // -O3 seems like the least-bad option when -Osomething is specified to
10979 // clang but it isn't handled below.
10980 StringRef OOpt = "3";
10981 if (A->getOption().matches(options::OPT_O4) ||
10982 A->getOption().matches(options::OPT_Ofast))
10983 OOpt = "3";
10984 else if (A->getOption().matches(options::OPT_O0))
10985 OOpt = "0";
10986 else if (A->getOption().matches(options::OPT_O)) {
10987 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10988 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10989 .Case("1", "1")
10990 .Case("2", "2")
10991 .Case("3", "3")
10992 .Case("s", "2")
10993 .Case("z", "2")
10994 .Default("2");
10995 }
10996 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10997 } else {
10998 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10999 // to no optimizations, but ptxas's default is -O3.
11000 CmdArgs.push_back("-O0");
11001 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011002
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011003 CmdArgs.push_back("--gpu-name");
11004 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
11005 CmdArgs.push_back("--output-file");
11006 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11007 for (const auto& II : Inputs)
11008 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11009
11010 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11011 CmdArgs.push_back(Args.MakeArgString(A));
11012
11013 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11014 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11015}
11016
11017// All inputs to this linker must be from CudaDeviceActions, as we need to look
11018// at the Inputs' Actions in order to figure out which GPU architecture they
11019// correspond to.
11020void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11021 const InputInfo &Output,
11022 const InputInfoList &Inputs,
11023 const ArgList &Args,
11024 const char *LinkingOutput) const {
11025 const auto &TC =
11026 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011027 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011028
11029 ArgStringList CmdArgs;
11030 CmdArgs.push_back("--cuda");
11031 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11032 CmdArgs.push_back(Args.MakeArgString("--create"));
11033 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11034
11035 for (const auto& II : Inputs) {
11036 auto* A = cast<const CudaDeviceAction>(II.getAction());
11037 // We need to pass an Arch of the form "sm_XX" for cubin files and
11038 // "compute_XX" for ptx.
11039 const char *Arch = (II.getType() == types::TY_PP_Asm)
11040 ? A->getComputeArchName()
11041 : A->getGpuArchName();
11042 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11043 Arch + ",file=" + II.getFilename()));
11044 }
11045
11046 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11047 CmdArgs.push_back(Args.MakeArgString(A));
11048
11049 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11050 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11051}