blob: 080fef8d9e903a499ed1dcb246c27afeeff2050f [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000389 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000390 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000391 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
393 RenderedImplicitInclude = true;
394
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000395 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000396 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000397
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000398 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000399 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000400 SmallString<128> P(A->getValue());
401 // We want the files to have a name like foo.h.pch. Add a dummy extension
402 // so that replace_extension does the right thing.
403 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000404 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000405 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000406 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000407 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000408 }
409
Douglas Gregor111af7d2009-04-18 00:34:01 +0000410 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000411 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000413 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000414 }
415
Douglas Gregor111af7d2009-04-18 00:34:01 +0000416 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000417 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000419 FoundPCH = UsePCH;
420 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000421 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000422 }
423
424 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000425 if (IsFirstImplicitInclude) {
426 A->claim();
427 if (UsePCH)
428 CmdArgs.push_back("-include-pch");
429 else
430 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000431 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000432 continue;
433 } else {
434 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000435 D.Diag(diag::warn_drv_pch_not_first_include) << P
436 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000437 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000438 }
439 }
440
441 // Not translated, render as usual.
442 A->claim();
443 A->render(Args, CmdArgs);
444 }
445
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000446 Args.AddAllArgs(CmdArgs,
447 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
448 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000450 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000451
452 // FIXME: There is a very unfortunate problem here, some troubled
453 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
454 // really support that we would have to parse and then translate
455 // those options. :(
456 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
457 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000458
459 // -I- is a deprecated GCC feature, reject it.
460 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000461 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000462
463 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
464 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000465 StringRef sysroot = C.getSysRoot();
466 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000467 if (!Args.hasArg(options::OPT_isysroot)) {
468 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000469 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000470 }
471 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000472
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000473 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000474 // FIXME: We should probably sink the logic for handling these from the
475 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000476 // CPATH - included following the user specified includes (but prior to
477 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000478 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000479 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000480 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000481 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000482 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000483 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000484 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000485 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000486 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000487
Artem Belevichfa11ab52015-11-17 22:28:46 +0000488 // Optional AuxToolChain indicates that we need to include headers
489 // for more than one target. If that's the case, add include paths
490 // from AuxToolChain right after include paths of the same kind for
491 // the current target.
492
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000493 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000494 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000495 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000496 if (AuxToolChain)
497 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
498 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000499
500 // Add system include arguments.
501 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000502 if (AuxToolChain)
503 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
504
505 // Add CUDA include arguments, if needed.
506 if (types::isCuda(Inputs[0].getType()))
507 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000508}
509
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000510// FIXME: Move to target hook.
511static bool isSignedCharDefault(const llvm::Triple &Triple) {
512 switch (Triple.getArch()) {
513 default:
514 return true;
515
Tim Northover9bb857a2013-01-31 12:13:10 +0000516 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000517 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000518 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000519 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000522 if (Triple.isOSDarwin() || Triple.isOSWindows())
523 return true;
524 return false;
525
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000526 case llvm::Triple::ppc:
527 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000528 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000529 return true;
530 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000531
David Majnemerdcecd932015-05-23 19:23:55 +0000532 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000533 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000534 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000535 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000536 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000537 }
538}
539
Robert Lytton0e076492013-08-13 09:43:10 +0000540static bool isNoCommonDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return false;
544
545 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000546 case llvm::Triple::wasm32:
547 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000548 return true;
549 }
550}
551
Renato Goline17c5802015-07-27 23:44:42 +0000552// ARM tools start.
553
554// Get SubArch (vN).
555static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
556 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000557 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000558}
559
560// True if M-profile.
561static bool isARMMProfile(const llvm::Triple &Triple) {
562 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000563 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000564 return Profile == llvm::ARM::PK_M;
565}
566
567// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000568static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
569 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000570 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
571 CPU = A->getValue();
572 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
573 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000574 if (!FromAs)
575 return;
576
577 for (const Arg *A :
578 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
579 StringRef Value = A->getValue();
580 if (Value.startswith("-mcpu="))
581 CPU = Value.substr(6);
582 if (Value.startswith("-march="))
583 Arch = Value.substr(7);
584 }
Renato Goline17c5802015-07-27 23:44:42 +0000585}
586
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000587// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000588// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000589static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000590 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000591 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000592 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
593 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
595}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000596
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000597// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000598static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000599 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000600 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000601 unsigned FPUID = llvm::ARM::parseFPU(FPU);
602 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000603 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
604}
605
Bradley Smithbbf5a002015-11-18 16:33:48 +0000606// Decode ARM features from string like +[no]featureA+[no]featureB+...
607static bool DecodeARMFeatures(const Driver &D, StringRef text,
608 std::vector<const char *> &Features) {
609 SmallVector<StringRef, 8> Split;
610 text.split(Split, StringRef("+"), -1, false);
611
612 for (StringRef Feature : Split) {
613 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
614 if (FeatureName)
615 Features.push_back(FeatureName);
616 else
617 return false;
618 }
619 return true;
620}
621
Renato Golin7c542b42015-07-27 23:44:45 +0000622// Check if -march is valid by checking if it can be canonicalised and parsed.
623// getARMArch is used here instead of just checking the -march value in order
624// to handle -march=native correctly.
625static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000626 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000627 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000628 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000629 std::pair<StringRef, StringRef> Split = ArchName.split("+");
630
Renato Goline17c5802015-07-27 23:44:42 +0000631 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000632 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
633 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000634 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000635}
636
Renato Golin7c542b42015-07-27 23:44:45 +0000637// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
638static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
639 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000640 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000641 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000642 std::pair<StringRef, StringRef> Split = CPUName.split("+");
643
Renato Goline17c5802015-07-27 23:44:42 +0000644 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000645 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
646 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000647 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000648}
649
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000650static bool useAAPCSForMachO(const llvm::Triple &T) {
651 // The backend is hardwired to assume AAPCS for M-class processors, ensure
652 // the frontend matches that.
653 return T.getEnvironment() == llvm::Triple::EABI ||
654 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
655}
656
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000657// Select the float ABI as determined by -msoft-float, -mhard-float, and
658// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000659arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
660 const Driver &D = TC.getDriver();
661 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 auto SubArch = getARMSubArchVersionNumber(Triple);
663 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000664 if (Arg *A =
665 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
666 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000667 if (A->getOption().matches(options::OPT_msoft_float)) {
668 ABI = FloatABI::Soft;
669 } else if (A->getOption().matches(options::OPT_mhard_float)) {
670 ABI = FloatABI::Hard;
671 } else {
672 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
673 .Case("soft", FloatABI::Soft)
674 .Case("softfp", FloatABI::SoftFP)
675 .Case("hard", FloatABI::Hard)
676 .Default(FloatABI::Invalid);
677 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000678 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000679 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000680 }
681 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000682
683 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
684 // "apcs-gnu".
685 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000686 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000687 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
688 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000689 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000690 }
691
692 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000693 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000694 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000695 case llvm::Triple::Darwin:
696 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000697 case llvm::Triple::IOS:
698 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000699 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000700 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000701 break;
702 }
Tim Northover756447a2015-10-30 16:30:36 +0000703 case llvm::Triple::WatchOS:
704 ABI = FloatABI::Hard;
705 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000706
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000707 // FIXME: this is invalid for WindowsCE
708 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000709 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000710 break;
711
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000712 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000713 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000714 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000715 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000716 break;
717 default:
718 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000719 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000720 break;
721 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000722 break;
723
Daniel Dunbar78485922009-09-10 23:00:09 +0000724 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000725 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000726 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 case llvm::Triple::EABIHF:
728 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000729 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000730 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000731 case llvm::Triple::EABI:
732 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000733 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000734 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000735 case llvm::Triple::Android:
736 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000737 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000738 default:
739 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000740 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000741 if (Triple.getOS() != llvm::Triple::UnknownOS ||
742 !Triple.isOSBinFormatMachO())
743 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000744 break;
745 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000746 }
747 }
748
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000749 assert(ABI != FloatABI::Invalid && "must select an ABI");
750 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000751}
752
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000753static void getARMTargetFeatures(const ToolChain &TC,
754 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000755 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000756 std::vector<const char *> &Features,
757 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000758 const Driver &D = TC.getDriver();
759
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000760 bool KernelOrKext =
761 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000762 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000763 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
764 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
765
Nico Weber6e0ebae2015-04-29 21:16:40 +0000766 if (!ForAS) {
767 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
768 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
769 // stripped out by the ARM target. We should probably pass this a new
770 // -target-option, which is handled by the -cc1/-cc1as invocation.
771 //
772 // FIXME2: For consistency, it would be ideal if we set up the target
773 // machine state the same when using the frontend or the assembler. We don't
774 // currently do that for the assembler, we pass the options directly to the
775 // backend and never even instantiate the frontend TargetInfo. If we did,
776 // and used its handleTargetFeatures hook, then we could ensure the
777 // assembler and the frontend behave the same.
778
779 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000780 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000781 Features.push_back("+soft-float");
782
783 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000784 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000785 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000786 } else {
787 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
788 // to the assembler correctly.
789 for (const Arg *A :
790 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
791 StringRef Value = A->getValue();
792 if (Value.startswith("-mfpu=")) {
793 WaFPU = A;
794 } else if (Value.startswith("-mcpu=")) {
795 WaCPU = A;
796 } else if (Value.startswith("-mhwdiv=")) {
797 WaHDiv = A;
798 } else if (Value.startswith("-march=")) {
799 WaArch = A;
800 }
801 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000802 }
803
Renato Golin7c542b42015-07-27 23:44:45 +0000804 // Check -march. ClangAs gives preference to -Wa,-march=.
805 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000806 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000807 if (WaArch) {
808 if (ArchArg)
809 D.Diag(clang::diag::warn_drv_unused_argument)
810 << ArchArg->getAsString(Args);
811 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000812 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000813 // FIXME: Set Arch.
814 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
815 } else if (ArchArg) {
816 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000817 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000818 }
819
Renato Golin7c542b42015-07-27 23:44:45 +0000820 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
821 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000822 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000823 if (WaCPU) {
824 if (CPUArg)
825 D.Diag(clang::diag::warn_drv_unused_argument)
826 << CPUArg->getAsString(Args);
827 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000828 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000829 } else if (CPUArg) {
830 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000831 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000832 }
John Brawna95c1a82015-05-08 12:52:18 +0000833
Renato Golin23459c62015-07-30 16:40:17 +0000834 // Add CPU features for generic CPUs
835 if (CPUName == "native") {
836 llvm::StringMap<bool> HostFeatures;
837 if (llvm::sys::getHostCPUFeatures(HostFeatures))
838 for (auto &F : HostFeatures)
839 Features.push_back(
840 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
841 }
842
843 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
844 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
845 if (WaFPU) {
846 if (FPUArg)
847 D.Diag(clang::diag::warn_drv_unused_argument)
848 << FPUArg->getAsString(Args);
849 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
850 Features);
851 } else if (FPUArg) {
852 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
853 }
854
855 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
856 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
857 if (WaHDiv) {
858 if (HDivArg)
859 D.Diag(clang::diag::warn_drv_unused_argument)
860 << HDivArg->getAsString(Args);
861 getARMHWDivFeatures(D, WaHDiv, Args,
862 StringRef(WaHDiv->getValue()).substr(8), Features);
863 } else if (HDivArg)
864 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
865
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000866 // Setting -msoft-float effectively disables NEON because of the GCC
867 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000868 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000869 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000870 // Also need to explicitly disable features which imply NEON.
871 Features.push_back("-crypto");
872 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000873
Eric Christopher269c2a22015-04-04 03:34:43 +0000874 // En/disable crc code generation.
875 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000876 if (A->getOption().matches(options::OPT_mcrc))
877 Features.push_back("+crc");
878 else
879 Features.push_back("-crc");
880 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000881
882 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
883 Features.insert(Features.begin(), "+v8.1a");
884 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000885
Akira Hatanakac2694822015-07-07 08:28:42 +0000886 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
887 // neither options are specified, see if we are compiling for kernel/kext and
888 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000889 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
890 options::OPT_mno_long_calls)) {
891 if (A->getOption().matches(options::OPT_mlong_calls))
892 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000893 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
894 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000895 Features.push_back("+long-calls");
896 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000897
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000898 // Kernel code has more strict alignment requirements.
899 if (KernelOrKext)
900 Features.push_back("+strict-align");
901 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
902 options::OPT_munaligned_access)) {
903 if (A->getOption().matches(options::OPT_munaligned_access)) {
904 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
905 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
906 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
907 } else
908 Features.push_back("+strict-align");
909 } else {
910 // Assume pre-ARMv6 doesn't support unaligned accesses.
911 //
912 // ARMv6 may or may not support unaligned accesses depending on the
913 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
914 // Darwin and NetBSD targets support unaligned accesses, and others don't.
915 //
916 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
917 // which raises an alignment fault on unaligned accesses. Linux
918 // defaults this bit to 0 and handles it as a system-wide (not
919 // per-process) setting. It is therefore safe to assume that ARMv7+
920 // Linux targets support unaligned accesses. The same goes for NaCl.
921 //
922 // The above behavior is consistent with GCC.
923 int VersionNum = getARMSubArchVersionNumber(Triple);
924 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000925 if (VersionNum < 6 ||
926 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000927 Features.push_back("+strict-align");
928 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
929 if (VersionNum < 7)
930 Features.push_back("+strict-align");
931 } else
932 Features.push_back("+strict-align");
933 }
934
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000935 // llvm does not support reserving registers in general. There is support
936 // for reserving r9 on ARM though (defined as a platform-specific register
937 // in ARM EABI).
938 if (Args.hasArg(options::OPT_ffixed_r9))
939 Features.push_back("+reserve-r9");
940
Dimitry Andric08107392016-01-06 07:42:18 +0000941 // The kext linker doesn't know how to deal with movw/movt.
942 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +0000943 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000944}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000945
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000946void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
947 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000948 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000949 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000950 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000951 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000952 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000953 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000954 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000955 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000956 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000957 } else if (Triple.isWatchOS()) {
958 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000959 } else {
960 ABIName = "apcs-gnu";
961 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000962 } else if (Triple.isOSWindows()) {
963 // FIXME: this is invalid for WindowsCE
964 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000965 } else {
966 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000967 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000968 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000969 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000970 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000971 ABIName = "aapcs-linux";
972 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000973 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000974 case llvm::Triple::EABI:
975 ABIName = "aapcs";
976 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000977 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000978 if (Triple.getOS() == llvm::Triple::NetBSD)
979 ABIName = "apcs-gnu";
980 else
981 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000982 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000983 }
984 }
985 CmdArgs.push_back("-target-abi");
986 CmdArgs.push_back(ABIName);
987
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000988 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000989 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000990 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000991 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000992 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000993 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000994 CmdArgs.push_back("-mfloat-abi");
995 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000996 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000997 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000998 CmdArgs.push_back("-mfloat-abi");
999 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001000 } else {
1001 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001002 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001003 CmdArgs.push_back("-mfloat-abi");
1004 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001005 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001006
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001008 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1009 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001011 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001012 CmdArgs.push_back("-arm-global-merge=false");
1013 else
1014 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001015 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001016
Bob Wilson9c8af452013-04-11 18:53:25 +00001017 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001018 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001019 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001020}
Renato Goline17c5802015-07-27 23:44:42 +00001021// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001022
Tim Northover573cbee2014-05-24 12:52:07 +00001023/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1024/// targeting.
1025static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001026 Arg *A;
1027 std::string CPU;
1028 // If we have -mtune or -mcpu, use that.
1029 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001030 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001031 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001032 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001033 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001034 }
1035
Kevin Qin110db6f2014-07-18 07:03:22 +00001036 // Handle CPU name is 'native'.
1037 if (CPU == "native")
1038 return llvm::sys::getHostCPUName();
1039 else if (CPU.size())
1040 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001041
James Molloy9b1586b2014-04-17 12:51:17 +00001042 // Make sure we pick "cyclone" if -arch is used.
1043 // FIXME: Should this be picked by checking the target triple instead?
1044 if (Args.getLastArg(options::OPT_arch))
1045 return "cyclone";
1046
1047 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001048}
1049
Tim Northover573cbee2014-05-24 12:52:07 +00001050void Clang::AddAArch64TargetArgs(const ArgList &Args,
1051 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001052 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1053 llvm::Triple Triple(TripleStr);
1054
1055 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1056 Args.hasArg(options::OPT_mkernel) ||
1057 Args.hasArg(options::OPT_fapple_kext))
1058 CmdArgs.push_back("-disable-red-zone");
1059
1060 if (!Args.hasFlag(options::OPT_mimplicit_float,
1061 options::OPT_mno_implicit_float, true))
1062 CmdArgs.push_back("-no-implicit-float");
1063
Craig Topper92fc2df2014-05-17 16:56:41 +00001064 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001065 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1066 ABIName = A->getValue();
1067 else if (Triple.isOSDarwin())
1068 ABIName = "darwinpcs";
1069 else
1070 ABIName = "aapcs";
1071
1072 CmdArgs.push_back("-target-abi");
1073 CmdArgs.push_back(ABIName);
1074
Bradley Smith9ff64332014-10-13 10:16:06 +00001075 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1076 options::OPT_mno_fix_cortex_a53_835769)) {
1077 CmdArgs.push_back("-backend-option");
1078 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1079 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1080 else
1081 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001082 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001083 // Enabled A53 errata (835769) workaround by default on android
1084 CmdArgs.push_back("-backend-option");
1085 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001086 }
1087
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001088 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001089 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1090 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001091 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001092 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001093 CmdArgs.push_back("-aarch64-global-merge=false");
1094 else
1095 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001096 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001097}
1098
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001099// Get CPU and ABI names. They are not independent
1100// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001101void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1102 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001103 const char *DefMips32CPU = "mips32r2";
1104 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001105
Daniel Sanders2bf13662014-07-10 14:40:57 +00001106 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1107 // default for mips64(el)?-img-linux-gnu.
1108 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1109 Triple.getEnvironment() == llvm::Triple::GNU) {
1110 DefMips32CPU = "mips32r6";
1111 DefMips64CPU = "mips64r6";
1112 }
Renato Golin7c542b42015-07-27 23:44:45 +00001113
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001114 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001115 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001116 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001117
Brad Smithba26f582015-01-06 02:53:17 +00001118 // MIPS3 is the default for mips64*-unknown-openbsd.
1119 if (Triple.getOS() == llvm::Triple::OpenBSD)
1120 DefMips64CPU = "mips3";
1121
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001122 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001123 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001124
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001125 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001126 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001127 // Convert a GNU style Mips ABI name to the name
1128 // accepted by LLVM Mips backend.
1129 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001130 .Case("32", "o32")
1131 .Case("64", "n64")
1132 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001133 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001134
1135 // Setup default CPU and ABI names.
1136 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001137 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001138 default:
1139 llvm_unreachable("Unexpected triple arch name");
1140 case llvm::Triple::mips:
1141 case llvm::Triple::mipsel:
1142 CPUName = DefMips32CPU;
1143 break;
1144 case llvm::Triple::mips64:
1145 case llvm::Triple::mips64el:
1146 CPUName = DefMips64CPU;
1147 break;
1148 }
1149 }
1150
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001151 if (ABIName.empty()) {
1152 // Deduce ABI name from the target triple.
1153 if (Triple.getArch() == llvm::Triple::mips ||
1154 Triple.getArch() == llvm::Triple::mipsel)
1155 ABIName = "o32";
1156 else
1157 ABIName = "n64";
1158 }
1159
1160 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001161 // Deduce CPU name from ABI name.
1162 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001163 .Cases("o32", "eabi", DefMips32CPU)
1164 .Cases("n32", "n64", DefMips64CPU)
1165 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001166 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001167
1168 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001169}
1170
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001171std::string mips::getMipsABILibSuffix(const ArgList &Args,
1172 const llvm::Triple &Triple) {
1173 StringRef CPUName, ABIName;
1174 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1175 return llvm::StringSwitch<std::string>(ABIName)
1176 .Case("o32", "")
1177 .Case("n32", "32")
1178 .Case("n64", "64");
1179}
1180
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001181// Convert ABI name to the GNU tools acceptable variant.
1182static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1183 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001184 .Case("o32", "32")
1185 .Case("n64", "64")
1186 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001187}
1188
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001189// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1190// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001191static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1192 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A =
1194 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1195 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001196 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001197 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001198 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001201 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1202 .Case("soft", mips::FloatABI::Soft)
1203 .Case("hard", mips::FloatABI::Hard)
1204 .Default(mips::FloatABI::Invalid);
1205 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001206 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001207 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001208 }
1209 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001210 }
1211
1212 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001213 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001214 // Assume "hard", because it's a default value used by gcc.
1215 // When we start to recognize specific target MIPS processors,
1216 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001217 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001218 }
1219
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001220 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1221 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001222}
1223
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001224static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001225 std::vector<const char *> &Features,
1226 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001227 StringRef FeatureName) {
1228 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001229 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001230 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001231 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001232 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001233 }
1234}
1235
Daniel Sanders379d44b2014-07-16 11:52:23 +00001236static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1237 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001238 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001239 StringRef CPUName;
1240 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001241 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001242 ABIName = getGnuCompatibleMipsABIName(ABIName);
1243
Daniel Sandersfeb61302014-08-08 15:47:17 +00001244 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1245 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001246
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001247 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1248 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001249 // FIXME: Note, this is a hack. We need to pass the selected float
1250 // mode to the MipsTargetInfoBase to define appropriate macros there.
1251 // Now it is the only method.
1252 Features.push_back("+soft-float");
1253 }
1254
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001255 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001256 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001257 if (Val == "2008") {
1258 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1259 Features.push_back("+nan2008");
1260 else {
1261 Features.push_back("-nan2008");
1262 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1263 }
1264 } else if (Val == "legacy") {
1265 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1266 Features.push_back("-nan2008");
1267 else {
1268 Features.push_back("+nan2008");
1269 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1270 }
1271 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001272 D.Diag(diag::err_drv_unsupported_option_argument)
1273 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001274 }
1275
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001276 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1277 options::OPT_mdouble_float, "single-float");
1278 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1279 "mips16");
1280 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1281 options::OPT_mno_micromips, "micromips");
1282 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1283 "dsp");
1284 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1285 "dspr2");
1286 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1287 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001288
1289 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1290 // pass -mfpxx
1291 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1292 options::OPT_mfp64)) {
1293 if (A->getOption().matches(options::OPT_mfp32))
1294 Features.push_back(Args.MakeArgString("-fp64"));
1295 else if (A->getOption().matches(options::OPT_mfpxx)) {
1296 Features.push_back(Args.MakeArgString("+fpxx"));
1297 Features.push_back(Args.MakeArgString("+nooddspreg"));
1298 } else
1299 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001300 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001301 Features.push_back(Args.MakeArgString("+fpxx"));
1302 Features.push_back(Args.MakeArgString("+nooddspreg"));
1303 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001304
Daniel Sanders28e5d392014-07-10 10:39:51 +00001305 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1306 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001307}
1308
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001309void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001310 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001311 const Driver &D = getToolChain().getDriver();
1312 StringRef CPUName;
1313 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001314 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001315 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001316
1317 CmdArgs.push_back("-target-abi");
1318 CmdArgs.push_back(ABIName.data());
1319
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001320 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1321 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001322 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001323 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001324 CmdArgs.push_back("-mfloat-abi");
1325 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001326 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001327 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001328 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001329 CmdArgs.push_back("-mfloat-abi");
1330 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001331 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001332
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001333 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1334 if (A->getOption().matches(options::OPT_mxgot)) {
1335 CmdArgs.push_back("-mllvm");
1336 CmdArgs.push_back("-mxgot");
1337 }
1338 }
1339
Simon Atanasyanc580b322013-05-11 06:33:44 +00001340 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1341 options::OPT_mno_ldc1_sdc1)) {
1342 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1343 CmdArgs.push_back("-mllvm");
1344 CmdArgs.push_back("-mno-ldc1-sdc1");
1345 }
1346 }
1347
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001348 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1349 options::OPT_mno_check_zero_division)) {
1350 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1351 CmdArgs.push_back("-mllvm");
1352 CmdArgs.push_back("-mno-check-zero-division");
1353 }
1354 }
1355
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001356 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001357 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001358 CmdArgs.push_back("-mllvm");
1359 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1360 A->claim();
1361 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001362}
1363
Hal Finkel8eb59282012-06-11 22:35:19 +00001364/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1365static std::string getPPCTargetCPU(const ArgList &Args) {
1366 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001367 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001368
1369 if (CPUName == "native") {
1370 std::string CPU = llvm::sys::getHostCPUName();
1371 if (!CPU.empty() && CPU != "generic")
1372 return CPU;
1373 else
1374 return "";
1375 }
1376
1377 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001378 .Case("common", "generic")
1379 .Case("440", "440")
1380 .Case("440fp", "440")
1381 .Case("450", "450")
1382 .Case("601", "601")
1383 .Case("602", "602")
1384 .Case("603", "603")
1385 .Case("603e", "603e")
1386 .Case("603ev", "603ev")
1387 .Case("604", "604")
1388 .Case("604e", "604e")
1389 .Case("620", "620")
1390 .Case("630", "pwr3")
1391 .Case("G3", "g3")
1392 .Case("7400", "7400")
1393 .Case("G4", "g4")
1394 .Case("7450", "7450")
1395 .Case("G4+", "g4+")
1396 .Case("750", "750")
1397 .Case("970", "970")
1398 .Case("G5", "g5")
1399 .Case("a2", "a2")
1400 .Case("a2q", "a2q")
1401 .Case("e500mc", "e500mc")
1402 .Case("e5500", "e5500")
1403 .Case("power3", "pwr3")
1404 .Case("power4", "pwr4")
1405 .Case("power5", "pwr5")
1406 .Case("power5x", "pwr5x")
1407 .Case("power6", "pwr6")
1408 .Case("power6x", "pwr6x")
1409 .Case("power7", "pwr7")
1410 .Case("power8", "pwr8")
1411 .Case("pwr3", "pwr3")
1412 .Case("pwr4", "pwr4")
1413 .Case("pwr5", "pwr5")
1414 .Case("pwr5x", "pwr5x")
1415 .Case("pwr6", "pwr6")
1416 .Case("pwr6x", "pwr6x")
1417 .Case("pwr7", "pwr7")
1418 .Case("pwr8", "pwr8")
1419 .Case("powerpc", "ppc")
1420 .Case("powerpc64", "ppc64")
1421 .Case("powerpc64le", "ppc64le")
1422 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001423 }
1424
1425 return "";
1426}
1427
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001428static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1429 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001430 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001431 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001432
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001433 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1434 if (FloatABI == ppc::FloatABI::Soft &&
1435 !(Triple.getArch() == llvm::Triple::ppc64 ||
1436 Triple.getArch() == llvm::Triple::ppc64le))
1437 Features.push_back("+soft-float");
1438 else if (FloatABI == ppc::FloatABI::Soft &&
1439 (Triple.getArch() == llvm::Triple::ppc64 ||
1440 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001441 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001442 << "soft float is not supported for ppc64";
1443
Eric Christopher643bb6a2013-10-16 20:40:08 +00001444 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001445 AddTargetFeature(Args, Features, options::OPT_faltivec,
1446 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001447}
1448
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001449ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1450 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1451 if (Arg *A =
1452 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1453 options::OPT_mfloat_abi_EQ)) {
1454 if (A->getOption().matches(options::OPT_msoft_float))
1455 ABI = ppc::FloatABI::Soft;
1456 else if (A->getOption().matches(options::OPT_mhard_float))
1457 ABI = ppc::FloatABI::Hard;
1458 else {
1459 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1460 .Case("soft", ppc::FloatABI::Soft)
1461 .Case("hard", ppc::FloatABI::Hard)
1462 .Default(ppc::FloatABI::Invalid);
1463 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1464 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1465 ABI = ppc::FloatABI::Hard;
1466 }
1467 }
1468 }
1469
1470 // If unspecified, choose the default based on the platform.
1471 if (ABI == ppc::FloatABI::Invalid) {
1472 ABI = ppc::FloatABI::Hard;
1473 }
1474
1475 return ABI;
1476}
1477
Ulrich Weigand8afad612014-07-28 13:17:52 +00001478void Clang::AddPPCTargetArgs(const ArgList &Args,
1479 ArgStringList &CmdArgs) const {
1480 // Select the ABI to use.
1481 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001482 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001483 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001484 case llvm::Triple::ppc64: {
1485 // When targeting a processor that supports QPX, or if QPX is
1486 // specifically enabled, default to using the ABI that supports QPX (so
1487 // long as it is not specifically disabled).
1488 bool HasQPX = false;
1489 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1490 HasQPX = A->getValue() == StringRef("a2q");
1491 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1492 if (HasQPX) {
1493 ABIName = "elfv1-qpx";
1494 break;
1495 }
1496
Ulrich Weigand8afad612014-07-28 13:17:52 +00001497 ABIName = "elfv1";
1498 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001499 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001500 case llvm::Triple::ppc64le:
1501 ABIName = "elfv2";
1502 break;
1503 default:
1504 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001505 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001506
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001507 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1508 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1509 // the option if given as we don't have backend support for any targets
1510 // that don't use the altivec abi.
1511 if (StringRef(A->getValue()) != "altivec")
1512 ABIName = A->getValue();
1513
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001514 ppc::FloatABI FloatABI =
1515 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1516
1517 if (FloatABI == ppc::FloatABI::Soft) {
1518 // Floating point operations and argument passing are soft.
1519 CmdArgs.push_back("-msoft-float");
1520 CmdArgs.push_back("-mfloat-abi");
1521 CmdArgs.push_back("soft");
1522 } else {
1523 // Floating point operations and argument passing are hard.
1524 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1525 CmdArgs.push_back("-mfloat-abi");
1526 CmdArgs.push_back("hard");
1527 }
1528
Ulrich Weigand8afad612014-07-28 13:17:52 +00001529 if (ABIName) {
1530 CmdArgs.push_back("-target-abi");
1531 CmdArgs.push_back(ABIName);
1532 }
1533}
1534
1535bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1536 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1537 return A && (A->getValue() == StringRef(Value));
1538}
1539
Tom Stellard6674c702013-04-01 20:56:53 +00001540/// Get the (LLVM) name of the R600 gpu we are targeting.
1541static std::string getR600TargetGPU(const ArgList &Args) {
1542 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001543 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001544 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001545 .Cases("rv630", "rv635", "r600")
1546 .Cases("rv610", "rv620", "rs780", "rs880")
1547 .Case("rv740", "rv770")
1548 .Case("palm", "cedar")
1549 .Cases("sumo", "sumo2", "sumo")
1550 .Case("hemlock", "cypress")
1551 .Case("aruba", "cayman")
1552 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001553 }
1554 return "";
1555}
1556
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001557void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001558 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001559 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001560 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001561
James Y Knightb2406522015-06-15 20:51:24 +00001562 bool SoftFloatABI = false;
1563 if (Arg *A =
1564 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001565 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001566 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001567 }
1568
James Y Knightb2406522015-06-15 20:51:24 +00001569 // Only the hard-float ABI on Sparc is standardized, and it is the
1570 // default. GCC also supports a nonstandard soft-float ABI mode, and
1571 // perhaps LLVM should implement that, too. However, since llvm
1572 // currently does not support Sparc soft-float, at all, display an
1573 // error if it's requested.
1574 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001575 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1576 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001577 }
1578}
1579
Richard Sandiford4652d892013-07-19 16:51:51 +00001580static const char *getSystemZTargetCPU(const ArgList &Args) {
1581 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1582 return A->getValue();
1583 return "z10";
1584}
1585
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001586static void getSystemZTargetFeatures(const ArgList &Args,
1587 std::vector<const char *> &Features) {
1588 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001589 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001590 if (A->getOption().matches(options::OPT_mhtm))
1591 Features.push_back("+transactional-execution");
1592 else
1593 Features.push_back("-transactional-execution");
1594 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001595 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001596 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001597 if (A->getOption().matches(options::OPT_mvx))
1598 Features.push_back("+vector");
1599 else
1600 Features.push_back("-vector");
1601 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001602}
1603
Chandler Carruth953fb082013-01-13 11:46:33 +00001604static const char *getX86TargetCPU(const ArgList &Args,
1605 const llvm::Triple &Triple) {
1606 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001607 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001608 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 return "core-avx2";
1610
Chandler Carruth953fb082013-01-13 11:46:33 +00001611 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001612 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001613
1614 // FIXME: Reject attempts to use -march=native unless the target matches
1615 // the host.
1616 //
1617 // FIXME: We should also incorporate the detected target features for use
1618 // with -native.
1619 std::string CPU = llvm::sys::getHostCPUName();
1620 if (!CPU.empty() && CPU != "generic")
1621 return Args.MakeArgString(CPU);
1622 }
1623
Reid Kleckner3123eff2015-06-30 16:32:04 +00001624 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1625 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1626 StringRef Arch = A->getValue();
1627 const char *CPU;
1628 if (Triple.getArch() == llvm::Triple::x86) {
1629 CPU = llvm::StringSwitch<const char *>(Arch)
1630 .Case("IA32", "i386")
1631 .Case("SSE", "pentium3")
1632 .Case("SSE2", "pentium4")
1633 .Case("AVX", "sandybridge")
1634 .Case("AVX2", "haswell")
1635 .Default(nullptr);
1636 } else {
1637 CPU = llvm::StringSwitch<const char *>(Arch)
1638 .Case("AVX", "sandybridge")
1639 .Case("AVX2", "haswell")
1640 .Default(nullptr);
1641 }
1642 if (CPU)
1643 return CPU;
1644 }
1645
Chandler Carruth953fb082013-01-13 11:46:33 +00001646 // Select the default CPU if none was given (or detection failed).
1647
1648 if (Triple.getArch() != llvm::Triple::x86_64 &&
1649 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001650 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001651
1652 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1653
1654 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001655 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001656 if (Triple.getArchName() == "x86_64h")
1657 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001658 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001659 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001660
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001661 // Set up default CPU name for PS4 compilers.
1662 if (Triple.isPS4CPU())
1663 return "btver2";
1664
Alexey Bataev286d1b92014-01-31 04:07:13 +00001665 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001666 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001667 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001668
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001669 // Everything else goes to x86-64 in 64-bit mode.
1670 if (Is64Bit)
1671 return "x86-64";
1672
1673 switch (Triple.getOS()) {
1674 case llvm::Triple::FreeBSD:
1675 case llvm::Triple::NetBSD:
1676 case llvm::Triple::OpenBSD:
1677 return "i486";
1678 case llvm::Triple::Haiku:
1679 return "i586";
1680 case llvm::Triple::Bitrig:
1681 return "i686";
1682 default:
1683 // Fallback to p4.
1684 return "pentium4";
1685 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001686}
1687
Dan Gohmanc2853072015-09-03 22:51:53 +00001688/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1689static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1690 // If we have -mcpu=, use that.
1691 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1692 StringRef CPU = A->getValue();
1693
1694#ifdef __wasm__
1695 // Handle "native" by examining the host. "native" isn't meaningful when
1696 // cross compiling, so only support this when the host is also WebAssembly.
1697 if (CPU == "native")
1698 return llvm::sys::getHostCPUName();
1699#endif
1700
1701 return CPU;
1702 }
1703
1704 return "generic";
1705}
1706
Renato Golin7c542b42015-07-27 23:44:45 +00001707static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1708 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001709 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001710 default:
1711 return "";
1712
Amara Emerson703da2e2013-10-31 09:32:33 +00001713 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001714 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001715 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001716
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001717 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001718 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001719 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001720 case llvm::Triple::thumbeb: {
1721 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001722 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001723 return arm::getARMTargetCPU(MCPU, MArch, T);
1724 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001725 case llvm::Triple::mips:
1726 case llvm::Triple::mipsel:
1727 case llvm::Triple::mips64:
1728 case llvm::Triple::mips64el: {
1729 StringRef CPUName;
1730 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001731 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001732 return CPUName;
1733 }
1734
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001735 case llvm::Triple::nvptx:
1736 case llvm::Triple::nvptx64:
1737 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1738 return A->getValue();
1739 return "";
1740
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001741 case llvm::Triple::ppc:
1742 case llvm::Triple::ppc64:
1743 case llvm::Triple::ppc64le: {
1744 std::string TargetCPUName = getPPCTargetCPU(Args);
1745 // LLVM may default to generating code for the native CPU,
1746 // but, like gcc, we default to a more generic option for
1747 // each architecture. (except on Darwin)
1748 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1749 if (T.getArch() == llvm::Triple::ppc64)
1750 TargetCPUName = "ppc64";
1751 else if (T.getArch() == llvm::Triple::ppc64le)
1752 TargetCPUName = "ppc64le";
1753 else
1754 TargetCPUName = "ppc";
1755 }
1756 return TargetCPUName;
1757 }
1758
1759 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001760 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001761 case llvm::Triple::sparcv9:
1762 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001763 return A->getValue();
1764 return "";
1765
1766 case llvm::Triple::x86:
1767 case llvm::Triple::x86_64:
1768 return getX86TargetCPU(Args, T);
1769
1770 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001771 return "hexagon" +
1772 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001773
1774 case llvm::Triple::systemz:
1775 return getSystemZTargetCPU(Args);
1776
1777 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001778 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001779 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001780
1781 case llvm::Triple::wasm32:
1782 case llvm::Triple::wasm64:
1783 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001784 }
1785}
1786
Alp Tokerce365ca2013-12-02 12:43:03 +00001787static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001788 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001789 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1790 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1791 // forward.
1792 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001793 std::string Plugin =
1794 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001795 CmdArgs.push_back(Args.MakeArgString(Plugin));
1796
1797 // Try to pass driver level flags relevant to LTO code generation down to
1798 // the plugin.
1799
1800 // Handle flags for selecting CPU variants.
1801 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1802 if (!CPU.empty())
1803 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001804
James Molloyf97fdae2015-12-21 10:44:36 +00001805 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1806 StringRef OOpt;
1807 if (A->getOption().matches(options::OPT_O4) ||
1808 A->getOption().matches(options::OPT_Ofast))
1809 OOpt = "3";
1810 else if (A->getOption().matches(options::OPT_O))
1811 OOpt = A->getValue();
1812 else if (A->getOption().matches(options::OPT_O0))
1813 OOpt = "0";
1814 if (!OOpt.empty())
1815 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1816 }
1817
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001818 if (IsThinLTO)
1819 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001820}
1821
Sanjay Patel2987c292015-06-11 14:53:41 +00001822/// This is a helper function for validating the optional refinement step
1823/// parameter in reciprocal argument strings. Return false if there is an error
1824/// parsing the refinement step. Otherwise, return true and set the Position
1825/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001826static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001827 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001828 const char RefinementStepToken = ':';
1829 Position = In.find(RefinementStepToken);
1830 if (Position != StringRef::npos) {
1831 StringRef Option = A.getOption().getName();
1832 StringRef RefStep = In.substr(Position + 1);
1833 // Allow exactly one numeric character for the additional refinement
1834 // step parameter. This is reasonable for all currently-supported
1835 // operations and architectures because we would expect that a larger value
1836 // of refinement steps would cause the estimate "optimization" to
1837 // under-perform the native operation. Also, if the estimate does not
1838 // converge quickly, it probably will not ever converge, so further
1839 // refinement steps will not produce a better answer.
1840 if (RefStep.size() != 1) {
1841 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1842 return false;
1843 }
1844 char RefStepChar = RefStep[0];
1845 if (RefStepChar < '0' || RefStepChar > '9') {
1846 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1847 return false;
1848 }
1849 }
1850 return true;
1851}
1852
1853/// The -mrecip flag requires processing of many optional parameters.
1854static void ParseMRecip(const Driver &D, const ArgList &Args,
1855 ArgStringList &OutStrings) {
1856 StringRef DisabledPrefixIn = "!";
1857 StringRef DisabledPrefixOut = "!";
1858 StringRef EnabledPrefixOut = "";
1859 StringRef Out = "-mrecip=";
1860
1861 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1862 if (!A)
1863 return;
1864
1865 unsigned NumOptions = A->getNumValues();
1866 if (NumOptions == 0) {
1867 // No option is the same as "all".
1868 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1869 return;
1870 }
1871
1872 // Pass through "all", "none", or "default" with an optional refinement step.
1873 if (NumOptions == 1) {
1874 StringRef Val = A->getValue(0);
1875 size_t RefStepLoc;
1876 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1877 return;
1878 StringRef ValBase = Val.slice(0, RefStepLoc);
1879 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1880 OutStrings.push_back(Args.MakeArgString(Out + Val));
1881 return;
1882 }
1883 }
1884
1885 // Each reciprocal type may be enabled or disabled individually.
1886 // Check each input value for validity, concatenate them all back together,
1887 // and pass through.
1888
1889 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001890 OptionStrings.insert(std::make_pair("divd", false));
1891 OptionStrings.insert(std::make_pair("divf", false));
1892 OptionStrings.insert(std::make_pair("vec-divd", false));
1893 OptionStrings.insert(std::make_pair("vec-divf", false));
1894 OptionStrings.insert(std::make_pair("sqrtd", false));
1895 OptionStrings.insert(std::make_pair("sqrtf", false));
1896 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1897 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001898
1899 for (unsigned i = 0; i != NumOptions; ++i) {
1900 StringRef Val = A->getValue(i);
1901
1902 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1903 // Ignore the disablement token for string matching.
1904 if (IsDisabled)
1905 Val = Val.substr(1);
1906
1907 size_t RefStep;
1908 if (!getRefinementStep(Val, D, *A, RefStep))
1909 return;
1910
1911 StringRef ValBase = Val.slice(0, RefStep);
1912 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1913 if (OptionIter == OptionStrings.end()) {
1914 // Try again specifying float suffix.
1915 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1916 if (OptionIter == OptionStrings.end()) {
1917 // The input name did not match any known option string.
1918 D.Diag(diag::err_drv_unknown_argument) << Val;
1919 return;
1920 }
1921 // The option was specified without a float or double suffix.
1922 // Make sure that the double entry was not already specified.
1923 // The float entry will be checked below.
1924 if (OptionStrings[ValBase.str() + 'd']) {
1925 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1926 return;
1927 }
1928 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929
Sanjay Patel2987c292015-06-11 14:53:41 +00001930 if (OptionIter->second == true) {
1931 // Duplicate option specified.
1932 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1933 return;
1934 }
1935
1936 // Mark the matched option as found. Do not allow duplicate specifiers.
1937 OptionIter->second = true;
1938
1939 // If the precision was not specified, also mark the double entry as found.
1940 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1941 OptionStrings[ValBase.str() + 'd'] = true;
1942
1943 // Build the output string.
1944 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1945 Out = Args.MakeArgString(Out + Prefix + Val);
1946 if (i != NumOptions - 1)
1947 Out = Args.MakeArgString(Out + ",");
1948 }
1949
1950 OutStrings.push_back(Args.MakeArgString(Out));
1951}
1952
Eric Christopherc54920a2015-03-23 19:26:05 +00001953static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001954 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001955 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001956 // If -march=native, autodetect the feature list.
1957 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1958 if (StringRef(A->getValue()) == "native") {
1959 llvm::StringMap<bool> HostFeatures;
1960 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1961 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001962 Features.push_back(
1963 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001964 }
1965 }
1966
Jim Grosbach82eee262013-11-16 00:53:35 +00001967 if (Triple.getArchName() == "x86_64h") {
1968 // x86_64h implies quite a few of the more modern subtarget features
1969 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1970 Features.push_back("-rdrnd");
1971 Features.push_back("-aes");
1972 Features.push_back("-pclmul");
1973 Features.push_back("-rtm");
1974 Features.push_back("-hle");
1975 Features.push_back("-fsgsbase");
1976 }
1977
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001978 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001979 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001980 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001981 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001982 Features.push_back("+sse4.2");
1983 Features.push_back("+popcnt");
1984 } else
1985 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001986 }
1987
Eric Christopherc54920a2015-03-23 19:26:05 +00001988 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001989 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1990 StringRef Arch = A->getValue();
1991 bool ArchUsed = false;
1992 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001993 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001994 if (Arch == "AVX" || Arch == "AVX2") {
1995 ArchUsed = true;
1996 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1997 }
1998 }
1999 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002000 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002001 if (Arch == "IA32") {
2002 ArchUsed = true;
2003 } else if (Arch == "SSE" || Arch == "SSE2") {
2004 ArchUsed = true;
2005 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2006 }
2007 }
2008 if (!ArchUsed)
2009 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2010 }
2011
Jim Grosbach82eee262013-11-16 00:53:35 +00002012 // Now add any that the user explicitly requested on the command line,
2013 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002014 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002015}
2016
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002017void Clang::AddX86TargetArgs(const ArgList &Args,
2018 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002019 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002020 Args.hasArg(options::OPT_mkernel) ||
2021 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002022 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002023
Bob Wilson2616e2e2013-02-10 16:01:41 +00002024 // Default to avoid implicit floating-point for kernel/kext code, but allow
2025 // that to be overridden with -mno-soft-float.
2026 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2027 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002028 if (Arg *A = Args.getLastArg(
2029 options::OPT_msoft_float, options::OPT_mno_soft_float,
2030 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002031 const Option &O = A->getOption();
2032 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2033 O.matches(options::OPT_msoft_float));
2034 }
2035 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002036 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002037
2038 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2039 StringRef Value = A->getValue();
2040 if (Value == "intel" || Value == "att") {
2041 CmdArgs.push_back("-mllvm");
2042 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2043 } else {
2044 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2045 << A->getOption().getName() << Value;
2046 }
2047 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002048}
2049
Tony Linthicum76329bf2011-12-12 21:14:55 +00002050void Clang::AddHexagonTargetArgs(const ArgList &Args,
2051 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002052 CmdArgs.push_back("-mqdsp6-compat");
2053 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002054
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002055 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2056 std::string N = llvm::utostr(G.getValue());
2057 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002058 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002059 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002060 }
2061
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002062 if (!Args.hasArg(options::OPT_fno_short_enums))
2063 CmdArgs.push_back("-fshort-enums");
2064 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002065 CmdArgs.push_back("-mllvm");
2066 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002067 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002068 CmdArgs.push_back("-mllvm");
2069 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002070}
2071
Dan Gohmane3d71e12016-01-07 01:00:21 +00002072void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2073 ArgStringList &CmdArgs) const {
2074 // Default to "hidden" visibility.
2075 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2076 options::OPT_fvisibility_ms_compat)) {
2077 CmdArgs.push_back("-fvisibility");
2078 CmdArgs.push_back("hidden");
2079 }
2080}
2081
Kevin Qin110db6f2014-07-18 07:03:22 +00002082// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002083static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002084 std::vector<const char *> &Features) {
2085 SmallVector<StringRef, 8> Split;
2086 text.split(Split, StringRef("+"), -1, false);
2087
Benjamin Kramer72e64312015-09-24 14:48:49 +00002088 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002089 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002090 .Case("fp", "+fp-armv8")
2091 .Case("simd", "+neon")
2092 .Case("crc", "+crc")
2093 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002094 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002095 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002096 .Case("nofp", "-fp-armv8")
2097 .Case("nosimd", "-neon")
2098 .Case("nocrc", "-crc")
2099 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002100 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002101 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002102 .Default(nullptr);
2103 if (result)
2104 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002105 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002106 D.Diag(diag::err_drv_no_neon_modifier);
2107 else
2108 return false;
2109 }
2110 return true;
2111}
2112
2113// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2114// decode CPU and feature.
2115static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2116 std::vector<const char *> &Features) {
2117 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2118 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002119 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
MinSeong Kim50d9c152016-01-05 12:53:24 +00002120 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002121 Features.push_back("+neon");
2122 Features.push_back("+crc");
2123 Features.push_back("+crypto");
2124 } else if (CPU == "generic") {
2125 Features.push_back("+neon");
2126 } else {
2127 return false;
2128 }
2129
2130 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2131 return false;
2132
2133 return true;
2134}
2135
2136static bool
2137getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2138 const ArgList &Args,
2139 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002140 std::string MarchLowerCase = March.lower();
2141 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002142
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002143 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002144 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002145 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002146 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002147 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2148 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002149 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002150 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002151 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002152
2153 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2154 return false;
2155
2156 return true;
2157}
2158
2159static bool
2160getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2161 const ArgList &Args,
2162 std::vector<const char *> &Features) {
2163 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002164 std::string McpuLowerCase = Mcpu.lower();
2165 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002166 return false;
2167
2168 return true;
2169}
2170
2171static bool
2172getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2173 const ArgList &Args,
2174 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002175 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002176 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002177 if (MtuneLowerCase == "native")
2178 MtuneLowerCase = llvm::sys::getHostCPUName();
2179 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002180 Features.push_back("+zcm");
2181 Features.push_back("+zcz");
2182 }
2183 return true;
2184}
2185
2186static bool
2187getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2188 const ArgList &Args,
2189 std::vector<const char *> &Features) {
2190 StringRef CPU;
2191 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002192 std::string McpuLowerCase = Mcpu.lower();
2193 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002194 return false;
2195
2196 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2197}
2198
Justin Bognerf9052562015-11-13 23:07:31 +00002199static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002200 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002201 Arg *A;
2202 bool success = true;
2203 // Enable NEON by default.
2204 Features.push_back("+neon");
2205 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2206 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2207 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2208 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002209 else if (Args.hasArg(options::OPT_arch))
2210 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2211 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002212
2213 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2214 success =
2215 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2216 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2217 success =
2218 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002219 else if (Args.hasArg(options::OPT_arch))
2220 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2221 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002222
2223 if (!success)
2224 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002225
2226 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2227 Features.push_back("-fp-armv8");
2228 Features.push_back("-crypto");
2229 Features.push_back("-neon");
2230 }
Bradley Smith418c5932014-05-02 15:17:51 +00002231
2232 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002233 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002234 if (A->getOption().matches(options::OPT_mcrc))
2235 Features.push_back("+crc");
2236 else
2237 Features.push_back("-crc");
2238 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002239
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002240 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2241 options::OPT_munaligned_access))
2242 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2243 Features.push_back("+strict-align");
2244
Justin Bognerf9052562015-11-13 23:07:31 +00002245 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002246 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002247}
2248
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002249static void getHexagonTargetFeatures(const ArgList &Args,
2250 std::vector<const char *> &Features) {
2251 bool HasHVX = false, HasHVXD = false;
2252
Eric Christopher49062a52015-12-22 03:12:34 +00002253 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2254 // doing dependent option handling here rather than in initFeatureMap or a
2255 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002256 for (auto &A : Args) {
2257 auto &Opt = A->getOption();
2258 if (Opt.matches(options::OPT_mhexagon_hvx))
2259 HasHVX = true;
2260 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2261 HasHVXD = HasHVX = false;
2262 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2263 HasHVXD = HasHVX = true;
2264 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2265 HasHVXD = false;
2266 else
2267 continue;
2268 A->claim();
2269 }
2270
2271 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2272 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2273}
2274
Dan Gohmanc2853072015-09-03 22:51:53 +00002275static void getWebAssemblyTargetFeatures(const ArgList &Args,
2276 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002277 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002278}
2279
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002280static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002281 const ArgList &Args, ArgStringList &CmdArgs,
2282 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002283 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002284 std::vector<const char *> Features;
2285 switch (Triple.getArch()) {
2286 default:
2287 break;
2288 case llvm::Triple::mips:
2289 case llvm::Triple::mipsel:
2290 case llvm::Triple::mips64:
2291 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002292 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002293 break;
2294
2295 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002296 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002297 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002298 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002299 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002300 break;
2301
2302 case llvm::Triple::ppc:
2303 case llvm::Triple::ppc64:
2304 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002305 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002306 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002307 case llvm::Triple::systemz:
2308 getSystemZTargetFeatures(Args, Features);
2309 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002310 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002311 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002312 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002313 break;
2314 case llvm::Triple::x86:
2315 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002316 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002317 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002318 case llvm::Triple::hexagon:
2319 getHexagonTargetFeatures(Args, Features);
2320 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002321 case llvm::Triple::wasm32:
2322 case llvm::Triple::wasm64:
2323 getWebAssemblyTargetFeatures(Args, Features);
2324 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002325 }
Rafael Espindola43964802013-08-21 17:34:32 +00002326
2327 // Find the last of each feature.
2328 llvm::StringMap<unsigned> LastOpt;
2329 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2330 const char *Name = Features[I];
2331 assert(Name[0] == '-' || Name[0] == '+');
2332 LastOpt[Name + 1] = I;
2333 }
2334
2335 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2336 // If this feature was overridden, ignore it.
2337 const char *Name = Features[I];
2338 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2339 assert(LastI != LastOpt.end());
2340 unsigned Last = LastI->second;
2341 if (Last != I)
2342 continue;
2343
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002344 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002345 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002346 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002347}
2348
David Majnemerae394812014-12-09 00:12:30 +00002349static bool
2350shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2351 const llvm::Triple &Triple) {
2352 // We use the zero-cost exception tables for Objective-C if the non-fragile
2353 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2354 // later.
2355 if (runtime.isNonFragile())
2356 return true;
2357
2358 if (!Triple.isMacOSX())
2359 return false;
2360
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002361 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002362 (Triple.getArch() == llvm::Triple::x86_64 ||
2363 Triple.getArch() == llvm::Triple::arm));
2364}
2365
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002366/// Adds exception related arguments to the driver command arguments. There's a
2367/// master flag, -fexceptions and also language specific flags to enable/disable
2368/// C++ and Objective-C exceptions. This makes it possible to for example
2369/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002370static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002371 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002372 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002373 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002374 const Driver &D = TC.getDriver();
2375 const llvm::Triple &Triple = TC.getTriple();
2376
Chad Rosier4fab82c2012-03-26 22:04:46 +00002377 if (KernelOrKext) {
2378 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2379 // arguments now to avoid warnings about unused arguments.
2380 Args.ClaimAllArgs(options::OPT_fexceptions);
2381 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2382 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2383 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2384 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2385 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002386 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002387 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002388
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002389 // See if the user explicitly enabled exceptions.
2390 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2391 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002392
David Majnemerae394812014-12-09 00:12:30 +00002393 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2394 // is not necessarily sensible, but follows GCC.
2395 if (types::isObjC(InputType) &&
2396 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002397 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002398 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002399
David Majnemerae394812014-12-09 00:12:30 +00002400 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002401 }
2402
2403 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002404 // Disable C++ EH by default on XCore, PS4, and MSVC.
2405 // FIXME: Remove MSVC from this list once things work.
2406 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2407 !Triple.isPS4CPU() &&
2408 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002409 Arg *ExceptionArg = Args.getLastArg(
2410 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2411 options::OPT_fexceptions, options::OPT_fno_exceptions);
2412 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002413 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002414 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2415 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002416
2417 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002418 if (Triple.isPS4CPU()) {
2419 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2420 assert(ExceptionArg &&
2421 "On the PS4 exceptions should only be enabled if passing "
2422 "an argument");
2423 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2424 const Arg *RTTIArg = TC.getRTTIArg();
2425 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2426 D.Diag(diag::err_drv_argument_not_allowed_with)
2427 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2428 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2429 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2430 } else
2431 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2432
Anders Carlssone96ab552011-02-28 02:27:16 +00002433 CmdArgs.push_back("-fcxx-exceptions");
2434
David Majnemer8de68642014-12-05 08:11:58 +00002435 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002436 }
2437 }
2438
David Majnemer8de68642014-12-05 08:11:58 +00002439 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002440 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002441}
2442
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002443static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002444 bool Default = true;
2445 if (TC.getTriple().isOSDarwin()) {
2446 // The native darwin assembler doesn't support the linker_option directives,
2447 // so we disable them if we think the .s file will be passed to it.
2448 Default = TC.useIntegratedAs();
2449 }
2450 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2451 Default);
2452}
2453
Ted Kremenek62093662013-03-12 17:02:12 +00002454static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2455 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002456 bool UseDwarfDirectory =
2457 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2458 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002459 return !UseDwarfDirectory;
2460}
2461
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002462/// \brief Check whether the given input tree contains any compilation actions.
2463static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002464 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002465 return true;
2466
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002467 for (const auto &Act : *A)
2468 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002469 return true;
2470
2471 return false;
2472}
2473
2474/// \brief Check if -relax-all should be passed to the internal assembler.
2475/// This is done by default when compiling non-assembler source with -O0.
2476static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2477 bool RelaxDefault = true;
2478
2479 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2480 RelaxDefault = A->getOption().matches(options::OPT_O0);
2481
2482 if (RelaxDefault) {
2483 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002484 for (const auto &Act : C.getActions()) {
2485 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002486 RelaxDefault = true;
2487 break;
2488 }
2489 }
2490 }
2491
2492 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002493 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002494}
2495
Paul Robinson0334a042015-12-19 19:41:48 +00002496// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2497// to the corresponding DebugInfoKind.
2498static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
2499 assert(A.getOption().matches(options::OPT_gN_Group) &&
2500 "Not a -g option that specifies a debug-info level");
2501 if (A.getOption().matches(options::OPT_g0) ||
2502 A.getOption().matches(options::OPT_ggdb0))
2503 return CodeGenOptions::NoDebugInfo;
2504 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2505 A.getOption().matches(options::OPT_ggdb1))
2506 return CodeGenOptions::DebugLineTablesOnly;
2507 return CodeGenOptions::LimitedDebugInfo;
2508}
2509
Douglas Katzman3459ce22015-10-08 04:24:12 +00002510// Extract the integer N from a string spelled "-dwarf-N", returning 0
2511// on mismatch. The StringRef input (rather than an Arg) allows
2512// for use by the "-Xassembler" option parser.
2513static unsigned DwarfVersionNum(StringRef ArgValue) {
2514 return llvm::StringSwitch<unsigned>(ArgValue)
2515 .Case("-gdwarf-2", 2)
2516 .Case("-gdwarf-3", 3)
2517 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002518 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002519 .Default(0);
2520}
2521
2522static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2523 CodeGenOptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002524 unsigned DwarfVersion,
2525 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002526 switch (DebugInfoKind) {
2527 case CodeGenOptions::DebugLineTablesOnly:
2528 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2529 break;
2530 case CodeGenOptions::LimitedDebugInfo:
2531 CmdArgs.push_back("-debug-info-kind=limited");
2532 break;
2533 case CodeGenOptions::FullDebugInfo:
2534 CmdArgs.push_back("-debug-info-kind=standalone");
2535 break;
2536 default:
2537 break;
2538 }
2539 if (DwarfVersion > 0)
2540 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002541 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002542 switch (DebuggerTuning) {
2543 case llvm::DebuggerKind::GDB:
2544 CmdArgs.push_back("-debugger-tuning=gdb");
2545 break;
2546 case llvm::DebuggerKind::LLDB:
2547 CmdArgs.push_back("-debugger-tuning=lldb");
2548 break;
2549 case llvm::DebuggerKind::SCE:
2550 CmdArgs.push_back("-debugger-tuning=sce");
2551 break;
2552 default:
2553 break;
2554 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002555}
2556
David Blaikie9260ed62013-07-25 21:19:01 +00002557static void CollectArgsForIntegratedAssembler(Compilation &C,
2558 const ArgList &Args,
2559 ArgStringList &CmdArgs,
2560 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002561 if (UseRelaxAll(C, Args))
2562 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002563
David Majnemer2b9349d2015-12-21 22:09:34 +00002564 // Only default to -mincremental-linker-compatible if we think we are
2565 // targeting the MSVC linker.
2566 bool DefaultIncrementalLinkerCompatible =
2567 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2568 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2569 options::OPT_mno_incremental_linker_compatible,
2570 DefaultIncrementalLinkerCompatible))
2571 CmdArgs.push_back("-mincremental-linker-compatible");
2572
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002573 // When passing -I arguments to the assembler we sometimes need to
2574 // unconditionally take the next argument. For example, when parsing
2575 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2576 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2577 // arg after parsing the '-I' arg.
2578 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002580 // When using an integrated assembler, translate -Wa, and -Xassembler
2581 // options.
2582 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002583 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002584 for (const Arg *A :
2585 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2586 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002587
Benjamin Kramer72e64312015-09-24 14:48:49 +00002588 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002589 if (TakeNextArg) {
2590 CmdArgs.push_back(Value.data());
2591 TakeNextArg = false;
2592 continue;
2593 }
David Blaikie9260ed62013-07-25 21:19:01 +00002594
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002595 switch (C.getDefaultToolChain().getArch()) {
2596 default:
2597 break;
2598 case llvm::Triple::mips:
2599 case llvm::Triple::mipsel:
2600 case llvm::Triple::mips64:
2601 case llvm::Triple::mips64el:
2602 if (Value == "--trap") {
2603 CmdArgs.push_back("-target-feature");
2604 CmdArgs.push_back("+use-tcc-in-div");
2605 continue;
2606 }
2607 if (Value == "--break") {
2608 CmdArgs.push_back("-target-feature");
2609 CmdArgs.push_back("-use-tcc-in-div");
2610 continue;
2611 }
2612 if (Value.startswith("-msoft-float")) {
2613 CmdArgs.push_back("-target-feature");
2614 CmdArgs.push_back("+soft-float");
2615 continue;
2616 }
2617 if (Value.startswith("-mhard-float")) {
2618 CmdArgs.push_back("-target-feature");
2619 CmdArgs.push_back("-soft-float");
2620 continue;
2621 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002622
2623 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2624 .Case("-mips1", "+mips1")
2625 .Case("-mips2", "+mips2")
2626 .Case("-mips3", "+mips3")
2627 .Case("-mips4", "+mips4")
2628 .Case("-mips5", "+mips5")
2629 .Case("-mips32", "+mips32")
2630 .Case("-mips32r2", "+mips32r2")
2631 .Case("-mips32r3", "+mips32r3")
2632 .Case("-mips32r5", "+mips32r5")
2633 .Case("-mips32r6", "+mips32r6")
2634 .Case("-mips64", "+mips64")
2635 .Case("-mips64r2", "+mips64r2")
2636 .Case("-mips64r3", "+mips64r3")
2637 .Case("-mips64r5", "+mips64r5")
2638 .Case("-mips64r6", "+mips64r6")
2639 .Default(nullptr);
2640 if (MipsTargetFeature)
2641 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002642 }
2643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002644 if (Value == "-force_cpusubtype_ALL") {
2645 // Do nothing, this is the default and we don't support anything else.
2646 } else if (Value == "-L") {
2647 CmdArgs.push_back("-msave-temp-labels");
2648 } else if (Value == "--fatal-warnings") {
2649 CmdArgs.push_back("-massembler-fatal-warnings");
2650 } else if (Value == "--noexecstack") {
2651 CmdArgs.push_back("-mnoexecstack");
2652 } else if (Value == "-compress-debug-sections" ||
2653 Value == "--compress-debug-sections") {
2654 CompressDebugSections = true;
2655 } else if (Value == "-nocompress-debug-sections" ||
2656 Value == "--nocompress-debug-sections") {
2657 CompressDebugSections = false;
2658 } else if (Value.startswith("-I")) {
2659 CmdArgs.push_back(Value.data());
2660 // We need to consume the next argument if the current arg is a plain
2661 // -I. The next arg will be the include directory.
2662 if (Value == "-I")
2663 TakeNextArg = true;
2664 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002665 // "-gdwarf-N" options are not cc1as options.
2666 unsigned DwarfVersion = DwarfVersionNum(Value);
2667 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2668 CmdArgs.push_back(Value.data());
2669 } else {
2670 RenderDebugEnablingArgs(
Paul Robinson0334a042015-12-19 19:41:48 +00002671 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
2672 llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002673 }
Renato Golin7c542b42015-07-27 23:44:45 +00002674 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2675 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2676 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002677 } else {
2678 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002679 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002680 }
2681 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002682 }
2683 if (CompressDebugSections) {
2684 if (llvm::zlib::isAvailable())
2685 CmdArgs.push_back("-compress-debug-sections");
2686 else
2687 D.Diag(diag::warn_debug_compression_unavailable);
2688 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002689 if (MipsTargetFeature != nullptr) {
2690 CmdArgs.push_back("-target-feature");
2691 CmdArgs.push_back(MipsTargetFeature);
2692 }
David Blaikie9260ed62013-07-25 21:19:01 +00002693}
2694
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002695// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002696// FIXME: Make sure we can also emit shared objects if they're requested
2697// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002698static void addClangRT(const ToolChain &TC, const ArgList &Args,
2699 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002700 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002701}
2702
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002703namespace {
2704enum OpenMPRuntimeKind {
2705 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2706 /// without knowing what runtime to target.
2707 OMPRT_Unknown,
2708
2709 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2710 /// the default for Clang.
2711 OMPRT_OMP,
2712
2713 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2714 /// this runtime but can swallow the pragmas, and find and link against the
2715 /// runtime library itself.
2716 OMPRT_GOMP,
2717
Chandler Carruthc6625c62015-05-28 21:10:31 +00002718 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002719 /// OpenMP runtime. We support this mode for users with existing dependencies
2720 /// on this runtime library name.
2721 OMPRT_IOMP5
2722};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002723}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002724
2725/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002726static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2727 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002728 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2729
2730 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2731 if (A)
2732 RuntimeName = A->getValue();
2733
2734 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002735 .Case("libomp", OMPRT_OMP)
2736 .Case("libgomp", OMPRT_GOMP)
2737 .Case("libiomp5", OMPRT_IOMP5)
2738 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002739
2740 if (RT == OMPRT_Unknown) {
2741 if (A)
2742 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002743 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002744 else
2745 // FIXME: We could use a nicer diagnostic here.
2746 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2747 }
2748
2749 return RT;
2750}
2751
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002752static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2753 const ArgList &Args) {
2754 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2755 options::OPT_fno_openmp, false))
2756 return;
2757
2758 switch (getOpenMPRuntime(TC, Args)) {
2759 case OMPRT_OMP:
2760 CmdArgs.push_back("-lomp");
2761 break;
2762 case OMPRT_GOMP:
2763 CmdArgs.push_back("-lgomp");
2764 break;
2765 case OMPRT_IOMP5:
2766 CmdArgs.push_back("-liomp5");
2767 break;
2768 case OMPRT_Unknown:
2769 // Already diagnosed.
2770 break;
2771 }
2772}
2773
Alexey Samsonov52550342014-09-15 19:58:40 +00002774static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2775 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002776 bool IsShared, bool IsWhole) {
2777 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002778 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002779 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002780 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002781 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002782}
2783
Alexey Samsonov52550342014-09-15 19:58:40 +00002784// Tries to use a file with the list of dynamic symbols that need to be exported
2785// from the runtime library. Returns true if the file was found.
2786static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2787 ArgStringList &CmdArgs,
2788 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002789 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002790 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2791 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002792 return true;
2793 }
2794 return false;
2795}
2796
2797static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2798 ArgStringList &CmdArgs) {
2799 // Force linking against the system libraries sanitizers depends on
2800 // (see PR15823 why this is necessary).
2801 CmdArgs.push_back("--no-as-needed");
2802 CmdArgs.push_back("-lpthread");
2803 CmdArgs.push_back("-lrt");
2804 CmdArgs.push_back("-lm");
2805 // There's no libdl on FreeBSD.
2806 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2807 CmdArgs.push_back("-ldl");
2808}
2809
2810static void
2811collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2812 SmallVectorImpl<StringRef> &SharedRuntimes,
2813 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002814 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2815 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2816 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002817 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2818 // Collect shared runtimes.
2819 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2820 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002821 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002822 // The stats_client library is also statically linked into DSOs.
2823 if (SanArgs.needsStatsRt())
2824 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002825
Alexey Samsonov52550342014-09-15 19:58:40 +00002826 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002827 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002828 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002829 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002830 }
2831 if (SanArgs.needsAsanRt()) {
2832 if (SanArgs.needsSharedAsanRt()) {
2833 HelperStaticRuntimes.push_back("asan-preinit");
2834 } else {
2835 StaticRuntimes.push_back("asan");
2836 if (SanArgs.linkCXXRuntimes())
2837 StaticRuntimes.push_back("asan_cxx");
2838 }
2839 }
2840 if (SanArgs.needsDfsanRt())
2841 StaticRuntimes.push_back("dfsan");
2842 if (SanArgs.needsLsanRt())
2843 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002844 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002845 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002846 if (SanArgs.linkCXXRuntimes())
2847 StaticRuntimes.push_back("msan_cxx");
2848 }
2849 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002850 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002851 if (SanArgs.linkCXXRuntimes())
2852 StaticRuntimes.push_back("tsan_cxx");
2853 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002854 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002855 StaticRuntimes.push_back("ubsan_standalone");
2856 if (SanArgs.linkCXXRuntimes())
2857 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002858 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002859 if (SanArgs.needsSafeStackRt())
2860 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002861 if (SanArgs.needsCfiRt())
2862 StaticRuntimes.push_back("cfi");
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002863 if (SanArgs.needsCfiDiagRt())
2864 StaticRuntimes.push_back("cfi_diag");
Peter Collingbournedc134532016-01-16 00:31:22 +00002865 if (SanArgs.needsStatsRt()) {
2866 NonWholeStaticRuntimes.push_back("stats");
2867 RequiredSymbols.push_back("__sanitizer_stats_register");
2868 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002869}
2870
Alexey Samsonov52550342014-09-15 19:58:40 +00002871// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2872// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2873static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002874 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002875 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002876 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002877 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002878 NonWholeStaticRuntimes, HelperStaticRuntimes,
2879 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002880 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002881 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002882 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002883 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002884 bool AddExportDynamic = false;
2885 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002886 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002887 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2888 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002889 for (auto RT : NonWholeStaticRuntimes) {
2890 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2891 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2892 }
2893 for (auto S : RequiredSymbols) {
2894 CmdArgs.push_back("-u");
2895 CmdArgs.push_back(Args.MakeArgString(S));
2896 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002897 // If there is a static runtime with no dynamic list, force all the symbols
2898 // to be dynamic to be sure we export sanitizer interface functions.
2899 if (AddExportDynamic)
2900 CmdArgs.push_back("-export-dynamic");
2901 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002902}
2903
Reid Kleckner86ea7702015-02-04 23:45:07 +00002904static bool areOptimizationsEnabled(const ArgList &Args) {
2905 // Find the last -O arg and see if it is non-zero.
2906 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2907 return !A->getOption().matches(options::OPT_O0);
2908 // Defaults to -O0.
2909 return false;
2910}
2911
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002912static bool shouldUseFramePointerForTarget(const ArgList &Args,
2913 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002914 switch (Triple.getArch()) {
2915 case llvm::Triple::xcore:
2916 case llvm::Triple::wasm32:
2917 case llvm::Triple::wasm64:
2918 // XCore never wants frame pointers, regardless of OS.
2919 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002920 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002921 default:
2922 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002923 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002924
2925 if (Triple.isOSLinux()) {
2926 switch (Triple.getArch()) {
2927 // Don't use a frame pointer on linux if optimizing for certain targets.
2928 case llvm::Triple::mips64:
2929 case llvm::Triple::mips64el:
2930 case llvm::Triple::mips:
2931 case llvm::Triple::mipsel:
2932 case llvm::Triple::systemz:
2933 case llvm::Triple::x86:
2934 case llvm::Triple::x86_64:
2935 return !areOptimizationsEnabled(Args);
2936 default:
2937 return true;
2938 }
2939 }
2940
2941 if (Triple.isOSWindows()) {
2942 switch (Triple.getArch()) {
2943 case llvm::Triple::x86:
2944 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002945 case llvm::Triple::arm:
2946 case llvm::Triple::thumb:
2947 // Windows on ARM builds with FPO disabled to aid fast stack walking
2948 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002949 default:
2950 // All other supported Windows ISAs use xdata unwind information, so frame
2951 // pointers are not generally useful.
2952 return false;
2953 }
2954 }
2955
2956 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002957}
2958
Rafael Espindola224dd632011-12-14 21:02:23 +00002959static bool shouldUseFramePointer(const ArgList &Args,
2960 const llvm::Triple &Triple) {
2961 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2962 options::OPT_fomit_frame_pointer))
2963 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002964 if (Args.hasArg(options::OPT_pg))
2965 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002966
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002967 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002968}
2969
Eric Christopherb7d97e92013-04-03 01:58:53 +00002970static bool shouldUseLeafFramePointer(const ArgList &Args,
2971 const llvm::Triple &Triple) {
2972 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2973 options::OPT_momit_leaf_frame_pointer))
2974 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002975 if (Args.hasArg(options::OPT_pg))
2976 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002977
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002978 if (Triple.isPS4CPU())
2979 return false;
2980
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002981 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002982}
2983
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002984/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002985static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002986 SmallString<128> cwd;
2987 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002988 CmdArgs.push_back("-fdebug-compilation-dir");
2989 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002990 }
2991}
2992
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002993static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002994 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2995 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2996 SmallString<128> T(FinalOutput->getValue());
2997 llvm::sys::path::replace_extension(T, "dwo");
2998 return Args.MakeArgString(T);
2999 } else {
3000 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003001 SmallString<128> T(
3002 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003003 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003004 llvm::sys::path::replace_extension(F, "dwo");
3005 T += F;
3006 return Args.MakeArgString(F);
3007 }
3008}
3009
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003010static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3011 const JobAction &JA, const ArgList &Args,
3012 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003013 ArgStringList ExtractArgs;
3014 ExtractArgs.push_back("--extract-dwo");
3015
3016 ArgStringList StripArgs;
3017 StripArgs.push_back("--strip-dwo");
3018
3019 // Grabbing the output of the earlier compile step.
3020 StripArgs.push_back(Output.getFilename());
3021 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003022 ExtractArgs.push_back(OutFile);
3023
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003024 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003025 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003026
3027 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003028 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003029
3030 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003031 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003032}
3033
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003034/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003035/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3036static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003037 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003038 if (A->getOption().matches(options::OPT_O4) ||
3039 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003040 return true;
3041
3042 if (A->getOption().matches(options::OPT_O0))
3043 return false;
3044
3045 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3046
Rafael Espindola91780de2013-08-26 14:05:41 +00003047 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003048 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003049 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003050 return true;
3051
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003052 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003053 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003054 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003055
3056 unsigned OptLevel = 0;
3057 if (S.getAsInteger(10, OptLevel))
3058 return false;
3059
3060 return OptLevel > 1;
3061 }
3062
3063 return false;
3064}
3065
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003066/// Add -x lang to \p CmdArgs for \p Input.
3067static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3068 ArgStringList &CmdArgs) {
3069 // When using -verify-pch, we don't want to provide the type
3070 // 'precompiled-header' if it was inferred from the file extension
3071 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3072 return;
3073
3074 CmdArgs.push_back("-x");
3075 if (Args.hasArg(options::OPT_rewrite_objc))
3076 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3077 else
3078 CmdArgs.push_back(types::getTypeName(Input.getType()));
3079}
3080
David Majnemerc371ff02015-03-22 08:39:22 +00003081static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003082 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003083 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003084
3085 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003086 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003087
3088 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003089 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003090 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003091 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003092}
3093
Rafael Espindola577637a2015-01-03 00:06:04 +00003094// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003095// options that build systems might add but are unused when assembling or only
3096// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003097static void claimNoWarnArgs(const ArgList &Args) {
3098 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003099 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003100 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003101 Args.ClaimAllArgs(options::OPT_flto);
3102 Args.ClaimAllArgs(options::OPT_fno_lto);
3103}
3104
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003105static void appendUserToPath(SmallVectorImpl<char> &Result) {
3106#ifdef LLVM_ON_UNIX
3107 const char *Username = getenv("LOGNAME");
3108#else
3109 const char *Username = getenv("USERNAME");
3110#endif
3111 if (Username) {
3112 // Validate that LoginName can be used in a path, and get its length.
3113 size_t Len = 0;
3114 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003115 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003116 Username = nullptr;
3117 break;
3118 }
3119 }
3120
3121 if (Username && Len > 0) {
3122 Result.append(Username, Username + Len);
3123 return;
3124 }
3125 }
3126
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003127// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003128#ifdef LLVM_ON_UNIX
3129 std::string UID = llvm::utostr(getuid());
3130#else
3131 // FIXME: Windows seems to have an 'SID' that might work.
3132 std::string UID = "9999";
3133#endif
3134 Result.append(UID.begin(), UID.end());
3135}
3136
David Majnemere11d3732015-06-08 00:22:46 +00003137VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3138 const llvm::Triple &Triple,
3139 const llvm::opt::ArgList &Args,
3140 bool IsWindowsMSVC) {
3141 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3142 IsWindowsMSVC) ||
3143 Args.hasArg(options::OPT_fmsc_version) ||
3144 Args.hasArg(options::OPT_fms_compatibility_version)) {
3145 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3146 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003147 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003148
3149 if (MSCVersion && MSCompatibilityVersion) {
3150 if (D)
3151 D->Diag(diag::err_drv_argument_not_allowed_with)
3152 << MSCVersion->getAsString(Args)
3153 << MSCompatibilityVersion->getAsString(Args);
3154 return VersionTuple();
3155 }
3156
3157 if (MSCompatibilityVersion) {
3158 VersionTuple MSVT;
3159 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3160 D->Diag(diag::err_drv_invalid_value)
3161 << MSCompatibilityVersion->getAsString(Args)
3162 << MSCompatibilityVersion->getValue();
3163 return MSVT;
3164 }
3165
3166 if (MSCVersion) {
3167 unsigned Version = 0;
3168 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3169 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3170 << MSCVersion->getValue();
3171 return getMSCompatibilityVersion(Version);
3172 }
3173
3174 unsigned Major, Minor, Micro;
3175 Triple.getEnvironmentVersion(Major, Minor, Micro);
3176 if (Major || Minor || Micro)
3177 return VersionTuple(Major, Minor, Micro);
3178
3179 return VersionTuple(18);
3180 }
3181 return VersionTuple();
3182}
3183
Diego Novilloa0545962015-07-10 18:00:07 +00003184static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3185 const InputInfo &Output, const ArgList &Args,
3186 ArgStringList &CmdArgs) {
3187 auto *ProfileGenerateArg = Args.getLastArg(
3188 options::OPT_fprofile_instr_generate,
3189 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003190 options::OPT_fprofile_generate_EQ,
3191 options::OPT_fno_profile_instr_generate);
3192 if (ProfileGenerateArg &&
3193 ProfileGenerateArg->getOption().matches(
3194 options::OPT_fno_profile_instr_generate))
3195 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003196
3197 auto *ProfileUseArg = Args.getLastArg(
3198 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003199 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3200 options::OPT_fno_profile_instr_use);
3201 if (ProfileUseArg &&
3202 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3203 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003204
3205 if (ProfileGenerateArg && ProfileUseArg)
3206 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003207 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003208
Diego Novillo758f3f52015-08-05 21:49:51 +00003209 if (ProfileGenerateArg) {
3210 if (ProfileGenerateArg->getOption().matches(
3211 options::OPT_fprofile_instr_generate_EQ))
3212 ProfileGenerateArg->render(Args, CmdArgs);
3213 else if (ProfileGenerateArg->getOption().matches(
3214 options::OPT_fprofile_generate_EQ)) {
3215 SmallString<128> Path(ProfileGenerateArg->getValue());
3216 llvm::sys::path::append(Path, "default.profraw");
3217 CmdArgs.push_back(
3218 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3219 } else
3220 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3221 }
Diego Novilloa0545962015-07-10 18:00:07 +00003222
Diego Novillo758f3f52015-08-05 21:49:51 +00003223 if (ProfileUseArg) {
3224 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3225 ProfileUseArg->render(Args, CmdArgs);
3226 else if ((ProfileUseArg->getOption().matches(
3227 options::OPT_fprofile_use_EQ) ||
3228 ProfileUseArg->getOption().matches(
3229 options::OPT_fprofile_instr_use))) {
3230 SmallString<128> Path(
3231 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3232 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3233 llvm::sys::path::append(Path, "default.profdata");
3234 CmdArgs.push_back(
3235 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3236 }
Diego Novilloa0545962015-07-10 18:00:07 +00003237 }
3238
3239 if (Args.hasArg(options::OPT_ftest_coverage) ||
3240 Args.hasArg(options::OPT_coverage))
3241 CmdArgs.push_back("-femit-coverage-notes");
3242 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3243 false) ||
3244 Args.hasArg(options::OPT_coverage))
3245 CmdArgs.push_back("-femit-coverage-data");
3246
Diego Novilloc4b94da2015-08-05 23:27:40 +00003247 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3248 options::OPT_fno_coverage_mapping, false) &&
3249 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003250 D.Diag(diag::err_drv_argument_only_allowed_with)
3251 << "-fcoverage-mapping"
3252 << "-fprofile-instr-generate";
3253
Diego Novilloc4b94da2015-08-05 23:27:40 +00003254 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3255 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003256 CmdArgs.push_back("-fcoverage-mapping");
3257
3258 if (C.getArgs().hasArg(options::OPT_c) ||
3259 C.getArgs().hasArg(options::OPT_S)) {
3260 if (Output.isFilename()) {
3261 CmdArgs.push_back("-coverage-file");
3262 SmallString<128> CoverageFilename;
3263 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3264 CoverageFilename = FinalOutput->getValue();
3265 } else {
3266 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3267 }
3268 if (llvm::sys::path::is_relative(CoverageFilename)) {
3269 SmallString<128> Pwd;
3270 if (!llvm::sys::fs::current_path(Pwd)) {
3271 llvm::sys::path::append(Pwd, CoverageFilename);
3272 CoverageFilename.swap(Pwd);
3273 }
3274 }
3275 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3276 }
3277 }
3278}
3279
Paul Robinsond083b9a2015-12-16 17:25:27 +00003280static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3281 ArgStringList &CmdArgs) {
3282 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3283 false) ||
3284 Args.hasFlag(options::OPT_fprofile_generate,
3285 options::OPT_fno_profile_instr_generate, false) ||
3286 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3287 options::OPT_fno_profile_instr_generate, false) ||
3288 Args.hasFlag(options::OPT_fprofile_instr_generate,
3289 options::OPT_fno_profile_instr_generate, false) ||
3290 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3291 options::OPT_fno_profile_instr_generate, false) ||
3292 Args.hasArg(options::OPT_fcreate_profile) ||
3293 Args.hasArg(options::OPT_coverage)))
3294 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3295}
3296
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003297/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3298/// smooshes them together with platform defaults, to decide whether
3299/// this compile should be using PIC mode or not. Returns a tuple of
3300/// (RelocationModel, PICLevel, IsPIE).
3301static std::tuple<llvm::Reloc::Model, unsigned, bool>
3302ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3303 const ArgList &Args) {
3304 // FIXME: why does this code...and so much everywhere else, use both
3305 // ToolChain.getTriple() and Triple?
3306 bool PIE = ToolChain.isPIEDefault();
3307 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003308 // The Darwin/MachO default to use PIC does not apply when using -static.
3309 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3310 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003311 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003312 bool IsPICLevelTwo = PIC;
3313
3314 bool KernelOrKext =
3315 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3316
3317 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003318 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003319 switch (ToolChain.getArch()) {
3320 case llvm::Triple::arm:
3321 case llvm::Triple::armeb:
3322 case llvm::Triple::thumb:
3323 case llvm::Triple::thumbeb:
3324 case llvm::Triple::aarch64:
3325 case llvm::Triple::mips:
3326 case llvm::Triple::mipsel:
3327 case llvm::Triple::mips64:
3328 case llvm::Triple::mips64el:
3329 PIC = true; // "-fpic"
3330 break;
3331
3332 case llvm::Triple::x86:
3333 case llvm::Triple::x86_64:
3334 PIC = true; // "-fPIC"
3335 IsPICLevelTwo = true;
3336 break;
3337
3338 default:
3339 break;
3340 }
3341 }
3342
3343 // OpenBSD-specific defaults for PIE
3344 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3345 switch (ToolChain.getArch()) {
3346 case llvm::Triple::mips64:
3347 case llvm::Triple::mips64el:
3348 case llvm::Triple::sparcel:
3349 case llvm::Triple::x86:
3350 case llvm::Triple::x86_64:
3351 IsPICLevelTwo = false; // "-fpie"
3352 break;
3353
3354 case llvm::Triple::ppc:
3355 case llvm::Triple::sparc:
3356 case llvm::Triple::sparcv9:
3357 IsPICLevelTwo = true; // "-fPIE"
3358 break;
3359
3360 default:
3361 break;
3362 }
3363 }
3364
3365 // The last argument relating to either PIC or PIE wins, and no
3366 // other argument is used. If the last argument is any flavor of the
3367 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3368 // option implicitly enables PIC at the same level.
3369 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3370 options::OPT_fpic, options::OPT_fno_pic,
3371 options::OPT_fPIE, options::OPT_fno_PIE,
3372 options::OPT_fpie, options::OPT_fno_pie);
3373 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3374 // is forced, then neither PIC nor PIE flags will have no effect.
3375 if (!ToolChain.isPICDefaultForced()) {
3376 if (LastPICArg) {
3377 Option O = LastPICArg->getOption();
3378 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3379 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3380 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3381 PIC =
3382 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3383 IsPICLevelTwo =
3384 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3385 } else {
3386 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003387 if (Triple.isPS4CPU()) {
3388 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3389 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3390 if (Model != "kernel") {
3391 PIC = true;
3392 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3393 << LastPICArg->getSpelling();
3394 }
3395 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003396 }
3397 }
3398 }
3399
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003400 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3401 // PIC level would've been set to level 1, force it back to level 2 PIC
3402 // instead.
3403 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003404 IsPICLevelTwo |= ToolChain.isPICDefault();
3405
James Y Knightc4015d32015-08-21 04:14:55 +00003406 // This kernel flags are a trump-card: they will disable PIC/PIE
3407 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003408 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3409 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003410 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003411
3412 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3413 // This is a very special mode. It trumps the other modes, almost no one
3414 // uses it, and it isn't even valid on any OS but Darwin.
3415 if (!ToolChain.getTriple().isOSDarwin())
3416 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3417 << A->getSpelling() << ToolChain.getTriple().str();
3418
3419 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3420
3421 // Only a forced PIC mode can cause the actual compile to have PIC defines
3422 // etc., no flags are sufficient. This behavior was selected to closely
3423 // match that of llvm-gcc and Apple GCC before that.
3424 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3425
3426 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3427 }
3428
3429 if (PIC)
3430 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3431
3432 return std::make_tuple(llvm::Reloc::Static, 0, false);
3433}
3434
3435static const char *RelocationModelName(llvm::Reloc::Model Model) {
3436 switch (Model) {
3437 case llvm::Reloc::Default:
3438 return nullptr;
3439 case llvm::Reloc::Static:
3440 return "static";
3441 case llvm::Reloc::PIC_:
3442 return "pic";
3443 case llvm::Reloc::DynamicNoPIC:
3444 return "dynamic-no-pic";
3445 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003446 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003447}
3448
3449static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3450 ArgStringList &CmdArgs) {
3451 llvm::Reloc::Model RelocationModel;
3452 unsigned PICLevel;
3453 bool IsPIE;
3454 std::tie(RelocationModel, PICLevel, IsPIE) =
3455 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3456
3457 if (RelocationModel != llvm::Reloc::Static)
3458 CmdArgs.push_back("-KPIC");
3459}
3460
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003461void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003462 const InputInfo &Output, const InputInfoList &Inputs,
3463 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003464 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3465 const llvm::Triple Triple(TripleStr);
3466
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003467 bool KernelOrKext =
3468 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003469 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003470 ArgStringList CmdArgs;
3471
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003472 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003473 bool IsWindowsCygnus =
3474 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003475 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003476 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003477
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003478 // Check number of inputs for sanity. We need at least one input.
3479 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003480 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003481 // CUDA compilation may have multiple inputs (source file + results of
3482 // device-side compilations). All other jobs are expected to have exactly one
3483 // input.
3484 bool IsCuda = types::isCuda(Input.getType());
3485 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003486
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003487 // Invoke ourselves in -cc1 mode.
3488 //
3489 // FIXME: Implement custom jobs for internal actions.
3490 CmdArgs.push_back("-cc1");
3491
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003492 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003493 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003494 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003495
Artem Belevichfa11ab52015-11-17 22:28:46 +00003496 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003497 if (IsCuda) {
3498 // FIXME: We need a (better) way to pass information about
3499 // particular compilation pass we're constructing here. For now we
3500 // can check which toolchain we're using and pick the other one to
3501 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003502 if (&getToolChain() == C.getCudaDeviceToolChain())
3503 AuxToolChain = C.getCudaHostToolChain();
3504 else if (&getToolChain() == C.getCudaHostToolChain())
3505 AuxToolChain = C.getCudaDeviceToolChain();
3506 else
3507 llvm_unreachable("Can't figure out CUDA compilation mode.");
3508 assert(AuxToolChain != nullptr && "No aux toolchain.");
3509 CmdArgs.push_back("-aux-triple");
3510 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003511 CmdArgs.push_back("-fcuda-target-overloads");
3512 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003513 }
3514
James Y Knight2db38f32015-08-15 03:45:25 +00003515 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3516 Triple.getArch() == llvm::Triple::thumb)) {
3517 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003518 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003519 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003520 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003521 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003522 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003523 }
3524
Tim Northover336f1892014-03-29 13:16:12 +00003525 // Push all default warning arguments that are specific to
3526 // the given target. These come before user provided warning options
3527 // are provided.
3528 getToolChain().addClangWarningOptions(CmdArgs);
3529
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003530 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003531 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003532
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003533 if (isa<AnalyzeJobAction>(JA)) {
3534 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3535 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003536 } else if (isa<MigrateJobAction>(JA)) {
3537 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003538 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003539 if (Output.getType() == types::TY_Dependencies)
3540 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003541 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003542 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003543 if (Args.hasArg(options::OPT_rewrite_objc) &&
3544 !Args.hasArg(options::OPT_g_Group))
3545 CmdArgs.push_back("-P");
3546 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003547 } else if (isa<AssembleJobAction>(JA)) {
3548 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003549
David Blaikie9260ed62013-07-25 21:19:01 +00003550 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003551
3552 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003553 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003554 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003555 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003556 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003557
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003558 if (JA.getType() == types::TY_Nothing)
3559 CmdArgs.push_back("-fsyntax-only");
3560 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003561 CmdArgs.push_back("-emit-pch");
3562 else
3563 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003564 } else if (isa<VerifyPCHJobAction>(JA)) {
3565 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003566 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003567 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3568 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003569 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003570 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003571 } else if (JA.getType() == types::TY_LLVM_IR ||
3572 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003573 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003574 } else if (JA.getType() == types::TY_LLVM_BC ||
3575 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003576 CmdArgs.push_back("-emit-llvm-bc");
3577 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003578 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003579 } else if (JA.getType() == types::TY_AST) {
3580 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003581 } else if (JA.getType() == types::TY_ModuleFile) {
3582 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003583 } else if (JA.getType() == types::TY_RewrittenObjC) {
3584 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003585 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003586 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3587 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003588 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003589 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003590 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003591 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003592
3593 // Preserve use-list order by default when emitting bitcode, so that
3594 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3595 // same result as running passes here. For LTO, we don't need to preserve
3596 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003597 if (JA.getType() == types::TY_LLVM_BC)
3598 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003599
3600 if (D.isUsingLTO())
3601 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003602 }
3603
Teresa Johnsonaff22322015-12-07 19:21:34 +00003604 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3605 if (!types::isLLVMIR(Input.getType()))
3606 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3607 << "-x ir";
3608 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3609 }
3610
Justin Bognera88f0122014-06-20 22:59:50 +00003611 // We normally speed up the clang process a bit by skipping destructors at
3612 // exit, but when we're generating diagnostics we can rely on some of the
3613 // cleanup.
3614 if (!C.isForDiagnostics())
3615 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003616
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003617// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003618#ifdef NDEBUG
3619 CmdArgs.push_back("-disable-llvm-verifier");
3620#endif
3621
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003622 // Set the main file name, so that debug info works even with
3623 // -save-temps.
3624 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003625 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003626
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003627 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003628 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003629 if (Args.hasArg(options::OPT_static))
3630 CmdArgs.push_back("-static-define");
3631
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003632 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003633 // Enable region store model by default.
3634 CmdArgs.push_back("-analyzer-store=region");
3635
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003636 // Treat blocks as analysis entry points.
3637 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3638
Ted Kremenek49c79792011-03-24 00:28:47 +00003639 CmdArgs.push_back("-analyzer-eagerly-assume");
3640
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003641 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003642 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003643 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003644
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003645 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003646 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003647
Sean Evesonb38c32b2016-01-06 10:03:58 +00003648 // Disable some unix checkers for PS4.
3649 if (IsPS4CPU) {
3650 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3651 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3652 }
3653
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003654 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003655 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003656
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003657 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003658
Artem Belevichba558952015-05-06 18:20:23 +00003659 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003660 CmdArgs.push_back("-analyzer-checker=cplusplus");
3661
Sean Evesonb38c32b2016-01-06 10:03:58 +00003662 if (!IsPS4CPU) {
3663 CmdArgs.push_back(
3664 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3665 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3666 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3667 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3668 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3669 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3670 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003671
3672 // Default nullability checks.
3673 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3674 CmdArgs.push_back(
3675 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003676 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003677
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003678 // Set the output format. The default is plist, for (lame) historical
3679 // reasons.
3680 CmdArgs.push_back("-analyzer-output");
3681 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003682 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003683 else
3684 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003685
Ted Kremenekfe449a22010-03-22 22:32:05 +00003686 // Disable the presentation of standard compiler warnings when
3687 // using --analyze. We only want to show static analyzer diagnostics
3688 // or frontend errors.
3689 CmdArgs.push_back("-w");
3690
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003691 // Add -Xanalyzer arguments when running as analyzer.
3692 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003693 }
3694
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003695 CheckCodeGenerationOptions(D, Args);
3696
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003697 llvm::Reloc::Model RelocationModel;
3698 unsigned PICLevel;
3699 bool IsPIE;
3700 std::tie(RelocationModel, PICLevel, IsPIE) =
3701 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003702
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003703 const char *RMName = RelocationModelName(RelocationModel);
3704 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003705 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003706 CmdArgs.push_back(RMName);
3707 }
3708 if (PICLevel > 0) {
3709 CmdArgs.push_back("-pic-level");
3710 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3711 if (IsPIE) {
3712 CmdArgs.push_back("-pie-level");
3713 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003714 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003715 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003716
Renato Golin4854d802015-11-09 12:40:41 +00003717 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3718 CmdArgs.push_back("-meabi");
3719 CmdArgs.push_back(A->getValue());
3720 }
3721
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003722 CmdArgs.push_back("-mthread-model");
3723 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3724 CmdArgs.push_back(A->getValue());
3725 else
3726 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3727
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003728 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3729
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003730 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3731 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003732 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003733
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003734 // LLVM Code Generator Options.
3735
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003736 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3737 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003738 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3739 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003740 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003741 CmdArgs.push_back(A->getValue());
3742 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003743 }
3744 }
3745
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003746 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3747 StringRef v = A->getValue();
3748 CmdArgs.push_back("-mllvm");
3749 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3750 A->claim();
3751 }
3752
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003753 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3754 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003755 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003756 }
3757
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003758 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3759 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003760 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003761 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003762 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003763 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3764 CmdArgs.push_back("-fpcc-struct-return");
3765 } else {
3766 assert(A->getOption().matches(options::OPT_freg_struct_return));
3767 CmdArgs.push_back("-freg-struct-return");
3768 }
3769 }
3770
Roman Divacky65b88cd2011-03-01 17:40:53 +00003771 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3772 CmdArgs.push_back("-mrtd");
3773
Rafael Espindola224dd632011-12-14 21:02:23 +00003774 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003775 CmdArgs.push_back("-mdisable-fp-elim");
3776 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3777 options::OPT_fno_zero_initialized_in_bss))
3778 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003779
3780 bool OFastEnabled = isOptimizationLevelFast(Args);
3781 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3782 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003783 OptSpecifier StrictAliasingAliasOption =
3784 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003785 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3786 // doesn't do any TBAA.
3787 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003788 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003789 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003790 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003791 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3792 options::OPT_fno_struct_path_tbaa))
3793 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003794 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3795 false))
3796 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003797 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3798 options::OPT_fno_strict_vtable_pointers,
3799 false))
3800 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003801 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3802 options::OPT_fno_optimize_sibling_calls))
3803 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003804
Eric Christopher006208c2013-04-04 06:29:47 +00003805 // Handle segmented stacks.
3806 if (Args.hasArg(options::OPT_fsplit_stack))
3807 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003808
3809 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3810 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003811 OptSpecifier FastMathAliasOption =
3812 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3813
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003814 // Handle various floating point optimization flags, mapping them to the
3815 // appropriate LLVM code generation flags. The pattern for all of these is to
3816 // default off the codegen optimizations, and if any flag enables them and no
3817 // flag disables them after the flag enabling them, enable the codegen
3818 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003819 if (Arg *A = Args.getLastArg(
3820 options::OPT_ffast_math, FastMathAliasOption,
3821 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3822 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3823 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003824 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3825 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003826 A->getOption().getID() != options::OPT_fhonor_infinities)
3827 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003828 if (Arg *A = Args.getLastArg(
3829 options::OPT_ffast_math, FastMathAliasOption,
3830 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3831 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3832 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003833 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3834 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003835 A->getOption().getID() != options::OPT_fhonor_nans)
3836 CmdArgs.push_back("-menable-no-nans");
3837
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003838 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3839 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003840 if (Arg *A =
3841 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3842 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3843 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003844 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3845 // However, turning *off* -ffast_math merely restores the toolchain default
3846 // (which may be false).
3847 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3848 A->getOption().getID() == options::OPT_ffast_math ||
3849 A->getOption().getID() == options::OPT_Ofast)
3850 MathErrno = false;
3851 else if (A->getOption().getID() == options::OPT_fmath_errno)
3852 MathErrno = true;
3853 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003854 if (MathErrno)
3855 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003856
3857 // There are several flags which require disabling very specific
3858 // optimizations. Any of these being disabled forces us to turn off the
3859 // entire set of LLVM optimizations, so collect them through all the flag
3860 // madness.
3861 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003862 if (Arg *A = Args.getLastArg(
3863 options::OPT_ffast_math, FastMathAliasOption,
3864 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3865 options::OPT_fno_unsafe_math_optimizations,
3866 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003867 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3868 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003869 A->getOption().getID() != options::OPT_fno_associative_math)
3870 AssociativeMath = true;
3871 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003872 if (Arg *A = Args.getLastArg(
3873 options::OPT_ffast_math, FastMathAliasOption,
3874 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3875 options::OPT_fno_unsafe_math_optimizations,
3876 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003877 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3878 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003879 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3880 ReciprocalMath = true;
3881 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003882 if (Arg *A = Args.getLastArg(
3883 options::OPT_ffast_math, FastMathAliasOption,
3884 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3885 options::OPT_fno_unsafe_math_optimizations,
3886 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003887 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3888 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003889 A->getOption().getID() != options::OPT_fsigned_zeros)
3890 SignedZeros = false;
3891 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003892 if (Arg *A = Args.getLastArg(
3893 options::OPT_ffast_math, FastMathAliasOption,
3894 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3895 options::OPT_fno_unsafe_math_optimizations,
3896 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003897 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3898 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003899 A->getOption().getID() != options::OPT_ftrapping_math)
3900 TrappingMath = false;
3901 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3902 !TrappingMath)
3903 CmdArgs.push_back("-menable-unsafe-fp-math");
3904
Sanjay Patel76c9e092015-01-23 16:40:50 +00003905 if (!SignedZeros)
3906 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003907
Sanjay Patel359b1052015-04-09 15:03:23 +00003908 if (ReciprocalMath)
3909 CmdArgs.push_back("-freciprocal-math");
3910
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003911 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003912 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003913 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003914 options::OPT_ffp_contract)) {
3915 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003916 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003917 if (Val == "fast" || Val == "on" || Val == "off") {
3918 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3919 } else {
3920 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003921 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003922 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003923 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3924 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003925 // If fast-math is set then set the fp-contract mode to fast.
3926 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3927 }
3928 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003929
Sanjay Patel2987c292015-06-11 14:53:41 +00003930 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003931
Bob Wilson6a039162012-07-19 03:52:53 +00003932 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3933 // and if we find them, tell the frontend to provide the appropriate
3934 // preprocessor macros. This is distinct from enabling any optimizations as
3935 // these options induce language changes which must survive serialization
3936 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003937 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3938 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003939 if (!A->getOption().matches(options::OPT_fno_fast_math))
3940 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003941 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3942 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003943 if (A->getOption().matches(options::OPT_ffinite_math_only))
3944 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003945
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003946 // Decide whether to use verbose asm. Verbose assembly is the default on
3947 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003948 bool IsIntegratedAssemblerDefault =
3949 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003950 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003951 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003952 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003953 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003954
Rafael Espindolab8a12932015-05-22 20:44:03 +00003955 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3956 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003957 CmdArgs.push_back("-no-integrated-as");
3958
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003959 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3960 CmdArgs.push_back("-mdebug-pass");
3961 CmdArgs.push_back("Structure");
3962 }
3963 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3964 CmdArgs.push_back("-mdebug-pass");
3965 CmdArgs.push_back("Arguments");
3966 }
3967
John McCall8517abc2010-02-19 02:45:38 +00003968 // Enable -mconstructor-aliases except on darwin, where we have to
3969 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003970 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003971 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003972
John McCall7ef5cb32011-03-18 02:56:14 +00003973 // Darwin's kernel doesn't support guard variables; just die if we
3974 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003975 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003976 CmdArgs.push_back("-fforbid-guard-variables");
3977
Akira Hatanaka02028482015-11-12 17:21:22 +00003978 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3979 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003980 CmdArgs.push_back("-mms-bitfields");
3981 }
John McCall8517abc2010-02-19 02:45:38 +00003982
Daniel Dunbar306945d2009-09-16 06:17:29 +00003983 // This is a coarse approximation of what llvm-gcc actually does, both
3984 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3985 // complicated ways.
3986 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003987 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3988 options::OPT_fno_asynchronous_unwind_tables,
3989 (getToolChain().IsUnwindTablesDefault() ||
3990 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3991 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003992 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3993 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003994 CmdArgs.push_back("-munwind-tables");
3995
Chandler Carruth05fb5852012-11-21 23:40:23 +00003996 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003997
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003998 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3999 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004000 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004001 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004002
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004003 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004004 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004005
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004006 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004007 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004008 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004009 }
4010
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004011 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004012 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004013 if (!CPU.empty()) {
4014 CmdArgs.push_back("-target-cpu");
4015 CmdArgs.push_back(Args.MakeArgString(CPU));
4016 }
4017
Rafael Espindolaeb265472013-08-21 21:59:03 +00004018 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4019 CmdArgs.push_back("-mfpmath");
4020 CmdArgs.push_back(A->getValue());
4021 }
4022
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004023 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004024 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004025
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004026 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004027 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004028 default:
4029 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004030
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004031 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004032 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004033 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004034 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004035 // Use the effective triple, which takes into account the deployment target.
4036 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004037 break;
4038
Tim Northover573cbee2014-05-24 12:52:07 +00004039 case llvm::Triple::aarch64:
4040 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004041 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004042 break;
4043
Eric Christopher0b26a612010-03-02 02:41:08 +00004044 case llvm::Triple::mips:
4045 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004046 case llvm::Triple::mips64:
4047 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004048 AddMIPSTargetArgs(Args, CmdArgs);
4049 break;
4050
Ulrich Weigand8afad612014-07-28 13:17:52 +00004051 case llvm::Triple::ppc:
4052 case llvm::Triple::ppc64:
4053 case llvm::Triple::ppc64le:
4054 AddPPCTargetArgs(Args, CmdArgs);
4055 break;
4056
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004057 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004058 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004059 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004060 AddSparcTargetArgs(Args, CmdArgs);
4061 break;
4062
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004063 case llvm::Triple::x86:
4064 case llvm::Triple::x86_64:
4065 AddX86TargetArgs(Args, CmdArgs);
4066 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004067
4068 case llvm::Triple::hexagon:
4069 AddHexagonTargetArgs(Args, CmdArgs);
4070 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004071
4072 case llvm::Triple::wasm32:
4073 case llvm::Triple::wasm64:
4074 AddWebAssemblyTargetArgs(Args, CmdArgs);
4075 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004076 }
4077
Douglas Katzman3459ce22015-10-08 04:24:12 +00004078 // The 'g' groups options involve a somewhat intricate sequence of decisions
4079 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004080 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004081 // * what level of debug info to generate
4082 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004083 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004084 // This avoids having to monkey around further in cc1 other than to disable
4085 // codeview if not running in a Windows environment. Perhaps even that
4086 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004087 unsigned DwarfVersion = 0;
4088 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4089 // These two are potentially updated by AddClangCLArgs.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004090 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4091 CodeGenOptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004092 bool EmitCodeView = false;
4093
Hans Wennborg75958c42013-08-08 00:17:41 +00004094 // Add clang-cl arguments.
4095 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004096 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004097
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004098 // Pass the linker version in use.
4099 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4100 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004101 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004102 }
4103
Eric Christopherb7d97e92013-04-03 01:58:53 +00004104 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004105 CmdArgs.push_back("-momit-leaf-frame-pointer");
4106
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004107 // Explicitly error on some things we know we don't support and can't just
4108 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004109 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004110 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4111 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004112 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004113 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004114 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4115 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004116 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004117 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004118 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004119 }
4120
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004121 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004122 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004123 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004124 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004125 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4126 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004127 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004128 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004129 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004130
Chad Rosierbe10f982011-08-02 17:58:04 +00004131 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004132 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004133 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4134 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004135 }
4136
Rafael Espindola08a692a2010-03-07 04:46:18 +00004137 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004138 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004139 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004140 // If the last option explicitly specified a debug-info level, use it.
4141 if (A->getOption().matches(options::OPT_gN_Group)) {
4142 DebugInfoKind = DebugLevelToInfoKind(*A);
4143 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4144 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4145 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4146 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4147 A->getIndex() > SplitDwarfArg->getIndex())
4148 SplitDwarfArg = nullptr;
4149 } else
4150 // For any other 'g' option, use Limited.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004151 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004152 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004153
Paul Robinson0334a042015-12-19 19:41:48 +00004154 // If a debugger tuning argument appeared, remember it.
4155 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4156 options::OPT_ggdbN_Group)) {
4157 if (A->getOption().matches(options::OPT_glldb))
4158 DebuggerTuning = llvm::DebuggerKind::LLDB;
4159 else if (A->getOption().matches(options::OPT_gsce))
4160 DebuggerTuning = llvm::DebuggerKind::SCE;
4161 else
4162 DebuggerTuning = llvm::DebuggerKind::GDB;
4163 }
4164
4165 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004166 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004167 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004168 DwarfVersion = DwarfVersionNum(A->getSpelling());
4169
Reid Kleckner124955a2015-08-05 18:51:13 +00004170 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004171 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4172 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4173 // DwarfVersion remains at 0 if no explicit choice was made.
4174 CmdArgs.push_back("-gcodeview");
4175 } else if (DwarfVersion == 0 &&
4176 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4177 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4178 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004179
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004180 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4181 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004182
4183 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004184 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004185 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004186 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004187
Eric Christopher138c32b2013-09-13 22:37:55 +00004188 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004189 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004190 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004191 CmdArgs.push_back("-dwarf-ext-refs");
4192 CmdArgs.push_back("-fmodule-format=obj");
4193 }
4194
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004195 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4196 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004197 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004198 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004199 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004200 CmdArgs.push_back("-backend-option");
4201 CmdArgs.push_back("-split-dwarf=Enable");
4202 }
4203
Douglas Katzman3459ce22015-10-08 04:24:12 +00004204 // After we've dealt with all combinations of things that could
4205 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4206 // figure out if we need to "upgrade" it to standalone debug info.
4207 // We parse these two '-f' options whether or not they will be used,
4208 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4209 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4210 options::OPT_fno_standalone_debug,
4211 getToolChain().GetDefaultStandaloneDebug());
4212 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4213 DebugInfoKind = CodeGenOptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004214 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4215 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004216
Eric Christopher138c32b2013-09-13 22:37:55 +00004217 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4218 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4219 CmdArgs.push_back("-backend-option");
4220 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4221 }
Eric Christophereec89c22013-06-18 00:03:50 +00004222
Eric Christopher0d403d22014-02-14 01:27:03 +00004223 // -gdwarf-aranges turns on the emission of the aranges section in the
4224 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004225 // Always enabled on the PS4.
4226 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004227 CmdArgs.push_back("-backend-option");
4228 CmdArgs.push_back("-generate-arange-section");
4229 }
4230
David Blaikief36d9ba2014-01-27 18:52:43 +00004231 if (Args.hasFlag(options::OPT_fdebug_types_section,
4232 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004233 CmdArgs.push_back("-backend-option");
4234 CmdArgs.push_back("-generate-type-units");
4235 }
Eric Christophereec89c22013-06-18 00:03:50 +00004236
Dan Gohmana5b804b2016-01-07 00:50:27 +00004237 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4238 // default.
4239 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4240 Triple.getArch() == llvm::Triple::wasm32 ||
4241 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004242
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004243 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004244 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004245 CmdArgs.push_back("-ffunction-sections");
4246 }
4247
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004248 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4249 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004250 CmdArgs.push_back("-fdata-sections");
4251 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004252
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004253 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004254 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004255 CmdArgs.push_back("-fno-unique-section-names");
4256
Chris Lattner3c77a352010-06-22 00:03:40 +00004257 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4258
Diego Novilloa0545962015-07-10 18:00:07 +00004259 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004260
Paul Robinsond083b9a2015-12-16 17:25:27 +00004261 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4262 if (getToolChain().getTriple().isPS4CPU())
4263 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4264
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004265 // Pass options for controlling the default header search paths.
4266 if (Args.hasArg(options::OPT_nostdinc)) {
4267 CmdArgs.push_back("-nostdsysteminc");
4268 CmdArgs.push_back("-nobuiltininc");
4269 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004270 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004271 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004272 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4273 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4274 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004275
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004276 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004277 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004278 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004279
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004280 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4281
Ted Kremenekf7639e12012-03-06 20:06:33 +00004282 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004283 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004284 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004285 options::OPT_ccc_arcmt_modify,
4286 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004287 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004288 switch (A->getOption().getID()) {
4289 default:
4290 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004291 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004292 CmdArgs.push_back("-arcmt-check");
4293 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004294 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004295 CmdArgs.push_back("-arcmt-modify");
4296 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004297 case options::OPT_ccc_arcmt_migrate:
4298 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004299 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004300 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004301
4302 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4303 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004304 break;
John McCalld70fb982011-06-15 23:25:17 +00004305 }
4306 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004307 } else {
4308 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4309 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4310 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004311 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004312
Ted Kremenekf7639e12012-03-06 20:06:33 +00004313 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4314 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004315 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4316 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004317 }
4318 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004319 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004320
4321 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004322 options::OPT_objcmt_migrate_subscripting,
4323 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004324 // None specified, means enable them all.
4325 CmdArgs.push_back("-objcmt-migrate-literals");
4326 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004327 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004328 } else {
4329 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4330 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004331 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004332 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004333 } else {
4334 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4335 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4336 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4337 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4338 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4339 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004340 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004341 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4342 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4343 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4344 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4345 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4346 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4347 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004348 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004349 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004350 }
4351
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004352 // Add preprocessing options like -I, -D, etc. if we are using the
4353 // preprocessor.
4354 //
4355 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004356 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004357 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4358 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004359
Rafael Espindolaa7431922011-07-21 23:40:37 +00004360 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4361 // that "The compiler can only warn and ignore the option if not recognized".
4362 // When building with ccache, it will pass -D options to clang even on
4363 // preprocessed inputs and configure concludes that -fPIC is not supported.
4364 Args.ClaimAllArgs(options::OPT_D);
4365
Alp Toker7874bdc2013-11-15 20:40:58 +00004366 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004367 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4368 if (A->getOption().matches(options::OPT_O4)) {
4369 CmdArgs.push_back("-O3");
4370 D.Diag(diag::warn_O4_is_O3);
4371 } else {
4372 A->render(Args, CmdArgs);
4373 }
4374 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004375
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004376 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004377 for (const Arg *A :
4378 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4379 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004380 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004381 }
4382
Rafael Espindola577637a2015-01-03 00:06:04 +00004383 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004384
Richard Smith3be1cb22014-08-07 00:24:21 +00004385 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004386 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004387 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4388 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004389 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004390 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004391
4392 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004393 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004394 //
4395 // If a std is supplied, only add -trigraphs if it follows the
4396 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004397 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004398 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4399 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004400 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004401 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004402 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004403 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004404 else
4405 Std->render(Args, CmdArgs);
4406
Nico Weber00721502014-12-23 22:32:37 +00004407 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004408 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004409 options::OPT_ftrigraphs,
4410 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004411 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004412 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004413 } else {
4414 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004415 //
4416 // FIXME: Clang doesn't correctly handle -std= when the input language
4417 // doesn't match. For the time being just ignore this for C++ inputs;
4418 // eventually we want to do all the standard defaulting here instead of
4419 // splitting it between the driver and clang -cc1.
4420 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004421 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4422 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004423 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004424 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004425
Nico Weber00721502014-12-23 22:32:37 +00004426 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4427 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004428 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004429
Richard Smith282b4492013-09-04 22:50:31 +00004430 // GCC's behavior for -Wwrite-strings is a bit strange:
4431 // * In C, this "warning flag" changes the types of string literals from
4432 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4433 // for the discarded qualifier.
4434 // * In C++, this is just a normal warning flag.
4435 //
4436 // Implementing this warning correctly in C is hard, so we follow GCC's
4437 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4438 // a non-const char* in C, rather than using this crude hack.
4439 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004440 // FIXME: This should behave just like a warning flag, and thus should also
4441 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4442 Arg *WriteStrings =
4443 Args.getLastArg(options::OPT_Wwrite_strings,
4444 options::OPT_Wno_write_strings, options::OPT_w);
4445 if (WriteStrings &&
4446 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004447 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004448 }
4449
Chandler Carruth61fbf622011-04-23 09:27:53 +00004450 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004451 // during C++ compilation, which it is by default. GCC keeps this define even
4452 // in the presence of '-w', match this behavior bug-for-bug.
4453 if (types::isCXX(InputType) &&
4454 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4455 true)) {
4456 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004457 }
4458
Chandler Carruthe0391482010-05-22 02:21:53 +00004459 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4460 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4461 if (Asm->getOption().matches(options::OPT_fasm))
4462 CmdArgs.push_back("-fgnu-keywords");
4463 else
4464 CmdArgs.push_back("-fno-gnu-keywords");
4465 }
4466
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004467 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4468 CmdArgs.push_back("-fno-dwarf-directory-asm");
4469
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004470 if (ShouldDisableAutolink(Args, getToolChain()))
4471 CmdArgs.push_back("-fno-autolink");
4472
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004473 // Add in -fdebug-compilation-dir if necessary.
4474 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004475
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004476 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4477 StringRef Map = A->getValue();
4478 if (Map.find('=') == StringRef::npos)
4479 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4480 else
4481 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4482 A->claim();
4483 }
4484
Richard Smith9a568822011-11-21 19:36:32 +00004485 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4486 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004487 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004488 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004489 }
4490
Richard Smith79c927b2013-11-06 19:31:51 +00004491 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4492 CmdArgs.push_back("-foperator-arrow-depth");
4493 CmdArgs.push_back(A->getValue());
4494 }
4495
Richard Smith9a568822011-11-21 19:36:32 +00004496 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4497 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004498 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004499 }
4500
Richard Smitha3d3bd22013-05-08 02:12:03 +00004501 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4502 CmdArgs.push_back("-fconstexpr-steps");
4503 CmdArgs.push_back(A->getValue());
4504 }
4505
Richard Smithb3a14522013-02-22 01:59:51 +00004506 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4507 CmdArgs.push_back("-fbracket-depth");
4508 CmdArgs.push_back(A->getValue());
4509 }
4510
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004511 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4512 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004513 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004514 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004515 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4516 } else
4517 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004518 }
4519
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004520 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004521 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004522
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004523 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4524 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004525 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004526 }
David Chisnall5778fce2009-08-31 16:41:57 +00004527
Chris Lattnere23003d2010-01-09 21:54:33 +00004528 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4529 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004530 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004531 }
4532
Chris Lattnerb35583d2010-04-07 20:49:23 +00004533 CmdArgs.push_back("-ferror-limit");
4534 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004535 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004536 else
4537 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004538
Chandler Carrutha77a7272010-05-06 04:55:18 +00004539 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4540 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004541 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004542 }
4543
4544 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4545 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004546 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004547 }
4548
Richard Smithf6f003a2011-12-16 19:06:07 +00004549 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4550 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004551 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004552 }
4553
Nick Lewycky24653262014-12-16 21:39:02 +00004554 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4555 CmdArgs.push_back("-fspell-checking-limit");
4556 CmdArgs.push_back(A->getValue());
4557 }
4558
Daniel Dunbar2c978472009-11-04 06:24:47 +00004559 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004560 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004561 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004562 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004563 } else {
4564 // If -fmessage-length=N was not specified, determine whether this is a
4565 // terminal and, if so, implicitly define -fmessage-length appropriately.
4566 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004567 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004568 }
4569
John McCallb4a99d32013-02-19 01:57:35 +00004570 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4571 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4572 options::OPT_fvisibility_ms_compat)) {
4573 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4574 CmdArgs.push_back("-fvisibility");
4575 CmdArgs.push_back(A->getValue());
4576 } else {
4577 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4578 CmdArgs.push_back("-fvisibility");
4579 CmdArgs.push_back("hidden");
4580 CmdArgs.push_back("-ftype-visibility");
4581 CmdArgs.push_back("default");
4582 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004583 }
4584
Douglas Gregor08329632010-06-15 17:05:35 +00004585 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004586
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004587 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4588
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004589 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004590 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4591 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004592 CmdArgs.push_back("-ffreestanding");
4593
Daniel Dunbare357d562009-12-03 18:42:11 +00004594 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004595 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004596 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004597 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004598 // Emulated TLS is enabled by default on Android, and can be enabled manually
4599 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004600 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004601 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4602 EmulatedTLSDefault))
4603 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004604 // AltiVec-like language extensions aren't relevant for assembling.
4605 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004606 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004607 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4608 }
Richard Trieu91844232012-06-26 18:18:47 +00004609 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4610 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004611
Alexey Bataevdb390212015-05-20 04:24:19 +00004612 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004613 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4614 options::OPT_fno_openmp, false))
4615 switch (getOpenMPRuntime(getToolChain(), Args)) {
4616 case OMPRT_OMP:
4617 case OMPRT_IOMP5:
4618 // Clang can generate useful OpenMP code for these two runtime libraries.
4619 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004620
4621 // If no option regarding the use of TLS in OpenMP codegeneration is
4622 // given, decide a default based on the target. Otherwise rely on the
4623 // options and pass the right information to the frontend.
4624 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004625 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004626 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004627 break;
4628 default:
4629 // By default, if Clang doesn't know how to generate useful OpenMP code
4630 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4631 // down to the actual compilation.
4632 // FIXME: It would be better to have a mode which *only* omits IR
4633 // generation based on the OpenMP support so that we get consistent
4634 // semantic analysis, etc.
4635 break;
4636 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004637
Peter Collingbourne32701642013-11-01 18:16:25 +00004638 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004639 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004640
Eric Christopher459d2712013-02-19 06:16:53 +00004641 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004642 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4643 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4644 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4645 Arch == llvm::Triple::ppc64le))
4646 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4647 << "ppc/ppc64/ppc64le";
4648 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004649
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004650 // -fzvector is incompatible with -faltivec.
4651 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4652 if (Args.hasArg(options::OPT_faltivec))
4653 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4654 << "-faltivec";
4655
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004656 if (getToolChain().SupportsProfiling())
4657 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004658
4659 // -flax-vector-conversions is default.
4660 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4661 options::OPT_fno_lax_vector_conversions))
4662 CmdArgs.push_back("-fno-lax-vector-conversions");
4663
John Brawna7b4ec02015-08-10 11:11:28 +00004664 if (Args.getLastArg(options::OPT_fapple_kext) ||
4665 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004666 CmdArgs.push_back("-fapple-kext");
4667
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004668 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004669 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004670 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004671 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4672 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004673
4674 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4675 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004676 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004677 }
4678
Bob Wilson14adb362012-02-03 06:27:22 +00004679 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004680
Chandler Carruth6e501032011-03-27 00:04:55 +00004681 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4682 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004683 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004684 if (A->getOption().matches(options::OPT_fwrapv))
4685 CmdArgs.push_back("-fwrapv");
4686 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4687 options::OPT_fno_strict_overflow)) {
4688 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4689 CmdArgs.push_back("-fwrapv");
4690 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004691
4692 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4693 options::OPT_fno_reroll_loops))
4694 if (A->getOption().matches(options::OPT_freroll_loops))
4695 CmdArgs.push_back("-freroll-loops");
4696
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004697 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004698 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4699 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004700
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004701 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4702
Daniel Dunbar4930e332009-11-17 08:07:36 +00004703 // -stack-protector=0 is default.
4704 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004705 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4706 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4707 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4708 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4709 Args.ClaimAllArgs(options::OPT_fstack_protector);
4710 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004711 options::OPT_fstack_protector_all,
4712 options::OPT_fstack_protector_strong,
4713 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004714 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004715 StackProtectorLevel = std::max<unsigned>(
4716 LangOptions::SSPOn,
4717 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004718 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004719 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004720 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004721 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004722 } else {
4723 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004724 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004725 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004726 if (StackProtectorLevel) {
4727 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004728 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004729 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004730
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004731 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004732 for (const Arg *A : Args.filtered(options::OPT__param)) {
4733 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004734 if (Str.startswith("ssp-buffer-size=")) {
4735 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004736 CmdArgs.push_back("-stack-protector-buffer-size");
4737 // FIXME: Verify the argument is a valid integer.
4738 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004739 }
Sean Silva14facf32015-06-09 01:57:17 +00004740 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004741 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004742 }
4743
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004744 // Translate -mstackrealign
4745 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004746 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004747 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004748
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004749 if (Args.hasArg(options::OPT_mstack_alignment)) {
4750 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4751 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004752 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004753
Hans Wennborg77dc2362015-01-20 19:45:50 +00004754 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4755 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4756
4757 if (!Size.empty())
4758 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4759 else
4760 CmdArgs.push_back("-mstack-probe-size=0");
4761 }
4762
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004763 switch (getToolChain().getArch()) {
4764 case llvm::Triple::aarch64:
4765 case llvm::Triple::aarch64_be:
4766 case llvm::Triple::arm:
4767 case llvm::Triple::armeb:
4768 case llvm::Triple::thumb:
4769 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004770 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004771 break;
4772
4773 default:
4774 break;
4775 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004776
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004777 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4778 options::OPT_mno_restrict_it)) {
4779 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4780 CmdArgs.push_back("-backend-option");
4781 CmdArgs.push_back("-arm-restrict-it");
4782 } else {
4783 CmdArgs.push_back("-backend-option");
4784 CmdArgs.push_back("-arm-no-restrict-it");
4785 }
James Y Knight2db38f32015-08-15 03:45:25 +00004786 } else if (Triple.isOSWindows() &&
4787 (Triple.getArch() == llvm::Triple::arm ||
4788 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004789 // Windows on ARM expects restricted IT blocks
4790 CmdArgs.push_back("-backend-option");
4791 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004792 }
4793
Daniel Dunbard18049a2009-04-07 21:16:11 +00004794 // Forward -f options with positive and negative forms; we translate
4795 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004796 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4797 StringRef fname = A->getValue();
4798 if (!llvm::sys::fs::exists(fname))
4799 D.Diag(diag::err_drv_no_such_file) << fname;
4800 else
4801 A->render(Args, CmdArgs);
4802 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004803
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004804 // -fbuiltin is default unless -mkernel is used.
4805 bool UseBuiltins =
4806 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4807 !Args.hasArg(options::OPT_mkernel));
4808 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004809 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004810
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004811 // -ffreestanding implies -fno-builtin.
4812 if (Args.hasArg(options::OPT_ffreestanding))
4813 UseBuiltins = false;
4814
4815 // Process the -fno-builtin-* options.
4816 for (const auto &Arg : Args) {
4817 const Option &O = Arg->getOption();
4818 if (!O.matches(options::OPT_fno_builtin_))
4819 continue;
4820
4821 Arg->claim();
4822 // If -fno-builtin is specified, then there's no need to pass the option to
4823 // the frontend.
4824 if (!UseBuiltins)
4825 continue;
4826
4827 StringRef FuncName = Arg->getValue();
4828 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4829 }
4830
Nuno Lopes13c88c72009-12-16 16:59:22 +00004831 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4832 options::OPT_fno_assume_sane_operator_new))
4833 CmdArgs.push_back("-fno-assume-sane-operator-new");
4834
Daniel Dunbar4930e332009-11-17 08:07:36 +00004835 // -fblocks=0 is default.
4836 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004837 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004838 (Args.hasArg(options::OPT_fgnu_runtime) &&
4839 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4840 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004841 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004842
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004843 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004844 !getToolChain().hasBlocksRuntime())
4845 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004846 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004847
Richard Smith47972af2015-06-16 00:08:24 +00004848 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004849 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004850 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004851 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004852 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004853 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4854 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004855 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004856 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004857 HaveModules = true;
4858 }
4859 }
4860
Richard Smith47972af2015-06-16 00:08:24 +00004861 // -fmodule-maps enables implicit reading of module map files. By default,
4862 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004863 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4864 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004865 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004866 }
4867
Daniel Jasperac42b752013-10-21 06:34:34 +00004868 // -fmodules-decluse checks that modules used are declared so (off by
4869 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004870 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004871 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004872 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004873 }
4874
Daniel Jasper962b38e2014-04-11 11:47:45 +00004875 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4876 // all #included headers are part of modules.
4877 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004878 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004879 CmdArgs.push_back("-fmodules-strict-decluse");
4880 }
4881
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004882 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4883 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4884 options::OPT_fno_implicit_modules)) {
4885 CmdArgs.push_back("-fno-implicit-modules");
4886 }
4887
Daniel Jasperac42b752013-10-21 06:34:34 +00004888 // -fmodule-name specifies the module that is currently being built (or
4889 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004890 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004891
Richard Smith9887d792014-10-17 01:42:53 +00004892 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004893 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004894 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004895
Richard Smithe842a472014-10-22 02:05:46 +00004896 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004897 if (HaveModules)
4898 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4899 else
4900 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004901
4902 // -fmodule-cache-path specifies where our implicitly-built module files
4903 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004904 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004905 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004906 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004907 if (HaveModules) {
4908 if (C.isForDiagnostics()) {
4909 // When generating crash reports, we want to emit the modules along with
4910 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004911 Path = Output.getFilename();
4912 llvm::sys::path::replace_extension(Path, ".cache");
4913 llvm::sys::path::append(Path, "modules");
4914 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004915 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004916 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004917 llvm::sys::path::append(Path, "org.llvm.clang.");
4918 appendUserToPath(Path);
4919 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004920 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004921 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004922 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4923 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004924 }
4925
4926 // When building modules and generating crashdumps, we need to dump a module
4927 // dependency VFS alongside the output.
4928 if (HaveModules && C.isForDiagnostics()) {
4929 SmallString<128> VFSDir(Output.getFilename());
4930 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004931 // Add the cache directory as a temp so the crash diagnostics pick it up.
4932 C.addTempFile(Args.MakeArgString(VFSDir));
4933
Justin Bognera88f0122014-06-20 22:59:50 +00004934 llvm::sys::path::append(VFSDir, "vfs");
4935 CmdArgs.push_back("-module-dependency-dir");
4936 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004937 }
4938
Richard Smith9887d792014-10-17 01:42:53 +00004939 if (HaveModules)
4940 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004941
Douglas Gregor35b04d62013-02-07 19:01:24 +00004942 // Pass through all -fmodules-ignore-macro arguments.
4943 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004944 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4945 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004946
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004947 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4948
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004949 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4950 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4951 D.Diag(diag::err_drv_argument_not_allowed_with)
4952 << A->getAsString(Args) << "-fbuild-session-timestamp";
4953
4954 llvm::sys::fs::file_status Status;
4955 if (llvm::sys::fs::status(A->getValue(), Status))
4956 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004957 CmdArgs.push_back(Args.MakeArgString(
4958 "-fbuild-session-timestamp=" +
4959 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004960 }
4961
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004962 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004963 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4964 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004965 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4966
4967 Args.AddLastArg(CmdArgs,
4968 options::OPT_fmodules_validate_once_per_build_session);
4969 }
4970
Ben Langmuirdcf73862014-03-12 00:06:17 +00004971 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4972
John McCalldfea9982010-04-09 19:12:06 +00004973 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004974 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004975 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004976 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004977
Anders Carlssond470fef2010-11-21 00:09:52 +00004978 // -felide-constructors is the default.
4979 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004980 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004981 CmdArgs.push_back("-fno-elide-constructors");
4982
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004983 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004984
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004985 if (KernelOrKext || (types::isCXX(InputType) &&
4986 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4987 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004988 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004989
Tony Linthicum76329bf2011-12-12 21:14:55 +00004990 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004991 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4992 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004993 CmdArgs.push_back("-fshort-enums");
4994
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004995 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004996 if (Arg *A = Args.getLastArg(
4997 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4998 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4999 if (A->getOption().matches(options::OPT_funsigned_char) ||
5000 A->getOption().matches(options::OPT_fno_signed_char)) {
5001 CmdArgs.push_back("-fno-signed-char");
5002 }
5003 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005004 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005005 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005006
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005007 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005008 if (!Args.hasFlag(
5009 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5010 !IsWindowsCygnus && !IsWindowsGNU &&
5011 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5012 getToolChain().getArch() != llvm::Triple::hexagon &&
5013 getToolChain().getArch() != llvm::Triple::xcore &&
5014 ((getToolChain().getTriple().getVendor() !=
5015 llvm::Triple::MipsTechnologies) ||
5016 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005017 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005018 CmdArgs.push_back("-fno-use-cxa-atexit");
5019
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005020 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005021 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005022 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005023 CmdArgs.push_back("-fms-extensions");
5024
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005025 // -fno-use-line-directives is default.
5026 if (Args.hasFlag(options::OPT_fuse_line_directives,
5027 options::OPT_fno_use_line_directives, false))
5028 CmdArgs.push_back("-fuse-line-directives");
5029
Francois Pichet1b4f1632011-09-17 04:32:15 +00005030 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005031 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005032 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005033 (IsWindowsMSVC &&
5034 Args.hasFlag(options::OPT_fms_extensions,
5035 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005036 CmdArgs.push_back("-fms-compatibility");
5037
David Majnemerc371ff02015-03-22 08:39:22 +00005038 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005039 VersionTuple MSVT = visualstudio::getMSVCVersion(
5040 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5041 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005042 CmdArgs.push_back(
5043 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005044
David Majnemer8db91762015-05-18 04:49:30 +00005045 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5046 if (ImplyVCPPCXXVer) {
5047 if (IsMSVC2015Compatible)
5048 CmdArgs.push_back("-std=c++14");
5049 else
5050 CmdArgs.push_back("-std=c++11");
5051 }
5052
Eric Christopher5ecce122013-02-18 00:38:31 +00005053 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005054 if (Args.hasFlag(options::OPT_fborland_extensions,
5055 options::OPT_fno_borland_extensions, false))
5056 CmdArgs.push_back("-fborland-extensions");
5057
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005058 // -fno-declspec is default, except for PS4.
5059 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5060 getToolChain().getTriple().isPS4()))
5061 CmdArgs.push_back("-fdeclspec");
5062 else if (Args.hasArg(options::OPT_fno_declspec))
5063 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5064
David Majnemerc371ff02015-03-22 08:39:22 +00005065 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5066 // than 19.
5067 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5068 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005069 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005070 CmdArgs.push_back("-fno-threadsafe-statics");
5071
Francois Pichet02744872011-09-01 16:38:08 +00005072 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5073 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005074 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005075 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005076 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005077
Chandler Carruthe03aa552010-04-17 20:17:31 +00005078 // -fgnu-keywords default varies depending on language; only pass if
5079 // specified.
5080 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005081 options::OPT_fno_gnu_keywords))
5082 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005083
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005084 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005085 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005086 CmdArgs.push_back("-fgnu89-inline");
5087
Chad Rosier9c76d242012-03-15 22:31:42 +00005088 if (Args.hasArg(options::OPT_fno_inline))
5089 CmdArgs.push_back("-fno-inline");
5090
Chad Rosier64d6be92012-03-06 21:17:19 +00005091 if (Args.hasArg(options::OPT_fno_inline_functions))
5092 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005093
John McCall5fb5df92012-06-20 06:18:46 +00005094 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005095
John McCall5fb5df92012-06-20 06:18:46 +00005096 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005097 // legacy is the default. Except for deployment taget of 10.5,
5098 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5099 // gets ignored silently.
5100 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005101 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5102 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005103 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005104 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005105 if (getToolChain().UseObjCMixedDispatch())
5106 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5107 else
5108 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5109 }
5110 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005111
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005112 // When ObjectiveC legacy runtime is in effect on MacOSX,
5113 // turn on the option to do Array/Dictionary subscripting
5114 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005115 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005116 getToolChain().getTriple().isMacOSX() &&
5117 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5118 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005119 objcRuntime.isNeXTFamily())
5120 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005121
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005122 // -fencode-extended-block-signature=1 is default.
5123 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5124 CmdArgs.push_back("-fencode-extended-block-signature");
5125 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005126
John McCall24fc0de2011-07-06 00:26:06 +00005127 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5128 // NOTE: This logic is duplicated in ToolChains.cpp.
5129 bool ARC = isObjCAutoRefCount(Args);
5130 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005131 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005132
John McCall24fc0de2011-07-06 00:26:06 +00005133 CmdArgs.push_back("-fobjc-arc");
5134
Chandler Carruth491db322011-11-04 07:34:47 +00005135 // FIXME: It seems like this entire block, and several around it should be
5136 // wrapped in isObjC, but for now we just use it here as this is where it
5137 // was being used previously.
5138 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5139 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5140 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5141 else
5142 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5143 }
5144
John McCall24fc0de2011-07-06 00:26:06 +00005145 // Allow the user to enable full exceptions code emission.
5146 // We define off for Objective-CC, on for Objective-C++.
5147 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5148 options::OPT_fno_objc_arc_exceptions,
5149 /*default*/ types::isCXX(InputType)))
5150 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005151
John McCall24fc0de2011-07-06 00:26:06 +00005152 }
5153
5154 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5155 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005156 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005157 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005158
John McCall24fc0de2011-07-06 00:26:06 +00005159 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5160 // takes precedence.
5161 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5162 if (!GCArg)
5163 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5164 if (GCArg) {
5165 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005166 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005167 } else if (getToolChain().SupportsObjCGC()) {
5168 GCArg->render(Args, CmdArgs);
5169 } else {
5170 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005171 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005172 }
5173 }
5174
John McCallfbe5ed72015-11-05 19:19:56 +00005175 // Pass down -fobjc-weak or -fno-objc-weak if present.
5176 if (types::isObjC(InputType)) {
5177 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5178 options::OPT_fno_objc_weak);
5179 if (!WeakArg) {
5180 // nothing to do
5181 } else if (GCArg) {
5182 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5183 D.Diag(diag::err_objc_weak_with_gc);
5184 } else if (!objcRuntime.allowsWeak()) {
5185 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5186 D.Diag(diag::err_objc_weak_unsupported);
5187 } else {
5188 WeakArg->render(Args, CmdArgs);
5189 }
5190 }
5191
Bob Wilsonb111ec92015-03-02 19:01:14 +00005192 if (Args.hasFlag(options::OPT_fapplication_extension,
5193 options::OPT_fno_application_extension, false))
5194 CmdArgs.push_back("-fapplication-extension");
5195
Reid Klecknerc542d372014-06-27 17:02:02 +00005196 // Handle GCC-style exception args.
5197 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005198 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5199 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005200
Tim Northovere931f9f2015-10-30 16:30:41 +00005201 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005202 CmdArgs.push_back("-fsjlj-exceptions");
5203
5204 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005205 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5206 options::OPT_fno_assume_sane_operator_new))
5207 CmdArgs.push_back("-fno-assume-sane-operator-new");
5208
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005209 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5210 // most platforms.
5211 if (Args.hasFlag(options::OPT_fsized_deallocation,
5212 options::OPT_fno_sized_deallocation, false))
5213 CmdArgs.push_back("-fsized-deallocation");
5214
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005215 // -fconstant-cfstrings is default, and may be subject to argument translation
5216 // on Darwin.
5217 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5218 options::OPT_fno_constant_cfstrings) ||
5219 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5220 options::OPT_mno_constant_cfstrings))
5221 CmdArgs.push_back("-fno-constant-cfstrings");
5222
John Thompsoned4e2952009-11-05 20:14:16 +00005223 // -fshort-wchar default varies depending on platform; only
5224 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005225 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5226 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005227 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005228
Hans Wennborg28c96312013-07-31 23:39:13 +00005229 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005230 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005231 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005232 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005233
Daniel Dunbar096ed292011-10-05 21:04:55 +00005234 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5235 // -fno-pack-struct doesn't apply to -fpack-struct=.
5236 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005237 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005238 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005239 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005240 } else if (Args.hasFlag(options::OPT_fpack_struct,
5241 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005242 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005243 }
5244
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005245 // Handle -fmax-type-align=N and -fno-type-align
5246 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5247 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5248 if (!SkipMaxTypeAlign) {
5249 std::string MaxTypeAlignStr = "-fmax-type-align=";
5250 MaxTypeAlignStr += A->getValue();
5251 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5252 }
5253 } else if (getToolChain().getTriple().isOSDarwin()) {
5254 if (!SkipMaxTypeAlign) {
5255 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5256 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5257 }
5258 }
5259
John Brawna7b4ec02015-08-10 11:11:28 +00005260 // -fcommon is the default unless compiling kernel code or the target says so
5261 bool NoCommonDefault =
5262 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5263 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5264 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005265 CmdArgs.push_back("-fno-common");
5266
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005267 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005268 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005269 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005270 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005271 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005272 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005273
Daniel Dunbar6358d682010-10-15 22:30:42 +00005274 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005275 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005276 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005277 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005278
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005279 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005280 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5281 StringRef value = inputCharset->getValue();
5282 if (value != "UTF-8")
5283 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5284 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005285 }
5286
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005287 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005288 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5289 StringRef value = execCharset->getValue();
5290 if (value != "UTF-8")
5291 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5292 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005293 }
5294
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005295 // -fcaret-diagnostics is default.
5296 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5297 options::OPT_fno_caret_diagnostics, true))
5298 CmdArgs.push_back("-fno-caret-diagnostics");
5299
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005300 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005301 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005302 options::OPT_fno_diagnostics_fixit_info))
5303 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005304
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005305 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005306 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005307 options::OPT_fno_diagnostics_show_option))
5308 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005309
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005310 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005311 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005312 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005313 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005314 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005315
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005316 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005317 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005318 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005319 }
5320
Chandler Carruthb6766f02011-03-27 01:50:55 +00005321 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005322 options::OPT_fdiagnostics_show_note_include_stack,
5323 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005324 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005325 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005326 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5327 else
5328 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5329 }
5330
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005331 // Color diagnostics are the default, unless the terminal doesn't support
5332 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005333 // Support both clang's -f[no-]color-diagnostics and gcc's
5334 // -f[no-]diagnostics-colors[=never|always|auto].
5335 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005336 for (const auto &Arg : Args) {
5337 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005338 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5339 !O.matches(options::OPT_fdiagnostics_color) &&
5340 !O.matches(options::OPT_fno_color_diagnostics) &&
5341 !O.matches(options::OPT_fno_diagnostics_color) &&
5342 !O.matches(options::OPT_fdiagnostics_color_EQ))
5343 continue;
5344
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005345 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005346 if (O.matches(options::OPT_fcolor_diagnostics) ||
5347 O.matches(options::OPT_fdiagnostics_color)) {
5348 ShowColors = Colors_On;
5349 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5350 O.matches(options::OPT_fno_diagnostics_color)) {
5351 ShowColors = Colors_Off;
5352 } else {
5353 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005354 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005355 if (value == "always")
5356 ShowColors = Colors_On;
5357 else if (value == "never")
5358 ShowColors = Colors_Off;
5359 else if (value == "auto")
5360 ShowColors = Colors_Auto;
5361 else
5362 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005363 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005364 }
5365 }
5366 if (ShowColors == Colors_On ||
5367 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005368 CmdArgs.push_back("-fcolor-diagnostics");
5369
Nico Rieck7857d462013-09-11 00:38:02 +00005370 if (Args.hasArg(options::OPT_fansi_escape_codes))
5371 CmdArgs.push_back("-fansi-escape-codes");
5372
Daniel Dunbardb097022009-06-08 21:13:54 +00005373 if (!Args.hasFlag(options::OPT_fshow_source_location,
5374 options::OPT_fno_show_source_location))
5375 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005376
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005377 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005378 true))
5379 CmdArgs.push_back("-fno-show-column");
5380
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005381 if (!Args.hasFlag(options::OPT_fspell_checking,
5382 options::OPT_fno_spell_checking))
5383 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005384
Chad Rosierc8e56e82012-12-05 21:08:21 +00005385 // -fno-asm-blocks is default.
5386 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5387 false))
5388 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005389
Steven Wucb0d13f2015-01-16 23:05:28 +00005390 // -fgnu-inline-asm is default.
5391 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5392 options::OPT_fno_gnu_inline_asm, true))
5393 CmdArgs.push_back("-fno-gnu-inline-asm");
5394
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005395 // Enable vectorization per default according to the optimization level
5396 // selected. For optimization levels that want vectorization we use the alias
5397 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005398 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005399 OptSpecifier VectorizeAliasOption =
5400 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005401 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005402 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005403 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005404
Chad Rosier136d67d2014-04-28 19:30:57 +00005405 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005406 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005407 OptSpecifier SLPVectAliasOption =
5408 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005409 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005410 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005411 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005412
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005413 // -fno-slp-vectorize-aggressive is default.
5414 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005415 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005416 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005417
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005418 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5419 A->render(Args, CmdArgs);
5420
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005421 // -fdollars-in-identifiers default varies depending on platform and
5422 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005423 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005424 options::OPT_fno_dollars_in_identifiers)) {
5425 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005426 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005427 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005428 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005429 }
5430
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005431 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5432 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005433 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005434 options::OPT_fno_unit_at_a_time)) {
5435 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005436 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005437 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005438
Eli Friedman055c9702011-11-02 01:53:16 +00005439 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5440 options::OPT_fno_apple_pragma_pack, false))
5441 CmdArgs.push_back("-fapple-pragma-pack");
5442
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005443 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005444 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5445 // by default.
5446 if (getToolChain().getArch() == llvm::Triple::le32) {
5447 CmdArgs.push_back("-fno-math-builtin");
5448 }
5449
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005450// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5451//
5452// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005453#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005454 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005455 (getToolChain().getArch() == llvm::Triple::arm ||
5456 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005457 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5458 CmdArgs.push_back("-fno-builtin-strcat");
5459 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5460 CmdArgs.push_back("-fno-builtin-strcpy");
5461 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005462#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005463
Justin Bognera88f0122014-06-20 22:59:50 +00005464 // Enable rewrite includes if the user's asked for it or if we're generating
5465 // diagnostics.
5466 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5467 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005468 if (Args.hasFlag(options::OPT_frewrite_includes,
5469 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005470 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005471 CmdArgs.push_back("-frewrite-includes");
5472
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005473 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005474 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005475 options::OPT_traditional_cpp)) {
5476 if (isa<PreprocessJobAction>(JA))
5477 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005478 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005479 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005480 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005481
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005482 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005483 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005484
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005485 // Handle serialized diagnostics.
5486 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5487 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005488 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005489 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005490
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005491 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5492 CmdArgs.push_back("-fretain-comments-from-system-headers");
5493
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005494 // Forward -fcomment-block-commands to -cc1.
5495 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005496 // Forward -fparse-all-comments to -cc1.
5497 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005498
John Brawnad31ace2015-09-23 13:55:40 +00005499 // Turn -fplugin=name.so into -load name.so
5500 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5501 CmdArgs.push_back("-load");
5502 CmdArgs.push_back(A->getValue());
5503 A->claim();
5504 }
5505
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005506 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5507 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005508 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005509 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5510 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005511
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005512 // We translate this by hand to the -cc1 argument, since nightly test uses
5513 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005514 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005515 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005516 } else
Sean Silva14facf32015-06-09 01:57:17 +00005517 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005518 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005519
Bob Wilson23a55f12014-12-21 07:00:00 +00005520 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005521 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5522 // by the frontend.
5523 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5524 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005525
Daniel Dunbard67a3222009-03-30 06:36:42 +00005526 if (Output.getType() == types::TY_Dependencies) {
5527 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005528 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005529 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005530 CmdArgs.push_back(Output.getFilename());
5531 } else {
5532 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005533 }
5534
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005535 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005536
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005537 if (Input.isFilename())
5538 CmdArgs.push_back(Input.getFilename());
5539 else
5540 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005541
Chris Lattnere9d7d782009-11-03 19:50:27 +00005542 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5543
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005544 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005545
5546 // Optionally embed the -cc1 level arguments into the debug info, for build
5547 // analysis.
5548 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005549 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005550 for (const auto &Arg : Args)
5551 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005552
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005553 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005554 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005555 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005556 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005557 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005558 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005559 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005560 }
5561 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005562 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005563 }
5564
Eric Christopherd3804002013-02-22 20:12:52 +00005565 // Add the split debug info name to the command lines here so we
5566 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005567 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005568 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5569 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005570 const char *SplitDwarfOut;
5571 if (SplitDwarf) {
5572 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005573 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005574 CmdArgs.push_back(SplitDwarfOut);
5575 }
5576
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005577 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5578 // Include them with -fcuda-include-gpubinary.
5579 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005580 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005581 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005582 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005583 }
5584
Eric Christopherd3804002013-02-22 20:12:52 +00005585 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005586 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005587 Output.getType() == types::TY_Object &&
5588 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005589 auto CLCommand =
5590 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005591 C.addCommand(llvm::make_unique<FallbackCommand>(
5592 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005593 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005594 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005595 }
5596
Eric Christopherf1545832013-02-22 23:50:16 +00005597 // Handle the debug info splitting at object creation time if we're
5598 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005599 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005600 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005601 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005602
Roman Divacky178e01602011-02-10 16:52:03 +00005603 if (Arg *A = Args.getLastArg(options::OPT_pg))
5604 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005605 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5606 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005607
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005608 // Claim some arguments which clang supports automatically.
5609
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005610 // -fpch-preprocess is used with gcc to add a special marker in the output to
5611 // include the PCH file. Clang's PTH solution is completely transparent, so we
5612 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005613 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005614
Daniel Dunbar17731772009-03-23 19:03:36 +00005615 // Claim some arguments which clang doesn't support, but we don't
5616 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005617 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5618 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005619
Rafael Espindolab0092d72013-09-04 19:37:35 +00005620 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005621 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005622}
5623
John McCall5fb5df92012-06-20 06:18:46 +00005624/// Add options related to the Objective-C runtime/ABI.
5625///
5626/// Returns true if the runtime is non-fragile.
5627ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5628 ArgStringList &cmdArgs,
5629 RewriteKind rewriteKind) const {
5630 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005631 Arg *runtimeArg =
5632 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5633 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005634
5635 // Just forward -fobjc-runtime= to the frontend. This supercedes
5636 // options about fragility.
5637 if (runtimeArg &&
5638 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5639 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005640 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005641 if (runtime.tryParse(value)) {
5642 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005643 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005644 }
5645
5646 runtimeArg->render(args, cmdArgs);
5647 return runtime;
5648 }
5649
5650 // Otherwise, we'll need the ABI "version". Version numbers are
5651 // slightly confusing for historical reasons:
5652 // 1 - Traditional "fragile" ABI
5653 // 2 - Non-fragile ABI, version 1
5654 // 3 - Non-fragile ABI, version 2
5655 unsigned objcABIVersion = 1;
5656 // If -fobjc-abi-version= is present, use that to set the version.
5657 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005658 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005659 if (value == "1")
5660 objcABIVersion = 1;
5661 else if (value == "2")
5662 objcABIVersion = 2;
5663 else if (value == "3")
5664 objcABIVersion = 3;
5665 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005666 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005667 } else {
5668 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005669 bool nonFragileABIIsDefault =
5670 (rewriteKind == RK_NonFragile ||
5671 (rewriteKind == RK_None &&
5672 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005673 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5674 options::OPT_fno_objc_nonfragile_abi,
5675 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005676// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005677#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5678 unsigned nonFragileABIVersion = 1;
5679#else
5680 unsigned nonFragileABIVersion = 2;
5681#endif
5682
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005683 if (Arg *abiArg =
5684 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005685 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005686 if (value == "1")
5687 nonFragileABIVersion = 1;
5688 else if (value == "2")
5689 nonFragileABIVersion = 2;
5690 else
5691 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005692 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005693 }
5694
5695 objcABIVersion = 1 + nonFragileABIVersion;
5696 } else {
5697 objcABIVersion = 1;
5698 }
5699 }
5700
5701 // We don't actually care about the ABI version other than whether
5702 // it's non-fragile.
5703 bool isNonFragile = objcABIVersion != 1;
5704
5705 // If we have no runtime argument, ask the toolchain for its default runtime.
5706 // However, the rewriter only really supports the Mac runtime, so assume that.
5707 ObjCRuntime runtime;
5708 if (!runtimeArg) {
5709 switch (rewriteKind) {
5710 case RK_None:
5711 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5712 break;
5713 case RK_Fragile:
5714 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5715 break;
5716 case RK_NonFragile:
5717 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5718 break;
5719 }
5720
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005721 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005722 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5723 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005724 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005725 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5726
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005727 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005728 } else {
5729 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5730 }
5731
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005732 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005733 } else {
5734 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005735 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005736 // non-fragile mode or the GCC runtime in fragile mode.
5737 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005738 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005739 else
5740 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005741 }
5742
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005743 cmdArgs.push_back(
5744 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005745 return runtime;
5746}
5747
Reid Klecknerc542d372014-06-27 17:02:02 +00005748static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5749 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5750 I += HaveDash;
5751 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005752}
Reid Klecknerc542d372014-06-27 17:02:02 +00005753
Benjamin Kramere003ca22015-10-28 13:54:16 +00005754namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005755struct EHFlags {
5756 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5757 bool Synch;
5758 bool Asynch;
5759 bool NoExceptC;
5760};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005761} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005762
5763/// /EH controls whether to run destructor cleanups when exceptions are
5764/// thrown. There are three modifiers:
5765/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5766/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5767/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5768/// - c: Assume that extern "C" functions are implicitly noexcept. This
5769/// modifier is an optimization, so we ignore it for now.
5770/// The default is /EHs-c-, meaning cleanups are disabled.
5771static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5772 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005773
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005774 std::vector<std::string> EHArgs =
5775 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005776 for (auto EHVal : EHArgs) {
5777 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5778 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005779 case 'a':
5780 EH.Asynch = maybeConsumeDash(EHVal, I);
5781 continue;
5782 case 'c':
5783 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5784 continue;
5785 case 's':
5786 EH.Synch = maybeConsumeDash(EHVal, I);
5787 continue;
5788 default:
5789 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005790 }
5791 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5792 break;
5793 }
5794 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005795
Reid Klecknerc542d372014-06-27 17:02:02 +00005796 return EH;
5797}
5798
Douglas Katzman3459ce22015-10-08 04:24:12 +00005799void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5800 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5801 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005802 unsigned RTOptionID = options::OPT__SLASH_MT;
5803
Hans Wennborgf1a74252013-09-10 20:18:04 +00005804 if (Args.hasArg(options::OPT__SLASH_LDd))
5805 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5806 // but defining _DEBUG is sticky.
5807 RTOptionID = options::OPT__SLASH_MTd;
5808
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005809 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005810 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005811
David Majnemere2afb472015-07-24 06:49:13 +00005812 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005813 switch (RTOptionID) {
5814 case options::OPT__SLASH_MD:
5815 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005816 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005817 CmdArgs.push_back("-D_MT");
5818 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005819 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005820 break;
5821 case options::OPT__SLASH_MDd:
5822 CmdArgs.push_back("-D_DEBUG");
5823 CmdArgs.push_back("-D_MT");
5824 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005825 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005826 break;
5827 case options::OPT__SLASH_MT:
5828 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005829 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005830 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005831 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005832 break;
5833 case options::OPT__SLASH_MTd:
5834 CmdArgs.push_back("-D_DEBUG");
5835 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005836 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005837 break;
5838 default:
5839 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005840 }
5841
David Majnemere2afb472015-07-24 06:49:13 +00005842 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5843 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5844 } else {
5845 CmdArgs.push_back(FlagForCRT.data());
5846
5847 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5848 // users want. The /Za flag to cl.exe turns this off, but it's not
5849 // implemented in clang.
5850 CmdArgs.push_back("--dependent-lib=oldnames");
5851 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005852
Hans Wennborg8858a032014-07-21 23:42:07 +00005853 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5854 // would produce interleaved output, so ignore /showIncludes in such cases.
5855 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5856 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5857 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005858
David Majnemerf6072342014-07-01 22:24:56 +00005859 // This controls whether or not we emit RTTI data for polymorphic types.
5860 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5861 /*default=*/false))
5862 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005863
Reid Kleckner124955a2015-08-05 18:51:13 +00005864 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005865 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005866 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5867 // If we are emitting CV but not DWARF, don't build information that LLVM
5868 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005869 if (*EmitCodeView && !EmitDwarf)
5870 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5871 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005872 CmdArgs.push_back("-gcodeview");
5873
Reid Klecknerc542d372014-06-27 17:02:02 +00005874 const Driver &D = getToolChain().getDriver();
5875 EHFlags EH = parseClangCLEHFlags(D, Args);
5876 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005877 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005878 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005879 CmdArgs.push_back("-fexceptions");
5880 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005881
Hans Wennborge50cec32014-06-13 20:59:54 +00005882 // /EP should expand to -E -P.
5883 if (Args.hasArg(options::OPT__SLASH_EP)) {
5884 CmdArgs.push_back("-E");
5885 CmdArgs.push_back("-P");
5886 }
5887
David Majnemera5b195a2015-02-14 01:35:12 +00005888 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005889 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5890 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005891 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5892 else
5893 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5894
5895 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5896 VolatileOptionID = A->getOption().getID();
5897
5898 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5899 CmdArgs.push_back("-fms-volatile");
5900
David Majnemer86c318f2014-02-11 21:05:00 +00005901 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5902 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5903 if (MostGeneralArg && BestCaseArg)
5904 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5905 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5906
5907 if (MostGeneralArg) {
5908 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5909 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5910 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5911
5912 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5913 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5914 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5915 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5916 << FirstConflict->getAsString(Args)
5917 << SecondConflict->getAsString(Args);
5918
5919 if (SingleArg)
5920 CmdArgs.push_back("-fms-memptr-rep=single");
5921 else if (MultipleArg)
5922 CmdArgs.push_back("-fms-memptr-rep=multiple");
5923 else
5924 CmdArgs.push_back("-fms-memptr-rep=virtual");
5925 }
5926
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005927 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5928 A->render(Args, CmdArgs);
5929
Hans Wennborg81f74482013-09-10 01:07:07 +00005930 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5931 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005932 if (Args.hasArg(options::OPT__SLASH_fallback))
5933 CmdArgs.push_back("msvc-fallback");
5934 else
5935 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005936 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005937}
5938
Douglas Katzman95354292015-06-23 20:42:09 +00005939visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005940 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005941 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005942 return CLFallback.get();
5943}
5944
Daniel Sanders7f933f42015-01-30 17:35:23 +00005945void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5946 ArgStringList &CmdArgs) const {
5947 StringRef CPUName;
5948 StringRef ABIName;
5949 const llvm::Triple &Triple = getToolChain().getTriple();
5950 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5951
5952 CmdArgs.push_back("-target-abi");
5953 CmdArgs.push_back(ABIName.data());
5954}
5955
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005956void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005957 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005958 const ArgList &Args,
5959 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005960 ArgStringList CmdArgs;
5961
5962 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5963 const InputInfo &Input = Inputs[0];
5964
James Y Knight2db38f32015-08-15 03:45:25 +00005965 std::string TripleStr =
5966 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5967 const llvm::Triple Triple(TripleStr);
5968
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005969 // Don't warn about "clang -w -c foo.s"
5970 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005971 // and "clang -emit-llvm -c foo.s"
5972 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005973
Rafael Espindola577637a2015-01-03 00:06:04 +00005974 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005975
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005976 // Invoke ourselves in -cc1as mode.
5977 //
5978 // FIXME: Implement custom jobs for internal actions.
5979 CmdArgs.push_back("-cc1as");
5980
5981 // Add the "effective" target triple.
5982 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005983 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5984
5985 // Set the output mode, we currently only expect to be used as a real
5986 // assembler.
5987 CmdArgs.push_back("-filetype");
5988 CmdArgs.push_back("obj");
5989
Eric Christopher45f2e712012-12-18 00:31:10 +00005990 // Set the main file name, so that debug info works even with
5991 // -save-temps or preprocessed assembly.
5992 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005993 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005994
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005995 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005996 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005997 if (!CPU.empty()) {
5998 CmdArgs.push_back("-target-cpu");
5999 CmdArgs.push_back(Args.MakeArgString(CPU));
6000 }
6001
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006002 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006003 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006004
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006005 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006006 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006007
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006008 // Pass along any -I options so we get proper .include search paths.
6009 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6010
Eric Christopherfc3ee562012-01-10 00:38:01 +00006011 // Determine the original source input.
6012 const Action *SourceAction = &JA;
6013 while (SourceAction->getKind() != Action::InputClass) {
6014 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6015 SourceAction = SourceAction->getInputs()[0];
6016 }
6017
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006018 // Forward -g and handle debug info related flags, assuming we are dealing
6019 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006020 if (SourceAction->getType() == types::TY_Asm ||
6021 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006022 bool WantDebug = false;
6023 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006024 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006025 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006026 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6027 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006028 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006029 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006030 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006031 if (DwarfVersion == 0)
6032 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006033 RenderDebugEnablingArgs(Args, CmdArgs,
6034 (WantDebug ? CodeGenOptions::LimitedDebugInfo
6035 : CodeGenOptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006036 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006037
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006038 // Add the -fdebug-compilation-dir flag if needed.
6039 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006040
6041 // Set the AT_producer to the clang version when using the integrated
6042 // assembler on assembly source files.
6043 CmdArgs.push_back("-dwarf-debug-producer");
6044 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006045
6046 // And pass along -I options
6047 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006048 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006049
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006050 // Handle -fPIC et al -- the relocation-model affects the assembler
6051 // for some targets.
6052 llvm::Reloc::Model RelocationModel;
6053 unsigned PICLevel;
6054 bool IsPIE;
6055 std::tie(RelocationModel, PICLevel, IsPIE) =
6056 ParsePICArgs(getToolChain(), Triple, Args);
6057
6058 const char *RMName = RelocationModelName(RelocationModel);
6059 if (RMName) {
6060 CmdArgs.push_back("-mrelocation-model");
6061 CmdArgs.push_back(RMName);
6062 }
6063
Kevin Enderby292dc082011-12-22 19:31:58 +00006064 // Optionally embed the -cc1as level arguments into the debug info, for build
6065 // analysis.
6066 if (getToolChain().UseDwarfDebugFlags()) {
6067 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006068 for (const auto &Arg : Args)
6069 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006070
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006071 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006072 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6073 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006074 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006075 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006076 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006077 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006078 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006079 }
6080 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006081 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006082 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006083
6084 // FIXME: Add -static support, once we have it.
6085
Daniel Sanders7f933f42015-01-30 17:35:23 +00006086 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006087 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006088 default:
6089 break;
6090
6091 case llvm::Triple::mips:
6092 case llvm::Triple::mipsel:
6093 case llvm::Triple::mips64:
6094 case llvm::Triple::mips64el:
6095 AddMIPSTargetArgs(Args, CmdArgs);
6096 break;
6097 }
6098
David Blaikie372d9502014-01-17 03:17:40 +00006099 // Consume all the warning flags. Usually this would be handled more
6100 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6101 // doesn't handle that so rather than warning about unused flags that are
6102 // actually used, we'll lie by omission instead.
6103 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006104 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006105
David Blaikie9260ed62013-07-25 21:19:01 +00006106 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6107 getToolChain().getDriver());
6108
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006109 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006110
6111 assert(Output.isFilename() && "Unexpected lipo output.");
6112 CmdArgs.push_back("-o");
6113 CmdArgs.push_back(Output.getFilename());
6114
Daniel Dunbarb440f562010-08-02 02:38:21 +00006115 assert(Input.isFilename() && "Invalid input.");
6116 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006117
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006118 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006119 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006120
6121 // Handle the debug info splitting at object creation time if we're
6122 // creating an object.
6123 // TODO: Currently only works on linux with newer objcopy.
6124 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006125 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006126 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006127 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006128}
6129
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006130void GnuTool::anchor() {}
6131
Daniel Dunbara3246a02009-03-18 08:07:30 +00006132void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006133 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006134 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006135 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006136 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006137 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006138
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006139 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006140 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006141 // It is unfortunate that we have to claim here, as this means
6142 // we will basically never report anything interesting for
6143 // platforms using a generic gcc, even if we are just using gcc
6144 // to get to the assembler.
6145 A->claim();
6146
Daniel Dunbar939c1212010-08-03 16:14:14 +00006147 // Don't forward any -g arguments to assembly steps.
6148 if (isa<AssembleJobAction>(JA) &&
6149 A->getOption().matches(options::OPT_g_Group))
6150 continue;
6151
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006152 // Don't forward any -W arguments to assembly and link steps.
6153 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6154 A->getOption().matches(options::OPT_W_Group))
6155 continue;
6156
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006157 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006158 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006159 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006160
Daniel Dunbar4e295052010-01-25 22:35:08 +00006161 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006162
6163 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006164 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006165 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006166 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006167 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006168 }
6169
Daniel Dunbar5716d872009-05-02 21:41:52 +00006170 // Try to force gcc to match the tool chain we want, if we recognize
6171 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006172 //
6173 // FIXME: The triple class should directly provide the information we want
6174 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006175 switch (getToolChain().getArch()) {
6176 default:
6177 break;
6178 case llvm::Triple::x86:
6179 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006180 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006181 break;
6182 case llvm::Triple::x86_64:
6183 case llvm::Triple::ppc64:
6184 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006185 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006186 break;
6187 case llvm::Triple::sparcel:
6188 CmdArgs.push_back("-EL");
6189 break;
6190 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006191
Daniel Dunbarb440f562010-08-02 02:38:21 +00006192 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006193 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006194 CmdArgs.push_back(Output.getFilename());
6195 } else {
6196 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006197 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006198 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006199
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006200 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006201
6202 // Only pass -x if gcc will understand it; otherwise hope gcc
6203 // understands the suffix correctly. The main use case this would go
6204 // wrong in is for linker inputs if they happened to have an odd
6205 // suffix; really the only way to get this to happen is a command
6206 // like '-x foobar a.c' which will treat a.c like a linker input.
6207 //
6208 // FIXME: For the linker case specifically, can we safely convert
6209 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006210 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006211 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006212 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006213 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006214 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006215 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006216 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006217 else if (II.getType() == types::TY_ModuleFile)
6218 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006219 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006220
Daniel Dunbara3246a02009-03-18 08:07:30 +00006221 if (types::canTypeBeUserSpecified(II.getType())) {
6222 CmdArgs.push_back("-x");
6223 CmdArgs.push_back(types::getTypeName(II.getType()));
6224 }
6225
Daniel Dunbarb440f562010-08-02 02:38:21 +00006226 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006227 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006228 else {
6229 const Arg &A = II.getInputArg();
6230
6231 // Reverse translate some rewritten options.
6232 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6233 CmdArgs.push_back("-lstdc++");
6234 continue;
6235 }
6236
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006237 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006238 A.render(Args, CmdArgs);
6239 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006240 }
6241
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006242 const std::string customGCCName = D.getCCCGenericGCCName();
6243 const char *GCCName;
6244 if (!customGCCName.empty())
6245 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006246 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006247 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006248 } else
6249 GCCName = "gcc";
6250
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006251 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006252 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006253}
6254
Douglas Katzman95354292015-06-23 20:42:09 +00006255void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6256 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006257 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006258}
6259
Douglas Katzman95354292015-06-23 20:42:09 +00006260void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6261 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006262 const Driver &D = getToolChain().getDriver();
6263
Eric Christophercc7ff502015-01-29 00:56:17 +00006264 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006265 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006266 case types::TY_LLVM_IR:
6267 case types::TY_LTO_IR:
6268 case types::TY_LLVM_BC:
6269 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006270 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006271 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006272 // We assume we've got an "integrated" assembler in that gcc will produce an
6273 // object file itself.
6274 case types::TY_Object:
6275 CmdArgs.push_back("-c");
6276 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006277 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006278 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006279 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006280 case types::TY_Nothing:
6281 CmdArgs.push_back("-fsyntax-only");
6282 break;
6283 default:
6284 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006285 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006286}
6287
Douglas Katzman95354292015-06-23 20:42:09 +00006288void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6289 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006290 // The types are (hopefully) good enough.
6291}
6292
Tony Linthicum76329bf2011-12-12 21:14:55 +00006293// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006294void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006295 ArgStringList &CmdArgs) const {
6296}
6297
Douglas Katzman95354292015-06-23 20:42:09 +00006298void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6299 const InputInfo &Output,
6300 const InputInfoList &Inputs,
6301 const ArgList &Args,
6302 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006303 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006304
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006305 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6306 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006307 ArgStringList CmdArgs;
6308
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006309 std::string MArchString = "-march=hexagon";
6310 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006311
6312 RenderExtraToolArgs(JA, CmdArgs);
6313
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006314 std::string AsName = "hexagon-llvm-mc";
6315 std::string MCpuString = "-mcpu=hexagon" +
6316 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6317 CmdArgs.push_back("-filetype=obj");
6318 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6319
Tony Linthicum76329bf2011-12-12 21:14:55 +00006320 if (Output.isFilename()) {
6321 CmdArgs.push_back("-o");
6322 CmdArgs.push_back(Output.getFilename());
6323 } else {
6324 assert(Output.isNothing() && "Unexpected output");
6325 CmdArgs.push_back("-fsyntax-only");
6326 }
6327
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006328 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6329 std::string N = llvm::utostr(G.getValue());
6330 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6331 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006332
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006333 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006334
Tony Linthicum76329bf2011-12-12 21:14:55 +00006335 // Only pass -x if gcc will understand it; otherwise hope gcc
6336 // understands the suffix correctly. The main use case this would go
6337 // wrong in is for linker inputs if they happened to have an odd
6338 // suffix; really the only way to get this to happen is a command
6339 // like '-x foobar a.c' which will treat a.c like a linker input.
6340 //
6341 // FIXME: For the linker case specifically, can we safely convert
6342 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006343 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006344 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006345 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006346 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006347 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006348 else if (II.getType() == types::TY_AST)
6349 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006350 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006351 else if (II.getType() == types::TY_ModuleFile)
6352 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006353 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006354
6355 if (II.isFilename())
6356 CmdArgs.push_back(II.getFilename());
6357 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006358 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006359 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006360 II.getInputArg().render(Args, CmdArgs);
6361 }
6362
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006363 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006364 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006365}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006366
Douglas Katzman95354292015-06-23 20:42:09 +00006367void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6368 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006369}
6370
Douglas Katzman54366072015-07-27 16:53:08 +00006371static void
6372constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006373 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006374 const InputInfo &Output, const InputInfoList &Inputs,
6375 const ArgList &Args, ArgStringList &CmdArgs,
6376 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006377
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006378 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006379
Matthew Curtise689b052012-12-06 15:46:07 +00006380 //----------------------------------------------------------------------------
6381 //
6382 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006383 bool IsStatic = Args.hasArg(options::OPT_static);
6384 bool IsShared = Args.hasArg(options::OPT_shared);
6385 bool IsPIE = Args.hasArg(options::OPT_pie);
6386 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6387 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6388 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6389 bool UseG0 = false;
6390 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006391
Matthew Curtise689b052012-12-06 15:46:07 +00006392 //----------------------------------------------------------------------------
6393 // Silence warnings for various options
6394 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006395 Args.ClaimAllArgs(options::OPT_g_Group);
6396 Args.ClaimAllArgs(options::OPT_emit_llvm);
6397 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6398 // handled somewhere else.
6399 Args.ClaimAllArgs(options::OPT_static_libgcc);
6400
6401 //----------------------------------------------------------------------------
6402 //
6403 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006404 if (Args.hasArg(options::OPT_s))
6405 CmdArgs.push_back("-s");
6406
6407 if (Args.hasArg(options::OPT_r))
6408 CmdArgs.push_back("-r");
6409
6410 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006411 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006412
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006413 CmdArgs.push_back("-march=hexagon");
6414 std::string CpuVer =
6415 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6416 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6417 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006418
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006419 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006420 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006421 // The following should be the default, but doing as hexagon-gcc does.
6422 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006423 }
6424
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006425 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006426 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006427
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006428 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006429 CmdArgs.push_back("-pie");
6430
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006431 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6432 std::string N = llvm::utostr(G.getValue());
6433 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6434 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006435 }
6436
Matthew Curtise689b052012-12-06 15:46:07 +00006437 //----------------------------------------------------------------------------
6438 //
6439 //----------------------------------------------------------------------------
6440 CmdArgs.push_back("-o");
6441 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006442
Matthew Curtise689b052012-12-06 15:46:07 +00006443 //----------------------------------------------------------------------------
6444 // moslib
6445 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006446 std::vector<std::string> OsLibs;
6447 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006448
Sean Silva14facf32015-06-09 01:57:17 +00006449 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6450 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006451 OsLibs.emplace_back(A->getValue());
6452 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006453 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006454 if (OsLibs.empty()) {
6455 OsLibs.push_back("standalone");
6456 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006457 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006458
Matthew Curtise689b052012-12-06 15:46:07 +00006459 //----------------------------------------------------------------------------
6460 // Start Files
6461 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006462 const std::string MCpuSuffix = "/" + CpuVer;
6463 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6464 const std::string RootDir =
6465 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6466 const std::string StartSubDir =
6467 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006468
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006469 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6470 const char *Name) -> std::string {
6471 std::string RelName = SubDir + Name;
6472 std::string P = HTC.GetFilePath(RelName.c_str());
6473 if (llvm::sys::fs::exists(P))
6474 return P;
6475 return RootDir + RelName;
6476 };
6477
6478 if (IncStdLib && IncStartFiles) {
6479 if (!IsShared) {
6480 if (HasStandalone) {
6481 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6482 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006483 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006484 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6485 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006486 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006487 std::string Init = UseShared
6488 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6489 : Find(RootDir, StartSubDir, "/init.o");
6490 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006491 }
6492
6493 //----------------------------------------------------------------------------
6494 // Library Search Paths
6495 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006496 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6497 for (const auto &LibPath : LibPaths)
6498 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006499
6500 //----------------------------------------------------------------------------
6501 //
6502 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006503 Args.AddAllArgs(CmdArgs,
6504 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6505 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006506
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006507 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006508
6509 //----------------------------------------------------------------------------
6510 // Libraries
6511 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006512 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006513 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006514 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006515 CmdArgs.push_back("-lm");
6516 }
6517
6518 CmdArgs.push_back("--start-group");
6519
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006520 if (!IsShared) {
6521 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006522 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006523 CmdArgs.push_back("-lc");
6524 }
6525 CmdArgs.push_back("-lgcc");
6526
6527 CmdArgs.push_back("--end-group");
6528 }
6529
6530 //----------------------------------------------------------------------------
6531 // End files
6532 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006533 if (IncStdLib && IncStartFiles) {
6534 std::string Fini = UseShared
6535 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6536 : Find(RootDir, StartSubDir, "/fini.o");
6537 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006538 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006539}
6540
Douglas Katzman95354292015-06-23 20:42:09 +00006541void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6542 const InputInfo &Output,
6543 const InputInfoList &Inputs,
6544 const ArgList &Args,
6545 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006546 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006547
6548 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006549 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006550 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006551
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006552 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006553 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006554 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006555}
6556// Hexagon tools end.
6557
Tom Stellard8fa33092015-07-18 01:49:05 +00006558void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6559 const InputInfo &Output,
6560 const InputInfoList &Inputs,
6561 const ArgList &Args,
6562 const char *LinkingOutput) const {
6563
6564 std::string Linker = getToolChain().GetProgramPath(getShortName());
6565 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006566 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6567 CmdArgs.push_back("-o");
6568 CmdArgs.push_back(Output.getFilename());
6569 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6570 CmdArgs, Inputs));
6571}
6572// AMDGPU tools end.
6573
Dan Gohman52816862015-12-16 23:30:41 +00006574wasm::Linker::Linker(const ToolChain &TC)
6575 : GnuTool("wasm::Linker", "lld", TC) {}
6576
6577bool wasm::Linker::isLinkJob() const {
6578 return true;
6579}
6580
6581bool wasm::Linker::hasIntegratedCPP() const {
6582 return false;
6583}
6584
6585void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6586 const InputInfo &Output,
6587 const InputInfoList &Inputs,
6588 const ArgList &Args,
6589 const char *LinkingOutput) const {
6590 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6591 ArgStringList CmdArgs;
6592 CmdArgs.push_back("-flavor");
6593 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006594
6595 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006596 // size is of particular importance. This is significantly facilitated by
6597 // the enabling of -ffunction-sections and -fdata-sections in
6598 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006599 if (areOptimizationsEnabled(Args))
6600 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006601
Dan Gohman52816862015-12-16 23:30:41 +00006602 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6603 CmdArgs.push_back("-o");
6604 CmdArgs.push_back(Output.getFilename());
6605 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6606}
6607
Renato Golin7c542b42015-07-27 23:44:45 +00006608const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006609 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006610 if (!Arch.empty())
6611 MArch = Arch;
6612 else
Bernard Ogden31561762013-12-12 13:27:11 +00006613 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006614 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006615
6616 // Handle -march=native.
6617 if (MArch == "native") {
6618 std::string CPU = llvm::sys::getHostCPUName();
6619 if (CPU != "generic") {
6620 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006621 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006622 // If there is no valid architecture suffix for this CPU we don't know how
6623 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006624 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006625 MArch = "";
6626 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006627 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006628 }
6629 }
6630
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006631 return MArch;
6632}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006633
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006634/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006635StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006636 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006637 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6638 // here means an -march=native that we can't handle, so instead return no CPU.
6639 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006640 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006641
John Brawna95c1a82015-05-08 12:52:18 +00006642 // We need to return an empty string here on invalid MArch values as the
6643 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006644 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006645}
6646
6647/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006648std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006649 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006650 // FIXME: Warn on inconsistent use of -mcpu and -march.
6651 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006652 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006653 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006654 // Handle -mcpu=native.
6655 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006656 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006657 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006658 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006659 }
6660
Renato Goline17c5802015-07-27 23:44:42 +00006661 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006662}
6663
6664/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006665/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006666// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006667StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6668 const llvm::Triple &Triple) {
6669 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006670 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006671 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006672 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006673 if (ArchKind == llvm::ARM::AK_INVALID)
6674 // In case of generic Arch, i.e. "arm",
6675 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006676 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006677 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006678 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6679 // armv7k triple if it's actually been specified via "-arch armv7k".
6680 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006681 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006682 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006683 }
Renato Golin3c007252015-05-28 15:05:53 +00006684 if (ArchKind == llvm::ARM::AK_INVALID)
6685 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006686 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006687}
6688
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006689void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006690 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006691 if (Args.hasArg(options::OPT_r))
6692 return;
6693
John Brawn94fd9632015-05-21 12:19:49 +00006694 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6695 // to generate BE-8 executables.
6696 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6697 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006698}
6699
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006700mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006701 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6702 // was first introduced in Release 3. However, other compilers have
6703 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006704 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6705 .Case("mips1", NanLegacy)
6706 .Case("mips2", NanLegacy)
6707 .Case("mips3", NanLegacy)
6708 .Case("mips4", NanLegacy)
6709 .Case("mips5", NanLegacy)
6710 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006711 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006712 .Case("mips32r3", NanLegacy | Nan2008)
6713 .Case("mips32r5", NanLegacy | Nan2008)
6714 .Case("mips32r6", Nan2008)
6715 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006716 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006717 .Case("mips64r3", NanLegacy | Nan2008)
6718 .Case("mips64r5", NanLegacy | Nan2008)
6719 .Case("mips64r6", Nan2008)
6720 .Default(NanLegacy);
6721}
6722
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006723bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6724 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6725 return A && (A->getValue() == StringRef(Value));
6726}
6727
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006728bool mips::isUCLibc(const ArgList &Args) {
6729 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006730 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006731}
6732
Daniel Sanders2bf13662014-07-10 14:40:57 +00006733bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006734 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6735 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006736 .Case("2008", true)
6737 .Case("legacy", false)
6738 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006739
6740 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006741 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006742 .Cases("mips32r6", "mips64r6", true)
6743 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006744
6745 return false;
6746}
6747
Daniel Sanders379d44b2014-07-16 11:52:23 +00006748bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006749 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006750 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006751 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006752 return false;
6753
6754 if (ABIName != "32")
6755 return false;
6756
Toma Tabacu94ea6862015-06-16 13:54:13 +00006757 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6758 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006759 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006760 return false;
6761
Daniel Sanders379d44b2014-07-16 11:52:23 +00006762 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006763 .Cases("mips2", "mips3", "mips4", "mips5", true)
6764 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6765 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6766 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006767}
6768
Toma Tabacu94ea6862015-06-16 13:54:13 +00006769bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6770 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006771 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006772 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6773
6774 // FPXX shouldn't be used if -msingle-float is present.
6775 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6776 options::OPT_mdouble_float))
6777 if (A->getOption().matches(options::OPT_msingle_float))
6778 UseFPXX = false;
6779
6780 return UseFPXX;
6781}
6782
Tim Northover157d9112014-01-16 08:48:16 +00006783llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006784 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6785 // archs which Darwin doesn't use.
6786
6787 // The matching this routine does is fairly pointless, since it is neither the
6788 // complete architecture list, nor a reasonable subset. The problem is that
6789 // historically the driver driver accepts this and also ties its -march=
6790 // handling to the architecture name, so we need to be careful before removing
6791 // support for it.
6792
6793 // This code must be kept in sync with Clang's Darwin specific argument
6794 // translation.
6795
6796 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006797 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6798 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6799 .Case("ppc64", llvm::Triple::ppc64)
6800 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6801 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6802 llvm::Triple::x86)
6803 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6804 // This is derived from the driver driver.
6805 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6806 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6807 .Cases("armv7s", "xscale", llvm::Triple::arm)
6808 .Case("arm64", llvm::Triple::aarch64)
6809 .Case("r600", llvm::Triple::r600)
6810 .Case("amdgcn", llvm::Triple::amdgcn)
6811 .Case("nvptx", llvm::Triple::nvptx)
6812 .Case("nvptx64", llvm::Triple::nvptx64)
6813 .Case("amdil", llvm::Triple::amdil)
6814 .Case("spir", llvm::Triple::spir)
6815 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006816}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006817
Tim Northover157d9112014-01-16 08:48:16 +00006818void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006819 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006820 T.setArch(Arch);
6821
6822 if (Str == "x86_64h")
6823 T.setArchName(Str);
6824 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6825 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006826 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006827 }
6828}
6829
Bob Wilsondecc03e2012-11-23 06:14:39 +00006830const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006831 const InputInfo &Input) {
6832 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006833}
6834
Bob Wilsondecc03e2012-11-23 06:14:39 +00006835const char *Clang::getBaseInputStem(const ArgList &Args,
6836 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006837 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006838
Chris Lattner906bb902011-01-16 08:14:11 +00006839 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006840 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006841
6842 return Str;
6843}
6844
Bob Wilsondecc03e2012-11-23 06:14:39 +00006845const char *Clang::getDependencyFileName(const ArgList &Args,
6846 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006847 // FIXME: Think about this more.
6848 std::string Res;
6849
6850 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006851 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006852 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006853 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006854 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006855 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006856 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006857}
6858
Douglas Katzman95354292015-06-23 20:42:09 +00006859void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6860 const InputInfo &Output,
6861 const InputInfoList &Inputs,
6862 const ArgList &Args,
6863 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006864 const ToolChain &ToolChain = getToolChain();
6865 const Driver &D = ToolChain.getDriver();
6866 ArgStringList CmdArgs;
6867
6868 // Silence warning for "clang -g foo.o -o foo"
6869 Args.ClaimAllArgs(options::OPT_g_Group);
6870 // and "clang -emit-llvm foo.o -o foo"
6871 Args.ClaimAllArgs(options::OPT_emit_llvm);
6872 // and for "clang -w foo.o -o foo". Other warning options are already
6873 // handled somewhere else.
6874 Args.ClaimAllArgs(options::OPT_w);
6875
6876 if (!D.SysRoot.empty())
6877 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6878
6879 // CloudABI only supports static linkage.
6880 CmdArgs.push_back("-Bstatic");
6881 CmdArgs.push_back("--eh-frame-hdr");
6882 CmdArgs.push_back("--gc-sections");
6883
6884 if (Output.isFilename()) {
6885 CmdArgs.push_back("-o");
6886 CmdArgs.push_back(Output.getFilename());
6887 } else {
6888 assert(Output.isNothing() && "Invalid output.");
6889 }
6890
Douglas Katzman78b37b02015-11-17 20:28:07 +00006891 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006892 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6893 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6894 }
6895
6896 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006897 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006898 Args.AddAllArgs(CmdArgs,
6899 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6900 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006901
Teresa Johnson945bc502015-10-15 20:35:53 +00006902 if (D.isUsingLTO())
6903 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006904
6905 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6906
Douglas Katzman78b37b02015-11-17 20:28:07 +00006907 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006908 if (D.CCCIsCXX())
6909 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6910 CmdArgs.push_back("-lc");
6911 CmdArgs.push_back("-lcompiler_rt");
6912 }
6913
Douglas Katzman78b37b02015-11-17 20:28:07 +00006914 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006915 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6916
6917 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006918 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006919}
6920
Douglas Katzman95354292015-06-23 20:42:09 +00006921void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6922 const InputInfo &Output,
6923 const InputInfoList &Inputs,
6924 const ArgList &Args,
6925 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006926 ArgStringList CmdArgs;
6927
6928 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6929 const InputInfo &Input = Inputs[0];
6930
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006931 // Determine the original source input.
6932 const Action *SourceAction = &JA;
6933 while (SourceAction->getKind() != Action::InputClass) {
6934 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6935 SourceAction = SourceAction->getInputs()[0];
6936 }
6937
Eric Christopherf5a8f492015-12-08 00:10:10 +00006938 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006939 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006940 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6941 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006942 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006943 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006944 const llvm::Triple &T(getToolChain().getTriple());
6945 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006946 CmdArgs.push_back("-Q");
6947 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006948
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006949 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006950 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006951 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006952 if (Args.hasArg(options::OPT_gstabs))
6953 CmdArgs.push_back("--gstabs");
6954 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006955 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006956 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006957
Daniel Dunbarbe220842009-03-20 16:06:39 +00006958 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006959 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006960
Daniel Dunbar6d484762010-07-22 01:47:22 +00006961 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006962 if (getToolChain().getArch() == llvm::Triple::x86 ||
6963 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006964 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6965 CmdArgs.push_back("-force_cpusubtype_ALL");
6966
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006967 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006968 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006969 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006970 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006971 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006972 CmdArgs.push_back("-static");
6973
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006974 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006975
6976 assert(Output.isFilename() && "Unexpected lipo output.");
6977 CmdArgs.push_back("-o");
6978 CmdArgs.push_back(Output.getFilename());
6979
Daniel Dunbarb440f562010-08-02 02:38:21 +00006980 assert(Input.isFilename() && "Invalid input.");
6981 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006982
6983 // asm_final spec is empty.
6984
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006985 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006986 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006987}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006988
Tim Northover157d9112014-01-16 08:48:16 +00006989void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006990
Tim Northover157d9112014-01-16 08:48:16 +00006991void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6992 ArgStringList &CmdArgs) const {
6993 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006994
Daniel Dunbarc1964212009-03-26 16:23:12 +00006995 // Derived from darwin_arch spec.
6996 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006997 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006998
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006999 // FIXME: Is this needed anymore?
7000 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007001 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007002}
7003
Douglas Katzman95354292015-06-23 20:42:09 +00007004bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007005 // We only need to generate a temp path for LTO if we aren't compiling object
7006 // files. When compiling source files, we run 'dsymutil' after linking. We
7007 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007008 for (const auto &Input : Inputs)
7009 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007010 return true;
7011
7012 return false;
7013}
7014
Douglas Katzman95354292015-06-23 20:42:09 +00007015void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7016 ArgStringList &CmdArgs,
7017 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007018 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007019 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007020
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007021 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007022 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7023 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007024 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7025 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007026 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007027 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007028 }
7029
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007030 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007031 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007032 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7033 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007034
Bob Wilson3d27dad2013-08-02 22:25:34 +00007035 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7036 CmdArgs.push_back("-export_dynamic");
7037
Bob Wilsonb111ec92015-03-02 19:01:14 +00007038 // If we are using App Extension restrictions, pass a flag to the linker
7039 // telling it that the compiled code has been audited.
7040 if (Args.hasFlag(options::OPT_fapplication_extension,
7041 options::OPT_fno_application_extension, false))
7042 CmdArgs.push_back("-application_extension");
7043
Teresa Johnson945bc502015-10-15 20:35:53 +00007044 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007045 // If we are using LTO, then automatically create a temporary file path for
7046 // the linker to use, so that it's lifetime will extend past a possible
7047 // dsymutil step.
7048 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7049 const char *TmpPath = C.getArgs().MakeArgString(
7050 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7051 C.addTempFile(TmpPath);
7052 CmdArgs.push_back("-object_path_lto");
7053 CmdArgs.push_back(TmpPath);
7054 }
7055
7056 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7057 // it in clang installed libraries. If not found, the option is not used
7058 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7059 if (Version[0] >= 133) {
7060 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7061 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7062 SmallString<128> LibLTOPath(P);
7063 llvm::sys::path::append(LibLTOPath, "lib");
7064 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7065 if (llvm::sys::fs::exists(LibLTOPath)) {
7066 CmdArgs.push_back("-lto_library");
7067 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7068 } else {
7069 D.Diag(diag::warn_drv_lto_libpath);
7070 }
7071 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007072 }
7073
Daniel Dunbarc1964212009-03-26 16:23:12 +00007074 // Derived from the "link" spec.
7075 Args.AddAllArgs(CmdArgs, options::OPT_static);
7076 if (!Args.hasArg(options::OPT_static))
7077 CmdArgs.push_back("-dynamic");
7078 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7079 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7080 // here. How do we wish to handle such things?
7081 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007082
Daniel Dunbarc1964212009-03-26 16:23:12 +00007083 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007084 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007085 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007086 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007087
7088 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7089 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7090 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7091
7092 Arg *A;
7093 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7094 (A = Args.getLastArg(options::OPT_current__version)) ||
7095 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007096 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7097 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007098
7099 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7100 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7101 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7102 } else {
7103 CmdArgs.push_back("-dylib");
7104
7105 Arg *A;
7106 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7107 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7108 (A = Args.getLastArg(options::OPT_client__name)) ||
7109 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7110 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7111 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007112 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7113 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007114
Daniel Dunbarc1964212009-03-26 16:23:12 +00007115 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7116 "-dylib_compatibility_version");
7117 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7118 "-dylib_current_version");
7119
Tim Northover157d9112014-01-16 08:48:16 +00007120 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007121
7122 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7123 "-dylib_install_name");
7124 }
7125
7126 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7127 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7128 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007129 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007130 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007131 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7132 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7133 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7134 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7135 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7136 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007137 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007138 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7139 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7140 Args.AddAllArgs(CmdArgs, options::OPT_init);
7141
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007142 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007143 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007144
Daniel Dunbarc1964212009-03-26 16:23:12 +00007145 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7146 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7147 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7148 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7149 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007150
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007151 if (const Arg *A =
7152 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7153 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007154 if (A->getOption().matches(options::OPT_fpie) ||
7155 A->getOption().matches(options::OPT_fPIE))
7156 CmdArgs.push_back("-pie");
7157 else
7158 CmdArgs.push_back("-no_pie");
7159 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007160
7161 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7162 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7163 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7164 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7165 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7166 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7167 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7168 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7169 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7170 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7171 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7172 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7173 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7174 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7175 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7176 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007177
Daniel Dunbar84384642011-05-02 21:03:47 +00007178 // Give --sysroot= preference, over the Apple specific behavior to also use
7179 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007180 StringRef sysroot = C.getSysRoot();
7181 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007182 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007183 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007184 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7185 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007186 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007187 }
7188
Daniel Dunbarc1964212009-03-26 16:23:12 +00007189 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7190 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7191 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7192 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7193 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007194 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007195 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7196 Args.AddAllArgs(CmdArgs, options::OPT_y);
7197 Args.AddLastArg(CmdArgs, options::OPT_w);
7198 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7199 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7200 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7201 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7202 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7203 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7204 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7205 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7206 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7207 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7208 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7209 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7210}
7211
Douglas Katzman95354292015-06-23 20:42:09 +00007212void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7213 const InputInfo &Output,
7214 const InputInfoList &Inputs,
7215 const ArgList &Args,
7216 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007217 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007218
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007219 // If the number of arguments surpasses the system limits, we will encode the
7220 // input files in a separate file, shortening the command line. To this end,
7221 // build a list of input file names that can be passed via a file with the
7222 // -filelist linker option.
7223 llvm::opt::ArgStringList InputFileList;
7224
Daniel Dunbarc1964212009-03-26 16:23:12 +00007225 // The logic here is derived from gcc's behavior; most of which
7226 // comes from specs (starting with link_command). Consult gcc for
7227 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007228 ArgStringList CmdArgs;
7229
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007230 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7231 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7232 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007233 for (const auto &Arg : Args)
7234 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007235 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007236 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007237 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007238 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007239 return;
7240 }
7241
Daniel Dunbarc1964212009-03-26 16:23:12 +00007242 // I'm not sure why this particular decomposition exists in gcc, but
7243 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007244 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007245
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007246 // It seems that the 'e' option is completely ignored for dynamic executables
7247 // (the default), and with static executables, the last one wins, as expected.
7248 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7249 options::OPT_Z_Flag, options::OPT_u_Group,
7250 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007251
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007252 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7253 // members of static archive libraries which implement Objective-C classes or
7254 // categories.
7255 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7256 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007257
Daniel Dunbarc1964212009-03-26 16:23:12 +00007258 CmdArgs.push_back("-o");
7259 CmdArgs.push_back(Output.getFilename());
7260
Douglas Katzman78b37b02015-11-17 20:28:07 +00007261 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007262 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007263
Peter Collingbournec4122c12015-06-15 21:08:13 +00007264 // SafeStack requires its own runtime libraries
7265 // These libraries should be linked first, to make sure the
7266 // __safestack_init constructor executes before everything else
7267 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7268 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7269 "libclang_rt.safestack_osx.a",
7270 /*AlwaysLink=*/true);
7271 }
7272
Daniel Dunbarc1964212009-03-26 16:23:12 +00007273 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007274
Douglas Gregor9295df02012-05-15 21:00:27 +00007275 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007276 // Build the input file for -filelist (list of linker input files) in case we
7277 // need it later
7278 for (const auto &II : Inputs) {
7279 if (!II.isFilename()) {
7280 // This is a linker input argument.
7281 // We cannot mix input arguments and file names in a -filelist input, thus
7282 // we prematurely stop our list (remaining files shall be passed as
7283 // arguments).
7284 if (InputFileList.size() > 0)
7285 break;
7286
7287 continue;
7288 }
7289
7290 InputFileList.push_back(II.getFilename());
7291 }
7292
Douglas Katzman78b37b02015-11-17 20:28:07 +00007293 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007294 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7295
Douglas Katzman78b37b02015-11-17 20:28:07 +00007296 if (isObjCRuntimeLinked(Args) &&
7297 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007298 // We use arclite library for both ARC and subscripting support.
7299 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7300
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007301 CmdArgs.push_back("-framework");
7302 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007303 // Link libobj.
7304 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007305 }
John McCall31168b02011-06-15 23:02:42 +00007306
Daniel Dunbarc1964212009-03-26 16:23:12 +00007307 if (LinkingOutput) {
7308 CmdArgs.push_back("-arch_multiple");
7309 CmdArgs.push_back("-final_output");
7310 CmdArgs.push_back(LinkingOutput);
7311 }
7312
Daniel Dunbarc1964212009-03-26 16:23:12 +00007313 if (Args.hasArg(options::OPT_fnested_functions))
7314 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007315
Justin Bognerc7701242015-05-12 05:44:36 +00007316 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7317
Douglas Katzman78b37b02015-11-17 20:28:07 +00007318 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007319 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007320 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007321
Daniel Dunbarc1964212009-03-26 16:23:12 +00007322 // link_ssp spec is empty.
7323
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007324 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007325 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007326 }
7327
Douglas Katzman78b37b02015-11-17 20:28:07 +00007328 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007329 // endfile_spec is empty.
7330 }
7331
7332 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7333 Args.AddAllArgs(CmdArgs, options::OPT_F);
7334
Steven Wu3ffb61b2015-02-06 18:08:29 +00007335 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007336 for (const Arg *A : Args.filtered(options::OPT_iframework))
7337 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007338
Douglas Katzman78b37b02015-11-17 20:28:07 +00007339 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007340 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7341 if (A->getValue() == StringRef("Accelerate")) {
7342 CmdArgs.push_back("-framework");
7343 CmdArgs.push_back("Accelerate");
7344 }
7345 }
7346 }
7347
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007348 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007349 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007350 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007351 Cmd->setInputFileList(std::move(InputFileList));
7352 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007353}
7354
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007355void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007356 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007357 const InputInfoList &Inputs,
7358 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007359 const char *LinkingOutput) const {
7360 ArgStringList CmdArgs;
7361
7362 CmdArgs.push_back("-create");
7363 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007364
7365 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007366 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007367
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007368 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007369 assert(II.isFilename() && "Unexpected lipo input.");
7370 CmdArgs.push_back(II.getFilename());
7371 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007372
7373 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007374 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007375}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007376
Daniel Dunbar88299622010-06-04 18:28:36 +00007377void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007378 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007379 const InputInfoList &Inputs,
7380 const ArgList &Args,
7381 const char *LinkingOutput) const {
7382 ArgStringList CmdArgs;
7383
Daniel Dunbareb86b042011-05-09 17:23:16 +00007384 CmdArgs.push_back("-o");
7385 CmdArgs.push_back(Output.getFilename());
7386
Daniel Dunbar88299622010-06-04 18:28:36 +00007387 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7388 const InputInfo &Input = Inputs[0];
7389 assert(Input.isFilename() && "Unexpected dsymutil input.");
7390 CmdArgs.push_back(Input.getFilename());
7391
Daniel Dunbar88299622010-06-04 18:28:36 +00007392 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007393 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007394 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007395}
7396
Eric Christopher551ef452011-08-23 17:56:55 +00007397void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007398 const InputInfo &Output,
7399 const InputInfoList &Inputs,
7400 const ArgList &Args,
7401 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007402 ArgStringList CmdArgs;
7403 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007404 CmdArgs.push_back("--debug-info");
7405 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007406 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007407
7408 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7409 const InputInfo &Input = Inputs[0];
7410 assert(Input.isFilename() && "Unexpected verify input");
7411
7412 // Grabbing the output of the earlier dsymutil run.
7413 CmdArgs.push_back(Input.getFilename());
7414
7415 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007416 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007417 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007418}
7419
Douglas Katzman95354292015-06-23 20:42:09 +00007420void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007421 const InputInfo &Output,
7422 const InputInfoList &Inputs,
7423 const ArgList &Args,
7424 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007425 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007426 ArgStringList CmdArgs;
7427
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007428 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007429
7430 CmdArgs.push_back("-o");
7431 CmdArgs.push_back(Output.getFilename());
7432
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007433 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007434 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007435
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007436 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007437 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007438}
7439
Douglas Katzman95354292015-06-23 20:42:09 +00007440void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7441 const InputInfo &Output,
7442 const InputInfoList &Inputs,
7443 const ArgList &Args,
7444 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007445 ArgStringList CmdArgs;
7446
David Chisnall272a0712012-02-29 15:06:12 +00007447 // Demangle C++ names in errors
7448 CmdArgs.push_back("-C");
7449
Douglas Katzman78b37b02015-11-17 20:28:07 +00007450 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007451 CmdArgs.push_back("-e");
7452 CmdArgs.push_back("_start");
7453 }
7454
7455 if (Args.hasArg(options::OPT_static)) {
7456 CmdArgs.push_back("-Bstatic");
7457 CmdArgs.push_back("-dn");
7458 } else {
7459 CmdArgs.push_back("-Bdynamic");
7460 if (Args.hasArg(options::OPT_shared)) {
7461 CmdArgs.push_back("-shared");
7462 } else {
7463 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007464 CmdArgs.push_back(
7465 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007466 }
7467 }
7468
7469 if (Output.isFilename()) {
7470 CmdArgs.push_back("-o");
7471 CmdArgs.push_back(Output.getFilename());
7472 } else {
7473 assert(Output.isNothing() && "Invalid output.");
7474 }
7475
Douglas Katzman78b37b02015-11-17 20:28:07 +00007476 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007477 if (!Args.hasArg(options::OPT_shared))
7478 CmdArgs.push_back(
7479 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7480
7481 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7482 CmdArgs.push_back(
7483 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7484 CmdArgs.push_back(
7485 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007486 }
7487
Douglas Katzman6059ef92015-11-17 17:41:23 +00007488 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007489
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007490 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7491 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007492
7493 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7494
Douglas Katzman78b37b02015-11-17 20:28:07 +00007495 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007496 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007497 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007498 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007499 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007500 if (!Args.hasArg(options::OPT_shared)) {
7501 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007502 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007503 }
David Chisnallf571cde2012-02-15 13:39:01 +00007504 }
7505
Douglas Katzman78b37b02015-11-17 20:28:07 +00007506 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007507 CmdArgs.push_back(
7508 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007509 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007510 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007511
Xinliang David Li69306c02015-10-22 06:15:31 +00007512 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007513
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007514 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007515 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007516}
7517
Douglas Katzman95354292015-06-23 20:42:09 +00007518void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7519 const InputInfo &Output,
7520 const InputInfoList &Inputs,
7521 const ArgList &Args,
7522 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007523 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007524 ArgStringList CmdArgs;
7525
Rafael Espindolacc126272014-02-28 01:55:21 +00007526 switch (getToolChain().getArch()) {
7527 case llvm::Triple::x86:
7528 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7529 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007530 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007531 break;
7532
7533 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007534 CmdArgs.push_back("-mppc");
7535 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007536 break;
7537
7538 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007539 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007540 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007541 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7542 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7543 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007544 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007545 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007546
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007547 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007548 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007549 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7550 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7551 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007552 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007553 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007554
7555 case llvm::Triple::mips64:
7556 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007557 StringRef CPUName;
7558 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007559 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007560
7561 CmdArgs.push_back("-mabi");
7562 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7563
7564 if (getToolChain().getArch() == llvm::Triple::mips64)
7565 CmdArgs.push_back("-EB");
7566 else
7567 CmdArgs.push_back("-EL");
7568
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007569 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007570 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007571 }
7572
Rafael Espindolacc126272014-02-28 01:55:21 +00007573 default:
7574 break;
7575 }
7576
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007577 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007578
7579 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007580 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007581
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007582 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007583 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007584
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007585 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007586 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007587}
7588
Douglas Katzman95354292015-06-23 20:42:09 +00007589void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7590 const InputInfo &Output,
7591 const InputInfoList &Inputs,
7592 const ArgList &Args,
7593 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007594 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007595 ArgStringList CmdArgs;
7596
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007597 // Silence warning for "clang -g foo.o -o foo"
7598 Args.ClaimAllArgs(options::OPT_g_Group);
7599 // and "clang -emit-llvm foo.o -o foo"
7600 Args.ClaimAllArgs(options::OPT_emit_llvm);
7601 // and for "clang -w foo.o -o foo". Other warning options are already
7602 // handled somewhere else.
7603 Args.ClaimAllArgs(options::OPT_w);
7604
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007605 if (getToolChain().getArch() == llvm::Triple::mips64)
7606 CmdArgs.push_back("-EB");
7607 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7608 CmdArgs.push_back("-EL");
7609
Douglas Katzman78b37b02015-11-17 20:28:07 +00007610 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007611 CmdArgs.push_back("-e");
7612 CmdArgs.push_back("__start");
7613 }
7614
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007615 if (Args.hasArg(options::OPT_static)) {
7616 CmdArgs.push_back("-Bstatic");
7617 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007618 if (Args.hasArg(options::OPT_rdynamic))
7619 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007620 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007621 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007622 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007623 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007624 } else {
7625 CmdArgs.push_back("-dynamic-linker");
7626 CmdArgs.push_back("/usr/libexec/ld.so");
7627 }
7628 }
7629
Rafael Espindola044f7832013-06-05 04:28:55 +00007630 if (Args.hasArg(options::OPT_nopie))
7631 CmdArgs.push_back("-nopie");
7632
Daniel Dunbarb440f562010-08-02 02:38:21 +00007633 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007634 CmdArgs.push_back("-o");
7635 CmdArgs.push_back(Output.getFilename());
7636 } else {
7637 assert(Output.isNothing() && "Invalid output.");
7638 }
7639
Douglas Katzman78b37b02015-11-17 20:28:07 +00007640 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007641 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007642 if (Args.hasArg(options::OPT_pg))
7643 CmdArgs.push_back(
7644 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007645 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007646 CmdArgs.push_back(
7647 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7648 CmdArgs.push_back(
7649 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007650 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007651 CmdArgs.push_back(
7652 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007653 }
7654 }
7655
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007656 std::string Triple = getToolChain().getTripleString();
7657 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007658 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007659 CmdArgs.push_back(
7660 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007661
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007662 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7663 options::OPT_e, options::OPT_s, options::OPT_t,
7664 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007665
Daniel Dunbar54423b22010-09-17 00:24:54 +00007666 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007667
Douglas Katzman78b37b02015-11-17 20:28:07 +00007668 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007669 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007670 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007671 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007672 CmdArgs.push_back("-lm_p");
7673 else
7674 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007675 }
7676
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007677 // FIXME: For some reason GCC passes -lgcc before adding
7678 // the default system libraries. Just mimic this for now.
7679 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007680
Eric Christopher17674ec2012-09-13 06:32:34 +00007681 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007682 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7683 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007684 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007685 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007686 }
7687
Chandler Carruth45661652011-12-17 22:32:42 +00007688 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007689 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007690 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007691 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007692 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007693 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007694
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007695 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007696 }
7697
Douglas Katzman78b37b02015-11-17 20:28:07 +00007698 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007699 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007700 CmdArgs.push_back(
7701 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007702 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007703 CmdArgs.push_back(
7704 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007705 }
7706
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007707 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007708 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007709}
Ed Schoutene33194b2009-04-02 19:13:12 +00007710
Douglas Katzman95354292015-06-23 20:42:09 +00007711void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7712 const InputInfo &Output,
7713 const InputInfoList &Inputs,
7714 const ArgList &Args,
7715 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007716 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007717 ArgStringList CmdArgs;
7718
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007719 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007720
7721 CmdArgs.push_back("-o");
7722 CmdArgs.push_back(Output.getFilename());
7723
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007724 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007725 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007726
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007727 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007728 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007729}
7730
Douglas Katzman95354292015-06-23 20:42:09 +00007731void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7732 const InputInfo &Output,
7733 const InputInfoList &Inputs,
7734 const ArgList &Args,
7735 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007736 const Driver &D = getToolChain().getDriver();
7737 ArgStringList CmdArgs;
7738
Douglas Katzman78b37b02015-11-17 20:28:07 +00007739 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007740 CmdArgs.push_back("-e");
7741 CmdArgs.push_back("__start");
7742 }
7743
7744 if (Args.hasArg(options::OPT_static)) {
7745 CmdArgs.push_back("-Bstatic");
7746 } else {
7747 if (Args.hasArg(options::OPT_rdynamic))
7748 CmdArgs.push_back("-export-dynamic");
7749 CmdArgs.push_back("--eh-frame-hdr");
7750 CmdArgs.push_back("-Bdynamic");
7751 if (Args.hasArg(options::OPT_shared)) {
7752 CmdArgs.push_back("-shared");
7753 } else {
7754 CmdArgs.push_back("-dynamic-linker");
7755 CmdArgs.push_back("/usr/libexec/ld.so");
7756 }
7757 }
7758
7759 if (Output.isFilename()) {
7760 CmdArgs.push_back("-o");
7761 CmdArgs.push_back(Output.getFilename());
7762 } else {
7763 assert(Output.isNothing() && "Invalid output.");
7764 }
7765
Douglas Katzman78b37b02015-11-17 20:28:07 +00007766 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007767 if (!Args.hasArg(options::OPT_shared)) {
7768 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007769 CmdArgs.push_back(
7770 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007771 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007772 CmdArgs.push_back(
7773 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7774 CmdArgs.push_back(
7775 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007776 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007777 CmdArgs.push_back(
7778 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007779 }
7780 }
7781
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007782 Args.AddAllArgs(CmdArgs,
7783 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007784
7785 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7786
Douglas Katzman78b37b02015-11-17 20:28:07 +00007787 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007788 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007789 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7790 if (Args.hasArg(options::OPT_pg))
7791 CmdArgs.push_back("-lm_p");
7792 else
7793 CmdArgs.push_back("-lm");
7794 }
7795
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007796 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007797 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007798 CmdArgs.push_back("-lpthread_p");
7799 else
7800 CmdArgs.push_back("-lpthread");
7801 }
7802
Eli Friedman9fa28852012-08-08 23:57:20 +00007803 if (!Args.hasArg(options::OPT_shared)) {
7804 if (Args.hasArg(options::OPT_pg))
7805 CmdArgs.push_back("-lc_p");
7806 else
7807 CmdArgs.push_back("-lc");
7808 }
7809
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007810 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007811 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007812 case llvm::Triple::arm:
7813 MyArch = "arm";
7814 break;
7815 case llvm::Triple::x86:
7816 MyArch = "i386";
7817 break;
7818 case llvm::Triple::x86_64:
7819 MyArch = "amd64";
7820 break;
7821 default:
7822 llvm_unreachable("Unsupported architecture");
7823 }
7824 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007825 }
7826
Douglas Katzman78b37b02015-11-17 20:28:07 +00007827 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007828 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007829 CmdArgs.push_back(
7830 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007831 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007832 CmdArgs.push_back(
7833 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007834 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007835
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007836 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007837 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007838}
7839
Douglas Katzman95354292015-06-23 20:42:09 +00007840void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7841 const InputInfo &Output,
7842 const InputInfoList &Inputs,
7843 const ArgList &Args,
7844 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007845 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007846 ArgStringList CmdArgs;
7847
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007848 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7849 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007850 switch (getToolChain().getArch()) {
7851 default:
7852 break;
7853 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007854 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007855 break;
7856 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007857 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007858 break;
7859 case llvm::Triple::mips:
7860 case llvm::Triple::mipsel:
7861 case llvm::Triple::mips64:
7862 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007863 StringRef CPUName;
7864 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007865 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007866
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007867 CmdArgs.push_back("-march");
7868 CmdArgs.push_back(CPUName.data());
7869
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007870 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007871 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007872
7873 if (getToolChain().getArch() == llvm::Triple::mips ||
7874 getToolChain().getArch() == llvm::Triple::mips64)
7875 CmdArgs.push_back("-EB");
7876 else
7877 CmdArgs.push_back("-EL");
7878
Dimitry Andric46f338c2015-12-27 10:36:44 +00007879 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7880 StringRef v = A->getValue();
7881 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7882 A->claim();
7883 }
7884
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007885 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007886 break;
7887 }
7888 case llvm::Triple::arm:
7889 case llvm::Triple::armeb:
7890 case llvm::Triple::thumb:
7891 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007892 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007893
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007894 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007895 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007896 else
Renato Golinf4421f72014-02-19 10:44:07 +00007897 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007898
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007899 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007900 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007901 case llvm::Triple::GNUEABI:
7902 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007903 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007904 break;
7905
7906 default:
7907 CmdArgs.push_back("-matpcs");
7908 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007909 break;
7910 }
7911 case llvm::Triple::sparc:
7912 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007913 case llvm::Triple::sparcv9: {
7914 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7915 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007916 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007917 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007918 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007919 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007920
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007921 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007922
7923 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007924 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007925
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007926 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007927 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007928
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007929 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007930 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007931}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007932
Douglas Katzman95354292015-06-23 20:42:09 +00007933void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7934 const InputInfo &Output,
7935 const InputInfoList &Inputs,
7936 const ArgList &Args,
7937 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007938 const toolchains::FreeBSD &ToolChain =
7939 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007940 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007941 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007942 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007943 !Args.hasArg(options::OPT_shared) &&
7944 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007945 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007946
7947 // Silence warning for "clang -g foo.o -o foo"
7948 Args.ClaimAllArgs(options::OPT_g_Group);
7949 // and "clang -emit-llvm foo.o -o foo"
7950 Args.ClaimAllArgs(options::OPT_emit_llvm);
7951 // and for "clang -w foo.o -o foo". Other warning options are already
7952 // handled somewhere else.
7953 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007954
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007955 if (!D.SysRoot.empty())
7956 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7957
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007958 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007959 CmdArgs.push_back("-pie");
7960
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007961 if (Args.hasArg(options::OPT_static)) {
7962 CmdArgs.push_back("-Bstatic");
7963 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007964 if (Args.hasArg(options::OPT_rdynamic))
7965 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007966 CmdArgs.push_back("--eh-frame-hdr");
7967 if (Args.hasArg(options::OPT_shared)) {
7968 CmdArgs.push_back("-Bshareable");
7969 } else {
7970 CmdArgs.push_back("-dynamic-linker");
7971 CmdArgs.push_back("/libexec/ld-elf.so.1");
7972 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007973 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007974 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7975 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7976 CmdArgs.push_back("--hash-style=both");
7977 }
7978 }
7979 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007980 }
7981
7982 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7983 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007984 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007985 CmdArgs.push_back("-m");
7986 CmdArgs.push_back("elf_i386_fbsd");
7987 }
7988
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007989 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007990 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007991 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007992 }
7993
Dimitry Andric904895f2015-12-27 06:47:09 +00007994 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7995 if (ToolChain.getArch() == llvm::Triple::mips ||
7996 ToolChain.getArch() == llvm::Triple::mipsel ||
7997 ToolChain.getArch() == llvm::Triple::mips64 ||
7998 ToolChain.getArch() == llvm::Triple::mips64el) {
7999 StringRef v = A->getValue();
8000 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8001 A->claim();
8002 }
8003 }
8004
Daniel Dunbarb440f562010-08-02 02:38:21 +00008005 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008006 CmdArgs.push_back("-o");
8007 CmdArgs.push_back(Output.getFilename());
8008 } else {
8009 assert(Output.isNothing() && "Invalid output.");
8010 }
8011
Douglas Katzman78b37b02015-11-17 20:28:07 +00008012 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008013 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008014 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008015 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008016 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008017 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008018 crt1 = "Scrt1.o";
8019 else
8020 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008021 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008022 if (crt1)
8023 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8024
8025 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8026
Craig Topper92fc2df2014-05-17 16:56:41 +00008027 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008028 if (Args.hasArg(options::OPT_static))
8029 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008030 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008031 crtbegin = "crtbeginS.o";
8032 else
8033 crtbegin = "crtbegin.o";
8034
8035 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008036 }
8037
8038 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008039 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008040 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8041 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008042 Args.AddAllArgs(CmdArgs, options::OPT_s);
8043 Args.AddAllArgs(CmdArgs, options::OPT_t);
8044 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8045 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008046
Teresa Johnson945bc502015-10-15 20:35:53 +00008047 if (D.isUsingLTO())
8048 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008049
Alexey Samsonov52550342014-09-15 19:58:40 +00008050 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008051 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008052
Douglas Katzman78b37b02015-11-17 20:28:07 +00008053 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008054 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008055 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008056 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008057 if (Args.hasArg(options::OPT_pg))
8058 CmdArgs.push_back("-lm_p");
8059 else
8060 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008061 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008062 if (NeedsSanitizerDeps)
8063 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008064 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8065 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008066 if (Args.hasArg(options::OPT_pg))
8067 CmdArgs.push_back("-lgcc_p");
8068 else
8069 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008070 if (Args.hasArg(options::OPT_static)) {
8071 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008072 } else if (Args.hasArg(options::OPT_pg)) {
8073 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008074 } else {
8075 CmdArgs.push_back("--as-needed");
8076 CmdArgs.push_back("-lgcc_s");
8077 CmdArgs.push_back("--no-as-needed");
8078 }
8079
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008080 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008081 if (Args.hasArg(options::OPT_pg))
8082 CmdArgs.push_back("-lpthread_p");
8083 else
8084 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008085 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008086
Roman Divacky66f22762011-02-10 16:59:40 +00008087 if (Args.hasArg(options::OPT_pg)) {
8088 if (Args.hasArg(options::OPT_shared))
8089 CmdArgs.push_back("-lc");
8090 else
8091 CmdArgs.push_back("-lc_p");
8092 CmdArgs.push_back("-lgcc_p");
8093 } else {
8094 CmdArgs.push_back("-lc");
8095 CmdArgs.push_back("-lgcc");
8096 }
8097
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008098 if (Args.hasArg(options::OPT_static)) {
8099 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008100 } else if (Args.hasArg(options::OPT_pg)) {
8101 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008102 } else {
8103 CmdArgs.push_back("--as-needed");
8104 CmdArgs.push_back("-lgcc_s");
8105 CmdArgs.push_back("--no-as-needed");
8106 }
8107 }
8108
Douglas Katzman78b37b02015-11-17 20:28:07 +00008109 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008110 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008111 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008112 else
8113 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008114 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008115 }
8116
Xinliang David Li69306c02015-10-22 06:15:31 +00008117 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008118
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008119 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008120 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008121}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008122
Douglas Katzman95354292015-06-23 20:42:09 +00008123void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008124 const InputInfo &Output,
8125 const InputInfoList &Inputs,
8126 const ArgList &Args,
8127 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008128 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008129 ArgStringList CmdArgs;
8130
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008131 // GNU as needs different flags for creating the correct output format
8132 // on architectures with different ABIs or optional feature sets.
8133 switch (getToolChain().getArch()) {
8134 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008135 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008136 break;
8137 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008138 case llvm::Triple::armeb:
8139 case llvm::Triple::thumb:
8140 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008141 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008142 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8143 std::string Arch =
8144 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008145 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008146 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008147 }
8148
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008149 case llvm::Triple::mips:
8150 case llvm::Triple::mipsel:
8151 case llvm::Triple::mips64:
8152 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008153 StringRef CPUName;
8154 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008155 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008156
8157 CmdArgs.push_back("-march");
8158 CmdArgs.push_back(CPUName.data());
8159
8160 CmdArgs.push_back("-mabi");
8161 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8162
8163 if (getToolChain().getArch() == llvm::Triple::mips ||
8164 getToolChain().getArch() == llvm::Triple::mips64)
8165 CmdArgs.push_back("-EB");
8166 else
8167 CmdArgs.push_back("-EL");
8168
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008169 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008170 break;
8171 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008172
8173 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008174 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008175 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008176 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8177 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008178 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008179 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008180 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008181
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008182 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008183 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008184 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 Sonnenbergered3f0692014-02-19 22:40:18 +00008187 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008188 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008189
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008190 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008191 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008192 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008193
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008194 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008195
8196 CmdArgs.push_back("-o");
8197 CmdArgs.push_back(Output.getFilename());
8198
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008199 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008200 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008201
David Chisnallddbd68f2011-09-27 22:03:18 +00008202 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008203 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008204}
8205
Douglas Katzman95354292015-06-23 20:42:09 +00008206void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8207 const InputInfo &Output,
8208 const InputInfoList &Inputs,
8209 const ArgList &Args,
8210 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008211 const Driver &D = getToolChain().getDriver();
8212 ArgStringList CmdArgs;
8213
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008214 if (!D.SysRoot.empty())
8215 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8216
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008217 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008218 if (Args.hasArg(options::OPT_static)) {
8219 CmdArgs.push_back("-Bstatic");
8220 } else {
8221 if (Args.hasArg(options::OPT_rdynamic))
8222 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008223 if (Args.hasArg(options::OPT_shared)) {
8224 CmdArgs.push_back("-Bshareable");
8225 } else {
8226 CmdArgs.push_back("-dynamic-linker");
8227 CmdArgs.push_back("/libexec/ld.elf_so");
8228 }
8229 }
8230
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008231 // Many NetBSD architectures support more than one ABI.
8232 // Determine the correct emulation for ld.
8233 switch (getToolChain().getArch()) {
8234 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008235 CmdArgs.push_back("-m");
8236 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008237 break;
8238 case llvm::Triple::arm:
8239 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008240 CmdArgs.push_back("-m");
8241 switch (getToolChain().getTriple().getEnvironment()) {
8242 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008243 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008244 CmdArgs.push_back("armelf_nbsd_eabi");
8245 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008246 case llvm::Triple::EABIHF:
8247 case llvm::Triple::GNUEABIHF:
8248 CmdArgs.push_back("armelf_nbsd_eabihf");
8249 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008250 default:
8251 CmdArgs.push_back("armelf_nbsd");
8252 break;
8253 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008254 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008255 case llvm::Triple::armeb:
8256 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008257 arm::appendEBLinkFlags(
8258 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008259 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008260 CmdArgs.push_back("-m");
8261 switch (getToolChain().getTriple().getEnvironment()) {
8262 case llvm::Triple::EABI:
8263 case llvm::Triple::GNUEABI:
8264 CmdArgs.push_back("armelfb_nbsd_eabi");
8265 break;
8266 case llvm::Triple::EABIHF:
8267 case llvm::Triple::GNUEABIHF:
8268 CmdArgs.push_back("armelfb_nbsd_eabihf");
8269 break;
8270 default:
8271 CmdArgs.push_back("armelfb_nbsd");
8272 break;
8273 }
8274 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008275 case llvm::Triple::mips64:
8276 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008277 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008278 CmdArgs.push_back("-m");
8279 if (getToolChain().getArch() == llvm::Triple::mips64)
8280 CmdArgs.push_back("elf32btsmip");
8281 else
8282 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008283 } else if (mips::hasMipsAbiArg(Args, "64")) {
8284 CmdArgs.push_back("-m");
8285 if (getToolChain().getArch() == llvm::Triple::mips64)
8286 CmdArgs.push_back("elf64btsmip");
8287 else
8288 CmdArgs.push_back("elf64ltsmip");
8289 }
8290 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008291 case llvm::Triple::ppc:
8292 CmdArgs.push_back("-m");
8293 CmdArgs.push_back("elf32ppc_nbsd");
8294 break;
8295
8296 case llvm::Triple::ppc64:
8297 case llvm::Triple::ppc64le:
8298 CmdArgs.push_back("-m");
8299 CmdArgs.push_back("elf64ppc");
8300 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008301
8302 case llvm::Triple::sparc:
8303 CmdArgs.push_back("-m");
8304 CmdArgs.push_back("elf32_sparc");
8305 break;
8306
8307 case llvm::Triple::sparcv9:
8308 CmdArgs.push_back("-m");
8309 CmdArgs.push_back("elf64_sparc");
8310 break;
8311
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008312 default:
8313 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008314 }
8315
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008316 if (Output.isFilename()) {
8317 CmdArgs.push_back("-o");
8318 CmdArgs.push_back(Output.getFilename());
8319 } else {
8320 assert(Output.isNothing() && "Invalid output.");
8321 }
8322
Douglas Katzman78b37b02015-11-17 20:28:07 +00008323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008324 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008325 CmdArgs.push_back(
8326 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8327 CmdArgs.push_back(
8328 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8329 CmdArgs.push_back(
8330 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008331 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008332 CmdArgs.push_back(
8333 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8334 CmdArgs.push_back(
8335 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008336 }
8337 }
8338
8339 Args.AddAllArgs(CmdArgs, options::OPT_L);
8340 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8341 Args.AddAllArgs(CmdArgs, options::OPT_e);
8342 Args.AddAllArgs(CmdArgs, options::OPT_s);
8343 Args.AddAllArgs(CmdArgs, options::OPT_t);
8344 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8345 Args.AddAllArgs(CmdArgs, options::OPT_r);
8346
8347 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8348
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008349 unsigned Major, Minor, Micro;
8350 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8351 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008352 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008353 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008354 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008355 case llvm::Triple::arm:
8356 case llvm::Triple::armeb:
8357 case llvm::Triple::thumb:
8358 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008359 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008360 case llvm::Triple::ppc64:
8361 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008362 case llvm::Triple::x86:
8363 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008364 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008365 break;
8366 default:
8367 break;
8368 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008369 }
8370
Douglas Katzman78b37b02015-11-17 20:28:07 +00008371 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008372 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008373 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008374 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8375 CmdArgs.push_back("-lm");
8376 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008377 if (Args.hasArg(options::OPT_pthread))
8378 CmdArgs.push_back("-lpthread");
8379 CmdArgs.push_back("-lc");
8380
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008381 if (useLibgcc) {
8382 if (Args.hasArg(options::OPT_static)) {
8383 // libgcc_eh depends on libc, so resolve as much as possible,
8384 // pull in any new requirements from libc and then get the rest
8385 // of libgcc.
8386 CmdArgs.push_back("-lgcc_eh");
8387 CmdArgs.push_back("-lc");
8388 CmdArgs.push_back("-lgcc");
8389 } else {
8390 CmdArgs.push_back("-lgcc");
8391 CmdArgs.push_back("--as-needed");
8392 CmdArgs.push_back("-lgcc_s");
8393 CmdArgs.push_back("--no-as-needed");
8394 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008395 }
8396 }
8397
Douglas Katzman78b37b02015-11-17 20:28:07 +00008398 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008399 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008400 CmdArgs.push_back(
8401 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008402 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008403 CmdArgs.push_back(
8404 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8405 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008406 }
8407
Xinliang David Li69306c02015-10-22 06:15:31 +00008408 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008409
Logan Chieneb9162f2014-06-26 14:23:45 +00008410 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008411 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008412}
8413
Douglas Katzman95354292015-06-23 20:42:09 +00008414void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8415 const InputInfo &Output,
8416 const InputInfoList &Inputs,
8417 const ArgList &Args,
8418 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008419 claimNoWarnArgs(Args);
8420
James Y Knight2db38f32015-08-15 03:45:25 +00008421 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8422 llvm::Triple Triple = llvm::Triple(TripleStr);
8423
Rafael Espindola92b00932010-08-10 00:25:48 +00008424 ArgStringList CmdArgs;
8425
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008426 llvm::Reloc::Model RelocationModel;
8427 unsigned PICLevel;
8428 bool IsPIE;
8429 std::tie(RelocationModel, PICLevel, IsPIE) =
8430 ParsePICArgs(getToolChain(), Triple, Args);
8431
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008432 switch (getToolChain().getArch()) {
8433 default:
8434 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008435 // Add --32/--64 to make sure we get the format we want.
8436 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008437 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008438 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008439 break;
8440 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008441 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8442 CmdArgs.push_back("--x32");
8443 else
8444 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008445 break;
8446 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008447 CmdArgs.push_back("-a32");
8448 CmdArgs.push_back("-mppc");
8449 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008450 break;
8451 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008452 CmdArgs.push_back("-a64");
8453 CmdArgs.push_back("-mppc64");
8454 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008455 break;
8456 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008457 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008458 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008459 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008460 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008461 break;
8462 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008463 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008464 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008465 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8466 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8467 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008468 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008469 }
8470 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008471 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008472 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8473 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8474 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008475 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008476 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008477 case llvm::Triple::arm:
8478 case llvm::Triple::armeb:
8479 case llvm::Triple::thumb:
8480 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008481 const llvm::Triple &Triple2 = getToolChain().getTriple();
8482 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008483 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008484 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008485 break;
8486 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008487 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008488 break;
8489 default:
8490 break;
8491 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008492
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008493 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008494 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8495 case arm::FloatABI::Soft:
8496 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8497 break;
8498 case arm::FloatABI::SoftFP:
8499 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8500 break;
8501 case arm::FloatABI::Hard:
8502 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8503 break;
8504 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008505
8506 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008507
8508 // FIXME: remove krait check when GNU tools support krait cpu
8509 // for now replace it with -march=armv7-a to avoid a lower
8510 // march from being picked in the absence of a cpu flag.
8511 Arg *A;
8512 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008513 StringRef(A->getValue()).lower() == "krait")
8514 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008515 else
8516 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008517 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008518 break;
8519 }
8520 case llvm::Triple::mips:
8521 case llvm::Triple::mipsel:
8522 case llvm::Triple::mips64:
8523 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008524 StringRef CPUName;
8525 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008526 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008527 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008528
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008529 CmdArgs.push_back("-march");
8530 CmdArgs.push_back(CPUName.data());
8531
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008532 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008533 CmdArgs.push_back(ABIName.data());
8534
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008535 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8536 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008537 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008538 CmdArgs.push_back("-mno-shared");
8539
Daniel Sanders379d44b2014-07-16 11:52:23 +00008540 // LLVM doesn't support -mplt yet and acts as if it is always given.
8541 // However, -mplt has no effect with the N64 ABI.
8542 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008543
8544 if (getToolChain().getArch() == llvm::Triple::mips ||
8545 getToolChain().getArch() == llvm::Triple::mips64)
8546 CmdArgs.push_back("-EB");
8547 else
8548 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008549
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008550 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8551 if (StringRef(A->getValue()) == "2008")
8552 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8553 }
8554
Daniel Sanders379d44b2014-07-16 11:52:23 +00008555 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8556 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8557 options::OPT_mfp64)) {
8558 A->claim();
8559 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008560 } else if (mips::shouldUseFPXX(
8561 Args, getToolChain().getTriple(), CPUName, ABIName,
8562 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008563 CmdArgs.push_back("-mfpxx");
8564
8565 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8566 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008567 if (Arg *A =
8568 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008569 if (A->getOption().matches(options::OPT_mips16)) {
8570 A->claim();
8571 A->render(Args, CmdArgs);
8572 } else {
8573 A->claim();
8574 CmdArgs.push_back("-no-mips16");
8575 }
8576 }
8577
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008578 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8579 options::OPT_mno_micromips);
8580 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8581 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8582
Simon Atanasyanbd986632013-11-26 11:58:04 +00008583 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8584 // Do not use AddLastArg because not all versions of MIPS assembler
8585 // support -mmsa / -mno-msa options.
8586 if (A->getOption().matches(options::OPT_mmsa))
8587 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8588 }
8589
Daniel Sanders379d44b2014-07-16 11:52:23 +00008590 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8591 options::OPT_msoft_float);
8592
Toma Tabacub36d6102015-06-11 12:13:18 +00008593 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8594 options::OPT_msingle_float);
8595
Daniel Sanders379d44b2014-07-16 11:52:23 +00008596 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8597 options::OPT_mno_odd_spreg);
8598
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008599 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008600 break;
8601 }
8602 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008603 // Always pass an -march option, since our default of z10 is later
8604 // than the GNU assembler's default.
8605 StringRef CPUName = getSystemZTargetCPU(Args);
8606 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008607 break;
8608 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008609 }
8610
Renato Golina74bbc72015-07-22 15:32:36 +00008611 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008612 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008613
8614 CmdArgs.push_back("-o");
8615 CmdArgs.push_back(Output.getFilename());
8616
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008617 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008618 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008619
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008620 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008621 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008622
8623 // Handle the debug info splitting at object creation time if we're
8624 // creating an object.
8625 // TODO: Currently only works on linux with newer objcopy.
8626 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008627 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008628 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008629 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008630}
8631
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008632static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008633 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008634 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008635 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008636 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8637 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008638 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008639 CmdArgs.push_back("-lgcc");
8640
Logan Chien3d3373c2012-11-19 12:04:11 +00008641 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008642 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008643 CmdArgs.push_back("-lgcc");
8644 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008645 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008646 CmdArgs.push_back("--as-needed");
8647 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008648 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008649 CmdArgs.push_back("--no-as-needed");
8650 }
8651
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008652 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008653 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008654 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008655 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008656
8657 // According to Android ABI, we have to link with libdl if we are
8658 // linking with non-static libgcc.
8659 //
8660 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8661 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8662 if (isAndroid && !StaticLibgcc)
8663 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008664}
8665
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008666static std::string getLinuxDynamicLinker(const ArgList &Args,
8667 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008668 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8669
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008670 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008671 if (ToolChain.getTriple().isArch64Bit())
8672 return "/system/bin/linker64";
8673 else
8674 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008675 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8676 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008677 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008678 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008679 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008680 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008681 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008682 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008683 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008684 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008685 return "/lib/ld-linux-armhf.so.3";
8686 else
8687 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008688 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8689 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008690 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008691 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008692 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008693 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008694 return "/lib/ld-linux.so.3";
8695 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8696 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008697 std::string LibDir =
8698 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008699 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008700 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008701 if (mips::isUCLibc(Args))
8702 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008703 else if (!ToolChain.getTriple().hasEnvironment()) {
8704 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8705 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8706 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8707 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008708 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008709
8710 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008711 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008712 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008713 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008714 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8715 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008716 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008717 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008718 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8719 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008720 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008721 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008722 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008723 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008724 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008725 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008726 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8727 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008728 else
8729 return "/lib64/ld-linux-x86-64.so.2";
8730}
8731
Renato Golinc4b49242014-02-13 10:01:16 +00008732static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008733 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008734 // Make use of compiler-rt if --rtlib option is used
8735 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8736
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008737 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008738 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008739 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008740 default:
8741 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008742 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008743 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008744 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008745 break;
8746 }
Renato Golinc4b49242014-02-13 10:01:16 +00008747 break;
8748 case ToolChain::RLT_Libgcc:
8749 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8750 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008751 }
8752}
8753
Rafael Espindola1e085772014-08-15 17:14:35 +00008754static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8755 switch (T.getArch()) {
8756 case llvm::Triple::x86:
8757 return "elf_i386";
8758 case llvm::Triple::aarch64:
8759 return "aarch64linux";
8760 case llvm::Triple::aarch64_be:
8761 return "aarch64_be_linux";
8762 case llvm::Triple::arm:
8763 case llvm::Triple::thumb:
8764 return "armelf_linux_eabi";
8765 case llvm::Triple::armeb:
8766 case llvm::Triple::thumbeb:
8767 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8768 case llvm::Triple::ppc:
8769 return "elf32ppclinux";
8770 case llvm::Triple::ppc64:
8771 return "elf64ppc";
8772 case llvm::Triple::ppc64le:
8773 return "elf64lppc";
8774 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008775 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008776 return "elf32_sparc";
8777 case llvm::Triple::sparcv9:
8778 return "elf64_sparc";
8779 case llvm::Triple::mips:
8780 return "elf32btsmip";
8781 case llvm::Triple::mipsel:
8782 return "elf32ltsmip";
8783 case llvm::Triple::mips64:
8784 if (mips::hasMipsAbiArg(Args, "n32"))
8785 return "elf32btsmipn32";
8786 return "elf64btsmip";
8787 case llvm::Triple::mips64el:
8788 if (mips::hasMipsAbiArg(Args, "n32"))
8789 return "elf32ltsmipn32";
8790 return "elf64ltsmip";
8791 case llvm::Triple::systemz:
8792 return "elf64_s390";
8793 case llvm::Triple::x86_64:
8794 if (T.getEnvironment() == llvm::Triple::GNUX32)
8795 return "elf32_x86_64";
8796 return "elf_x86_64";
8797 default:
8798 llvm_unreachable("Unexpected arch");
8799 }
8800}
8801
Douglas Katzman95354292015-06-23 20:42:09 +00008802void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8803 const InputInfo &Output,
8804 const InputInfoList &Inputs,
8805 const ArgList &Args,
8806 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008807 const toolchains::Linux &ToolChain =
8808 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008809 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008810
8811 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8812 llvm::Triple Triple = llvm::Triple(TripleStr);
8813
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008814 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008815 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008816 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008817 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8818 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008819 const bool HasCRTBeginEndFiles =
8820 ToolChain.getTriple().hasEnvironment() ||
8821 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008822
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008823 ArgStringList CmdArgs;
8824
Rafael Espindolad1002f62010-11-15 18:28:16 +00008825 // Silence warning for "clang -g foo.o -o foo"
8826 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008827 // and "clang -emit-llvm foo.o -o foo"
8828 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008829 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008830 // handled somewhere else.
8831 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008832
Peter Collingbourne39719a72015-11-20 20:49:39 +00008833 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8834 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008835 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008836 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008837 CmdArgs.push_back("-target");
8838 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8839 }
8840
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008841 if (!D.SysRoot.empty())
8842 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008843
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008844 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008845 CmdArgs.push_back("-pie");
8846
Rafael Espindola1c76c592010-11-07 22:57:16 +00008847 if (Args.hasArg(options::OPT_rdynamic))
8848 CmdArgs.push_back("-export-dynamic");
8849
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008850 if (Args.hasArg(options::OPT_s))
8851 CmdArgs.push_back("-s");
8852
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008853 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008854 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008855
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008856 for (const auto &Opt : ToolChain.ExtraOpts)
8857 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008858
8859 if (!Args.hasArg(options::OPT_static)) {
8860 CmdArgs.push_back("--eh-frame-hdr");
8861 }
8862
8863 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008864 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008865
8866 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008867 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8868 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008869 CmdArgs.push_back("-Bstatic");
8870 else
8871 CmdArgs.push_back("-static");
8872 } else if (Args.hasArg(options::OPT_shared)) {
8873 CmdArgs.push_back("-shared");
8874 }
8875
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008876 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8877 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008878 (!Args.hasArg(options::OPT_static) &&
8879 !Args.hasArg(options::OPT_shared))) {
8880 CmdArgs.push_back("-dynamic-linker");
8881 CmdArgs.push_back(Args.MakeArgString(
8882 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8883 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008884
8885 CmdArgs.push_back("-o");
8886 CmdArgs.push_back(Output.getFilename());
8887
Douglas Katzman78b37b02015-11-17 20:28:07 +00008888 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008889 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008890 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008891 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008892 if (Args.hasArg(options::OPT_pg))
8893 crt1 = "gcrt1.o";
8894 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008895 crt1 = "Scrt1.o";
8896 else
8897 crt1 = "crt1.o";
8898 }
8899 if (crt1)
8900 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008901
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008902 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8903 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008904
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008905 const char *crtbegin;
8906 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008907 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008908 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008909 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008910 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008911 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008912 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008913 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008914
8915 if (HasCRTBeginEndFiles)
8916 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008917
8918 // Add crtfastmath.o if available and fast math is enabled.
8919 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008920 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008921
8922 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008923 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008924
Douglas Katzman6059ef92015-11-17 17:41:23 +00008925 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008926
Teresa Johnson945bc502015-10-15 20:35:53 +00008927 if (D.isUsingLTO())
8928 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008929
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008930 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8931 CmdArgs.push_back("--no-demangle");
8932
Alexey Samsonov52550342014-09-15 19:58:40 +00008933 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008934 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008935 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008936 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008937
Douglas Katzman78b37b02015-11-17 20:28:07 +00008938 if (D.CCCIsCXX() &&
8939 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008940 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008941 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008942 if (OnlyLibstdcxxStatic)
8943 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008944 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008945 if (OnlyLibstdcxxStatic)
8946 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008947 CmdArgs.push_back("-lm");
8948 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008949 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8950 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008951
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008952 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008953 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8954 if (Args.hasArg(options::OPT_static))
8955 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008956
Alexey Samsonov52550342014-09-15 19:58:40 +00008957 if (NeedsSanitizerDeps)
8958 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8959
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008960 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8961 Args.hasArg(options::OPT_pthreads);
8962
8963 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8964 options::OPT_fno_openmp, false)) {
8965 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8966 // FIXME: Does this really make sense for all GNU toolchains?
8967 WantPthread = true;
8968
8969 // Also link the particular OpenMP runtimes.
8970 switch (getOpenMPRuntime(ToolChain, Args)) {
8971 case OMPRT_OMP:
8972 CmdArgs.push_back("-lomp");
8973 break;
8974 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008975 CmdArgs.push_back("-lgomp");
8976
8977 // FIXME: Exclude this for platforms with libgomp that don't require
8978 // librt. Most modern Linux platforms require it, but some may not.
8979 CmdArgs.push_back("-lrt");
8980 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008981 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008982 CmdArgs.push_back("-liomp5");
8983 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008984 case OMPRT_Unknown:
8985 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008986 break;
8987 }
Chandler Carruth01538002013-01-17 13:19:29 +00008988 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008989
Renato Golinc4b49242014-02-13 10:01:16 +00008990 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008991
Richard Smith31d1de22015-05-20 22:48:44 +00008992 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008993 CmdArgs.push_back("-lpthread");
8994
8995 CmdArgs.push_back("-lc");
8996
8997 if (Args.hasArg(options::OPT_static))
8998 CmdArgs.push_back("--end-group");
8999 else
Renato Golinc4b49242014-02-13 10:01:16 +00009000 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009001 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009002
Rafael Espindola81937ec2010-12-01 01:52:43 +00009003 if (!Args.hasArg(options::OPT_nostartfiles)) {
9004 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009005 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009006 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009007 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009008 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009009 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009010 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009011
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009012 if (HasCRTBeginEndFiles)
9013 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009014 if (!isAndroid)
9015 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009016 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009017 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009018
Peter Collingbourne39719a72015-11-20 20:49:39 +00009019 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009020}
9021
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009022// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9023// for the various SFI requirements like register masking. The assembly tool
9024// inserts the file containing the macros as an input into all the assembly
9025// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009026void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9027 const InputInfo &Output,
9028 const InputInfoList &Inputs,
9029 const ArgList &Args,
9030 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009031 const toolchains::NaClToolChain &ToolChain =
9032 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009033 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009034 "nacl-arm-macros.s");
9035 InputInfoList NewInputs;
9036 NewInputs.push_back(NaClMacros);
9037 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009038 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9039 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009040}
9041
Douglas Katzman750cfc52015-06-29 18:42:16 +00009042// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009043// we use static by default, do not yet support sanitizers or LTO, and a few
9044// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009045// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009046void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9047 const InputInfo &Output,
9048 const InputInfoList &Inputs,
9049 const ArgList &Args,
9050 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009051
Douglas Katzman54366072015-07-27 16:53:08 +00009052 const toolchains::NaClToolChain &ToolChain =
9053 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009054 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009055 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009056 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009057 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009058
9059 ArgStringList CmdArgs;
9060
9061 // Silence warning for "clang -g foo.o -o foo"
9062 Args.ClaimAllArgs(options::OPT_g_Group);
9063 // and "clang -emit-llvm foo.o -o foo"
9064 Args.ClaimAllArgs(options::OPT_emit_llvm);
9065 // and for "clang -w foo.o -o foo". Other warning options are already
9066 // handled somewhere else.
9067 Args.ClaimAllArgs(options::OPT_w);
9068
9069 if (!D.SysRoot.empty())
9070 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9071
9072 if (Args.hasArg(options::OPT_rdynamic))
9073 CmdArgs.push_back("-export-dynamic");
9074
9075 if (Args.hasArg(options::OPT_s))
9076 CmdArgs.push_back("-s");
9077
Douglas Katzman54366072015-07-27 16:53:08 +00009078 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9079 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009080 CmdArgs.push_back("--build-id");
9081
9082 if (!IsStatic)
9083 CmdArgs.push_back("--eh-frame-hdr");
9084
9085 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009086 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009087 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009088 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009089 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009090 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009091 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009092 else if (Arch == llvm::Triple::mipsel)
9093 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009094 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009095 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9096 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009097
9098 if (IsStatic)
9099 CmdArgs.push_back("-static");
9100 else if (Args.hasArg(options::OPT_shared))
9101 CmdArgs.push_back("-shared");
9102
9103 CmdArgs.push_back("-o");
9104 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009105 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009106 if (!Args.hasArg(options::OPT_shared))
9107 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9108 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9109
9110 const char *crtbegin;
9111 if (IsStatic)
9112 crtbegin = "crtbeginT.o";
9113 else if (Args.hasArg(options::OPT_shared))
9114 crtbegin = "crtbeginS.o";
9115 else
9116 crtbegin = "crtbegin.o";
9117 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9118 }
9119
9120 Args.AddAllArgs(CmdArgs, options::OPT_L);
9121 Args.AddAllArgs(CmdArgs, options::OPT_u);
9122
Douglas Katzman6059ef92015-11-17 17:41:23 +00009123 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009124
9125 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9126 CmdArgs.push_back("--no-demangle");
9127
9128 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9129
Douglas Katzman78b37b02015-11-17 20:28:07 +00009130 if (D.CCCIsCXX() &&
9131 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009132 bool OnlyLibstdcxxStatic =
9133 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009134 if (OnlyLibstdcxxStatic)
9135 CmdArgs.push_back("-Bstatic");
9136 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9137 if (OnlyLibstdcxxStatic)
9138 CmdArgs.push_back("-Bdynamic");
9139 CmdArgs.push_back("-lm");
9140 }
9141
9142 if (!Args.hasArg(options::OPT_nostdlib)) {
9143 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9144 // Always use groups, since it has no effect on dynamic libraries.
9145 CmdArgs.push_back("--start-group");
9146 CmdArgs.push_back("-lc");
9147 // NaCl's libc++ currently requires libpthread, so just always include it
9148 // in the group for C++.
9149 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009150 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009151 // Gold, used by Mips, handles nested groups differently than ld, and
9152 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9153 // which is not a desired behaviour here.
9154 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9155 if (getToolChain().getArch() == llvm::Triple::mipsel)
9156 CmdArgs.push_back("-lnacl");
9157
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009158 CmdArgs.push_back("-lpthread");
9159 }
9160
9161 CmdArgs.push_back("-lgcc");
9162 CmdArgs.push_back("--as-needed");
9163 if (IsStatic)
9164 CmdArgs.push_back("-lgcc_eh");
9165 else
9166 CmdArgs.push_back("-lgcc_s");
9167 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009168
9169 // Mips needs to create and use pnacl_legacy library that contains
9170 // definitions from bitcode/pnaclmm.c and definitions for
9171 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9172 if (getToolChain().getArch() == llvm::Triple::mipsel)
9173 CmdArgs.push_back("-lpnacl_legacy");
9174
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009175 CmdArgs.push_back("--end-group");
9176 }
9177
9178 if (!Args.hasArg(options::OPT_nostartfiles)) {
9179 const char *crtend;
9180 if (Args.hasArg(options::OPT_shared))
9181 crtend = "crtendS.o";
9182 else
9183 crtend = "crtend.o";
9184
9185 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9186 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9187 }
9188 }
9189
Peter Collingbourne39719a72015-11-20 20:49:39 +00009190 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9191 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009192}
9193
Douglas Katzman95354292015-06-23 20:42:09 +00009194void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9195 const InputInfo &Output,
9196 const InputInfoList &Inputs,
9197 const ArgList &Args,
9198 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009199 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009200 ArgStringList CmdArgs;
9201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009202 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009203
9204 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009205 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009206
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009207 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009208 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009209
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009210 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009211 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009212}
9213
Douglas Katzman95354292015-06-23 20:42:09 +00009214void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9215 const InputInfo &Output,
9216 const InputInfoList &Inputs,
9217 const ArgList &Args,
9218 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009219 const Driver &D = getToolChain().getDriver();
9220 ArgStringList CmdArgs;
9221
Daniel Dunbarb440f562010-08-02 02:38:21 +00009222 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009223 CmdArgs.push_back("-o");
9224 CmdArgs.push_back(Output.getFilename());
9225 } else {
9226 assert(Output.isNothing() && "Invalid output.");
9227 }
9228
Douglas Katzman78b37b02015-11-17 20:28:07 +00009229 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009230 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9231 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9232 CmdArgs.push_back(
9233 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9234 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009235 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009236
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009237 Args.AddAllArgs(CmdArgs,
9238 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009239
Daniel Dunbar54423b22010-09-17 00:24:54 +00009240 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009241
Xinliang David Li69306c02015-10-22 06:15:31 +00009242 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009243
Douglas Katzman78b37b02015-11-17 20:28:07 +00009244 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009245 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009246 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009247 CmdArgs.push_back("-lm");
9248 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009249 }
9250
Douglas Katzman78b37b02015-11-17 20:28:07 +00009251 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009252 if (Args.hasArg(options::OPT_pthread))
9253 CmdArgs.push_back("-lpthread");
9254 CmdArgs.push_back("-lc");
9255 CmdArgs.push_back("-lCompilerRT-Generic");
9256 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9257 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009258 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009259 }
9260
Logan Chieneb9162f2014-06-26 14:23:45 +00009261 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009262 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009263}
9264
Daniel Dunbarcc912342009-05-02 18:28:39 +00009265/// DragonFly Tools
9266
9267// For now, DragonFly Assemble does just about the same as for
9268// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009269void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9270 const InputInfo &Output,
9271 const InputInfoList &Inputs,
9272 const ArgList &Args,
9273 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009274 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009275 ArgStringList CmdArgs;
9276
9277 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9278 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009279 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009280 CmdArgs.push_back("--32");
9281
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009282 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009283
9284 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009285 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009286
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009287 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009288 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009289
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009290 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009291 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009292}
9293
Douglas Katzman95354292015-06-23 20:42:09 +00009294void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9295 const InputInfo &Output,
9296 const InputInfoList &Inputs,
9297 const ArgList &Args,
9298 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009299 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009300 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009301
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009302 if (!D.SysRoot.empty())
9303 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9304
John McCall65b8da02013-04-11 22:55:55 +00009305 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009306 if (Args.hasArg(options::OPT_static)) {
9307 CmdArgs.push_back("-Bstatic");
9308 } else {
John McCall65b8da02013-04-11 22:55:55 +00009309 if (Args.hasArg(options::OPT_rdynamic))
9310 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009311 if (Args.hasArg(options::OPT_shared))
9312 CmdArgs.push_back("-Bshareable");
9313 else {
9314 CmdArgs.push_back("-dynamic-linker");
9315 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9316 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009317 CmdArgs.push_back("--hash-style=gnu");
9318 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009319 }
9320
9321 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9322 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009323 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009324 CmdArgs.push_back("-m");
9325 CmdArgs.push_back("elf_i386");
9326 }
9327
Daniel Dunbarb440f562010-08-02 02:38:21 +00009328 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009329 CmdArgs.push_back("-o");
9330 CmdArgs.push_back(Output.getFilename());
9331 } else {
9332 assert(Output.isNothing() && "Invalid output.");
9333 }
9334
Douglas Katzman78b37b02015-11-17 20:28:07 +00009335 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009336 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009337 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009338 CmdArgs.push_back(
9339 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009340 else {
9341 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009342 CmdArgs.push_back(
9343 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009344 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009345 CmdArgs.push_back(
9346 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009347 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009348 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009349 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009350 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009351 CmdArgs.push_back(
9352 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009353 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009354 CmdArgs.push_back(
9355 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009356 }
9357
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009358 Args.AddAllArgs(CmdArgs,
9359 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009360
Daniel Dunbar54423b22010-09-17 00:24:54 +00009361 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009362
Douglas Katzman78b37b02015-11-17 20:28:07 +00009363 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009364 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009365
9366 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009367 CmdArgs.push_back("-rpath");
9368 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009369 }
9370
Hans Wennborg70850d82013-07-18 20:29:38 +00009371 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009372 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009373 CmdArgs.push_back("-lm");
9374 }
9375
Daniel Dunbarcc912342009-05-02 18:28:39 +00009376 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009377 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009378
9379 if (!Args.hasArg(options::OPT_nolibc)) {
9380 CmdArgs.push_back("-lc");
9381 }
9382
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009383 if (Args.hasArg(options::OPT_static) ||
9384 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009385 CmdArgs.push_back("-lgcc");
9386 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009387 } else {
9388 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009389 CmdArgs.push_back("-lgcc_pic");
9390 if (!Args.hasArg(options::OPT_shared))
9391 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009392 } else {
John McCall65b8da02013-04-11 22:55:55 +00009393 CmdArgs.push_back("-lgcc");
9394 CmdArgs.push_back("--as-needed");
9395 CmdArgs.push_back("-lgcc_pic");
9396 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009397 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009398 }
9399 }
9400
Douglas Katzman78b37b02015-11-17 20:28:07 +00009401 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009402 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009403 CmdArgs.push_back(
9404 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009405 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009406 CmdArgs.push_back(
9407 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9408 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009409 }
9410
Xinliang David Li69306c02015-10-22 06:15:31 +00009411 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009412
Logan Chieneb9162f2014-06-26 14:23:45 +00009413 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009414 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009415}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009416
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009417// Try to find Exe from a Visual Studio distribution. This first tries to find
9418// an installed copy of Visual Studio and, failing that, looks in the PATH,
9419// making sure that whatever executable that's found is not a same-named exe
9420// from clang itself to prevent clang from falling back to itself.
9421static std::string FindVisualStudioExecutable(const ToolChain &TC,
9422 const char *Exe,
9423 const char *ClangProgramPath) {
9424 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9425 std::string visualStudioBinDir;
9426 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9427 visualStudioBinDir)) {
9428 SmallString<128> FilePath(visualStudioBinDir);
9429 llvm::sys::path::append(FilePath, Exe);
9430 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9431 return FilePath.str();
9432 }
9433
9434 return Exe;
9435}
9436
Douglas Katzman95354292015-06-23 20:42:09 +00009437void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9438 const InputInfo &Output,
9439 const InputInfoList &Inputs,
9440 const ArgList &Args,
9441 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009442 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009443 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009444
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009445 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9446 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009447 CmdArgs.push_back(
9448 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009449
Douglas Katzman78b37b02015-11-17 20:28:07 +00009450 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9451 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009452 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009453
Zachary Turner10d75b22014-10-22 20:40:43 +00009454 if (!llvm::sys::Process::GetEnv("LIB")) {
9455 // If the VC environment hasn't been configured (perhaps because the user
9456 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009457 // the environment variable is set however, assume the user knows what
9458 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009459 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009460 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009461 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9462 SmallString<128> LibDir(VisualStudioDir);
9463 llvm::sys::path::append(LibDir, "VC", "lib");
9464 switch (MSVC.getArch()) {
9465 case llvm::Triple::x86:
9466 // x86 just puts the libraries directly in lib
9467 break;
9468 case llvm::Triple::x86_64:
9469 llvm::sys::path::append(LibDir, "amd64");
9470 break;
9471 case llvm::Triple::arm:
9472 llvm::sys::path::append(LibDir, "arm");
9473 break;
9474 default:
9475 break;
9476 }
9477 CmdArgs.push_back(
9478 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009479
9480 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9481 std::string UniversalCRTLibPath;
9482 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9483 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9484 UniversalCRTLibPath.c_str()));
9485 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009486 }
9487
9488 std::string WindowsSdkLibPath;
9489 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9490 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9491 WindowsSdkLibPath.c_str()));
9492 }
9493
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009494 CmdArgs.push_back("-nologo");
9495
Reid Kleckner124955a2015-08-05 18:51:13 +00009496 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009497 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009498
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009499 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009500 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009501 if (DLL) {
9502 CmdArgs.push_back(Args.MakeArgString("-dll"));
9503
9504 SmallString<128> ImplibName(Output.getFilename());
9505 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009506 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009507 }
9508
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009509 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009510 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009511 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009512 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009513 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9514 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009515 // Make sure the dynamic runtime thunk is not optimized out at link time
9516 // to ensure proper SEH handling.
9517 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009518 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009519 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009520 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009521 for (const auto &Lib : {"asan", "asan_cxx"})
9522 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009523 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009524 }
9525
Hans Wennborg2e274592013-08-13 23:38:57 +00009526 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009527
Alexey Bataevc7e84352015-08-19 04:49:01 +00009528 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9529 options::OPT_fno_openmp, false)) {
9530 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9531 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9532 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9533 TC.getDriver().Dir + "/../lib"));
9534 switch (getOpenMPRuntime(getToolChain(), Args)) {
9535 case OMPRT_OMP:
9536 CmdArgs.push_back("-defaultlib:libomp.lib");
9537 break;
9538 case OMPRT_IOMP5:
9539 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9540 break;
9541 case OMPRT_GOMP:
9542 break;
9543 case OMPRT_Unknown:
9544 // Already diagnosed.
9545 break;
9546 }
9547 }
9548
Reid Kleckner337188f2014-09-16 19:22:00 +00009549 // Add filenames, libraries, and other linker inputs.
9550 for (const auto &Input : Inputs) {
9551 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009552 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009553 continue;
9554 }
9555
9556 const Arg &A = Input.getInputArg();
9557
9558 // Render -l options differently for the MSVC linker.
9559 if (A.getOption().matches(options::OPT_l)) {
9560 StringRef Lib = A.getValue();
9561 const char *LinkLibArg;
9562 if (Lib.endswith(".lib"))
9563 LinkLibArg = Args.MakeArgString(Lib);
9564 else
9565 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9566 CmdArgs.push_back(LinkLibArg);
9567 continue;
9568 }
9569
9570 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9571 // or -L. Render it, even if MSVC doesn't understand it.
9572 A.renderAsInput(Args, CmdArgs);
9573 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009574
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009575 TC.addProfileRTLibs(Args, CmdArgs);
9576
Zachary Turner719f58c2014-12-01 23:06:47 +00009577 // We need to special case some linker paths. In the case of lld, we need to
9578 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9579 // linker, we need to use a special search algorithm.
9580 llvm::SmallString<128> linkPath;
9581 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9582 if (Linker.equals_lower("lld"))
9583 Linker = "lld-link";
9584
9585 if (Linker.equals_lower("link")) {
9586 // If we're using the MSVC linker, it's not sufficient to just use link
9587 // from the program PATH, because other environments like GnuWin32 install
9588 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009589 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009590 C.getDriver().getClangProgramPath());
9591 } else {
9592 linkPath = Linker;
9593 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009594 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009595 }
9596
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009597 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009598 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009599}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009600
Douglas Katzman95354292015-06-23 20:42:09 +00009601void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9602 const InputInfo &Output,
9603 const InputInfoList &Inputs,
9604 const ArgList &Args,
9605 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009606 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9607}
9608
Douglas Katzman95354292015-06-23 20:42:09 +00009609std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009610 Compilation &C, const JobAction &JA, const InputInfo &Output,
9611 const InputInfoList &Inputs, const ArgList &Args,
9612 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009613 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009614 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009615 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009616 CmdArgs.push_back("/W0"); // No warnings.
9617
9618 // The goal is to be able to invoke this tool correctly based on
9619 // any flag accepted by clang-cl.
9620
9621 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009622 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009623
9624 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009625 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9626 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9627 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009628 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9629 if (A->getOption().getID() == options::OPT_O0) {
9630 CmdArgs.push_back("/Od");
9631 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009632 CmdArgs.push_back("/Og");
9633
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009634 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009635 if (OptLevel == "s" || OptLevel == "z")
9636 CmdArgs.push_back("/Os");
9637 else
9638 CmdArgs.push_back("/Ot");
9639
9640 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009641 }
9642 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009643 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9644 options::OPT_fno_omit_frame_pointer))
9645 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9646 ? "/Oy"
9647 : "/Oy-");
9648 if (!Args.hasArg(options::OPT_fwritable_strings))
9649 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009650
Nico Weber3f8dafb2015-03-12 19:37:10 +00009651 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009652 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9653
David Majnemerf6072342014-07-01 22:24:56 +00009654 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9655 /*default=*/false))
9656 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009657 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9658 options::OPT_fno_function_sections))
9659 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9660 ? "/Gy"
9661 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009662 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9663 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009664 CmdArgs.push_back(
9665 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009666 if (Args.hasArg(options::OPT_fsyntax_only))
9667 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009668 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9669 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009670 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009671
Nico Weber3f8dafb2015-03-12 19:37:10 +00009672 std::vector<std::string> Includes =
9673 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009674 for (const auto &Include : Includes)
9675 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009676
Hans Wennborg87cfa712013-09-19 20:32:16 +00009677 // Flags that can simply be passed through.
9678 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9679 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009680 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009681 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009682
9683 // The order of these flags is relevant, so pick the last one.
9684 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9685 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9686 A->render(Args, CmdArgs);
9687
Hans Wennborg87cfa712013-09-19 20:32:16 +00009688 // Input filename.
9689 assert(Inputs.size() == 1);
9690 const InputInfo &II = Inputs[0];
9691 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9692 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9693 if (II.isFilename())
9694 CmdArgs.push_back(II.getFilename());
9695 else
9696 II.getInputArg().renderAsInput(Args, CmdArgs);
9697
9698 // Output filename.
9699 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009700 const char *Fo =
9701 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009702 CmdArgs.push_back(Fo);
9703
Hans Wennborg188382e2013-09-20 18:16:35 +00009704 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009705 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9706 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009707 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009708 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009709}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009710
Yaron Keren1c0070c2015-07-02 04:45:27 +00009711/// MinGW Tools
9712void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9713 const InputInfo &Output,
9714 const InputInfoList &Inputs,
9715 const ArgList &Args,
9716 const char *LinkingOutput) const {
9717 claimNoWarnArgs(Args);
9718 ArgStringList CmdArgs;
9719
9720 if (getToolChain().getArch() == llvm::Triple::x86) {
9721 CmdArgs.push_back("--32");
9722 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9723 CmdArgs.push_back("--64");
9724 }
9725
9726 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9727
9728 CmdArgs.push_back("-o");
9729 CmdArgs.push_back(Output.getFilename());
9730
9731 for (const auto &II : Inputs)
9732 CmdArgs.push_back(II.getFilename());
9733
9734 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009735 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009736
9737 if (Args.hasArg(options::OPT_gsplit_dwarf))
9738 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9739 SplitDebugName(Args, Inputs[0]));
9740}
9741
9742void MinGW::Linker::AddLibGCC(const ArgList &Args,
9743 ArgStringList &CmdArgs) const {
9744 if (Args.hasArg(options::OPT_mthreads))
9745 CmdArgs.push_back("-lmingwthrd");
9746 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009747
Yaron Kerenaa281332015-08-09 00:24:07 +00009748 // Make use of compiler-rt if --rtlib option is used
9749 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9750 if (RLT == ToolChain::RLT_Libgcc) {
9751 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9752 Args.hasArg(options::OPT_static);
9753 bool Shared = Args.hasArg(options::OPT_shared);
9754 bool CXX = getToolChain().getDriver().CCCIsCXX();
9755
9756 if (Static || (!CXX && !Shared)) {
9757 CmdArgs.push_back("-lgcc");
9758 CmdArgs.push_back("-lgcc_eh");
9759 } else {
9760 CmdArgs.push_back("-lgcc_s");
9761 CmdArgs.push_back("-lgcc");
9762 }
9763 } else {
9764 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9765 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009766
Yaron Keren1c0070c2015-07-02 04:45:27 +00009767 CmdArgs.push_back("-lmoldname");
9768 CmdArgs.push_back("-lmingwex");
9769 CmdArgs.push_back("-lmsvcrt");
9770}
9771
9772void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9773 const InputInfo &Output,
9774 const InputInfoList &Inputs,
9775 const ArgList &Args,
9776 const char *LinkingOutput) const {
9777 const ToolChain &TC = getToolChain();
9778 const Driver &D = TC.getDriver();
9779 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9780
9781 ArgStringList CmdArgs;
9782
9783 // Silence warning for "clang -g foo.o -o foo"
9784 Args.ClaimAllArgs(options::OPT_g_Group);
9785 // and "clang -emit-llvm foo.o -o foo"
9786 Args.ClaimAllArgs(options::OPT_emit_llvm);
9787 // and for "clang -w foo.o -o foo". Other warning options are already
9788 // handled somewhere else.
9789 Args.ClaimAllArgs(options::OPT_w);
9790
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009791 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9792 if (LinkerName.equals_lower("lld")) {
9793 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009794 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009795 } else if (!LinkerName.equals_lower("ld")) {
9796 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009797 }
9798
Yaron Keren1c0070c2015-07-02 04:45:27 +00009799 if (!D.SysRoot.empty())
9800 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9801
9802 if (Args.hasArg(options::OPT_s))
9803 CmdArgs.push_back("-s");
9804
9805 CmdArgs.push_back("-m");
9806 if (TC.getArch() == llvm::Triple::x86)
9807 CmdArgs.push_back("i386pe");
9808 if (TC.getArch() == llvm::Triple::x86_64)
9809 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009810 if (TC.getArch() == llvm::Triple::arm)
9811 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009812
9813 if (Args.hasArg(options::OPT_mwindows)) {
9814 CmdArgs.push_back("--subsystem");
9815 CmdArgs.push_back("windows");
9816 } else if (Args.hasArg(options::OPT_mconsole)) {
9817 CmdArgs.push_back("--subsystem");
9818 CmdArgs.push_back("console");
9819 }
9820
9821 if (Args.hasArg(options::OPT_static))
9822 CmdArgs.push_back("-Bstatic");
9823 else {
9824 if (Args.hasArg(options::OPT_mdll))
9825 CmdArgs.push_back("--dll");
9826 else if (Args.hasArg(options::OPT_shared))
9827 CmdArgs.push_back("--shared");
9828 CmdArgs.push_back("-Bdynamic");
9829 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9830 CmdArgs.push_back("-e");
9831 if (TC.getArch() == llvm::Triple::x86)
9832 CmdArgs.push_back("_DllMainCRTStartup@12");
9833 else
9834 CmdArgs.push_back("DllMainCRTStartup");
9835 CmdArgs.push_back("--enable-auto-image-base");
9836 }
9837 }
9838
9839 CmdArgs.push_back("-o");
9840 CmdArgs.push_back(Output.getFilename());
9841
9842 Args.AddAllArgs(CmdArgs, options::OPT_e);
9843 // FIXME: add -N, -n flags
9844 Args.AddLastArg(CmdArgs, options::OPT_r);
9845 Args.AddLastArg(CmdArgs, options::OPT_s);
9846 Args.AddLastArg(CmdArgs, options::OPT_t);
9847 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9848 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9849
Douglas Katzman78b37b02015-11-17 20:28:07 +00009850 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009851 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9852 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9853 } else {
9854 if (Args.hasArg(options::OPT_municode))
9855 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9856 else
9857 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9858 }
9859 if (Args.hasArg(options::OPT_pg))
9860 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9861 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9862 }
9863
9864 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009865 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009866 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9867
9868 // TODO: Add ASan stuff here
9869
9870 // TODO: Add profile stuff here
9871
Douglas Katzman78b37b02015-11-17 20:28:07 +00009872 if (D.CCCIsCXX() &&
9873 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009874 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9875 !Args.hasArg(options::OPT_static);
9876 if (OnlyLibstdcxxStatic)
9877 CmdArgs.push_back("-Bstatic");
9878 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9879 if (OnlyLibstdcxxStatic)
9880 CmdArgs.push_back("-Bdynamic");
9881 }
9882
9883 if (!Args.hasArg(options::OPT_nostdlib)) {
9884 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9885 if (Args.hasArg(options::OPT_static))
9886 CmdArgs.push_back("--start-group");
9887
9888 if (Args.hasArg(options::OPT_fstack_protector) ||
9889 Args.hasArg(options::OPT_fstack_protector_strong) ||
9890 Args.hasArg(options::OPT_fstack_protector_all)) {
9891 CmdArgs.push_back("-lssp_nonshared");
9892 CmdArgs.push_back("-lssp");
9893 }
9894 if (Args.hasArg(options::OPT_fopenmp))
9895 CmdArgs.push_back("-lgomp");
9896
9897 AddLibGCC(Args, CmdArgs);
9898
9899 if (Args.hasArg(options::OPT_pg))
9900 CmdArgs.push_back("-lgmon");
9901
Yaron Kerenadce68e2015-07-06 18:52:19 +00009902 if (Args.hasArg(options::OPT_pthread))
9903 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009904
9905 // add system libraries
9906 if (Args.hasArg(options::OPT_mwindows)) {
9907 CmdArgs.push_back("-lgdi32");
9908 CmdArgs.push_back("-lcomdlg32");
9909 }
9910 CmdArgs.push_back("-ladvapi32");
9911 CmdArgs.push_back("-lshell32");
9912 CmdArgs.push_back("-luser32");
9913 CmdArgs.push_back("-lkernel32");
9914
9915 if (Args.hasArg(options::OPT_static))
9916 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009917 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009918 AddLibGCC(Args, CmdArgs);
9919 }
9920
9921 if (!Args.hasArg(options::OPT_nostartfiles)) {
9922 // Add crtfastmath.o if available and fast math is enabled.
9923 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9924
9925 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9926 }
9927 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009928 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009929 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009930}
9931
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009932/// XCore Tools
9933// We pass assemble and link construction to the xcc tool.
9934
Douglas Katzman95354292015-06-23 20:42:09 +00009935void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9936 const InputInfo &Output,
9937 const InputInfoList &Inputs,
9938 const ArgList &Args,
9939 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009940 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009941 ArgStringList CmdArgs;
9942
9943 CmdArgs.push_back("-o");
9944 CmdArgs.push_back(Output.getFilename());
9945
9946 CmdArgs.push_back("-c");
9947
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009948 if (Args.hasArg(options::OPT_v))
9949 CmdArgs.push_back("-v");
9950
Robert Lytton894d25c2014-05-02 09:33:25 +00009951 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9952 if (!A->getOption().matches(options::OPT_g0))
9953 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009954
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009955 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9956 false))
9957 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009958
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009959 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009960
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009961 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009962 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009963
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009964 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009965 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009966}
9967
Douglas Katzman95354292015-06-23 20:42:09 +00009968void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9969 const InputInfo &Output,
9970 const InputInfoList &Inputs,
9971 const ArgList &Args,
9972 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009973 ArgStringList CmdArgs;
9974
9975 if (Output.isFilename()) {
9976 CmdArgs.push_back("-o");
9977 CmdArgs.push_back(Output.getFilename());
9978 } else {
9979 assert(Output.isNothing() && "Invalid output.");
9980 }
9981
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009982 if (Args.hasArg(options::OPT_v))
9983 CmdArgs.push_back("-v");
9984
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009985 // Pass -fexceptions through to the linker if it was present.
9986 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9987 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009988 CmdArgs.push_back("-fexceptions");
9989
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009990 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9991
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009992 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009993 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009994}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009995
Douglas Katzman95354292015-06-23 20:42:09 +00009996void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9997 const InputInfo &Output,
9998 const InputInfoList &Inputs,
9999 const ArgList &Args,
10000 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010001 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010002 const auto &TC =
10003 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10004 ArgStringList CmdArgs;
10005 const char *Exec;
10006
10007 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010008 default:
10009 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010010 case llvm::Triple::arm:
10011 case llvm::Triple::thumb:
10012 break;
10013 case llvm::Triple::x86:
10014 CmdArgs.push_back("--32");
10015 break;
10016 case llvm::Triple::x86_64:
10017 CmdArgs.push_back("--64");
10018 break;
10019 }
10020
10021 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10022
10023 CmdArgs.push_back("-o");
10024 CmdArgs.push_back(Output.getFilename());
10025
10026 for (const auto &Input : Inputs)
10027 CmdArgs.push_back(Input.getFilename());
10028
10029 const std::string Assembler = TC.GetProgramPath("as");
10030 Exec = Args.MakeArgString(Assembler);
10031
Justin Bognerd3371d82015-07-17 03:35:54 +000010032 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010033}
10034
Douglas Katzman95354292015-06-23 20:42:09 +000010035void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10036 const InputInfo &Output,
10037 const InputInfoList &Inputs,
10038 const ArgList &Args,
10039 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010040 const auto &TC =
10041 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10042 const llvm::Triple &T = TC.getTriple();
10043 const Driver &D = TC.getDriver();
10044 SmallString<128> EntryPoint;
10045 ArgStringList CmdArgs;
10046 const char *Exec;
10047
10048 // Silence warning for "clang -g foo.o -o foo"
10049 Args.ClaimAllArgs(options::OPT_g_Group);
10050 // and "clang -emit-llvm foo.o -o foo"
10051 Args.ClaimAllArgs(options::OPT_emit_llvm);
10052 // and for "clang -w foo.o -o foo"
10053 Args.ClaimAllArgs(options::OPT_w);
10054 // Other warning options are already handled somewhere else.
10055
10056 if (!D.SysRoot.empty())
10057 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10058
10059 if (Args.hasArg(options::OPT_pie))
10060 CmdArgs.push_back("-pie");
10061 if (Args.hasArg(options::OPT_rdynamic))
10062 CmdArgs.push_back("-export-dynamic");
10063 if (Args.hasArg(options::OPT_s))
10064 CmdArgs.push_back("--strip-all");
10065
10066 CmdArgs.push_back("-m");
10067 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010068 default:
10069 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010070 case llvm::Triple::arm:
10071 case llvm::Triple::thumb:
10072 // FIXME: this is incorrect for WinCE
10073 CmdArgs.push_back("thumb2pe");
10074 break;
10075 case llvm::Triple::x86:
10076 CmdArgs.push_back("i386pe");
10077 EntryPoint.append("_");
10078 break;
10079 case llvm::Triple::x86_64:
10080 CmdArgs.push_back("i386pep");
10081 break;
10082 }
10083
10084 if (Args.hasArg(options::OPT_shared)) {
10085 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010086 default:
10087 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010088 case llvm::Triple::arm:
10089 case llvm::Triple::thumb:
10090 case llvm::Triple::x86_64:
10091 EntryPoint.append("_DllMainCRTStartup");
10092 break;
10093 case llvm::Triple::x86:
10094 EntryPoint.append("_DllMainCRTStartup@12");
10095 break;
10096 }
10097
10098 CmdArgs.push_back("-shared");
10099 CmdArgs.push_back("-Bdynamic");
10100
10101 CmdArgs.push_back("--enable-auto-image-base");
10102
10103 CmdArgs.push_back("--entry");
10104 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10105 } else {
10106 EntryPoint.append("mainCRTStartup");
10107
10108 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10109 : "-Bdynamic");
10110
Douglas Katzman78b37b02015-11-17 20:28:07 +000010111 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010112 CmdArgs.push_back("--entry");
10113 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10114 }
10115
10116 // FIXME: handle subsystem
10117 }
10118
10119 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010120 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010121
10122 CmdArgs.push_back("-o");
10123 CmdArgs.push_back(Output.getFilename());
10124
10125 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10126 SmallString<261> ImpLib(Output.getFilename());
10127 llvm::sys::path::replace_extension(ImpLib, ".lib");
10128
10129 CmdArgs.push_back("--out-implib");
10130 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10131 }
10132
Douglas Katzman78b37b02015-11-17 20:28:07 +000010133 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010134 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10135 const char *CRTBegin;
10136
10137 CRTBegin =
10138 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10139 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10140 }
10141
10142 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010143 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010144 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10145
10146 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10147 !Args.hasArg(options::OPT_nodefaultlibs)) {
10148 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10149 !Args.hasArg(options::OPT_static);
10150 if (StaticCXX)
10151 CmdArgs.push_back("-Bstatic");
10152 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10153 if (StaticCXX)
10154 CmdArgs.push_back("-Bdynamic");
10155 }
10156
10157 if (!Args.hasArg(options::OPT_nostdlib)) {
10158 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10159 // TODO handle /MT[d] /MD[d]
10160 CmdArgs.push_back("-lmsvcrt");
10161 AddRunTimeLibs(TC, D, CmdArgs, Args);
10162 }
10163 }
10164
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010165 if (TC.getSanitizerArgs().needsAsanRt()) {
10166 // TODO handle /MT[d] /MD[d]
10167 if (Args.hasArg(options::OPT_shared)) {
10168 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10169 } else {
10170 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10171 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10172 // Make sure the dynamic runtime thunk is not optimized out at link time
10173 // to ensure proper SEH handling.
10174 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10175 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10176 ? "___asan_seh_interceptor"
10177 : "__asan_seh_interceptor"));
10178 }
10179 }
10180
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010181 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010182
Justin Bognerd3371d82015-07-17 03:35:54 +000010183 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010184}
Douglas Katzman84a75642015-06-19 14:55:19 +000010185
Douglas Katzman95354292015-06-23 20:42:09 +000010186void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10187 const InputInfo &Output,
10188 const InputInfoList &Inputs,
10189 const ArgList &Args,
10190 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010191 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010192 assert(Inputs.size() == 1);
10193 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010194 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10195 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010196
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010197 if (JA.getKind() == Action::PreprocessJobClass) {
10198 Args.ClaimAllArgs();
10199 CmdArgs.push_back("-E");
10200 } else {
10201 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10202 CmdArgs.push_back("-S");
10203 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10204 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010205 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010206 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010207
Douglas Katzmanf6071112015-08-03 14:34:22 +000010208 // Append all -I, -iquote, -isystem paths, defines/undefines,
10209 // 'f' flags, optimize flags, and warning options.
10210 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010211 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010212 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010213 options::OPT_f_Group, options::OPT_f_clang_Group,
10214 options::OPT_g_Group, options::OPT_M_Group,
10215 options::OPT_O_Group, options::OPT_W_Group});
10216
10217 // If we're producing a dependency file, and assembly is the final action,
10218 // then the name of the target in the dependency file should be the '.o'
10219 // file, not the '.s' file produced by this step. For example, instead of
10220 // /tmp/mumble.s: mumble.c .../someheader.h
10221 // the filename on the lefthand side should be "mumble.o"
10222 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10223 C.getActions().size() == 1 &&
10224 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10225 Arg *A = Args.getLastArg(options::OPT_o);
10226 if (A) {
10227 CmdArgs.push_back("-MT");
10228 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10229 }
10230 }
10231
Douglas Katzman84a75642015-06-19 14:55:19 +000010232 CmdArgs.push_back(II.getFilename());
10233 CmdArgs.push_back("-o");
10234 CmdArgs.push_back(Output.getFilename());
10235
10236 std::string Exec =
10237 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010238 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10239 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010240}
10241
Douglas Katzman95354292015-06-23 20:42:09 +000010242void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10243 const InputInfo &Output,
10244 const InputInfoList &Inputs,
10245 const ArgList &Args,
10246 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010247 ArgStringList CmdArgs;
10248
10249 assert(Inputs.size() == 1);
10250 const InputInfo &II = Inputs[0];
10251 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10252 assert(Output.getType() == types::TY_Object);
10253
10254 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010255 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010256 CmdArgs.push_back("-noSPrefixing");
10257 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010258 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10259 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10260 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010261 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010262 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010263 }
10264 CmdArgs.push_back("-elf"); // Output format.
10265 CmdArgs.push_back(II.getFilename());
10266 CmdArgs.push_back(
10267 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10268
10269 std::string Exec =
10270 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010271 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10272 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010273}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010274
10275void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10276 const InputInfo &Output,
10277 const InputInfoList &Inputs,
10278 const ArgList &Args,
10279 const char *LinkingOutput) const {
10280 const auto &TC =
10281 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10282 const llvm::Triple &T = TC.getTriple();
10283 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010284 bool UseStartfiles =
10285 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010286 bool UseDefaultLibs =
10287 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010288
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010289 if (T.getArch() == llvm::Triple::sparc)
10290 CmdArgs.push_back("-EB");
10291 else // SHAVE assumes little-endian, and sparcel is expressly so.
10292 CmdArgs.push_back("-EL");
10293
10294 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10295 // but we never pass through a --sysroot option and various other bits.
10296 // For example, there are no sanitizers (yet) nor gold linker.
10297
10298 // Eat some arguments that may be present but have no effect.
10299 Args.ClaimAllArgs(options::OPT_g_Group);
10300 Args.ClaimAllArgs(options::OPT_w);
10301 Args.ClaimAllArgs(options::OPT_static_libgcc);
10302
10303 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10304 CmdArgs.push_back("-s");
10305
10306 CmdArgs.push_back("-o");
10307 CmdArgs.push_back(Output.getFilename());
10308
10309 if (UseStartfiles) {
10310 // If you want startfiles, it means you want the builtin crti and crtbegin,
10311 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010312 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10313 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010314 }
10315
10316 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10317 options::OPT_e, options::OPT_s, options::OPT_t,
10318 options::OPT_Z_Flag, options::OPT_r});
10319
Douglas Katzman674a3122015-11-18 16:24:46 +000010320 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010321
10322 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10323
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010324 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010325 if (C.getDriver().CCCIsCXX())
10326 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010327 if (T.getOS() == llvm::Triple::RTEMS) {
10328 CmdArgs.push_back("--start-group");
10329 CmdArgs.push_back("-lc");
10330 // You must provide your own "-L" option to enable finding these.
10331 CmdArgs.push_back("-lrtemscpu");
10332 CmdArgs.push_back("-lrtemsbsp");
10333 CmdArgs.push_back("--end-group");
10334 } else {
10335 CmdArgs.push_back("-lc");
10336 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010337 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010338 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010339 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010340 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10341 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010342 }
10343
10344 std::string Exec =
10345 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10346 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10347 CmdArgs, Inputs));
10348}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010349
10350void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10351 const InputInfo &Output,
10352 const InputInfoList &Inputs,
10353 const ArgList &Args,
10354 const char *LinkingOutput) const {
10355 claimNoWarnArgs(Args);
10356 ArgStringList CmdArgs;
10357
10358 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10359
10360 CmdArgs.push_back("-o");
10361 CmdArgs.push_back(Output.getFilename());
10362
10363 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10364 const InputInfo &Input = Inputs[0];
10365 assert(Input.isFilename() && "Invalid input.");
10366 CmdArgs.push_back(Input.getFilename());
10367
10368 const char *Exec =
10369 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10370 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10371}
10372
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010373static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10374 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10375 if (SanArgs.needsUbsanRt()) {
10376 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10377 }
10378 if (SanArgs.needsAsanRt()) {
10379 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10380 }
10381}
10382
10383static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10384 const JobAction &JA, const InputInfo &Output,
10385 const InputInfoList &Inputs,
10386 const ArgList &Args,
10387 const char *LinkingOutput) {
10388 const toolchains::FreeBSD &ToolChain =
10389 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10390 const Driver &D = ToolChain.getDriver();
10391 ArgStringList CmdArgs;
10392
10393 // Silence warning for "clang -g foo.o -o foo"
10394 Args.ClaimAllArgs(options::OPT_g_Group);
10395 // and "clang -emit-llvm foo.o -o foo"
10396 Args.ClaimAllArgs(options::OPT_emit_llvm);
10397 // and for "clang -w foo.o -o foo". Other warning options are already
10398 // handled somewhere else.
10399 Args.ClaimAllArgs(options::OPT_w);
10400
10401 if (!D.SysRoot.empty())
10402 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10403
10404 if (Args.hasArg(options::OPT_pie))
10405 CmdArgs.push_back("-pie");
10406
10407 if (Args.hasArg(options::OPT_rdynamic))
10408 CmdArgs.push_back("-export-dynamic");
10409 if (Args.hasArg(options::OPT_shared))
10410 CmdArgs.push_back("--oformat=so");
10411
10412 if (Output.isFilename()) {
10413 CmdArgs.push_back("-o");
10414 CmdArgs.push_back(Output.getFilename());
10415 } else {
10416 assert(Output.isNothing() && "Invalid output.");
10417 }
10418
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010419 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10420
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010421 Args.AddAllArgs(CmdArgs, options::OPT_L);
10422 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10423 Args.AddAllArgs(CmdArgs, options::OPT_e);
10424 Args.AddAllArgs(CmdArgs, options::OPT_s);
10425 Args.AddAllArgs(CmdArgs, options::OPT_t);
10426 Args.AddAllArgs(CmdArgs, options::OPT_r);
10427
10428 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10429 CmdArgs.push_back("--no-demangle");
10430
10431 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10432
10433 if (Args.hasArg(options::OPT_pthread)) {
10434 CmdArgs.push_back("-lpthread");
10435 }
10436
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010437 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10438
10439 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10440}
10441
10442static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10443 const JobAction &JA, const InputInfo &Output,
10444 const InputInfoList &Inputs,
10445 const ArgList &Args,
10446 const char *LinkingOutput) {
10447 const toolchains::FreeBSD &ToolChain =
10448 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10449 const Driver &D = ToolChain.getDriver();
10450 ArgStringList CmdArgs;
10451
10452 // Silence warning for "clang -g foo.o -o foo"
10453 Args.ClaimAllArgs(options::OPT_g_Group);
10454 // and "clang -emit-llvm foo.o -o foo"
10455 Args.ClaimAllArgs(options::OPT_emit_llvm);
10456 // and for "clang -w foo.o -o foo". Other warning options are already
10457 // handled somewhere else.
10458 Args.ClaimAllArgs(options::OPT_w);
10459
10460 if (!D.SysRoot.empty())
10461 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10462
10463 if (Args.hasArg(options::OPT_pie))
10464 CmdArgs.push_back("-pie");
10465
10466 if (Args.hasArg(options::OPT_static)) {
10467 CmdArgs.push_back("-Bstatic");
10468 } else {
10469 if (Args.hasArg(options::OPT_rdynamic))
10470 CmdArgs.push_back("-export-dynamic");
10471 CmdArgs.push_back("--eh-frame-hdr");
10472 if (Args.hasArg(options::OPT_shared)) {
10473 CmdArgs.push_back("-Bshareable");
10474 } else {
10475 CmdArgs.push_back("-dynamic-linker");
10476 CmdArgs.push_back("/libexec/ld-elf.so.1");
10477 }
10478 CmdArgs.push_back("--enable-new-dtags");
10479 }
10480
10481 if (Output.isFilename()) {
10482 CmdArgs.push_back("-o");
10483 CmdArgs.push_back(Output.getFilename());
10484 } else {
10485 assert(Output.isNothing() && "Invalid output.");
10486 }
10487
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010488 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10489
Douglas Katzman78b37b02015-11-17 20:28:07 +000010490 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010491 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010492 if (!Args.hasArg(options::OPT_shared)) {
10493 if (Args.hasArg(options::OPT_pg))
10494 crt1 = "gcrt1.o";
10495 else if (Args.hasArg(options::OPT_pie))
10496 crt1 = "Scrt1.o";
10497 else
10498 crt1 = "crt1.o";
10499 }
10500 if (crt1)
10501 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10502
10503 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10504
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010505 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010506 if (Args.hasArg(options::OPT_static))
10507 crtbegin = "crtbeginT.o";
10508 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10509 crtbegin = "crtbeginS.o";
10510 else
10511 crtbegin = "crtbegin.o";
10512
10513 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10514 }
10515
10516 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010517 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010518 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10519 Args.AddAllArgs(CmdArgs, options::OPT_e);
10520 Args.AddAllArgs(CmdArgs, options::OPT_s);
10521 Args.AddAllArgs(CmdArgs, options::OPT_t);
10522 Args.AddAllArgs(CmdArgs, options::OPT_r);
10523
10524 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10525 CmdArgs.push_back("--no-demangle");
10526
10527 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10528
Douglas Katzman78b37b02015-11-17 20:28:07 +000010529 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010530 // For PS4, we always want to pass libm, libstdc++ and libkernel
10531 // libraries for both C and C++ compilations.
10532 CmdArgs.push_back("-lkernel");
10533 if (D.CCCIsCXX()) {
10534 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10535 if (Args.hasArg(options::OPT_pg))
10536 CmdArgs.push_back("-lm_p");
10537 else
10538 CmdArgs.push_back("-lm");
10539 }
10540 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10541 // the default system libraries. Just mimic this for now.
10542 if (Args.hasArg(options::OPT_pg))
10543 CmdArgs.push_back("-lgcc_p");
10544 else
10545 CmdArgs.push_back("-lcompiler_rt");
10546 if (Args.hasArg(options::OPT_static)) {
10547 CmdArgs.push_back("-lstdc++");
10548 } else if (Args.hasArg(options::OPT_pg)) {
10549 CmdArgs.push_back("-lgcc_eh_p");
10550 } else {
10551 CmdArgs.push_back("--as-needed");
10552 CmdArgs.push_back("-lstdc++");
10553 CmdArgs.push_back("--no-as-needed");
10554 }
10555
10556 if (Args.hasArg(options::OPT_pthread)) {
10557 if (Args.hasArg(options::OPT_pg))
10558 CmdArgs.push_back("-lpthread_p");
10559 else
10560 CmdArgs.push_back("-lpthread");
10561 }
10562
10563 if (Args.hasArg(options::OPT_pg)) {
10564 if (Args.hasArg(options::OPT_shared))
10565 CmdArgs.push_back("-lc");
10566 else {
10567 if (Args.hasArg(options::OPT_static)) {
10568 CmdArgs.push_back("--start-group");
10569 CmdArgs.push_back("-lc_p");
10570 CmdArgs.push_back("-lpthread_p");
10571 CmdArgs.push_back("--end-group");
10572 } else {
10573 CmdArgs.push_back("-lc_p");
10574 }
10575 }
10576 CmdArgs.push_back("-lgcc_p");
10577 } else {
10578 if (Args.hasArg(options::OPT_static)) {
10579 CmdArgs.push_back("--start-group");
10580 CmdArgs.push_back("-lc");
10581 CmdArgs.push_back("-lpthread");
10582 CmdArgs.push_back("--end-group");
10583 } else {
10584 CmdArgs.push_back("-lc");
10585 }
10586 CmdArgs.push_back("-lcompiler_rt");
10587 }
10588
10589 if (Args.hasArg(options::OPT_static)) {
10590 CmdArgs.push_back("-lstdc++");
10591 } else if (Args.hasArg(options::OPT_pg)) {
10592 CmdArgs.push_back("-lgcc_eh_p");
10593 } else {
10594 CmdArgs.push_back("--as-needed");
10595 CmdArgs.push_back("-lstdc++");
10596 CmdArgs.push_back("--no-as-needed");
10597 }
10598 }
10599
Douglas Katzman78b37b02015-11-17 20:28:07 +000010600 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010601 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10602 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10603 else
10604 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10605 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10606 }
10607
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010608 const char *Exec =
10609#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010610 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010611#else
10612 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10613#endif
10614
10615 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10616}
10617
10618void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10619 const InputInfo &Output,
10620 const InputInfoList &Inputs,
10621 const ArgList &Args,
10622 const char *LinkingOutput) const {
10623 const toolchains::FreeBSD &ToolChain =
10624 static_cast<const toolchains::FreeBSD &>(getToolChain());
10625 const Driver &D = ToolChain.getDriver();
10626 bool PS4Linker;
10627 StringRef LinkerOptName;
10628 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10629 LinkerOptName = A->getValue();
10630 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10631 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10632 }
10633
10634 if (LinkerOptName == "gold")
10635 PS4Linker = false;
10636 else if (LinkerOptName == "ps4")
10637 PS4Linker = true;
10638 else
10639 PS4Linker = !Args.hasArg(options::OPT_shared);
10640
10641 if (PS4Linker)
10642 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10643 else
10644 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10645}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010646
10647void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10648 const InputInfo &Output,
10649 const InputInfoList &Inputs,
10650 const ArgList &Args,
10651 const char *LinkingOutput) const {
10652 const auto &TC =
10653 static_cast<const toolchains::CudaToolChain &>(getToolChain());
10654 assert(TC.getArch() == llvm::Triple::nvptx ||
10655 TC.getArch() == llvm::Triple::nvptx64);
10656
10657 std::vector<std::string> gpu_archs =
10658 Args.getAllArgValues(options::OPT_march_EQ);
10659 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10660 const std::string& gpu_arch = gpu_archs[0];
10661
10662
10663 ArgStringList CmdArgs;
10664 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
10665
10666 // Clang's default optimization level is -O0, but ptxas's default is -O3.
10667 CmdArgs.push_back(Args.MakeArgString(
10668 llvm::Twine("-O") +
10669 Args.getLastArgValue(options::OPT_O_Group, "0").data()));
10670
10671 // Don't bother passing -g to ptxas: It's enabled by default at -O0, and
10672 // not supported at other optimization levels.
10673
10674 CmdArgs.push_back("--gpu-name");
10675 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10676 CmdArgs.push_back("--output-file");
10677 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10678 for (const auto& II : Inputs)
10679 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10680
10681 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10682 CmdArgs.push_back(Args.MakeArgString(A));
10683
10684 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10685 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10686}
10687
10688// All inputs to this linker must be from CudaDeviceActions, as we need to look
10689// at the Inputs' Actions in order to figure out which GPU architecture they
10690// correspond to.
10691void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10692 const InputInfo &Output,
10693 const InputInfoList &Inputs,
10694 const ArgList &Args,
10695 const char *LinkingOutput) const {
10696 const auto &TC =
10697 static_cast<const toolchains::CudaToolChain &>(getToolChain());
10698 assert(TC.getArch() == llvm::Triple::nvptx ||
10699 TC.getArch() == llvm::Triple::nvptx64);
10700
10701 ArgStringList CmdArgs;
10702 CmdArgs.push_back("--cuda");
10703 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10704 CmdArgs.push_back(Args.MakeArgString("--create"));
10705 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10706
10707 for (const auto& II : Inputs) {
10708 auto* A = cast<const CudaDeviceAction>(II.getAction());
10709 // We need to pass an Arch of the form "sm_XX" for cubin files and
10710 // "compute_XX" for ptx.
10711 const char *Arch = (II.getType() == types::TY_PP_Asm)
10712 ? A->getComputeArchName()
10713 : A->getGpuArchName();
10714 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10715 Arch + ",file=" + II.getFilename()));
10716 }
10717
10718 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10719 CmdArgs.push_back(Args.MakeArgString(A));
10720
10721 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10722 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10723}