blob: 9c64da58c27092c38730df19265f070a630739f4 [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;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000701 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000702 break;
703 }
Tim Northover756447a2015-10-30 16:30:36 +0000704 case llvm::Triple::WatchOS:
705 ABI = FloatABI::Hard;
706 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000707
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000708 // FIXME: this is invalid for WindowsCE
709 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000710 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000711 break;
712
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000713 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000714 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000715 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000716 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000717 break;
718 default:
719 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000720 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000721 break;
722 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000723 break;
724
Daniel Dunbar78485922009-09-10 23:00:09 +0000725 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000726 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000727 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000728 case llvm::Triple::EABIHF:
729 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000730 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000731 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000732 case llvm::Triple::EABI:
733 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000734 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000735 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000736 case llvm::Triple::Android:
737 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000738 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000739 default:
740 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000741 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000742 if (Triple.getOS() != llvm::Triple::UnknownOS ||
743 !Triple.isOSBinFormatMachO())
744 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000745 break;
746 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000747 }
748 }
749
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000750 assert(ABI != FloatABI::Invalid && "must select an ABI");
751 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000752}
753
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000754static void getARMTargetFeatures(const ToolChain &TC,
755 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000756 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000757 std::vector<const char *> &Features,
758 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000759 const Driver &D = TC.getDriver();
760
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000761 bool KernelOrKext =
762 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000763 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000764 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
765 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
766
Nico Weber6e0ebae2015-04-29 21:16:40 +0000767 if (!ForAS) {
768 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
769 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
770 // stripped out by the ARM target. We should probably pass this a new
771 // -target-option, which is handled by the -cc1/-cc1as invocation.
772 //
773 // FIXME2: For consistency, it would be ideal if we set up the target
774 // machine state the same when using the frontend or the assembler. We don't
775 // currently do that for the assembler, we pass the options directly to the
776 // backend and never even instantiate the frontend TargetInfo. If we did,
777 // and used its handleTargetFeatures hook, then we could ensure the
778 // assembler and the frontend behave the same.
779
780 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000782 Features.push_back("+soft-float");
783
784 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000786 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000787 } else {
788 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
789 // to the assembler correctly.
790 for (const Arg *A :
791 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
792 StringRef Value = A->getValue();
793 if (Value.startswith("-mfpu=")) {
794 WaFPU = A;
795 } else if (Value.startswith("-mcpu=")) {
796 WaCPU = A;
797 } else if (Value.startswith("-mhwdiv=")) {
798 WaHDiv = A;
799 } else if (Value.startswith("-march=")) {
800 WaArch = A;
801 }
802 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000803 }
804
Renato Golin7c542b42015-07-27 23:44:45 +0000805 // Check -march. ClangAs gives preference to -Wa,-march=.
806 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000807 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000808 if (WaArch) {
809 if (ArchArg)
810 D.Diag(clang::diag::warn_drv_unused_argument)
811 << ArchArg->getAsString(Args);
812 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000813 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000814 // FIXME: Set Arch.
815 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
816 } else if (ArchArg) {
817 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000818 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000819 }
820
Renato Golin7c542b42015-07-27 23:44:45 +0000821 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
822 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000823 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000824 if (WaCPU) {
825 if (CPUArg)
826 D.Diag(clang::diag::warn_drv_unused_argument)
827 << CPUArg->getAsString(Args);
828 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000829 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000830 } else if (CPUArg) {
831 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000832 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000833 }
John Brawna95c1a82015-05-08 12:52:18 +0000834
Renato Golin23459c62015-07-30 16:40:17 +0000835 // Add CPU features for generic CPUs
836 if (CPUName == "native") {
837 llvm::StringMap<bool> HostFeatures;
838 if (llvm::sys::getHostCPUFeatures(HostFeatures))
839 for (auto &F : HostFeatures)
840 Features.push_back(
841 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
842 }
843
844 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
845 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
846 if (WaFPU) {
847 if (FPUArg)
848 D.Diag(clang::diag::warn_drv_unused_argument)
849 << FPUArg->getAsString(Args);
850 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
851 Features);
852 } else if (FPUArg) {
853 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
854 }
855
856 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
857 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
858 if (WaHDiv) {
859 if (HDivArg)
860 D.Diag(clang::diag::warn_drv_unused_argument)
861 << HDivArg->getAsString(Args);
862 getARMHWDivFeatures(D, WaHDiv, Args,
863 StringRef(WaHDiv->getValue()).substr(8), Features);
864 } else if (HDivArg)
865 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
866
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000867 // Setting -msoft-float effectively disables NEON because of the GCC
868 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000869 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000870 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000871 // Also need to explicitly disable features which imply NEON.
872 Features.push_back("-crypto");
873 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000874
Eric Christopher269c2a22015-04-04 03:34:43 +0000875 // En/disable crc code generation.
876 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000877 if (A->getOption().matches(options::OPT_mcrc))
878 Features.push_back("+crc");
879 else
880 Features.push_back("-crc");
881 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000882
Akira Hatanakac2694822015-07-07 08:28:42 +0000883 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
884 // neither options are specified, see if we are compiling for kernel/kext and
885 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000886 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
887 options::OPT_mno_long_calls)) {
888 if (A->getOption().matches(options::OPT_mlong_calls))
889 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000890 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
891 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000892 Features.push_back("+long-calls");
893 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000894
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000895 // Kernel code has more strict alignment requirements.
896 if (KernelOrKext)
897 Features.push_back("+strict-align");
898 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
899 options::OPT_munaligned_access)) {
900 if (A->getOption().matches(options::OPT_munaligned_access)) {
901 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
902 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
903 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
904 } else
905 Features.push_back("+strict-align");
906 } else {
907 // Assume pre-ARMv6 doesn't support unaligned accesses.
908 //
909 // ARMv6 may or may not support unaligned accesses depending on the
910 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
911 // Darwin and NetBSD targets support unaligned accesses, and others don't.
912 //
913 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
914 // which raises an alignment fault on unaligned accesses. Linux
915 // defaults this bit to 0 and handles it as a system-wide (not
916 // per-process) setting. It is therefore safe to assume that ARMv7+
917 // Linux targets support unaligned accesses. The same goes for NaCl.
918 //
919 // The above behavior is consistent with GCC.
920 int VersionNum = getARMSubArchVersionNumber(Triple);
921 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000922 if (VersionNum < 6 ||
923 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000924 Features.push_back("+strict-align");
925 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
926 if (VersionNum < 7)
927 Features.push_back("+strict-align");
928 } else
929 Features.push_back("+strict-align");
930 }
931
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000932 // llvm does not support reserving registers in general. There is support
933 // for reserving r9 on ARM though (defined as a platform-specific register
934 // in ARM EABI).
935 if (Args.hasArg(options::OPT_ffixed_r9))
936 Features.push_back("+reserve-r9");
937
Dimitry Andric08107392016-01-06 07:42:18 +0000938 // The kext linker doesn't know how to deal with movw/movt.
939 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +0000940 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000941}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000942
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000943void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
944 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000945 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000946 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000947 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000948 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000949 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000950 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000951 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000952 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000953 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +0000954 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +0000955 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000956 } else {
957 ABIName = "apcs-gnu";
958 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000959 } else if (Triple.isOSWindows()) {
960 // FIXME: this is invalid for WindowsCE
961 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000962 } else {
963 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000964 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000965 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000966 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000967 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000968 ABIName = "aapcs-linux";
969 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000970 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000971 case llvm::Triple::EABI:
972 ABIName = "aapcs";
973 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000974 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000975 if (Triple.getOS() == llvm::Triple::NetBSD)
976 ABIName = "apcs-gnu";
977 else
978 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000979 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000980 }
981 }
982 CmdArgs.push_back("-target-abi");
983 CmdArgs.push_back(ABIName);
984
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000985 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000986 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000987 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000988 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000989 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000990 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000991 CmdArgs.push_back("-mfloat-abi");
992 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000993 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000994 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000995 CmdArgs.push_back("-mfloat-abi");
996 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000997 } else {
998 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000999 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001000 CmdArgs.push_back("-mfloat-abi");
1001 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001002 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001003
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001004 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001005 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1006 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001008 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001009 CmdArgs.push_back("-arm-global-merge=false");
1010 else
1011 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001012 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001013
Bob Wilson9c8af452013-04-11 18:53:25 +00001014 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001015 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001016 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001017}
Renato Goline17c5802015-07-27 23:44:42 +00001018// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001019
Tim Northover573cbee2014-05-24 12:52:07 +00001020/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1021/// targeting.
1022static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001023 Arg *A;
1024 std::string CPU;
1025 // If we have -mtune or -mcpu, use that.
1026 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001027 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001028 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001029 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001030 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001031 }
1032
Kevin Qin110db6f2014-07-18 07:03:22 +00001033 // Handle CPU name is 'native'.
1034 if (CPU == "native")
1035 return llvm::sys::getHostCPUName();
1036 else if (CPU.size())
1037 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001038
James Molloy9b1586b2014-04-17 12:51:17 +00001039 // Make sure we pick "cyclone" if -arch is used.
1040 // FIXME: Should this be picked by checking the target triple instead?
1041 if (Args.getLastArg(options::OPT_arch))
1042 return "cyclone";
1043
1044 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001045}
1046
Tim Northover573cbee2014-05-24 12:52:07 +00001047void Clang::AddAArch64TargetArgs(const ArgList &Args,
1048 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001049 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1050 llvm::Triple Triple(TripleStr);
1051
1052 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1053 Args.hasArg(options::OPT_mkernel) ||
1054 Args.hasArg(options::OPT_fapple_kext))
1055 CmdArgs.push_back("-disable-red-zone");
1056
1057 if (!Args.hasFlag(options::OPT_mimplicit_float,
1058 options::OPT_mno_implicit_float, true))
1059 CmdArgs.push_back("-no-implicit-float");
1060
Craig Topper92fc2df2014-05-17 16:56:41 +00001061 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001062 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1063 ABIName = A->getValue();
1064 else if (Triple.isOSDarwin())
1065 ABIName = "darwinpcs";
1066 else
1067 ABIName = "aapcs";
1068
1069 CmdArgs.push_back("-target-abi");
1070 CmdArgs.push_back(ABIName);
1071
Bradley Smith9ff64332014-10-13 10:16:06 +00001072 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1073 options::OPT_mno_fix_cortex_a53_835769)) {
1074 CmdArgs.push_back("-backend-option");
1075 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1076 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1077 else
1078 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001079 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001080 // Enabled A53 errata (835769) workaround by default on android
1081 CmdArgs.push_back("-backend-option");
1082 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001083 }
1084
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001085 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001086 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1087 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001088 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001089 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001090 CmdArgs.push_back("-aarch64-global-merge=false");
1091 else
1092 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001093 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001094}
1095
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001096// Get CPU and ABI names. They are not independent
1097// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001098void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1099 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001100 const char *DefMips32CPU = "mips32r2";
1101 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001102
Daniel Sanders2bf13662014-07-10 14:40:57 +00001103 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1104 // default for mips64(el)?-img-linux-gnu.
1105 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1106 Triple.getEnvironment() == llvm::Triple::GNU) {
1107 DefMips32CPU = "mips32r6";
1108 DefMips64CPU = "mips64r6";
1109 }
Renato Golin7c542b42015-07-27 23:44:45 +00001110
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001111 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001112 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001113 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001114
Brad Smithba26f582015-01-06 02:53:17 +00001115 // MIPS3 is the default for mips64*-unknown-openbsd.
1116 if (Triple.getOS() == llvm::Triple::OpenBSD)
1117 DefMips64CPU = "mips3";
1118
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001119 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001120 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001121
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001122 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001123 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001124 // Convert a GNU style Mips ABI name to the name
1125 // accepted by LLVM Mips backend.
1126 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001127 .Case("32", "o32")
1128 .Case("64", "n64")
1129 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001130 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001131
1132 // Setup default CPU and ABI names.
1133 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001134 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001135 default:
1136 llvm_unreachable("Unexpected triple arch name");
1137 case llvm::Triple::mips:
1138 case llvm::Triple::mipsel:
1139 CPUName = DefMips32CPU;
1140 break;
1141 case llvm::Triple::mips64:
1142 case llvm::Triple::mips64el:
1143 CPUName = DefMips64CPU;
1144 break;
1145 }
1146 }
1147
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001148 if (ABIName.empty()) {
1149 // Deduce ABI name from the target triple.
1150 if (Triple.getArch() == llvm::Triple::mips ||
1151 Triple.getArch() == llvm::Triple::mipsel)
1152 ABIName = "o32";
1153 else
1154 ABIName = "n64";
1155 }
1156
1157 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001158 // Deduce CPU name from ABI name.
1159 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001160 .Cases("o32", "eabi", DefMips32CPU)
1161 .Cases("n32", "n64", DefMips64CPU)
1162 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001163 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001164
1165 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001166}
1167
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001168std::string mips::getMipsABILibSuffix(const ArgList &Args,
1169 const llvm::Triple &Triple) {
1170 StringRef CPUName, ABIName;
1171 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1172 return llvm::StringSwitch<std::string>(ABIName)
1173 .Case("o32", "")
1174 .Case("n32", "32")
1175 .Case("n64", "64");
1176}
1177
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001178// Convert ABI name to the GNU tools acceptable variant.
1179static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1180 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001181 .Case("o32", "32")
1182 .Case("n64", "64")
1183 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001184}
1185
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001186// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1187// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001188static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1189 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001190 if (Arg *A =
1191 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1192 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001193 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001194 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001195 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001196 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001197 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001198 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1199 .Case("soft", mips::FloatABI::Soft)
1200 .Case("hard", mips::FloatABI::Hard)
1201 .Default(mips::FloatABI::Invalid);
1202 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001203 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001204 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001205 }
1206 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001207 }
1208
1209 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001210 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001211 // Assume "hard", because it's a default value used by gcc.
1212 // When we start to recognize specific target MIPS processors,
1213 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001214 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001215 }
1216
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001217 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1218 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001219}
1220
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001221static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001222 std::vector<const char *> &Features,
1223 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001224 StringRef FeatureName) {
1225 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001226 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001227 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001228 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001229 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001230 }
1231}
1232
Daniel Sanders379d44b2014-07-16 11:52:23 +00001233static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1234 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001235 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001236 StringRef CPUName;
1237 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001238 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001239 ABIName = getGnuCompatibleMipsABIName(ABIName);
1240
Daniel Sandersfeb61302014-08-08 15:47:17 +00001241 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1242 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001243
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001244 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1245 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001246 // FIXME: Note, this is a hack. We need to pass the selected float
1247 // mode to the MipsTargetInfoBase to define appropriate macros there.
1248 // Now it is the only method.
1249 Features.push_back("+soft-float");
1250 }
1251
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001252 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001253 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001254 if (Val == "2008") {
1255 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1256 Features.push_back("+nan2008");
1257 else {
1258 Features.push_back("-nan2008");
1259 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1260 }
1261 } else if (Val == "legacy") {
1262 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1263 Features.push_back("-nan2008");
1264 else {
1265 Features.push_back("+nan2008");
1266 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1267 }
1268 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001269 D.Diag(diag::err_drv_unsupported_option_argument)
1270 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001271 }
1272
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001273 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1274 options::OPT_mdouble_float, "single-float");
1275 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1276 "mips16");
1277 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1278 options::OPT_mno_micromips, "micromips");
1279 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1280 "dsp");
1281 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1282 "dspr2");
1283 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1284 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001285
1286 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1287 // pass -mfpxx
1288 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1289 options::OPT_mfp64)) {
1290 if (A->getOption().matches(options::OPT_mfp32))
1291 Features.push_back(Args.MakeArgString("-fp64"));
1292 else if (A->getOption().matches(options::OPT_mfpxx)) {
1293 Features.push_back(Args.MakeArgString("+fpxx"));
1294 Features.push_back(Args.MakeArgString("+nooddspreg"));
1295 } else
1296 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001297 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001298 Features.push_back(Args.MakeArgString("+fpxx"));
1299 Features.push_back(Args.MakeArgString("+nooddspreg"));
1300 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001301
Daniel Sanders28e5d392014-07-10 10:39:51 +00001302 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1303 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001304}
1305
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001306void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001307 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001308 const Driver &D = getToolChain().getDriver();
1309 StringRef CPUName;
1310 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001311 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001312 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001313
1314 CmdArgs.push_back("-target-abi");
1315 CmdArgs.push_back(ABIName.data());
1316
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001317 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1318 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001319 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001320 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001321 CmdArgs.push_back("-mfloat-abi");
1322 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001323 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001324 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001325 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001326 CmdArgs.push_back("-mfloat-abi");
1327 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001328 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001329
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001330 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1331 if (A->getOption().matches(options::OPT_mxgot)) {
1332 CmdArgs.push_back("-mllvm");
1333 CmdArgs.push_back("-mxgot");
1334 }
1335 }
1336
Simon Atanasyanc580b322013-05-11 06:33:44 +00001337 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1338 options::OPT_mno_ldc1_sdc1)) {
1339 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1340 CmdArgs.push_back("-mllvm");
1341 CmdArgs.push_back("-mno-ldc1-sdc1");
1342 }
1343 }
1344
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001345 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1346 options::OPT_mno_check_zero_division)) {
1347 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1348 CmdArgs.push_back("-mllvm");
1349 CmdArgs.push_back("-mno-check-zero-division");
1350 }
1351 }
1352
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001353 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001354 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001355 CmdArgs.push_back("-mllvm");
1356 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1357 A->claim();
1358 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001359}
1360
Hal Finkel8eb59282012-06-11 22:35:19 +00001361/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1362static std::string getPPCTargetCPU(const ArgList &Args) {
1363 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001364 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001365
1366 if (CPUName == "native") {
1367 std::string CPU = llvm::sys::getHostCPUName();
1368 if (!CPU.empty() && CPU != "generic")
1369 return CPU;
1370 else
1371 return "";
1372 }
1373
1374 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001375 .Case("common", "generic")
1376 .Case("440", "440")
1377 .Case("440fp", "440")
1378 .Case("450", "450")
1379 .Case("601", "601")
1380 .Case("602", "602")
1381 .Case("603", "603")
1382 .Case("603e", "603e")
1383 .Case("603ev", "603ev")
1384 .Case("604", "604")
1385 .Case("604e", "604e")
1386 .Case("620", "620")
1387 .Case("630", "pwr3")
1388 .Case("G3", "g3")
1389 .Case("7400", "7400")
1390 .Case("G4", "g4")
1391 .Case("7450", "7450")
1392 .Case("G4+", "g4+")
1393 .Case("750", "750")
1394 .Case("970", "970")
1395 .Case("G5", "g5")
1396 .Case("a2", "a2")
1397 .Case("a2q", "a2q")
1398 .Case("e500mc", "e500mc")
1399 .Case("e5500", "e5500")
1400 .Case("power3", "pwr3")
1401 .Case("power4", "pwr4")
1402 .Case("power5", "pwr5")
1403 .Case("power5x", "pwr5x")
1404 .Case("power6", "pwr6")
1405 .Case("power6x", "pwr6x")
1406 .Case("power7", "pwr7")
1407 .Case("power8", "pwr8")
1408 .Case("pwr3", "pwr3")
1409 .Case("pwr4", "pwr4")
1410 .Case("pwr5", "pwr5")
1411 .Case("pwr5x", "pwr5x")
1412 .Case("pwr6", "pwr6")
1413 .Case("pwr6x", "pwr6x")
1414 .Case("pwr7", "pwr7")
1415 .Case("pwr8", "pwr8")
1416 .Case("powerpc", "ppc")
1417 .Case("powerpc64", "ppc64")
1418 .Case("powerpc64le", "ppc64le")
1419 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001420 }
1421
1422 return "";
1423}
1424
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001425static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1426 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001427 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001428 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001429
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001430 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1431 if (FloatABI == ppc::FloatABI::Soft &&
1432 !(Triple.getArch() == llvm::Triple::ppc64 ||
1433 Triple.getArch() == llvm::Triple::ppc64le))
1434 Features.push_back("+soft-float");
1435 else if (FloatABI == ppc::FloatABI::Soft &&
1436 (Triple.getArch() == llvm::Triple::ppc64 ||
1437 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001438 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001439 << "soft float is not supported for ppc64";
1440
Eric Christopher643bb6a2013-10-16 20:40:08 +00001441 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001442 AddTargetFeature(Args, Features, options::OPT_faltivec,
1443 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001444}
1445
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001446ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1447 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1448 if (Arg *A =
1449 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1450 options::OPT_mfloat_abi_EQ)) {
1451 if (A->getOption().matches(options::OPT_msoft_float))
1452 ABI = ppc::FloatABI::Soft;
1453 else if (A->getOption().matches(options::OPT_mhard_float))
1454 ABI = ppc::FloatABI::Hard;
1455 else {
1456 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1457 .Case("soft", ppc::FloatABI::Soft)
1458 .Case("hard", ppc::FloatABI::Hard)
1459 .Default(ppc::FloatABI::Invalid);
1460 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1461 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1462 ABI = ppc::FloatABI::Hard;
1463 }
1464 }
1465 }
1466
1467 // If unspecified, choose the default based on the platform.
1468 if (ABI == ppc::FloatABI::Invalid) {
1469 ABI = ppc::FloatABI::Hard;
1470 }
1471
1472 return ABI;
1473}
1474
Ulrich Weigand8afad612014-07-28 13:17:52 +00001475void Clang::AddPPCTargetArgs(const ArgList &Args,
1476 ArgStringList &CmdArgs) const {
1477 // Select the ABI to use.
1478 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001479 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001480 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001481 case llvm::Triple::ppc64: {
1482 // When targeting a processor that supports QPX, or if QPX is
1483 // specifically enabled, default to using the ABI that supports QPX (so
1484 // long as it is not specifically disabled).
1485 bool HasQPX = false;
1486 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1487 HasQPX = A->getValue() == StringRef("a2q");
1488 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1489 if (HasQPX) {
1490 ABIName = "elfv1-qpx";
1491 break;
1492 }
1493
Ulrich Weigand8afad612014-07-28 13:17:52 +00001494 ABIName = "elfv1";
1495 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001496 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001497 case llvm::Triple::ppc64le:
1498 ABIName = "elfv2";
1499 break;
1500 default:
1501 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001502 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001503
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001504 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1505 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1506 // the option if given as we don't have backend support for any targets
1507 // that don't use the altivec abi.
1508 if (StringRef(A->getValue()) != "altivec")
1509 ABIName = A->getValue();
1510
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001511 ppc::FloatABI FloatABI =
1512 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1513
1514 if (FloatABI == ppc::FloatABI::Soft) {
1515 // Floating point operations and argument passing are soft.
1516 CmdArgs.push_back("-msoft-float");
1517 CmdArgs.push_back("-mfloat-abi");
1518 CmdArgs.push_back("soft");
1519 } else {
1520 // Floating point operations and argument passing are hard.
1521 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1522 CmdArgs.push_back("-mfloat-abi");
1523 CmdArgs.push_back("hard");
1524 }
1525
Ulrich Weigand8afad612014-07-28 13:17:52 +00001526 if (ABIName) {
1527 CmdArgs.push_back("-target-abi");
1528 CmdArgs.push_back(ABIName);
1529 }
1530}
1531
1532bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1533 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1534 return A && (A->getValue() == StringRef(Value));
1535}
1536
Tom Stellard6674c702013-04-01 20:56:53 +00001537/// Get the (LLVM) name of the R600 gpu we are targeting.
1538static std::string getR600TargetGPU(const ArgList &Args) {
1539 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001540 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001541 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001542 .Cases("rv630", "rv635", "r600")
1543 .Cases("rv610", "rv620", "rs780", "rs880")
1544 .Case("rv740", "rv770")
1545 .Case("palm", "cedar")
1546 .Cases("sumo", "sumo2", "sumo")
1547 .Case("hemlock", "cypress")
1548 .Case("aruba", "cayman")
1549 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001550 }
1551 return "";
1552}
1553
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001554void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001555 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001556 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001557 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001558
James Y Knightb2406522015-06-15 20:51:24 +00001559 bool SoftFloatABI = false;
1560 if (Arg *A =
1561 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001562 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001563 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001564 }
1565
James Y Knightb2406522015-06-15 20:51:24 +00001566 // Only the hard-float ABI on Sparc is standardized, and it is the
1567 // default. GCC also supports a nonstandard soft-float ABI mode, and
1568 // perhaps LLVM should implement that, too. However, since llvm
1569 // currently does not support Sparc soft-float, at all, display an
1570 // error if it's requested.
1571 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001572 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1573 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001574 }
1575}
1576
Richard Sandiford4652d892013-07-19 16:51:51 +00001577static const char *getSystemZTargetCPU(const ArgList &Args) {
1578 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1579 return A->getValue();
1580 return "z10";
1581}
1582
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001583static void getSystemZTargetFeatures(const ArgList &Args,
1584 std::vector<const char *> &Features) {
1585 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001586 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001587 if (A->getOption().matches(options::OPT_mhtm))
1588 Features.push_back("+transactional-execution");
1589 else
1590 Features.push_back("-transactional-execution");
1591 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001592 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001593 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001594 if (A->getOption().matches(options::OPT_mvx))
1595 Features.push_back("+vector");
1596 else
1597 Features.push_back("-vector");
1598 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001599}
1600
Chandler Carruth953fb082013-01-13 11:46:33 +00001601static const char *getX86TargetCPU(const ArgList &Args,
1602 const llvm::Triple &Triple) {
1603 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001604 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001605 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001606 return "core-avx2";
1607
Chandler Carruth953fb082013-01-13 11:46:33 +00001608 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001610
1611 // FIXME: Reject attempts to use -march=native unless the target matches
1612 // the host.
1613 //
1614 // FIXME: We should also incorporate the detected target features for use
1615 // with -native.
1616 std::string CPU = llvm::sys::getHostCPUName();
1617 if (!CPU.empty() && CPU != "generic")
1618 return Args.MakeArgString(CPU);
1619 }
1620
Reid Kleckner3123eff2015-06-30 16:32:04 +00001621 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1622 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1623 StringRef Arch = A->getValue();
1624 const char *CPU;
1625 if (Triple.getArch() == llvm::Triple::x86) {
1626 CPU = llvm::StringSwitch<const char *>(Arch)
1627 .Case("IA32", "i386")
1628 .Case("SSE", "pentium3")
1629 .Case("SSE2", "pentium4")
1630 .Case("AVX", "sandybridge")
1631 .Case("AVX2", "haswell")
1632 .Default(nullptr);
1633 } else {
1634 CPU = llvm::StringSwitch<const char *>(Arch)
1635 .Case("AVX", "sandybridge")
1636 .Case("AVX2", "haswell")
1637 .Default(nullptr);
1638 }
1639 if (CPU)
1640 return CPU;
1641 }
1642
Chandler Carruth953fb082013-01-13 11:46:33 +00001643 // Select the default CPU if none was given (or detection failed).
1644
1645 if (Triple.getArch() != llvm::Triple::x86_64 &&
1646 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001647 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001648
1649 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1650
1651 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001652 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001653 if (Triple.getArchName() == "x86_64h")
1654 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001655 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001656 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001657
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001658 // Set up default CPU name for PS4 compilers.
1659 if (Triple.isPS4CPU())
1660 return "btver2";
1661
Alexey Bataev286d1b92014-01-31 04:07:13 +00001662 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001663 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001664 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001665
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001666 // Everything else goes to x86-64 in 64-bit mode.
1667 if (Is64Bit)
1668 return "x86-64";
1669
1670 switch (Triple.getOS()) {
1671 case llvm::Triple::FreeBSD:
1672 case llvm::Triple::NetBSD:
1673 case llvm::Triple::OpenBSD:
1674 return "i486";
1675 case llvm::Triple::Haiku:
1676 return "i586";
1677 case llvm::Triple::Bitrig:
1678 return "i686";
1679 default:
1680 // Fallback to p4.
1681 return "pentium4";
1682 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001683}
1684
Dan Gohmanc2853072015-09-03 22:51:53 +00001685/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1686static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1687 // If we have -mcpu=, use that.
1688 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1689 StringRef CPU = A->getValue();
1690
1691#ifdef __wasm__
1692 // Handle "native" by examining the host. "native" isn't meaningful when
1693 // cross compiling, so only support this when the host is also WebAssembly.
1694 if (CPU == "native")
1695 return llvm::sys::getHostCPUName();
1696#endif
1697
1698 return CPU;
1699 }
1700
1701 return "generic";
1702}
1703
Renato Golin7c542b42015-07-27 23:44:45 +00001704static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1705 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001706 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001707 default:
1708 return "";
1709
Amara Emerson703da2e2013-10-31 09:32:33 +00001710 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001711 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001712 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001713
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001714 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001715 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001716 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001717 case llvm::Triple::thumbeb: {
1718 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001719 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001720 return arm::getARMTargetCPU(MCPU, MArch, T);
1721 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001722 case llvm::Triple::mips:
1723 case llvm::Triple::mipsel:
1724 case llvm::Triple::mips64:
1725 case llvm::Triple::mips64el: {
1726 StringRef CPUName;
1727 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001728 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001729 return CPUName;
1730 }
1731
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001732 case llvm::Triple::nvptx:
1733 case llvm::Triple::nvptx64:
1734 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1735 return A->getValue();
1736 return "";
1737
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001738 case llvm::Triple::ppc:
1739 case llvm::Triple::ppc64:
1740 case llvm::Triple::ppc64le: {
1741 std::string TargetCPUName = getPPCTargetCPU(Args);
1742 // LLVM may default to generating code for the native CPU,
1743 // but, like gcc, we default to a more generic option for
1744 // each architecture. (except on Darwin)
1745 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1746 if (T.getArch() == llvm::Triple::ppc64)
1747 TargetCPUName = "ppc64";
1748 else if (T.getArch() == llvm::Triple::ppc64le)
1749 TargetCPUName = "ppc64le";
1750 else
1751 TargetCPUName = "ppc";
1752 }
1753 return TargetCPUName;
1754 }
1755
1756 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001757 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001758 case llvm::Triple::sparcv9:
1759 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001760 return A->getValue();
1761 return "";
1762
1763 case llvm::Triple::x86:
1764 case llvm::Triple::x86_64:
1765 return getX86TargetCPU(Args, T);
1766
1767 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001768 return "hexagon" +
1769 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001770
1771 case llvm::Triple::systemz:
1772 return getSystemZTargetCPU(Args);
1773
1774 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001775 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001776 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001777
1778 case llvm::Triple::wasm32:
1779 case llvm::Triple::wasm64:
1780 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001781 }
1782}
1783
Alp Tokerce365ca2013-12-02 12:43:03 +00001784static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001785 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001786 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1787 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1788 // forward.
1789 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001790 std::string Plugin =
1791 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001792 CmdArgs.push_back(Args.MakeArgString(Plugin));
1793
1794 // Try to pass driver level flags relevant to LTO code generation down to
1795 // the plugin.
1796
1797 // Handle flags for selecting CPU variants.
1798 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1799 if (!CPU.empty())
1800 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001801
James Molloyf97fdae2015-12-21 10:44:36 +00001802 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1803 StringRef OOpt;
1804 if (A->getOption().matches(options::OPT_O4) ||
1805 A->getOption().matches(options::OPT_Ofast))
1806 OOpt = "3";
1807 else if (A->getOption().matches(options::OPT_O))
1808 OOpt = A->getValue();
1809 else if (A->getOption().matches(options::OPT_O0))
1810 OOpt = "0";
1811 if (!OOpt.empty())
1812 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1813 }
1814
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001815 if (IsThinLTO)
1816 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001817
1818 // If an explicit debugger tuning argument appeared, pass it along.
1819 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1820 options::OPT_ggdbN_Group)) {
1821 if (A->getOption().matches(options::OPT_glldb))
1822 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1823 else if (A->getOption().matches(options::OPT_gsce))
1824 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1825 else
1826 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1827 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001828}
1829
Sanjay Patel2987c292015-06-11 14:53:41 +00001830/// This is a helper function for validating the optional refinement step
1831/// parameter in reciprocal argument strings. Return false if there is an error
1832/// parsing the refinement step. Otherwise, return true and set the Position
1833/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001834static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001835 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001836 const char RefinementStepToken = ':';
1837 Position = In.find(RefinementStepToken);
1838 if (Position != StringRef::npos) {
1839 StringRef Option = A.getOption().getName();
1840 StringRef RefStep = In.substr(Position + 1);
1841 // Allow exactly one numeric character for the additional refinement
1842 // step parameter. This is reasonable for all currently-supported
1843 // operations and architectures because we would expect that a larger value
1844 // of refinement steps would cause the estimate "optimization" to
1845 // under-perform the native operation. Also, if the estimate does not
1846 // converge quickly, it probably will not ever converge, so further
1847 // refinement steps will not produce a better answer.
1848 if (RefStep.size() != 1) {
1849 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1850 return false;
1851 }
1852 char RefStepChar = RefStep[0];
1853 if (RefStepChar < '0' || RefStepChar > '9') {
1854 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1855 return false;
1856 }
1857 }
1858 return true;
1859}
1860
1861/// The -mrecip flag requires processing of many optional parameters.
1862static void ParseMRecip(const Driver &D, const ArgList &Args,
1863 ArgStringList &OutStrings) {
1864 StringRef DisabledPrefixIn = "!";
1865 StringRef DisabledPrefixOut = "!";
1866 StringRef EnabledPrefixOut = "";
1867 StringRef Out = "-mrecip=";
1868
1869 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1870 if (!A)
1871 return;
1872
1873 unsigned NumOptions = A->getNumValues();
1874 if (NumOptions == 0) {
1875 // No option is the same as "all".
1876 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1877 return;
1878 }
1879
1880 // Pass through "all", "none", or "default" with an optional refinement step.
1881 if (NumOptions == 1) {
1882 StringRef Val = A->getValue(0);
1883 size_t RefStepLoc;
1884 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1885 return;
1886 StringRef ValBase = Val.slice(0, RefStepLoc);
1887 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1888 OutStrings.push_back(Args.MakeArgString(Out + Val));
1889 return;
1890 }
1891 }
1892
1893 // Each reciprocal type may be enabled or disabled individually.
1894 // Check each input value for validity, concatenate them all back together,
1895 // and pass through.
1896
1897 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 OptionStrings.insert(std::make_pair("divd", false));
1899 OptionStrings.insert(std::make_pair("divf", false));
1900 OptionStrings.insert(std::make_pair("vec-divd", false));
1901 OptionStrings.insert(std::make_pair("vec-divf", false));
1902 OptionStrings.insert(std::make_pair("sqrtd", false));
1903 OptionStrings.insert(std::make_pair("sqrtf", false));
1904 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1905 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001906
1907 for (unsigned i = 0; i != NumOptions; ++i) {
1908 StringRef Val = A->getValue(i);
1909
1910 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1911 // Ignore the disablement token for string matching.
1912 if (IsDisabled)
1913 Val = Val.substr(1);
1914
1915 size_t RefStep;
1916 if (!getRefinementStep(Val, D, *A, RefStep))
1917 return;
1918
1919 StringRef ValBase = Val.slice(0, RefStep);
1920 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1921 if (OptionIter == OptionStrings.end()) {
1922 // Try again specifying float suffix.
1923 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1924 if (OptionIter == OptionStrings.end()) {
1925 // The input name did not match any known option string.
1926 D.Diag(diag::err_drv_unknown_argument) << Val;
1927 return;
1928 }
1929 // The option was specified without a float or double suffix.
1930 // Make sure that the double entry was not already specified.
1931 // The float entry will be checked below.
1932 if (OptionStrings[ValBase.str() + 'd']) {
1933 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1934 return;
1935 }
1936 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001937
Sanjay Patel2987c292015-06-11 14:53:41 +00001938 if (OptionIter->second == true) {
1939 // Duplicate option specified.
1940 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1941 return;
1942 }
1943
1944 // Mark the matched option as found. Do not allow duplicate specifiers.
1945 OptionIter->second = true;
1946
1947 // If the precision was not specified, also mark the double entry as found.
1948 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1949 OptionStrings[ValBase.str() + 'd'] = true;
1950
1951 // Build the output string.
1952 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1953 Out = Args.MakeArgString(Out + Prefix + Val);
1954 if (i != NumOptions - 1)
1955 Out = Args.MakeArgString(Out + ",");
1956 }
1957
1958 OutStrings.push_back(Args.MakeArgString(Out));
1959}
1960
Eric Christopherc54920a2015-03-23 19:26:05 +00001961static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001962 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001963 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001964 // If -march=native, autodetect the feature list.
1965 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1966 if (StringRef(A->getValue()) == "native") {
1967 llvm::StringMap<bool> HostFeatures;
1968 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1969 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001970 Features.push_back(
1971 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001972 }
1973 }
1974
Jim Grosbach82eee262013-11-16 00:53:35 +00001975 if (Triple.getArchName() == "x86_64h") {
1976 // x86_64h implies quite a few of the more modern subtarget features
1977 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1978 Features.push_back("-rdrnd");
1979 Features.push_back("-aes");
1980 Features.push_back("-pclmul");
1981 Features.push_back("-rtm");
1982 Features.push_back("-hle");
1983 Features.push_back("-fsgsbase");
1984 }
1985
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001986 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001987 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001988 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001989 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001990 Features.push_back("+sse4.2");
1991 Features.push_back("+popcnt");
1992 } else
1993 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001994 }
1995
Eric Christopherc54920a2015-03-23 19:26:05 +00001996 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001997 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1998 StringRef Arch = A->getValue();
1999 bool ArchUsed = false;
2000 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002001 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002002 if (Arch == "AVX" || Arch == "AVX2") {
2003 ArchUsed = true;
2004 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2005 }
2006 }
2007 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002008 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002009 if (Arch == "IA32") {
2010 ArchUsed = true;
2011 } else if (Arch == "SSE" || Arch == "SSE2") {
2012 ArchUsed = true;
2013 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2014 }
2015 }
2016 if (!ArchUsed)
2017 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2018 }
2019
Jim Grosbach82eee262013-11-16 00:53:35 +00002020 // Now add any that the user explicitly requested on the command line,
2021 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002022 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002023}
2024
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002025void Clang::AddX86TargetArgs(const ArgList &Args,
2026 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002027 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002028 Args.hasArg(options::OPT_mkernel) ||
2029 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002030 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002031
Bob Wilson2616e2e2013-02-10 16:01:41 +00002032 // Default to avoid implicit floating-point for kernel/kext code, but allow
2033 // that to be overridden with -mno-soft-float.
2034 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2035 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002036 if (Arg *A = Args.getLastArg(
2037 options::OPT_msoft_float, options::OPT_mno_soft_float,
2038 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002039 const Option &O = A->getOption();
2040 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2041 O.matches(options::OPT_msoft_float));
2042 }
2043 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002044 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002045
2046 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2047 StringRef Value = A->getValue();
2048 if (Value == "intel" || Value == "att") {
2049 CmdArgs.push_back("-mllvm");
2050 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2051 } else {
2052 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2053 << A->getOption().getName() << Value;
2054 }
2055 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002056}
2057
Tony Linthicum76329bf2011-12-12 21:14:55 +00002058void Clang::AddHexagonTargetArgs(const ArgList &Args,
2059 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002060 CmdArgs.push_back("-mqdsp6-compat");
2061 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002062
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002063 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2064 std::string N = llvm::utostr(G.getValue());
2065 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002066 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002067 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002068 }
2069
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002070 if (!Args.hasArg(options::OPT_fno_short_enums))
2071 CmdArgs.push_back("-fshort-enums");
2072 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002073 CmdArgs.push_back("-mllvm");
2074 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002075 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002076 CmdArgs.push_back("-mllvm");
2077 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002078}
2079
Dan Gohmane3d71e12016-01-07 01:00:21 +00002080void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2081 ArgStringList &CmdArgs) const {
2082 // Default to "hidden" visibility.
2083 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2084 options::OPT_fvisibility_ms_compat)) {
2085 CmdArgs.push_back("-fvisibility");
2086 CmdArgs.push_back("hidden");
2087 }
2088}
2089
Kevin Qin110db6f2014-07-18 07:03:22 +00002090// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002091static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002092 std::vector<const char *> &Features) {
2093 SmallVector<StringRef, 8> Split;
2094 text.split(Split, StringRef("+"), -1, false);
2095
Benjamin Kramer72e64312015-09-24 14:48:49 +00002096 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002097 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002098 .Case("fp", "+fp-armv8")
2099 .Case("simd", "+neon")
2100 .Case("crc", "+crc")
2101 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002102 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002103 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002104 .Case("nofp", "-fp-armv8")
2105 .Case("nosimd", "-neon")
2106 .Case("nocrc", "-crc")
2107 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002108 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002109 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002110 .Default(nullptr);
2111 if (result)
2112 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002113 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002114 D.Diag(diag::err_drv_no_neon_modifier);
2115 else
2116 return false;
2117 }
2118 return true;
2119}
2120
2121// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2122// decode CPU and feature.
2123static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2124 std::vector<const char *> &Features) {
2125 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2126 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002127 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002128 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2129 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002130 Features.push_back("+neon");
2131 Features.push_back("+crc");
2132 Features.push_back("+crypto");
2133 } else if (CPU == "generic") {
2134 Features.push_back("+neon");
2135 } else {
2136 return false;
2137 }
2138
2139 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2140 return false;
2141
2142 return true;
2143}
2144
2145static bool
2146getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2147 const ArgList &Args,
2148 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002149 std::string MarchLowerCase = March.lower();
2150 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002151
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002152 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002153 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002154 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002155 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002156 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2157 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002158 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002159 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002160 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002161
2162 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2163 return false;
2164
2165 return true;
2166}
2167
2168static bool
2169getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2170 const ArgList &Args,
2171 std::vector<const char *> &Features) {
2172 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002173 std::string McpuLowerCase = Mcpu.lower();
2174 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002175 return false;
2176
2177 return true;
2178}
2179
2180static bool
2181getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2182 const ArgList &Args,
2183 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002184 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002185 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002186 if (MtuneLowerCase == "native")
2187 MtuneLowerCase = llvm::sys::getHostCPUName();
2188 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002189 Features.push_back("+zcm");
2190 Features.push_back("+zcz");
2191 }
2192 return true;
2193}
2194
2195static bool
2196getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2197 const ArgList &Args,
2198 std::vector<const char *> &Features) {
2199 StringRef CPU;
2200 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002201 std::string McpuLowerCase = Mcpu.lower();
2202 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002203 return false;
2204
2205 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2206}
2207
Justin Bognerf9052562015-11-13 23:07:31 +00002208static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002209 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002210 Arg *A;
2211 bool success = true;
2212 // Enable NEON by default.
2213 Features.push_back("+neon");
2214 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2215 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2216 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2217 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002218 else if (Args.hasArg(options::OPT_arch))
2219 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2220 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002221
2222 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2223 success =
2224 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2225 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2226 success =
2227 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002228 else if (Args.hasArg(options::OPT_arch))
2229 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2230 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002231
2232 if (!success)
2233 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002234
2235 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2236 Features.push_back("-fp-armv8");
2237 Features.push_back("-crypto");
2238 Features.push_back("-neon");
2239 }
Bradley Smith418c5932014-05-02 15:17:51 +00002240
2241 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002242 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002243 if (A->getOption().matches(options::OPT_mcrc))
2244 Features.push_back("+crc");
2245 else
2246 Features.push_back("-crc");
2247 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002248
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002249 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2250 options::OPT_munaligned_access))
2251 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2252 Features.push_back("+strict-align");
2253
Justin Bognerf9052562015-11-13 23:07:31 +00002254 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002255 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002256}
2257
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002258static void getHexagonTargetFeatures(const ArgList &Args,
2259 std::vector<const char *> &Features) {
2260 bool HasHVX = false, HasHVXD = false;
2261
Eric Christopher49062a52015-12-22 03:12:34 +00002262 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2263 // doing dependent option handling here rather than in initFeatureMap or a
2264 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002265 for (auto &A : Args) {
2266 auto &Opt = A->getOption();
2267 if (Opt.matches(options::OPT_mhexagon_hvx))
2268 HasHVX = true;
2269 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2270 HasHVXD = HasHVX = false;
2271 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2272 HasHVXD = HasHVX = true;
2273 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2274 HasHVXD = false;
2275 else
2276 continue;
2277 A->claim();
2278 }
2279
2280 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2281 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2282}
2283
Dan Gohmanc2853072015-09-03 22:51:53 +00002284static void getWebAssemblyTargetFeatures(const ArgList &Args,
2285 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002286 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002287}
2288
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002289static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002290 const ArgList &Args, ArgStringList &CmdArgs,
2291 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002292 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002293 std::vector<const char *> Features;
2294 switch (Triple.getArch()) {
2295 default:
2296 break;
2297 case llvm::Triple::mips:
2298 case llvm::Triple::mipsel:
2299 case llvm::Triple::mips64:
2300 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002301 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002302 break;
2303
2304 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002305 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002306 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002307 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002308 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002309 break;
2310
2311 case llvm::Triple::ppc:
2312 case llvm::Triple::ppc64:
2313 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002314 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002315 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002316 case llvm::Triple::systemz:
2317 getSystemZTargetFeatures(Args, Features);
2318 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002319 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002320 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002321 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002322 break;
2323 case llvm::Triple::x86:
2324 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002325 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002326 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002327 case llvm::Triple::hexagon:
2328 getHexagonTargetFeatures(Args, Features);
2329 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002330 case llvm::Triple::wasm32:
2331 case llvm::Triple::wasm64:
2332 getWebAssemblyTargetFeatures(Args, Features);
2333 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002334 }
Rafael Espindola43964802013-08-21 17:34:32 +00002335
2336 // Find the last of each feature.
2337 llvm::StringMap<unsigned> LastOpt;
2338 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2339 const char *Name = Features[I];
2340 assert(Name[0] == '-' || Name[0] == '+');
2341 LastOpt[Name + 1] = I;
2342 }
2343
2344 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2345 // If this feature was overridden, ignore it.
2346 const char *Name = Features[I];
2347 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2348 assert(LastI != LastOpt.end());
2349 unsigned Last = LastI->second;
2350 if (Last != I)
2351 continue;
2352
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002353 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002354 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002355 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002356}
2357
David Majnemerae394812014-12-09 00:12:30 +00002358static bool
2359shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2360 const llvm::Triple &Triple) {
2361 // We use the zero-cost exception tables for Objective-C if the non-fragile
2362 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2363 // later.
2364 if (runtime.isNonFragile())
2365 return true;
2366
2367 if (!Triple.isMacOSX())
2368 return false;
2369
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002370 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002371 (Triple.getArch() == llvm::Triple::x86_64 ||
2372 Triple.getArch() == llvm::Triple::arm));
2373}
2374
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002375/// Adds exception related arguments to the driver command arguments. There's a
2376/// master flag, -fexceptions and also language specific flags to enable/disable
2377/// C++ and Objective-C exceptions. This makes it possible to for example
2378/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002379static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002380 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002381 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002382 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002383 const Driver &D = TC.getDriver();
2384 const llvm::Triple &Triple = TC.getTriple();
2385
Chad Rosier4fab82c2012-03-26 22:04:46 +00002386 if (KernelOrKext) {
2387 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2388 // arguments now to avoid warnings about unused arguments.
2389 Args.ClaimAllArgs(options::OPT_fexceptions);
2390 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2391 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2392 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2393 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2394 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002395 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002396 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002397
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002398 // See if the user explicitly enabled exceptions.
2399 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2400 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002401
David Majnemerae394812014-12-09 00:12:30 +00002402 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2403 // is not necessarily sensible, but follows GCC.
2404 if (types::isObjC(InputType) &&
2405 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002406 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002407 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002408
David Majnemerae394812014-12-09 00:12:30 +00002409 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002410 }
2411
2412 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002413 // Disable C++ EH by default on XCore and PS4.
2414 bool CXXExceptionsEnabled =
2415 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002416 Arg *ExceptionArg = Args.getLastArg(
2417 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2418 options::OPT_fexceptions, options::OPT_fno_exceptions);
2419 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002420 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002421 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2422 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002423
2424 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002425 if (Triple.isPS4CPU()) {
2426 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2427 assert(ExceptionArg &&
2428 "On the PS4 exceptions should only be enabled if passing "
2429 "an argument");
2430 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2431 const Arg *RTTIArg = TC.getRTTIArg();
2432 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2433 D.Diag(diag::err_drv_argument_not_allowed_with)
2434 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2435 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2436 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2437 } else
2438 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2439
Anders Carlssone96ab552011-02-28 02:27:16 +00002440 CmdArgs.push_back("-fcxx-exceptions");
2441
David Majnemer8de68642014-12-05 08:11:58 +00002442 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002443 }
2444 }
2445
David Majnemer8de68642014-12-05 08:11:58 +00002446 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002447 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002448}
2449
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002450static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002451 bool Default = true;
2452 if (TC.getTriple().isOSDarwin()) {
2453 // The native darwin assembler doesn't support the linker_option directives,
2454 // so we disable them if we think the .s file will be passed to it.
2455 Default = TC.useIntegratedAs();
2456 }
2457 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2458 Default);
2459}
2460
Ted Kremenek62093662013-03-12 17:02:12 +00002461static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2462 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002463 bool UseDwarfDirectory =
2464 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2465 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002466 return !UseDwarfDirectory;
2467}
2468
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002469/// \brief Check whether the given input tree contains any compilation actions.
2470static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002471 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002472 return true;
2473
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002474 for (const auto &Act : *A)
2475 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002476 return true;
2477
2478 return false;
2479}
2480
2481/// \brief Check if -relax-all should be passed to the internal assembler.
2482/// This is done by default when compiling non-assembler source with -O0.
2483static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2484 bool RelaxDefault = true;
2485
2486 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2487 RelaxDefault = A->getOption().matches(options::OPT_O0);
2488
2489 if (RelaxDefault) {
2490 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002491 for (const auto &Act : C.getActions()) {
2492 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002493 RelaxDefault = true;
2494 break;
2495 }
2496 }
2497 }
2498
2499 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002500 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002501}
2502
Paul Robinson0334a042015-12-19 19:41:48 +00002503// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2504// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002505static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002506 assert(A.getOption().matches(options::OPT_gN_Group) &&
2507 "Not a -g option that specifies a debug-info level");
2508 if (A.getOption().matches(options::OPT_g0) ||
2509 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002510 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002511 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2512 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002513 return codegenoptions::DebugLineTablesOnly;
2514 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002515}
2516
Douglas Katzman3459ce22015-10-08 04:24:12 +00002517// Extract the integer N from a string spelled "-dwarf-N", returning 0
2518// on mismatch. The StringRef input (rather than an Arg) allows
2519// for use by the "-Xassembler" option parser.
2520static unsigned DwarfVersionNum(StringRef ArgValue) {
2521 return llvm::StringSwitch<unsigned>(ArgValue)
2522 .Case("-gdwarf-2", 2)
2523 .Case("-gdwarf-3", 3)
2524 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002525 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002526 .Default(0);
2527}
2528
2529static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002530 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002531 unsigned DwarfVersion,
2532 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002533 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002534 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002535 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2536 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002537 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002538 CmdArgs.push_back("-debug-info-kind=limited");
2539 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002540 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002541 CmdArgs.push_back("-debug-info-kind=standalone");
2542 break;
2543 default:
2544 break;
2545 }
2546 if (DwarfVersion > 0)
2547 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002548 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002549 switch (DebuggerTuning) {
2550 case llvm::DebuggerKind::GDB:
2551 CmdArgs.push_back("-debugger-tuning=gdb");
2552 break;
2553 case llvm::DebuggerKind::LLDB:
2554 CmdArgs.push_back("-debugger-tuning=lldb");
2555 break;
2556 case llvm::DebuggerKind::SCE:
2557 CmdArgs.push_back("-debugger-tuning=sce");
2558 break;
2559 default:
2560 break;
2561 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002562}
2563
David Blaikie9260ed62013-07-25 21:19:01 +00002564static void CollectArgsForIntegratedAssembler(Compilation &C,
2565 const ArgList &Args,
2566 ArgStringList &CmdArgs,
2567 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002568 if (UseRelaxAll(C, Args))
2569 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002570
David Majnemer2b9349d2015-12-21 22:09:34 +00002571 // Only default to -mincremental-linker-compatible if we think we are
2572 // targeting the MSVC linker.
2573 bool DefaultIncrementalLinkerCompatible =
2574 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2575 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2576 options::OPT_mno_incremental_linker_compatible,
2577 DefaultIncrementalLinkerCompatible))
2578 CmdArgs.push_back("-mincremental-linker-compatible");
2579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002580 // When passing -I arguments to the assembler we sometimes need to
2581 // unconditionally take the next argument. For example, when parsing
2582 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2583 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2584 // arg after parsing the '-I' arg.
2585 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002586
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002587 // When using an integrated assembler, translate -Wa, and -Xassembler
2588 // options.
2589 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002590 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002591 for (const Arg *A :
2592 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2593 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002594
Benjamin Kramer72e64312015-09-24 14:48:49 +00002595 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002596 if (TakeNextArg) {
2597 CmdArgs.push_back(Value.data());
2598 TakeNextArg = false;
2599 continue;
2600 }
David Blaikie9260ed62013-07-25 21:19:01 +00002601
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002602 switch (C.getDefaultToolChain().getArch()) {
2603 default:
2604 break;
2605 case llvm::Triple::mips:
2606 case llvm::Triple::mipsel:
2607 case llvm::Triple::mips64:
2608 case llvm::Triple::mips64el:
2609 if (Value == "--trap") {
2610 CmdArgs.push_back("-target-feature");
2611 CmdArgs.push_back("+use-tcc-in-div");
2612 continue;
2613 }
2614 if (Value == "--break") {
2615 CmdArgs.push_back("-target-feature");
2616 CmdArgs.push_back("-use-tcc-in-div");
2617 continue;
2618 }
2619 if (Value.startswith("-msoft-float")) {
2620 CmdArgs.push_back("-target-feature");
2621 CmdArgs.push_back("+soft-float");
2622 continue;
2623 }
2624 if (Value.startswith("-mhard-float")) {
2625 CmdArgs.push_back("-target-feature");
2626 CmdArgs.push_back("-soft-float");
2627 continue;
2628 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002629
2630 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2631 .Case("-mips1", "+mips1")
2632 .Case("-mips2", "+mips2")
2633 .Case("-mips3", "+mips3")
2634 .Case("-mips4", "+mips4")
2635 .Case("-mips5", "+mips5")
2636 .Case("-mips32", "+mips32")
2637 .Case("-mips32r2", "+mips32r2")
2638 .Case("-mips32r3", "+mips32r3")
2639 .Case("-mips32r5", "+mips32r5")
2640 .Case("-mips32r6", "+mips32r6")
2641 .Case("-mips64", "+mips64")
2642 .Case("-mips64r2", "+mips64r2")
2643 .Case("-mips64r3", "+mips64r3")
2644 .Case("-mips64r5", "+mips64r5")
2645 .Case("-mips64r6", "+mips64r6")
2646 .Default(nullptr);
2647 if (MipsTargetFeature)
2648 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002649 }
2650
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002651 if (Value == "-force_cpusubtype_ALL") {
2652 // Do nothing, this is the default and we don't support anything else.
2653 } else if (Value == "-L") {
2654 CmdArgs.push_back("-msave-temp-labels");
2655 } else if (Value == "--fatal-warnings") {
2656 CmdArgs.push_back("-massembler-fatal-warnings");
2657 } else if (Value == "--noexecstack") {
2658 CmdArgs.push_back("-mnoexecstack");
2659 } else if (Value == "-compress-debug-sections" ||
2660 Value == "--compress-debug-sections") {
2661 CompressDebugSections = true;
2662 } else if (Value == "-nocompress-debug-sections" ||
2663 Value == "--nocompress-debug-sections") {
2664 CompressDebugSections = false;
2665 } else if (Value.startswith("-I")) {
2666 CmdArgs.push_back(Value.data());
2667 // We need to consume the next argument if the current arg is a plain
2668 // -I. The next arg will be the include directory.
2669 if (Value == "-I")
2670 TakeNextArg = true;
2671 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002672 // "-gdwarf-N" options are not cc1as options.
2673 unsigned DwarfVersion = DwarfVersionNum(Value);
2674 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2675 CmdArgs.push_back(Value.data());
2676 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002677 RenderDebugEnablingArgs(Args, CmdArgs,
2678 codegenoptions::LimitedDebugInfo,
2679 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002680 }
Renato Golin7c542b42015-07-27 23:44:45 +00002681 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2682 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2683 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002684 } else {
2685 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002686 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002687 }
2688 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002689 }
2690 if (CompressDebugSections) {
2691 if (llvm::zlib::isAvailable())
2692 CmdArgs.push_back("-compress-debug-sections");
2693 else
2694 D.Diag(diag::warn_debug_compression_unavailable);
2695 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002696 if (MipsTargetFeature != nullptr) {
2697 CmdArgs.push_back("-target-feature");
2698 CmdArgs.push_back(MipsTargetFeature);
2699 }
David Blaikie9260ed62013-07-25 21:19:01 +00002700}
2701
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002702// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002703// FIXME: Make sure we can also emit shared objects if they're requested
2704// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002705static void addClangRT(const ToolChain &TC, const ArgList &Args,
2706 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002707 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002708}
2709
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002710namespace {
2711enum OpenMPRuntimeKind {
2712 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2713 /// without knowing what runtime to target.
2714 OMPRT_Unknown,
2715
2716 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2717 /// the default for Clang.
2718 OMPRT_OMP,
2719
2720 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2721 /// this runtime but can swallow the pragmas, and find and link against the
2722 /// runtime library itself.
2723 OMPRT_GOMP,
2724
Chandler Carruthc6625c62015-05-28 21:10:31 +00002725 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002726 /// OpenMP runtime. We support this mode for users with existing dependencies
2727 /// on this runtime library name.
2728 OMPRT_IOMP5
2729};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002730}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002731
2732/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002733static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2734 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002735 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2736
2737 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2738 if (A)
2739 RuntimeName = A->getValue();
2740
2741 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002742 .Case("libomp", OMPRT_OMP)
2743 .Case("libgomp", OMPRT_GOMP)
2744 .Case("libiomp5", OMPRT_IOMP5)
2745 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002746
2747 if (RT == OMPRT_Unknown) {
2748 if (A)
2749 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002750 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002751 else
2752 // FIXME: We could use a nicer diagnostic here.
2753 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2754 }
2755
2756 return RT;
2757}
2758
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002759static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2760 const ArgList &Args) {
2761 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2762 options::OPT_fno_openmp, false))
2763 return;
2764
2765 switch (getOpenMPRuntime(TC, Args)) {
2766 case OMPRT_OMP:
2767 CmdArgs.push_back("-lomp");
2768 break;
2769 case OMPRT_GOMP:
2770 CmdArgs.push_back("-lgomp");
2771 break;
2772 case OMPRT_IOMP5:
2773 CmdArgs.push_back("-liomp5");
2774 break;
2775 case OMPRT_Unknown:
2776 // Already diagnosed.
2777 break;
2778 }
2779}
2780
Alexey Samsonov52550342014-09-15 19:58:40 +00002781static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2782 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002783 bool IsShared, bool IsWhole) {
2784 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002785 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002786 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002787 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002788 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002789}
2790
Alexey Samsonov52550342014-09-15 19:58:40 +00002791// Tries to use a file with the list of dynamic symbols that need to be exported
2792// from the runtime library. Returns true if the file was found.
2793static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2794 ArgStringList &CmdArgs,
2795 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002796 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002797 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2798 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002799 return true;
2800 }
2801 return false;
2802}
2803
2804static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2805 ArgStringList &CmdArgs) {
2806 // Force linking against the system libraries sanitizers depends on
2807 // (see PR15823 why this is necessary).
2808 CmdArgs.push_back("--no-as-needed");
2809 CmdArgs.push_back("-lpthread");
2810 CmdArgs.push_back("-lrt");
2811 CmdArgs.push_back("-lm");
2812 // There's no libdl on FreeBSD.
2813 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2814 CmdArgs.push_back("-ldl");
2815}
2816
2817static void
2818collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2819 SmallVectorImpl<StringRef> &SharedRuntimes,
2820 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002821 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2822 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2823 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002824 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2825 // Collect shared runtimes.
2826 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2827 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002828 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002829 // The stats_client library is also statically linked into DSOs.
2830 if (SanArgs.needsStatsRt())
2831 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002832
Alexey Samsonov52550342014-09-15 19:58:40 +00002833 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002834 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002835 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002836 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002837 }
2838 if (SanArgs.needsAsanRt()) {
2839 if (SanArgs.needsSharedAsanRt()) {
2840 HelperStaticRuntimes.push_back("asan-preinit");
2841 } else {
2842 StaticRuntimes.push_back("asan");
2843 if (SanArgs.linkCXXRuntimes())
2844 StaticRuntimes.push_back("asan_cxx");
2845 }
2846 }
2847 if (SanArgs.needsDfsanRt())
2848 StaticRuntimes.push_back("dfsan");
2849 if (SanArgs.needsLsanRt())
2850 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002851 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002852 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002853 if (SanArgs.linkCXXRuntimes())
2854 StaticRuntimes.push_back("msan_cxx");
2855 }
2856 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002857 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002858 if (SanArgs.linkCXXRuntimes())
2859 StaticRuntimes.push_back("tsan_cxx");
2860 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002861 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002862 StaticRuntimes.push_back("ubsan_standalone");
2863 if (SanArgs.linkCXXRuntimes())
2864 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002865 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002866 if (SanArgs.needsSafeStackRt())
2867 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002868 if (SanArgs.needsCfiRt())
2869 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002870 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002871 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002872 if (SanArgs.linkCXXRuntimes())
2873 StaticRuntimes.push_back("ubsan_standalone_cxx");
2874 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002875 if (SanArgs.needsStatsRt()) {
2876 NonWholeStaticRuntimes.push_back("stats");
2877 RequiredSymbols.push_back("__sanitizer_stats_register");
2878 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002879}
2880
Alexey Samsonov52550342014-09-15 19:58:40 +00002881// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2882// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2883static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002884 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002885 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002886 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002887 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002888 NonWholeStaticRuntimes, HelperStaticRuntimes,
2889 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002890 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002891 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002892 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002893 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002894 bool AddExportDynamic = false;
2895 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002896 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002897 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2898 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002899 for (auto RT : NonWholeStaticRuntimes) {
2900 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2901 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2902 }
2903 for (auto S : RequiredSymbols) {
2904 CmdArgs.push_back("-u");
2905 CmdArgs.push_back(Args.MakeArgString(S));
2906 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002907 // If there is a static runtime with no dynamic list, force all the symbols
2908 // to be dynamic to be sure we export sanitizer interface functions.
2909 if (AddExportDynamic)
2910 CmdArgs.push_back("-export-dynamic");
2911 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002912}
2913
Reid Kleckner86ea7702015-02-04 23:45:07 +00002914static bool areOptimizationsEnabled(const ArgList &Args) {
2915 // Find the last -O arg and see if it is non-zero.
2916 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2917 return !A->getOption().matches(options::OPT_O0);
2918 // Defaults to -O0.
2919 return false;
2920}
2921
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002922static bool shouldUseFramePointerForTarget(const ArgList &Args,
2923 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002924 switch (Triple.getArch()) {
2925 case llvm::Triple::xcore:
2926 case llvm::Triple::wasm32:
2927 case llvm::Triple::wasm64:
2928 // XCore never wants frame pointers, regardless of OS.
2929 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002930 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002931 default:
2932 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002933 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002934
2935 if (Triple.isOSLinux()) {
2936 switch (Triple.getArch()) {
2937 // Don't use a frame pointer on linux if optimizing for certain targets.
2938 case llvm::Triple::mips64:
2939 case llvm::Triple::mips64el:
2940 case llvm::Triple::mips:
2941 case llvm::Triple::mipsel:
2942 case llvm::Triple::systemz:
2943 case llvm::Triple::x86:
2944 case llvm::Triple::x86_64:
2945 return !areOptimizationsEnabled(Args);
2946 default:
2947 return true;
2948 }
2949 }
2950
2951 if (Triple.isOSWindows()) {
2952 switch (Triple.getArch()) {
2953 case llvm::Triple::x86:
2954 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002955 case llvm::Triple::arm:
2956 case llvm::Triple::thumb:
2957 // Windows on ARM builds with FPO disabled to aid fast stack walking
2958 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002959 default:
2960 // All other supported Windows ISAs use xdata unwind information, so frame
2961 // pointers are not generally useful.
2962 return false;
2963 }
2964 }
2965
2966 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002967}
2968
Rafael Espindola224dd632011-12-14 21:02:23 +00002969static bool shouldUseFramePointer(const ArgList &Args,
2970 const llvm::Triple &Triple) {
2971 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2972 options::OPT_fomit_frame_pointer))
2973 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002974 if (Args.hasArg(options::OPT_pg))
2975 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002976
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002977 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002978}
2979
Eric Christopherb7d97e92013-04-03 01:58:53 +00002980static bool shouldUseLeafFramePointer(const ArgList &Args,
2981 const llvm::Triple &Triple) {
2982 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2983 options::OPT_momit_leaf_frame_pointer))
2984 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002985 if (Args.hasArg(options::OPT_pg))
2986 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002987
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002988 if (Triple.isPS4CPU())
2989 return false;
2990
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002991 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002992}
2993
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002994/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002995static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002996 SmallString<128> cwd;
2997 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002998 CmdArgs.push_back("-fdebug-compilation-dir");
2999 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003000 }
3001}
3002
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003003static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003004 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3005 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3006 SmallString<128> T(FinalOutput->getValue());
3007 llvm::sys::path::replace_extension(T, "dwo");
3008 return Args.MakeArgString(T);
3009 } else {
3010 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003011 SmallString<128> T(
3012 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003013 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003014 llvm::sys::path::replace_extension(F, "dwo");
3015 T += F;
3016 return Args.MakeArgString(F);
3017 }
3018}
3019
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003020static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3021 const JobAction &JA, const ArgList &Args,
3022 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003023 ArgStringList ExtractArgs;
3024 ExtractArgs.push_back("--extract-dwo");
3025
3026 ArgStringList StripArgs;
3027 StripArgs.push_back("--strip-dwo");
3028
3029 // Grabbing the output of the earlier compile step.
3030 StripArgs.push_back(Output.getFilename());
3031 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003032 ExtractArgs.push_back(OutFile);
3033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003034 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003035 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003036
3037 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003038 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003039
3040 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003041 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003042}
3043
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003044/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003045/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3046static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003047 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003048 if (A->getOption().matches(options::OPT_O4) ||
3049 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003050 return true;
3051
3052 if (A->getOption().matches(options::OPT_O0))
3053 return false;
3054
3055 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3056
Rafael Espindola91780de2013-08-26 14:05:41 +00003057 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003058 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003059 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003060 return true;
3061
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003062 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003063 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003064 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003065
3066 unsigned OptLevel = 0;
3067 if (S.getAsInteger(10, OptLevel))
3068 return false;
3069
3070 return OptLevel > 1;
3071 }
3072
3073 return false;
3074}
3075
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003076/// Add -x lang to \p CmdArgs for \p Input.
3077static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3078 ArgStringList &CmdArgs) {
3079 // When using -verify-pch, we don't want to provide the type
3080 // 'precompiled-header' if it was inferred from the file extension
3081 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3082 return;
3083
3084 CmdArgs.push_back("-x");
3085 if (Args.hasArg(options::OPT_rewrite_objc))
3086 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3087 else
3088 CmdArgs.push_back(types::getTypeName(Input.getType()));
3089}
3090
David Majnemerc371ff02015-03-22 08:39:22 +00003091static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003092 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003093 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003094
3095 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003096 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003097
3098 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003099 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003100 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003101 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003102}
3103
Rafael Espindola577637a2015-01-03 00:06:04 +00003104// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003105// options that build systems might add but are unused when assembling or only
3106// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003107static void claimNoWarnArgs(const ArgList &Args) {
3108 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003109 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003110 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003111 Args.ClaimAllArgs(options::OPT_flto);
3112 Args.ClaimAllArgs(options::OPT_fno_lto);
3113}
3114
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003115static void appendUserToPath(SmallVectorImpl<char> &Result) {
3116#ifdef LLVM_ON_UNIX
3117 const char *Username = getenv("LOGNAME");
3118#else
3119 const char *Username = getenv("USERNAME");
3120#endif
3121 if (Username) {
3122 // Validate that LoginName can be used in a path, and get its length.
3123 size_t Len = 0;
3124 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003125 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003126 Username = nullptr;
3127 break;
3128 }
3129 }
3130
3131 if (Username && Len > 0) {
3132 Result.append(Username, Username + Len);
3133 return;
3134 }
3135 }
3136
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003137// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003138#ifdef LLVM_ON_UNIX
3139 std::string UID = llvm::utostr(getuid());
3140#else
3141 // FIXME: Windows seems to have an 'SID' that might work.
3142 std::string UID = "9999";
3143#endif
3144 Result.append(UID.begin(), UID.end());
3145}
3146
David Majnemere11d3732015-06-08 00:22:46 +00003147VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3148 const llvm::Triple &Triple,
3149 const llvm::opt::ArgList &Args,
3150 bool IsWindowsMSVC) {
3151 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3152 IsWindowsMSVC) ||
3153 Args.hasArg(options::OPT_fmsc_version) ||
3154 Args.hasArg(options::OPT_fms_compatibility_version)) {
3155 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3156 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003157 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003158
3159 if (MSCVersion && MSCompatibilityVersion) {
3160 if (D)
3161 D->Diag(diag::err_drv_argument_not_allowed_with)
3162 << MSCVersion->getAsString(Args)
3163 << MSCompatibilityVersion->getAsString(Args);
3164 return VersionTuple();
3165 }
3166
3167 if (MSCompatibilityVersion) {
3168 VersionTuple MSVT;
3169 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3170 D->Diag(diag::err_drv_invalid_value)
3171 << MSCompatibilityVersion->getAsString(Args)
3172 << MSCompatibilityVersion->getValue();
3173 return MSVT;
3174 }
3175
3176 if (MSCVersion) {
3177 unsigned Version = 0;
3178 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3179 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3180 << MSCVersion->getValue();
3181 return getMSCompatibilityVersion(Version);
3182 }
3183
3184 unsigned Major, Minor, Micro;
3185 Triple.getEnvironmentVersion(Major, Minor, Micro);
3186 if (Major || Minor || Micro)
3187 return VersionTuple(Major, Minor, Micro);
3188
3189 return VersionTuple(18);
3190 }
3191 return VersionTuple();
3192}
3193
Diego Novilloa0545962015-07-10 18:00:07 +00003194static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3195 const InputInfo &Output, const ArgList &Args,
3196 ArgStringList &CmdArgs) {
3197 auto *ProfileGenerateArg = Args.getLastArg(
3198 options::OPT_fprofile_instr_generate,
3199 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003200 options::OPT_fprofile_generate_EQ,
3201 options::OPT_fno_profile_instr_generate);
3202 if (ProfileGenerateArg &&
3203 ProfileGenerateArg->getOption().matches(
3204 options::OPT_fno_profile_instr_generate))
3205 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003206
3207 auto *ProfileUseArg = Args.getLastArg(
3208 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003209 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3210 options::OPT_fno_profile_instr_use);
3211 if (ProfileUseArg &&
3212 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3213 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003214
3215 if (ProfileGenerateArg && ProfileUseArg)
3216 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003217 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003218
Diego Novillo758f3f52015-08-05 21:49:51 +00003219 if (ProfileGenerateArg) {
3220 if (ProfileGenerateArg->getOption().matches(
3221 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003222 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3223 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003224 else if (ProfileGenerateArg->getOption().matches(
3225 options::OPT_fprofile_generate_EQ)) {
3226 SmallString<128> Path(ProfileGenerateArg->getValue());
3227 llvm::sys::path::append(Path, "default.profraw");
3228 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003229 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3230 }
3231 // The default is to use Clang Instrumentation.
3232 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003233 }
Diego Novilloa0545962015-07-10 18:00:07 +00003234
Diego Novillo758f3f52015-08-05 21:49:51 +00003235 if (ProfileUseArg) {
3236 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3237 ProfileUseArg->render(Args, CmdArgs);
3238 else if ((ProfileUseArg->getOption().matches(
3239 options::OPT_fprofile_use_EQ) ||
3240 ProfileUseArg->getOption().matches(
3241 options::OPT_fprofile_instr_use))) {
3242 SmallString<128> Path(
3243 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3244 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3245 llvm::sys::path::append(Path, "default.profdata");
3246 CmdArgs.push_back(
3247 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3248 }
Diego Novilloa0545962015-07-10 18:00:07 +00003249 }
3250
3251 if (Args.hasArg(options::OPT_ftest_coverage) ||
3252 Args.hasArg(options::OPT_coverage))
3253 CmdArgs.push_back("-femit-coverage-notes");
3254 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3255 false) ||
3256 Args.hasArg(options::OPT_coverage))
3257 CmdArgs.push_back("-femit-coverage-data");
3258
Diego Novilloc4b94da2015-08-05 23:27:40 +00003259 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3260 options::OPT_fno_coverage_mapping, false) &&
3261 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003262 D.Diag(diag::err_drv_argument_only_allowed_with)
3263 << "-fcoverage-mapping"
3264 << "-fprofile-instr-generate";
3265
Diego Novilloc4b94da2015-08-05 23:27:40 +00003266 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3267 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003268 CmdArgs.push_back("-fcoverage-mapping");
3269
3270 if (C.getArgs().hasArg(options::OPT_c) ||
3271 C.getArgs().hasArg(options::OPT_S)) {
3272 if (Output.isFilename()) {
3273 CmdArgs.push_back("-coverage-file");
3274 SmallString<128> CoverageFilename;
3275 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3276 CoverageFilename = FinalOutput->getValue();
3277 } else {
3278 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3279 }
3280 if (llvm::sys::path::is_relative(CoverageFilename)) {
3281 SmallString<128> Pwd;
3282 if (!llvm::sys::fs::current_path(Pwd)) {
3283 llvm::sys::path::append(Pwd, CoverageFilename);
3284 CoverageFilename.swap(Pwd);
3285 }
3286 }
3287 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3288 }
3289 }
3290}
3291
Paul Robinsond083b9a2015-12-16 17:25:27 +00003292static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3293 ArgStringList &CmdArgs) {
3294 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3295 false) ||
3296 Args.hasFlag(options::OPT_fprofile_generate,
3297 options::OPT_fno_profile_instr_generate, false) ||
3298 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3299 options::OPT_fno_profile_instr_generate, false) ||
3300 Args.hasFlag(options::OPT_fprofile_instr_generate,
3301 options::OPT_fno_profile_instr_generate, false) ||
3302 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3303 options::OPT_fno_profile_instr_generate, false) ||
3304 Args.hasArg(options::OPT_fcreate_profile) ||
3305 Args.hasArg(options::OPT_coverage)))
3306 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3307}
3308
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003309/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3310/// smooshes them together with platform defaults, to decide whether
3311/// this compile should be using PIC mode or not. Returns a tuple of
3312/// (RelocationModel, PICLevel, IsPIE).
3313static std::tuple<llvm::Reloc::Model, unsigned, bool>
3314ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3315 const ArgList &Args) {
3316 // FIXME: why does this code...and so much everywhere else, use both
3317 // ToolChain.getTriple() and Triple?
3318 bool PIE = ToolChain.isPIEDefault();
3319 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003320 // The Darwin/MachO default to use PIC does not apply when using -static.
3321 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3322 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003323 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003324 bool IsPICLevelTwo = PIC;
3325
3326 bool KernelOrKext =
3327 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3328
3329 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003330 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003331 switch (ToolChain.getArch()) {
3332 case llvm::Triple::arm:
3333 case llvm::Triple::armeb:
3334 case llvm::Triple::thumb:
3335 case llvm::Triple::thumbeb:
3336 case llvm::Triple::aarch64:
3337 case llvm::Triple::mips:
3338 case llvm::Triple::mipsel:
3339 case llvm::Triple::mips64:
3340 case llvm::Triple::mips64el:
3341 PIC = true; // "-fpic"
3342 break;
3343
3344 case llvm::Triple::x86:
3345 case llvm::Triple::x86_64:
3346 PIC = true; // "-fPIC"
3347 IsPICLevelTwo = true;
3348 break;
3349
3350 default:
3351 break;
3352 }
3353 }
3354
3355 // OpenBSD-specific defaults for PIE
3356 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3357 switch (ToolChain.getArch()) {
3358 case llvm::Triple::mips64:
3359 case llvm::Triple::mips64el:
3360 case llvm::Triple::sparcel:
3361 case llvm::Triple::x86:
3362 case llvm::Triple::x86_64:
3363 IsPICLevelTwo = false; // "-fpie"
3364 break;
3365
3366 case llvm::Triple::ppc:
3367 case llvm::Triple::sparc:
3368 case llvm::Triple::sparcv9:
3369 IsPICLevelTwo = true; // "-fPIE"
3370 break;
3371
3372 default:
3373 break;
3374 }
3375 }
3376
3377 // The last argument relating to either PIC or PIE wins, and no
3378 // other argument is used. If the last argument is any flavor of the
3379 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3380 // option implicitly enables PIC at the same level.
3381 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3382 options::OPT_fpic, options::OPT_fno_pic,
3383 options::OPT_fPIE, options::OPT_fno_PIE,
3384 options::OPT_fpie, options::OPT_fno_pie);
3385 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3386 // is forced, then neither PIC nor PIE flags will have no effect.
3387 if (!ToolChain.isPICDefaultForced()) {
3388 if (LastPICArg) {
3389 Option O = LastPICArg->getOption();
3390 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3391 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3392 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3393 PIC =
3394 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3395 IsPICLevelTwo =
3396 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3397 } else {
3398 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003399 if (Triple.isPS4CPU()) {
3400 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3401 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3402 if (Model != "kernel") {
3403 PIC = true;
3404 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3405 << LastPICArg->getSpelling();
3406 }
3407 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003408 }
3409 }
3410 }
3411
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003412 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3413 // PIC level would've been set to level 1, force it back to level 2 PIC
3414 // instead.
3415 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003416 IsPICLevelTwo |= ToolChain.isPICDefault();
3417
James Y Knightc4015d32015-08-21 04:14:55 +00003418 // This kernel flags are a trump-card: they will disable PIC/PIE
3419 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003420 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3421 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003422 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003423
3424 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3425 // This is a very special mode. It trumps the other modes, almost no one
3426 // uses it, and it isn't even valid on any OS but Darwin.
3427 if (!ToolChain.getTriple().isOSDarwin())
3428 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3429 << A->getSpelling() << ToolChain.getTriple().str();
3430
3431 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3432
3433 // Only a forced PIC mode can cause the actual compile to have PIC defines
3434 // etc., no flags are sufficient. This behavior was selected to closely
3435 // match that of llvm-gcc and Apple GCC before that.
3436 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3437
3438 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3439 }
3440
3441 if (PIC)
3442 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3443
3444 return std::make_tuple(llvm::Reloc::Static, 0, false);
3445}
3446
3447static const char *RelocationModelName(llvm::Reloc::Model Model) {
3448 switch (Model) {
3449 case llvm::Reloc::Default:
3450 return nullptr;
3451 case llvm::Reloc::Static:
3452 return "static";
3453 case llvm::Reloc::PIC_:
3454 return "pic";
3455 case llvm::Reloc::DynamicNoPIC:
3456 return "dynamic-no-pic";
3457 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003458 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003459}
3460
3461static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3462 ArgStringList &CmdArgs) {
3463 llvm::Reloc::Model RelocationModel;
3464 unsigned PICLevel;
3465 bool IsPIE;
3466 std::tie(RelocationModel, PICLevel, IsPIE) =
3467 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3468
3469 if (RelocationModel != llvm::Reloc::Static)
3470 CmdArgs.push_back("-KPIC");
3471}
3472
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003473void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003474 const InputInfo &Output, const InputInfoList &Inputs,
3475 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003476 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3477 const llvm::Triple Triple(TripleStr);
3478
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003479 bool KernelOrKext =
3480 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003481 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003482 ArgStringList CmdArgs;
3483
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003484 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003485 bool IsWindowsCygnus =
3486 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003487 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003488 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003489
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003490 // Check number of inputs for sanity. We need at least one input.
3491 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003492 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003493 // CUDA compilation may have multiple inputs (source file + results of
3494 // device-side compilations). All other jobs are expected to have exactly one
3495 // input.
3496 bool IsCuda = types::isCuda(Input.getType());
3497 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003498
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003499 // Invoke ourselves in -cc1 mode.
3500 //
3501 // FIXME: Implement custom jobs for internal actions.
3502 CmdArgs.push_back("-cc1");
3503
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003504 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003505 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003506 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003507
Artem Belevichfa11ab52015-11-17 22:28:46 +00003508 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003509 if (IsCuda) {
3510 // FIXME: We need a (better) way to pass information about
3511 // particular compilation pass we're constructing here. For now we
3512 // can check which toolchain we're using and pick the other one to
3513 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003514 if (&getToolChain() == C.getCudaDeviceToolChain())
3515 AuxToolChain = C.getCudaHostToolChain();
3516 else if (&getToolChain() == C.getCudaHostToolChain())
3517 AuxToolChain = C.getCudaDeviceToolChain();
3518 else
3519 llvm_unreachable("Can't figure out CUDA compilation mode.");
3520 assert(AuxToolChain != nullptr && "No aux toolchain.");
3521 CmdArgs.push_back("-aux-triple");
3522 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003523 CmdArgs.push_back("-fcuda-target-overloads");
3524 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003525 }
3526
James Y Knight2db38f32015-08-15 03:45:25 +00003527 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3528 Triple.getArch() == llvm::Triple::thumb)) {
3529 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003530 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003531 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003532 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003533 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003534 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003535 }
3536
Tim Northover336f1892014-03-29 13:16:12 +00003537 // Push all default warning arguments that are specific to
3538 // the given target. These come before user provided warning options
3539 // are provided.
3540 getToolChain().addClangWarningOptions(CmdArgs);
3541
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003542 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003543 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003544
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003545 if (isa<AnalyzeJobAction>(JA)) {
3546 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3547 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003548 } else if (isa<MigrateJobAction>(JA)) {
3549 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003550 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003551 if (Output.getType() == types::TY_Dependencies)
3552 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003553 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003554 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003555 if (Args.hasArg(options::OPT_rewrite_objc) &&
3556 !Args.hasArg(options::OPT_g_Group))
3557 CmdArgs.push_back("-P");
3558 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003559 } else if (isa<AssembleJobAction>(JA)) {
3560 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003561
David Blaikie9260ed62013-07-25 21:19:01 +00003562 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003563
3564 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003565 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003566 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003567 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003568 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003569
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003570 if (JA.getType() == types::TY_Nothing)
3571 CmdArgs.push_back("-fsyntax-only");
3572 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003573 CmdArgs.push_back("-emit-pch");
3574 else
3575 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003576 } else if (isa<VerifyPCHJobAction>(JA)) {
3577 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003578 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003579 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3580 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003581 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003582 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003583 } else if (JA.getType() == types::TY_LLVM_IR ||
3584 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003585 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003586 } else if (JA.getType() == types::TY_LLVM_BC ||
3587 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003588 CmdArgs.push_back("-emit-llvm-bc");
3589 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003590 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003591 } else if (JA.getType() == types::TY_AST) {
3592 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003593 } else if (JA.getType() == types::TY_ModuleFile) {
3594 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003595 } else if (JA.getType() == types::TY_RewrittenObjC) {
3596 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003597 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003598 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3599 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003600 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003601 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003602 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003603 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003604
3605 // Preserve use-list order by default when emitting bitcode, so that
3606 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3607 // same result as running passes here. For LTO, we don't need to preserve
3608 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003609 if (JA.getType() == types::TY_LLVM_BC)
3610 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003611
3612 if (D.isUsingLTO())
3613 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003614 }
3615
Teresa Johnsonaff22322015-12-07 19:21:34 +00003616 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3617 if (!types::isLLVMIR(Input.getType()))
3618 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3619 << "-x ir";
3620 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3621 }
3622
Justin Bognera88f0122014-06-20 22:59:50 +00003623 // We normally speed up the clang process a bit by skipping destructors at
3624 // exit, but when we're generating diagnostics we can rely on some of the
3625 // cleanup.
3626 if (!C.isForDiagnostics())
3627 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003628
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003629// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003630#ifdef NDEBUG
3631 CmdArgs.push_back("-disable-llvm-verifier");
3632#endif
3633
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003634 // Set the main file name, so that debug info works even with
3635 // -save-temps.
3636 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003637 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003638
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003639 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003640 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003641 if (Args.hasArg(options::OPT_static))
3642 CmdArgs.push_back("-static-define");
3643
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003644 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003645 // Enable region store model by default.
3646 CmdArgs.push_back("-analyzer-store=region");
3647
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003648 // Treat blocks as analysis entry points.
3649 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3650
Ted Kremenek49c79792011-03-24 00:28:47 +00003651 CmdArgs.push_back("-analyzer-eagerly-assume");
3652
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003653 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003654 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003655 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003656
Devin Coughlin65c77082016-01-21 20:09:49 +00003657 if (!IsWindowsMSVC) {
3658 CmdArgs.push_back("-analyzer-checker=unix");
3659 } else {
3660 // Enable "unix" checkers that also work on Windows.
3661 CmdArgs.push_back("-analyzer-checker=unix.API");
3662 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3663 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3664 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3665 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3666 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3667 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003668
Sean Evesonb38c32b2016-01-06 10:03:58 +00003669 // Disable some unix checkers for PS4.
3670 if (IsPS4CPU) {
3671 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3672 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3673 }
3674
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003675 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003676 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003677
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003678 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003679
Artem Belevichba558952015-05-06 18:20:23 +00003680 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003681 CmdArgs.push_back("-analyzer-checker=cplusplus");
3682
Sean Evesonb38c32b2016-01-06 10:03:58 +00003683 if (!IsPS4CPU) {
3684 CmdArgs.push_back(
3685 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3686 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3687 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3688 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3689 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3690 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3691 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003692
3693 // Default nullability checks.
3694 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3695 CmdArgs.push_back(
3696 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003697 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003698
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003699 // Set the output format. The default is plist, for (lame) historical
3700 // reasons.
3701 CmdArgs.push_back("-analyzer-output");
3702 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003703 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003704 else
3705 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003706
Ted Kremenekfe449a22010-03-22 22:32:05 +00003707 // Disable the presentation of standard compiler warnings when
3708 // using --analyze. We only want to show static analyzer diagnostics
3709 // or frontend errors.
3710 CmdArgs.push_back("-w");
3711
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003712 // Add -Xanalyzer arguments when running as analyzer.
3713 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003714 }
3715
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003716 CheckCodeGenerationOptions(D, Args);
3717
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003718 llvm::Reloc::Model RelocationModel;
3719 unsigned PICLevel;
3720 bool IsPIE;
3721 std::tie(RelocationModel, PICLevel, IsPIE) =
3722 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003723
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003724 const char *RMName = RelocationModelName(RelocationModel);
3725 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003726 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003727 CmdArgs.push_back(RMName);
3728 }
3729 if (PICLevel > 0) {
3730 CmdArgs.push_back("-pic-level");
3731 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3732 if (IsPIE) {
3733 CmdArgs.push_back("-pie-level");
3734 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003735 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003736 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003737
Renato Golin4854d802015-11-09 12:40:41 +00003738 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3739 CmdArgs.push_back("-meabi");
3740 CmdArgs.push_back(A->getValue());
3741 }
3742
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003743 CmdArgs.push_back("-mthread-model");
3744 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3745 CmdArgs.push_back(A->getValue());
3746 else
3747 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3748
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003749 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3750
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003751 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3752 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003753 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003754
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003755 // LLVM Code Generator Options.
3756
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003757 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3758 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003759 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3760 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003761 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003762 CmdArgs.push_back(A->getValue());
3763 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003764 }
3765 }
3766
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003767 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3768 StringRef v = A->getValue();
3769 CmdArgs.push_back("-mllvm");
3770 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3771 A->claim();
3772 }
3773
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003774 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3775 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003776 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003777 }
3778
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003779 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3780 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003781 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003782 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003783 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003784 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3785 CmdArgs.push_back("-fpcc-struct-return");
3786 } else {
3787 assert(A->getOption().matches(options::OPT_freg_struct_return));
3788 CmdArgs.push_back("-freg-struct-return");
3789 }
3790 }
3791
Roman Divacky65b88cd2011-03-01 17:40:53 +00003792 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3793 CmdArgs.push_back("-mrtd");
3794
Rafael Espindola224dd632011-12-14 21:02:23 +00003795 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003796 CmdArgs.push_back("-mdisable-fp-elim");
3797 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3798 options::OPT_fno_zero_initialized_in_bss))
3799 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003800
3801 bool OFastEnabled = isOptimizationLevelFast(Args);
3802 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3803 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003804 OptSpecifier StrictAliasingAliasOption =
3805 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003806 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3807 // doesn't do any TBAA.
3808 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003809 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003810 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003811 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003812 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3813 options::OPT_fno_struct_path_tbaa))
3814 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003815 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3816 false))
3817 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003818 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3819 options::OPT_fno_strict_vtable_pointers,
3820 false))
3821 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003822 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3823 options::OPT_fno_optimize_sibling_calls))
3824 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003825
Eric Christopher006208c2013-04-04 06:29:47 +00003826 // Handle segmented stacks.
3827 if (Args.hasArg(options::OPT_fsplit_stack))
3828 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003829
3830 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3831 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003832 OptSpecifier FastMathAliasOption =
3833 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3834
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003835 // Handle various floating point optimization flags, mapping them to the
3836 // appropriate LLVM code generation flags. The pattern for all of these is to
3837 // default off the codegen optimizations, and if any flag enables them and no
3838 // flag disables them after the flag enabling them, enable the codegen
3839 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003840 if (Arg *A = Args.getLastArg(
3841 options::OPT_ffast_math, FastMathAliasOption,
3842 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3843 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3844 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003845 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3846 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003847 A->getOption().getID() != options::OPT_fhonor_infinities)
3848 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003849 if (Arg *A = Args.getLastArg(
3850 options::OPT_ffast_math, FastMathAliasOption,
3851 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3852 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3853 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003854 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3855 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003856 A->getOption().getID() != options::OPT_fhonor_nans)
3857 CmdArgs.push_back("-menable-no-nans");
3858
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003859 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3860 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003861 if (Arg *A =
3862 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3863 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3864 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003865 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3866 // However, turning *off* -ffast_math merely restores the toolchain default
3867 // (which may be false).
3868 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3869 A->getOption().getID() == options::OPT_ffast_math ||
3870 A->getOption().getID() == options::OPT_Ofast)
3871 MathErrno = false;
3872 else if (A->getOption().getID() == options::OPT_fmath_errno)
3873 MathErrno = true;
3874 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003875 if (MathErrno)
3876 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003877
3878 // There are several flags which require disabling very specific
3879 // optimizations. Any of these being disabled forces us to turn off the
3880 // entire set of LLVM optimizations, so collect them through all the flag
3881 // madness.
3882 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003883 if (Arg *A = Args.getLastArg(
3884 options::OPT_ffast_math, FastMathAliasOption,
3885 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3886 options::OPT_fno_unsafe_math_optimizations,
3887 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003888 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3889 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003890 A->getOption().getID() != options::OPT_fno_associative_math)
3891 AssociativeMath = true;
3892 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003893 if (Arg *A = Args.getLastArg(
3894 options::OPT_ffast_math, FastMathAliasOption,
3895 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3896 options::OPT_fno_unsafe_math_optimizations,
3897 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003898 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3899 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003900 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3901 ReciprocalMath = true;
3902 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003903 if (Arg *A = Args.getLastArg(
3904 options::OPT_ffast_math, FastMathAliasOption,
3905 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3906 options::OPT_fno_unsafe_math_optimizations,
3907 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003908 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3909 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003910 A->getOption().getID() != options::OPT_fsigned_zeros)
3911 SignedZeros = false;
3912 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003913 if (Arg *A = Args.getLastArg(
3914 options::OPT_ffast_math, FastMathAliasOption,
3915 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3916 options::OPT_fno_unsafe_math_optimizations,
3917 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003918 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3919 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003920 A->getOption().getID() != options::OPT_ftrapping_math)
3921 TrappingMath = false;
3922 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3923 !TrappingMath)
3924 CmdArgs.push_back("-menable-unsafe-fp-math");
3925
Sanjay Patel76c9e092015-01-23 16:40:50 +00003926 if (!SignedZeros)
3927 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003928
Sanjay Patel359b1052015-04-09 15:03:23 +00003929 if (ReciprocalMath)
3930 CmdArgs.push_back("-freciprocal-math");
3931
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003932 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003933 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003934 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003935 options::OPT_ffp_contract)) {
3936 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003937 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003938 if (Val == "fast" || Val == "on" || Val == "off") {
3939 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3940 } else {
3941 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003942 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003943 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003944 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3945 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003946 // If fast-math is set then set the fp-contract mode to fast.
3947 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3948 }
3949 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003950
Sanjay Patel2987c292015-06-11 14:53:41 +00003951 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003952
Bob Wilson6a039162012-07-19 03:52:53 +00003953 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3954 // and if we find them, tell the frontend to provide the appropriate
3955 // preprocessor macros. This is distinct from enabling any optimizations as
3956 // these options induce language changes which must survive serialization
3957 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003958 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3959 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003960 if (!A->getOption().matches(options::OPT_fno_fast_math))
3961 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003962 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3963 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003964 if (A->getOption().matches(options::OPT_ffinite_math_only))
3965 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003966
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003967 // Decide whether to use verbose asm. Verbose assembly is the default on
3968 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003969 bool IsIntegratedAssemblerDefault =
3970 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003971 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003972 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003973 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003974 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003975
Rafael Espindolab8a12932015-05-22 20:44:03 +00003976 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3977 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003978 CmdArgs.push_back("-no-integrated-as");
3979
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003980 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3981 CmdArgs.push_back("-mdebug-pass");
3982 CmdArgs.push_back("Structure");
3983 }
3984 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3985 CmdArgs.push_back("-mdebug-pass");
3986 CmdArgs.push_back("Arguments");
3987 }
3988
Justin Lebar710a35f2016-01-25 22:36:35 +00003989 // Enable -mconstructor-aliases except on darwin, where we have to work around
3990 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
3991 // aliases aren't supported.
3992 if (!getToolChain().getTriple().isOSDarwin() &&
3993 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00003994 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003995
John McCall7ef5cb32011-03-18 02:56:14 +00003996 // Darwin's kernel doesn't support guard variables; just die if we
3997 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003998 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003999 CmdArgs.push_back("-fforbid-guard-variables");
4000
Akira Hatanaka02028482015-11-12 17:21:22 +00004001 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4002 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004003 CmdArgs.push_back("-mms-bitfields");
4004 }
John McCall8517abc2010-02-19 02:45:38 +00004005
Daniel Dunbar306945d2009-09-16 06:17:29 +00004006 // This is a coarse approximation of what llvm-gcc actually does, both
4007 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4008 // complicated ways.
4009 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004010 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4011 options::OPT_fno_asynchronous_unwind_tables,
4012 (getToolChain().IsUnwindTablesDefault() ||
4013 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4014 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004015 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4016 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004017 CmdArgs.push_back("-munwind-tables");
4018
Chandler Carruth05fb5852012-11-21 23:40:23 +00004019 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004020
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004021 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4022 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004023 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004024 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004025
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004026 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004027 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004028
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004029 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004030 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004031 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004032 }
4033
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004034 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004035 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004036 if (!CPU.empty()) {
4037 CmdArgs.push_back("-target-cpu");
4038 CmdArgs.push_back(Args.MakeArgString(CPU));
4039 }
4040
Rafael Espindolaeb265472013-08-21 21:59:03 +00004041 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4042 CmdArgs.push_back("-mfpmath");
4043 CmdArgs.push_back(A->getValue());
4044 }
4045
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004046 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004047 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004048
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004049 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004050 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004051 default:
4052 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004053
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004054 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004055 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004056 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004057 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004058 // Use the effective triple, which takes into account the deployment target.
4059 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004060 break;
4061
Tim Northover573cbee2014-05-24 12:52:07 +00004062 case llvm::Triple::aarch64:
4063 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004064 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004065 break;
4066
Eric Christopher0b26a612010-03-02 02:41:08 +00004067 case llvm::Triple::mips:
4068 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004069 case llvm::Triple::mips64:
4070 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004071 AddMIPSTargetArgs(Args, CmdArgs);
4072 break;
4073
Ulrich Weigand8afad612014-07-28 13:17:52 +00004074 case llvm::Triple::ppc:
4075 case llvm::Triple::ppc64:
4076 case llvm::Triple::ppc64le:
4077 AddPPCTargetArgs(Args, CmdArgs);
4078 break;
4079
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004080 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004081 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004082 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004083 AddSparcTargetArgs(Args, CmdArgs);
4084 break;
4085
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004086 case llvm::Triple::x86:
4087 case llvm::Triple::x86_64:
4088 AddX86TargetArgs(Args, CmdArgs);
4089 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004090
4091 case llvm::Triple::hexagon:
4092 AddHexagonTargetArgs(Args, CmdArgs);
4093 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004094
4095 case llvm::Triple::wasm32:
4096 case llvm::Triple::wasm64:
4097 AddWebAssemblyTargetArgs(Args, CmdArgs);
4098 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004099 }
4100
Douglas Katzman3459ce22015-10-08 04:24:12 +00004101 // The 'g' groups options involve a somewhat intricate sequence of decisions
4102 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004103 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004104 // * what level of debug info to generate
4105 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004106 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004107 // This avoids having to monkey around further in cc1 other than to disable
4108 // codeview if not running in a Windows environment. Perhaps even that
4109 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004110 unsigned DwarfVersion = 0;
4111 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4112 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004113 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004114 bool EmitCodeView = false;
4115
Hans Wennborg75958c42013-08-08 00:17:41 +00004116 // Add clang-cl arguments.
4117 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004118 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004119
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004120 // Pass the linker version in use.
4121 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4122 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004123 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004124 }
4125
Eric Christopherb7d97e92013-04-03 01:58:53 +00004126 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004127 CmdArgs.push_back("-momit-leaf-frame-pointer");
4128
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004129 // Explicitly error on some things we know we don't support and can't just
4130 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004131 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004132 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4133 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004134 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004135 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004136 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4137 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004138 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004139 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004140 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004141 }
4142
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004143 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004144 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004145 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004146 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004147 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4148 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004149 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004150 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004151 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004152
Chad Rosierbe10f982011-08-02 17:58:04 +00004153 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004154 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004155 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4156 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004157 }
4158
Rafael Espindola08a692a2010-03-07 04:46:18 +00004159 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004160 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004161 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004162 // If the last option explicitly specified a debug-info level, use it.
4163 if (A->getOption().matches(options::OPT_gN_Group)) {
4164 DebugInfoKind = DebugLevelToInfoKind(*A);
4165 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4166 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4167 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004168 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004169 A->getIndex() > SplitDwarfArg->getIndex())
4170 SplitDwarfArg = nullptr;
4171 } else
4172 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004173 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004174 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004175
Paul Robinson0334a042015-12-19 19:41:48 +00004176 // If a debugger tuning argument appeared, remember it.
4177 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4178 options::OPT_ggdbN_Group)) {
4179 if (A->getOption().matches(options::OPT_glldb))
4180 DebuggerTuning = llvm::DebuggerKind::LLDB;
4181 else if (A->getOption().matches(options::OPT_gsce))
4182 DebuggerTuning = llvm::DebuggerKind::SCE;
4183 else
4184 DebuggerTuning = llvm::DebuggerKind::GDB;
4185 }
4186
4187 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004188 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004189 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004190 DwarfVersion = DwarfVersionNum(A->getSpelling());
4191
Reid Kleckner124955a2015-08-05 18:51:13 +00004192 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004193 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4194 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4195 // DwarfVersion remains at 0 if no explicit choice was made.
4196 CmdArgs.push_back("-gcodeview");
4197 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004198 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004199 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4200 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004201
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004202 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4203 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004204
4205 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004206 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004207 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004208 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004209
Eric Christopher138c32b2013-09-13 22:37:55 +00004210 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004211 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004212 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004213 CmdArgs.push_back("-dwarf-ext-refs");
4214 CmdArgs.push_back("-fmodule-format=obj");
4215 }
4216
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004217 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4218 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004219 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004220 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004221 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004222 CmdArgs.push_back("-backend-option");
4223 CmdArgs.push_back("-split-dwarf=Enable");
4224 }
4225
Douglas Katzman3459ce22015-10-08 04:24:12 +00004226 // After we've dealt with all combinations of things that could
4227 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4228 // figure out if we need to "upgrade" it to standalone debug info.
4229 // We parse these two '-f' options whether or not they will be used,
4230 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4231 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4232 options::OPT_fno_standalone_debug,
4233 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004234 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4235 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004236 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4237 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004238
Eric Christopher138c32b2013-09-13 22:37:55 +00004239 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4240 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4241 CmdArgs.push_back("-backend-option");
4242 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4243 }
Eric Christophereec89c22013-06-18 00:03:50 +00004244
Eric Christopher0d403d22014-02-14 01:27:03 +00004245 // -gdwarf-aranges turns on the emission of the aranges section in the
4246 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004247 // Always enabled on the PS4.
4248 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004249 CmdArgs.push_back("-backend-option");
4250 CmdArgs.push_back("-generate-arange-section");
4251 }
4252
David Blaikief36d9ba2014-01-27 18:52:43 +00004253 if (Args.hasFlag(options::OPT_fdebug_types_section,
4254 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004255 CmdArgs.push_back("-backend-option");
4256 CmdArgs.push_back("-generate-type-units");
4257 }
Eric Christophereec89c22013-06-18 00:03:50 +00004258
Dan Gohmana5b804b2016-01-07 00:50:27 +00004259 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4260 // default.
4261 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4262 Triple.getArch() == llvm::Triple::wasm32 ||
4263 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004264
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004265 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004266 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004267 CmdArgs.push_back("-ffunction-sections");
4268 }
4269
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004270 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4271 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004272 CmdArgs.push_back("-fdata-sections");
4273 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004274
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004275 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004276 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004277 CmdArgs.push_back("-fno-unique-section-names");
4278
Chris Lattner3c77a352010-06-22 00:03:40 +00004279 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4280
Diego Novilloa0545962015-07-10 18:00:07 +00004281 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004282
Paul Robinsond083b9a2015-12-16 17:25:27 +00004283 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4284 if (getToolChain().getTriple().isPS4CPU())
4285 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4286
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004287 // Pass options for controlling the default header search paths.
4288 if (Args.hasArg(options::OPT_nostdinc)) {
4289 CmdArgs.push_back("-nostdsysteminc");
4290 CmdArgs.push_back("-nobuiltininc");
4291 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004292 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004293 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004294 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4295 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4296 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004297
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004298 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004299 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004300 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004301
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004302 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4303
Ted Kremenekf7639e12012-03-06 20:06:33 +00004304 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004305 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004306 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004307 options::OPT_ccc_arcmt_modify,
4308 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004309 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004310 switch (A->getOption().getID()) {
4311 default:
4312 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004313 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004314 CmdArgs.push_back("-arcmt-check");
4315 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004316 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004317 CmdArgs.push_back("-arcmt-modify");
4318 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004319 case options::OPT_ccc_arcmt_migrate:
4320 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004321 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004322 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004323
4324 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4325 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004326 break;
John McCalld70fb982011-06-15 23:25:17 +00004327 }
4328 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004329 } else {
4330 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4331 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4332 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004333 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004334
Ted Kremenekf7639e12012-03-06 20:06:33 +00004335 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4336 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004337 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4338 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004339 }
4340 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004341 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004342
4343 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004344 options::OPT_objcmt_migrate_subscripting,
4345 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004346 // None specified, means enable them all.
4347 CmdArgs.push_back("-objcmt-migrate-literals");
4348 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004349 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004350 } else {
4351 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4352 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004353 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004354 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004355 } else {
4356 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4357 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4358 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4359 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4360 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4361 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004362 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004363 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4364 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4365 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4366 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4367 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4368 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4369 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004370 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004371 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004372 }
4373
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004374 // Add preprocessing options like -I, -D, etc. if we are using the
4375 // preprocessor.
4376 //
4377 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004378 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004379 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4380 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004381
Rafael Espindolaa7431922011-07-21 23:40:37 +00004382 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4383 // that "The compiler can only warn and ignore the option if not recognized".
4384 // When building with ccache, it will pass -D options to clang even on
4385 // preprocessed inputs and configure concludes that -fPIC is not supported.
4386 Args.ClaimAllArgs(options::OPT_D);
4387
Alp Toker7874bdc2013-11-15 20:40:58 +00004388 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004389 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4390 if (A->getOption().matches(options::OPT_O4)) {
4391 CmdArgs.push_back("-O3");
4392 D.Diag(diag::warn_O4_is_O3);
4393 } else {
4394 A->render(Args, CmdArgs);
4395 }
4396 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004397
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004398 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004399 for (const Arg *A :
4400 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4401 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004402 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004403 }
4404
Rafael Espindola577637a2015-01-03 00:06:04 +00004405 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004406
Richard Smith3be1cb22014-08-07 00:24:21 +00004407 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004408 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004409 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4410 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004411 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004412 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004413
4414 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004415 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004416 //
4417 // If a std is supplied, only add -trigraphs if it follows the
4418 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004419 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004420 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4421 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004422 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004423 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004424 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004425 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004426 else
4427 Std->render(Args, CmdArgs);
4428
Nico Weber00721502014-12-23 22:32:37 +00004429 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004430 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004431 options::OPT_ftrigraphs,
4432 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004433 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004434 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004435 } else {
4436 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004437 //
4438 // FIXME: Clang doesn't correctly handle -std= when the input language
4439 // doesn't match. For the time being just ignore this for C++ inputs;
4440 // eventually we want to do all the standard defaulting here instead of
4441 // splitting it between the driver and clang -cc1.
4442 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004443 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4444 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004445 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004446 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004447
Nico Weber00721502014-12-23 22:32:37 +00004448 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4449 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004450 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004451
Richard Smith282b4492013-09-04 22:50:31 +00004452 // GCC's behavior for -Wwrite-strings is a bit strange:
4453 // * In C, this "warning flag" changes the types of string literals from
4454 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4455 // for the discarded qualifier.
4456 // * In C++, this is just a normal warning flag.
4457 //
4458 // Implementing this warning correctly in C is hard, so we follow GCC's
4459 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4460 // a non-const char* in C, rather than using this crude hack.
4461 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004462 // FIXME: This should behave just like a warning flag, and thus should also
4463 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4464 Arg *WriteStrings =
4465 Args.getLastArg(options::OPT_Wwrite_strings,
4466 options::OPT_Wno_write_strings, options::OPT_w);
4467 if (WriteStrings &&
4468 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004469 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004470 }
4471
Chandler Carruth61fbf622011-04-23 09:27:53 +00004472 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004473 // during C++ compilation, which it is by default. GCC keeps this define even
4474 // in the presence of '-w', match this behavior bug-for-bug.
4475 if (types::isCXX(InputType) &&
4476 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4477 true)) {
4478 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004479 }
4480
Chandler Carruthe0391482010-05-22 02:21:53 +00004481 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4482 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4483 if (Asm->getOption().matches(options::OPT_fasm))
4484 CmdArgs.push_back("-fgnu-keywords");
4485 else
4486 CmdArgs.push_back("-fno-gnu-keywords");
4487 }
4488
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004489 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4490 CmdArgs.push_back("-fno-dwarf-directory-asm");
4491
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004492 if (ShouldDisableAutolink(Args, getToolChain()))
4493 CmdArgs.push_back("-fno-autolink");
4494
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004495 // Add in -fdebug-compilation-dir if necessary.
4496 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004497
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004498 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4499 StringRef Map = A->getValue();
4500 if (Map.find('=') == StringRef::npos)
4501 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4502 else
4503 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4504 A->claim();
4505 }
4506
Richard Smith9a568822011-11-21 19:36:32 +00004507 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4508 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004509 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004510 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004511 }
4512
Richard Smith79c927b2013-11-06 19:31:51 +00004513 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4514 CmdArgs.push_back("-foperator-arrow-depth");
4515 CmdArgs.push_back(A->getValue());
4516 }
4517
Richard Smith9a568822011-11-21 19:36:32 +00004518 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4519 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004520 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004521 }
4522
Richard Smitha3d3bd22013-05-08 02:12:03 +00004523 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4524 CmdArgs.push_back("-fconstexpr-steps");
4525 CmdArgs.push_back(A->getValue());
4526 }
4527
Richard Smithb3a14522013-02-22 01:59:51 +00004528 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4529 CmdArgs.push_back("-fbracket-depth");
4530 CmdArgs.push_back(A->getValue());
4531 }
4532
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004533 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4534 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004535 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004536 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004537 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4538 } else
4539 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004540 }
4541
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004542 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004543 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004544
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004545 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4546 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004547 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004548 }
David Chisnall5778fce2009-08-31 16:41:57 +00004549
Chris Lattnere23003d2010-01-09 21:54:33 +00004550 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4551 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004552 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004553 }
4554
Chris Lattnerb35583d2010-04-07 20:49:23 +00004555 CmdArgs.push_back("-ferror-limit");
4556 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004557 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004558 else
4559 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004560
Chandler Carrutha77a7272010-05-06 04:55:18 +00004561 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4562 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004563 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004564 }
4565
4566 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4567 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004568 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004569 }
4570
Richard Smithf6f003a2011-12-16 19:06:07 +00004571 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4572 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004573 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004574 }
4575
Nick Lewycky24653262014-12-16 21:39:02 +00004576 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4577 CmdArgs.push_back("-fspell-checking-limit");
4578 CmdArgs.push_back(A->getValue());
4579 }
4580
Daniel Dunbar2c978472009-11-04 06:24:47 +00004581 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004582 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004583 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004584 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004585 } else {
4586 // If -fmessage-length=N was not specified, determine whether this is a
4587 // terminal and, if so, implicitly define -fmessage-length appropriately.
4588 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004589 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004590 }
4591
John McCallb4a99d32013-02-19 01:57:35 +00004592 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4593 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4594 options::OPT_fvisibility_ms_compat)) {
4595 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4596 CmdArgs.push_back("-fvisibility");
4597 CmdArgs.push_back(A->getValue());
4598 } else {
4599 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4600 CmdArgs.push_back("-fvisibility");
4601 CmdArgs.push_back("hidden");
4602 CmdArgs.push_back("-ftype-visibility");
4603 CmdArgs.push_back("default");
4604 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004605 }
4606
Douglas Gregor08329632010-06-15 17:05:35 +00004607 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004608
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004609 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4610
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004611 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004612 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4613 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004614 CmdArgs.push_back("-ffreestanding");
4615
Daniel Dunbare357d562009-12-03 18:42:11 +00004616 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004617 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004618 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004619 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004620 // Emulated TLS is enabled by default on Android, and can be enabled manually
4621 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004622 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004623 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4624 EmulatedTLSDefault))
4625 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004626 // AltiVec-like language extensions aren't relevant for assembling.
4627 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004628 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004629 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4630 }
Richard Trieu91844232012-06-26 18:18:47 +00004631 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4632 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004633
Alexey Bataevdb390212015-05-20 04:24:19 +00004634 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004635 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4636 options::OPT_fno_openmp, false))
4637 switch (getOpenMPRuntime(getToolChain(), Args)) {
4638 case OMPRT_OMP:
4639 case OMPRT_IOMP5:
4640 // Clang can generate useful OpenMP code for these two runtime libraries.
4641 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004642
4643 // If no option regarding the use of TLS in OpenMP codegeneration is
4644 // given, decide a default based on the target. Otherwise rely on the
4645 // options and pass the right information to the frontend.
4646 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004647 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004648 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004649 break;
4650 default:
4651 // By default, if Clang doesn't know how to generate useful OpenMP code
4652 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4653 // down to the actual compilation.
4654 // FIXME: It would be better to have a mode which *only* omits IR
4655 // generation based on the OpenMP support so that we get consistent
4656 // semantic analysis, etc.
4657 break;
4658 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004659
Peter Collingbourne32701642013-11-01 18:16:25 +00004660 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004661 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004662
Eric Christopher459d2712013-02-19 06:16:53 +00004663 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004664 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4665 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4666 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4667 Arch == llvm::Triple::ppc64le))
4668 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4669 << "ppc/ppc64/ppc64le";
4670 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004671
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004672 // -fzvector is incompatible with -faltivec.
4673 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4674 if (Args.hasArg(options::OPT_faltivec))
4675 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4676 << "-faltivec";
4677
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004678 if (getToolChain().SupportsProfiling())
4679 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004680
4681 // -flax-vector-conversions is default.
4682 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4683 options::OPT_fno_lax_vector_conversions))
4684 CmdArgs.push_back("-fno-lax-vector-conversions");
4685
John Brawna7b4ec02015-08-10 11:11:28 +00004686 if (Args.getLastArg(options::OPT_fapple_kext) ||
4687 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004688 CmdArgs.push_back("-fapple-kext");
4689
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004690 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004691 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004692 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004693 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4694 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004695
4696 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4697 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004698 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004699 }
4700
Bob Wilson14adb362012-02-03 06:27:22 +00004701 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004702
Chandler Carruth6e501032011-03-27 00:04:55 +00004703 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4704 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004705 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004706 if (A->getOption().matches(options::OPT_fwrapv))
4707 CmdArgs.push_back("-fwrapv");
4708 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4709 options::OPT_fno_strict_overflow)) {
4710 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4711 CmdArgs.push_back("-fwrapv");
4712 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004713
4714 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4715 options::OPT_fno_reroll_loops))
4716 if (A->getOption().matches(options::OPT_freroll_loops))
4717 CmdArgs.push_back("-freroll-loops");
4718
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004719 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004720 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4721 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004722
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004723 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4724
Daniel Dunbar4930e332009-11-17 08:07:36 +00004725 // -stack-protector=0 is default.
4726 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004727 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4728 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4729 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4730 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4731 Args.ClaimAllArgs(options::OPT_fstack_protector);
4732 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004733 options::OPT_fstack_protector_all,
4734 options::OPT_fstack_protector_strong,
4735 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004736 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004737 StackProtectorLevel = std::max<unsigned>(
4738 LangOptions::SSPOn,
4739 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004740 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004741 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004742 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004743 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004744 } else {
4745 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004746 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004747 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004748 if (StackProtectorLevel) {
4749 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004750 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004751 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004752
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004753 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004754 for (const Arg *A : Args.filtered(options::OPT__param)) {
4755 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004756 if (Str.startswith("ssp-buffer-size=")) {
4757 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004758 CmdArgs.push_back("-stack-protector-buffer-size");
4759 // FIXME: Verify the argument is a valid integer.
4760 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004761 }
Sean Silva14facf32015-06-09 01:57:17 +00004762 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004763 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004764 }
4765
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004766 // Translate -mstackrealign
4767 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004768 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004769 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004770
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004771 if (Args.hasArg(options::OPT_mstack_alignment)) {
4772 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4773 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004774 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004775
Hans Wennborg77dc2362015-01-20 19:45:50 +00004776 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4777 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4778
4779 if (!Size.empty())
4780 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4781 else
4782 CmdArgs.push_back("-mstack-probe-size=0");
4783 }
4784
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004785 switch (getToolChain().getArch()) {
4786 case llvm::Triple::aarch64:
4787 case llvm::Triple::aarch64_be:
4788 case llvm::Triple::arm:
4789 case llvm::Triple::armeb:
4790 case llvm::Triple::thumb:
4791 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004792 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004793 break;
4794
4795 default:
4796 break;
4797 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004798
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004799 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4800 options::OPT_mno_restrict_it)) {
4801 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4802 CmdArgs.push_back("-backend-option");
4803 CmdArgs.push_back("-arm-restrict-it");
4804 } else {
4805 CmdArgs.push_back("-backend-option");
4806 CmdArgs.push_back("-arm-no-restrict-it");
4807 }
James Y Knight2db38f32015-08-15 03:45:25 +00004808 } else if (Triple.isOSWindows() &&
4809 (Triple.getArch() == llvm::Triple::arm ||
4810 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004811 // Windows on ARM expects restricted IT blocks
4812 CmdArgs.push_back("-backend-option");
4813 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004814 }
4815
Daniel Dunbard18049a2009-04-07 21:16:11 +00004816 // Forward -f options with positive and negative forms; we translate
4817 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004818 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4819 StringRef fname = A->getValue();
4820 if (!llvm::sys::fs::exists(fname))
4821 D.Diag(diag::err_drv_no_such_file) << fname;
4822 else
4823 A->render(Args, CmdArgs);
4824 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004825
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004826 // -fbuiltin is default unless -mkernel is used.
4827 bool UseBuiltins =
4828 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4829 !Args.hasArg(options::OPT_mkernel));
4830 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004831 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004832
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004833 // -ffreestanding implies -fno-builtin.
4834 if (Args.hasArg(options::OPT_ffreestanding))
4835 UseBuiltins = false;
4836
4837 // Process the -fno-builtin-* options.
4838 for (const auto &Arg : Args) {
4839 const Option &O = Arg->getOption();
4840 if (!O.matches(options::OPT_fno_builtin_))
4841 continue;
4842
4843 Arg->claim();
4844 // If -fno-builtin is specified, then there's no need to pass the option to
4845 // the frontend.
4846 if (!UseBuiltins)
4847 continue;
4848
4849 StringRef FuncName = Arg->getValue();
4850 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4851 }
4852
Nuno Lopes13c88c72009-12-16 16:59:22 +00004853 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4854 options::OPT_fno_assume_sane_operator_new))
4855 CmdArgs.push_back("-fno-assume-sane-operator-new");
4856
Daniel Dunbar4930e332009-11-17 08:07:36 +00004857 // -fblocks=0 is default.
4858 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004859 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004860 (Args.hasArg(options::OPT_fgnu_runtime) &&
4861 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4862 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004863 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004864
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004865 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004866 !getToolChain().hasBlocksRuntime())
4867 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004868 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004869
Richard Smith47972af2015-06-16 00:08:24 +00004870 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004871 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004872 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004873 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004874 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004875 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4876 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004877 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004878 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004879 HaveModules = true;
4880 }
4881 }
4882
Richard Smith47972af2015-06-16 00:08:24 +00004883 // -fmodule-maps enables implicit reading of module map files. By default,
4884 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004885 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4886 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004887 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004888 }
4889
Daniel Jasperac42b752013-10-21 06:34:34 +00004890 // -fmodules-decluse checks that modules used are declared so (off by
4891 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004892 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004893 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004894 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004895 }
4896
Daniel Jasper962b38e2014-04-11 11:47:45 +00004897 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4898 // all #included headers are part of modules.
4899 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004900 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004901 CmdArgs.push_back("-fmodules-strict-decluse");
4902 }
4903
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004904 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4905 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4906 options::OPT_fno_implicit_modules)) {
4907 CmdArgs.push_back("-fno-implicit-modules");
4908 }
4909
Daniel Jasperac42b752013-10-21 06:34:34 +00004910 // -fmodule-name specifies the module that is currently being built (or
4911 // used for header checking by -fmodule-maps).
Richard Smith7e82e012016-02-19 22:25:36 +00004912 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
Daniel Jasperac42b752013-10-21 06:34:34 +00004913
Richard Smith9887d792014-10-17 01:42:53 +00004914 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004915 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004916 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004917
Richard Smithe842a472014-10-22 02:05:46 +00004918 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004919 if (HaveModules)
4920 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4921 else
4922 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004923
4924 // -fmodule-cache-path specifies where our implicitly-built module files
4925 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004926 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004927 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004928 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004929 if (HaveModules) {
4930 if (C.isForDiagnostics()) {
4931 // When generating crash reports, we want to emit the modules along with
4932 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004933 Path = Output.getFilename();
4934 llvm::sys::path::replace_extension(Path, ".cache");
4935 llvm::sys::path::append(Path, "modules");
4936 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004937 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004938 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004939 llvm::sys::path::append(Path, "org.llvm.clang.");
4940 appendUserToPath(Path);
4941 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004942 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004943 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004944 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4945 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004946 }
4947
4948 // When building modules and generating crashdumps, we need to dump a module
4949 // dependency VFS alongside the output.
4950 if (HaveModules && C.isForDiagnostics()) {
4951 SmallString<128> VFSDir(Output.getFilename());
4952 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004953 // Add the cache directory as a temp so the crash diagnostics pick it up.
4954 C.addTempFile(Args.MakeArgString(VFSDir));
4955
Justin Bognera88f0122014-06-20 22:59:50 +00004956 llvm::sys::path::append(VFSDir, "vfs");
4957 CmdArgs.push_back("-module-dependency-dir");
4958 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004959 }
4960
Richard Smith9887d792014-10-17 01:42:53 +00004961 if (HaveModules)
4962 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004963
Douglas Gregor35b04d62013-02-07 19:01:24 +00004964 // Pass through all -fmodules-ignore-macro arguments.
4965 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004966 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4967 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004968
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004969 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4970
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004971 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4972 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4973 D.Diag(diag::err_drv_argument_not_allowed_with)
4974 << A->getAsString(Args) << "-fbuild-session-timestamp";
4975
4976 llvm::sys::fs::file_status Status;
4977 if (llvm::sys::fs::status(A->getValue(), Status))
4978 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004979 CmdArgs.push_back(Args.MakeArgString(
4980 "-fbuild-session-timestamp=" +
4981 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004982 }
4983
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004984 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004985 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4986 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004987 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4988
4989 Args.AddLastArg(CmdArgs,
4990 options::OPT_fmodules_validate_once_per_build_session);
4991 }
4992
Ben Langmuirdcf73862014-03-12 00:06:17 +00004993 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4994
John McCalldfea9982010-04-09 19:12:06 +00004995 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004996 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004997 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004998 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004999
Anders Carlssond470fef2010-11-21 00:09:52 +00005000 // -felide-constructors is the default.
5001 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005002 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005003 CmdArgs.push_back("-fno-elide-constructors");
5004
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005005 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005006
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005007 if (KernelOrKext || (types::isCXX(InputType) &&
5008 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5009 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005010 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005011
Tony Linthicum76329bf2011-12-12 21:14:55 +00005012 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005013 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5014 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005015 CmdArgs.push_back("-fshort-enums");
5016
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005017 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005018 if (Arg *A = Args.getLastArg(
5019 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5020 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5021 if (A->getOption().matches(options::OPT_funsigned_char) ||
5022 A->getOption().matches(options::OPT_fno_signed_char)) {
5023 CmdArgs.push_back("-fno-signed-char");
5024 }
5025 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005026 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005027 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005028
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005029 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005030 if (!Args.hasFlag(
5031 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5032 !IsWindowsCygnus && !IsWindowsGNU &&
5033 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5034 getToolChain().getArch() != llvm::Triple::hexagon &&
5035 getToolChain().getArch() != llvm::Triple::xcore &&
5036 ((getToolChain().getTriple().getVendor() !=
5037 llvm::Triple::MipsTechnologies) ||
5038 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005039 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005040 CmdArgs.push_back("-fno-use-cxa-atexit");
5041
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005042 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005043 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005044 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005045 CmdArgs.push_back("-fms-extensions");
5046
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005047 // -fno-use-line-directives is default.
5048 if (Args.hasFlag(options::OPT_fuse_line_directives,
5049 options::OPT_fno_use_line_directives, false))
5050 CmdArgs.push_back("-fuse-line-directives");
5051
Francois Pichet1b4f1632011-09-17 04:32:15 +00005052 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005053 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005054 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005055 (IsWindowsMSVC &&
5056 Args.hasFlag(options::OPT_fms_extensions,
5057 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005058 CmdArgs.push_back("-fms-compatibility");
5059
David Majnemerc371ff02015-03-22 08:39:22 +00005060 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005061 VersionTuple MSVT = visualstudio::getMSVCVersion(
5062 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5063 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005064 CmdArgs.push_back(
5065 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005066
David Majnemer8db91762015-05-18 04:49:30 +00005067 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5068 if (ImplyVCPPCXXVer) {
5069 if (IsMSVC2015Compatible)
5070 CmdArgs.push_back("-std=c++14");
5071 else
5072 CmdArgs.push_back("-std=c++11");
5073 }
5074
Eric Christopher5ecce122013-02-18 00:38:31 +00005075 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005076 if (Args.hasFlag(options::OPT_fborland_extensions,
5077 options::OPT_fno_borland_extensions, false))
5078 CmdArgs.push_back("-fborland-extensions");
5079
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005080 // -fno-declspec is default, except for PS4.
5081 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5082 getToolChain().getTriple().isPS4()))
5083 CmdArgs.push_back("-fdeclspec");
5084 else if (Args.hasArg(options::OPT_fno_declspec))
5085 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5086
David Majnemerc371ff02015-03-22 08:39:22 +00005087 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5088 // than 19.
5089 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5090 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005091 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005092 CmdArgs.push_back("-fno-threadsafe-statics");
5093
Francois Pichet02744872011-09-01 16:38:08 +00005094 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5095 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005096 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005097 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005098 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005099
Chandler Carruthe03aa552010-04-17 20:17:31 +00005100 // -fgnu-keywords default varies depending on language; only pass if
5101 // specified.
5102 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005103 options::OPT_fno_gnu_keywords))
5104 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005105
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005106 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005107 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005108 CmdArgs.push_back("-fgnu89-inline");
5109
Chad Rosier9c76d242012-03-15 22:31:42 +00005110 if (Args.hasArg(options::OPT_fno_inline))
5111 CmdArgs.push_back("-fno-inline");
5112
Chad Rosier64d6be92012-03-06 21:17:19 +00005113 if (Args.hasArg(options::OPT_fno_inline_functions))
5114 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005115
John McCall5fb5df92012-06-20 06:18:46 +00005116 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005117
John McCall5fb5df92012-06-20 06:18:46 +00005118 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005119 // legacy is the default. Except for deployment taget of 10.5,
5120 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5121 // gets ignored silently.
5122 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005123 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5124 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005125 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005126 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005127 if (getToolChain().UseObjCMixedDispatch())
5128 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5129 else
5130 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5131 }
5132 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005133
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005134 // When ObjectiveC legacy runtime is in effect on MacOSX,
5135 // turn on the option to do Array/Dictionary subscripting
5136 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005137 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005138 getToolChain().getTriple().isMacOSX() &&
5139 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5140 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005141 objcRuntime.isNeXTFamily())
5142 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005143
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005144 // -fencode-extended-block-signature=1 is default.
5145 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5146 CmdArgs.push_back("-fencode-extended-block-signature");
5147 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005148
John McCall24fc0de2011-07-06 00:26:06 +00005149 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5150 // NOTE: This logic is duplicated in ToolChains.cpp.
5151 bool ARC = isObjCAutoRefCount(Args);
5152 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005153 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005154
John McCall24fc0de2011-07-06 00:26:06 +00005155 CmdArgs.push_back("-fobjc-arc");
5156
Chandler Carruth491db322011-11-04 07:34:47 +00005157 // FIXME: It seems like this entire block, and several around it should be
5158 // wrapped in isObjC, but for now we just use it here as this is where it
5159 // was being used previously.
5160 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5161 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5162 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5163 else
5164 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5165 }
5166
John McCall24fc0de2011-07-06 00:26:06 +00005167 // Allow the user to enable full exceptions code emission.
5168 // We define off for Objective-CC, on for Objective-C++.
5169 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5170 options::OPT_fno_objc_arc_exceptions,
5171 /*default*/ types::isCXX(InputType)))
5172 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005173
John McCall24fc0de2011-07-06 00:26:06 +00005174 }
5175
5176 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5177 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005178 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005179 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005180
John McCall24fc0de2011-07-06 00:26:06 +00005181 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5182 // takes precedence.
5183 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5184 if (!GCArg)
5185 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5186 if (GCArg) {
5187 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005188 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005189 } else if (getToolChain().SupportsObjCGC()) {
5190 GCArg->render(Args, CmdArgs);
5191 } else {
5192 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005193 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005194 }
5195 }
5196
John McCallfbe5ed72015-11-05 19:19:56 +00005197 // Pass down -fobjc-weak or -fno-objc-weak if present.
5198 if (types::isObjC(InputType)) {
5199 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5200 options::OPT_fno_objc_weak);
5201 if (!WeakArg) {
5202 // nothing to do
5203 } else if (GCArg) {
5204 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5205 D.Diag(diag::err_objc_weak_with_gc);
5206 } else if (!objcRuntime.allowsWeak()) {
5207 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5208 D.Diag(diag::err_objc_weak_unsupported);
5209 } else {
5210 WeakArg->render(Args, CmdArgs);
5211 }
5212 }
5213
Bob Wilsonb111ec92015-03-02 19:01:14 +00005214 if (Args.hasFlag(options::OPT_fapplication_extension,
5215 options::OPT_fno_application_extension, false))
5216 CmdArgs.push_back("-fapplication-extension");
5217
Reid Klecknerc542d372014-06-27 17:02:02 +00005218 // Handle GCC-style exception args.
5219 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005220 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5221 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005222
Tim Northovere931f9f2015-10-30 16:30:41 +00005223 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005224 CmdArgs.push_back("-fsjlj-exceptions");
5225
5226 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005227 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5228 options::OPT_fno_assume_sane_operator_new))
5229 CmdArgs.push_back("-fno-assume-sane-operator-new");
5230
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005231 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5232 // most platforms.
5233 if (Args.hasFlag(options::OPT_fsized_deallocation,
5234 options::OPT_fno_sized_deallocation, false))
5235 CmdArgs.push_back("-fsized-deallocation");
5236
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005237 // -fconstant-cfstrings is default, and may be subject to argument translation
5238 // on Darwin.
5239 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5240 options::OPT_fno_constant_cfstrings) ||
5241 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5242 options::OPT_mno_constant_cfstrings))
5243 CmdArgs.push_back("-fno-constant-cfstrings");
5244
John Thompsoned4e2952009-11-05 20:14:16 +00005245 // -fshort-wchar default varies depending on platform; only
5246 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005247 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5248 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005249 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005250
Hans Wennborg28c96312013-07-31 23:39:13 +00005251 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005252 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005253 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005254 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005255
Daniel Dunbar096ed292011-10-05 21:04:55 +00005256 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5257 // -fno-pack-struct doesn't apply to -fpack-struct=.
5258 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005259 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005260 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005261 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005262 } else if (Args.hasFlag(options::OPT_fpack_struct,
5263 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005264 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005265 }
5266
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005267 // Handle -fmax-type-align=N and -fno-type-align
5268 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5269 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5270 if (!SkipMaxTypeAlign) {
5271 std::string MaxTypeAlignStr = "-fmax-type-align=";
5272 MaxTypeAlignStr += A->getValue();
5273 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5274 }
5275 } else if (getToolChain().getTriple().isOSDarwin()) {
5276 if (!SkipMaxTypeAlign) {
5277 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5278 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5279 }
5280 }
5281
John Brawna7b4ec02015-08-10 11:11:28 +00005282 // -fcommon is the default unless compiling kernel code or the target says so
5283 bool NoCommonDefault =
5284 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5285 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5286 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005287 CmdArgs.push_back("-fno-common");
5288
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005289 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005290 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005291 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005292 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005293 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005294 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005295
Daniel Dunbar6358d682010-10-15 22:30:42 +00005296 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005297 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005298 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005299 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005300
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005301 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005302 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5303 StringRef value = inputCharset->getValue();
5304 if (value != "UTF-8")
5305 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5306 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005307 }
5308
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005309 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005310 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5311 StringRef value = execCharset->getValue();
5312 if (value != "UTF-8")
5313 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5314 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005315 }
5316
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005317 // -fcaret-diagnostics is default.
5318 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5319 options::OPT_fno_caret_diagnostics, true))
5320 CmdArgs.push_back("-fno-caret-diagnostics");
5321
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005322 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005323 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005324 options::OPT_fno_diagnostics_fixit_info))
5325 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005326
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005327 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005328 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005329 options::OPT_fno_diagnostics_show_option))
5330 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005331
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005332 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005333 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005334 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005335 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005336 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005338 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005339 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005340 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005341 }
5342
Chandler Carruthb6766f02011-03-27 01:50:55 +00005343 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005344 options::OPT_fdiagnostics_show_note_include_stack,
5345 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005346 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005347 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005348 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5349 else
5350 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5351 }
5352
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005353 // Color diagnostics are the default, unless the terminal doesn't support
5354 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005355 // Support both clang's -f[no-]color-diagnostics and gcc's
5356 // -f[no-]diagnostics-colors[=never|always|auto].
5357 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005358 for (const auto &Arg : Args) {
5359 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005360 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5361 !O.matches(options::OPT_fdiagnostics_color) &&
5362 !O.matches(options::OPT_fno_color_diagnostics) &&
5363 !O.matches(options::OPT_fno_diagnostics_color) &&
5364 !O.matches(options::OPT_fdiagnostics_color_EQ))
5365 continue;
5366
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005367 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005368 if (O.matches(options::OPT_fcolor_diagnostics) ||
5369 O.matches(options::OPT_fdiagnostics_color)) {
5370 ShowColors = Colors_On;
5371 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5372 O.matches(options::OPT_fno_diagnostics_color)) {
5373 ShowColors = Colors_Off;
5374 } else {
5375 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005376 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005377 if (value == "always")
5378 ShowColors = Colors_On;
5379 else if (value == "never")
5380 ShowColors = Colors_Off;
5381 else if (value == "auto")
5382 ShowColors = Colors_Auto;
5383 else
5384 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005385 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005386 }
5387 }
5388 if (ShowColors == Colors_On ||
5389 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005390 CmdArgs.push_back("-fcolor-diagnostics");
5391
Nico Rieck7857d462013-09-11 00:38:02 +00005392 if (Args.hasArg(options::OPT_fansi_escape_codes))
5393 CmdArgs.push_back("-fansi-escape-codes");
5394
Daniel Dunbardb097022009-06-08 21:13:54 +00005395 if (!Args.hasFlag(options::OPT_fshow_source_location,
5396 options::OPT_fno_show_source_location))
5397 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005398
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005399 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005400 true))
5401 CmdArgs.push_back("-fno-show-column");
5402
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005403 if (!Args.hasFlag(options::OPT_fspell_checking,
5404 options::OPT_fno_spell_checking))
5405 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005406
Chad Rosierc8e56e82012-12-05 21:08:21 +00005407 // -fno-asm-blocks is default.
5408 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5409 false))
5410 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005411
Steven Wucb0d13f2015-01-16 23:05:28 +00005412 // -fgnu-inline-asm is default.
5413 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5414 options::OPT_fno_gnu_inline_asm, true))
5415 CmdArgs.push_back("-fno-gnu-inline-asm");
5416
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005417 // Enable vectorization per default according to the optimization level
5418 // selected. For optimization levels that want vectorization we use the alias
5419 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005420 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005421 OptSpecifier VectorizeAliasOption =
5422 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005423 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005424 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005425 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005426
Chad Rosier136d67d2014-04-28 19:30:57 +00005427 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005428 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005429 OptSpecifier SLPVectAliasOption =
5430 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005431 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005432 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005433 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005434
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005435 // -fno-slp-vectorize-aggressive is default.
5436 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005437 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005438 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005439
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005440 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5441 A->render(Args, CmdArgs);
5442
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005443 // -fdollars-in-identifiers default varies depending on platform and
5444 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005445 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005446 options::OPT_fno_dollars_in_identifiers)) {
5447 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005448 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005449 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005450 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005451 }
5452
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005453 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5454 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005455 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005456 options::OPT_fno_unit_at_a_time)) {
5457 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005458 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005459 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005460
Eli Friedman055c9702011-11-02 01:53:16 +00005461 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5462 options::OPT_fno_apple_pragma_pack, false))
5463 CmdArgs.push_back("-fapple-pragma-pack");
5464
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005465 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005466 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5467 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005468 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005469 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005470 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005471
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005472// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5473//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005474// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005475#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005476 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005477 (getToolChain().getArch() == llvm::Triple::arm ||
5478 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005479 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5480 CmdArgs.push_back("-fno-builtin-strcat");
5481 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5482 CmdArgs.push_back("-fno-builtin-strcpy");
5483 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005484#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005485
Justin Bognera88f0122014-06-20 22:59:50 +00005486 // Enable rewrite includes if the user's asked for it or if we're generating
5487 // diagnostics.
5488 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5489 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005490 if (Args.hasFlag(options::OPT_frewrite_includes,
5491 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005492 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005493 CmdArgs.push_back("-frewrite-includes");
5494
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005495 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005496 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005497 options::OPT_traditional_cpp)) {
5498 if (isa<PreprocessJobAction>(JA))
5499 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005500 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005501 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005502 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005503
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005504 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005505 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005506
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005507 // Handle serialized diagnostics.
5508 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5509 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005510 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005511 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005512
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005513 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5514 CmdArgs.push_back("-fretain-comments-from-system-headers");
5515
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005516 // Forward -fcomment-block-commands to -cc1.
5517 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005518 // Forward -fparse-all-comments to -cc1.
5519 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005520
John Brawnad31ace2015-09-23 13:55:40 +00005521 // Turn -fplugin=name.so into -load name.so
5522 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5523 CmdArgs.push_back("-load");
5524 CmdArgs.push_back(A->getValue());
5525 A->claim();
5526 }
5527
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005528 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5529 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005530 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005531 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5532 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005533
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005534 // We translate this by hand to the -cc1 argument, since nightly test uses
5535 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005536 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005537 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005538 } else
Sean Silva14facf32015-06-09 01:57:17 +00005539 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005540 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005541
Bob Wilson23a55f12014-12-21 07:00:00 +00005542 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005543 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5544 // by the frontend.
5545 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5546 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005547
Daniel Dunbard67a3222009-03-30 06:36:42 +00005548 if (Output.getType() == types::TY_Dependencies) {
5549 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005550 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005551 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005552 CmdArgs.push_back(Output.getFilename());
5553 } else {
5554 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005555 }
5556
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005557 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005558
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005559 if (Input.isFilename())
5560 CmdArgs.push_back(Input.getFilename());
5561 else
5562 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005563
Chris Lattnere9d7d782009-11-03 19:50:27 +00005564 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5565
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005566 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005567
5568 // Optionally embed the -cc1 level arguments into the debug info, for build
5569 // analysis.
5570 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005571 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005572 for (const auto &Arg : Args)
5573 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005574
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005575 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005576 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005577 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005578 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005579 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005580 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005581 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005582 }
5583 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005584 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005585 }
5586
Eric Christopherd3804002013-02-22 20:12:52 +00005587 // Add the split debug info name to the command lines here so we
5588 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005589 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005590 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5591 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005592 const char *SplitDwarfOut;
5593 if (SplitDwarf) {
5594 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005595 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005596 CmdArgs.push_back(SplitDwarfOut);
5597 }
5598
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005599 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5600 // Include them with -fcuda-include-gpubinary.
5601 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005602 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005603 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005604 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005605 }
5606
Eric Christopherd3804002013-02-22 20:12:52 +00005607 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005608 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005609 Output.getType() == types::TY_Object &&
5610 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005611 auto CLCommand =
5612 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005613 C.addCommand(llvm::make_unique<FallbackCommand>(
5614 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005615 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005616 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005617 }
5618
Eric Christopherf1545832013-02-22 23:50:16 +00005619 // Handle the debug info splitting at object creation time if we're
5620 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005621 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005622 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005623 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005624
Roman Divacky178e01602011-02-10 16:52:03 +00005625 if (Arg *A = Args.getLastArg(options::OPT_pg))
5626 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005627 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5628 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005629
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005630 // Claim some arguments which clang supports automatically.
5631
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005632 // -fpch-preprocess is used with gcc to add a special marker in the output to
5633 // include the PCH file. Clang's PTH solution is completely transparent, so we
5634 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005635 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005636
Daniel Dunbar17731772009-03-23 19:03:36 +00005637 // Claim some arguments which clang doesn't support, but we don't
5638 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005639 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5640 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005641
Rafael Espindolab0092d72013-09-04 19:37:35 +00005642 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005643 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005644}
5645
John McCall5fb5df92012-06-20 06:18:46 +00005646/// Add options related to the Objective-C runtime/ABI.
5647///
5648/// Returns true if the runtime is non-fragile.
5649ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5650 ArgStringList &cmdArgs,
5651 RewriteKind rewriteKind) const {
5652 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005653 Arg *runtimeArg =
5654 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5655 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005656
5657 // Just forward -fobjc-runtime= to the frontend. This supercedes
5658 // options about fragility.
5659 if (runtimeArg &&
5660 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5661 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005662 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005663 if (runtime.tryParse(value)) {
5664 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005665 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005666 }
5667
5668 runtimeArg->render(args, cmdArgs);
5669 return runtime;
5670 }
5671
5672 // Otherwise, we'll need the ABI "version". Version numbers are
5673 // slightly confusing for historical reasons:
5674 // 1 - Traditional "fragile" ABI
5675 // 2 - Non-fragile ABI, version 1
5676 // 3 - Non-fragile ABI, version 2
5677 unsigned objcABIVersion = 1;
5678 // If -fobjc-abi-version= is present, use that to set the version.
5679 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005680 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005681 if (value == "1")
5682 objcABIVersion = 1;
5683 else if (value == "2")
5684 objcABIVersion = 2;
5685 else if (value == "3")
5686 objcABIVersion = 3;
5687 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005688 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005689 } else {
5690 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005691 bool nonFragileABIIsDefault =
5692 (rewriteKind == RK_NonFragile ||
5693 (rewriteKind == RK_None &&
5694 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005695 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5696 options::OPT_fno_objc_nonfragile_abi,
5697 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005698// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005699#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5700 unsigned nonFragileABIVersion = 1;
5701#else
5702 unsigned nonFragileABIVersion = 2;
5703#endif
5704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005705 if (Arg *abiArg =
5706 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005707 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005708 if (value == "1")
5709 nonFragileABIVersion = 1;
5710 else if (value == "2")
5711 nonFragileABIVersion = 2;
5712 else
5713 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005714 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005715 }
5716
5717 objcABIVersion = 1 + nonFragileABIVersion;
5718 } else {
5719 objcABIVersion = 1;
5720 }
5721 }
5722
5723 // We don't actually care about the ABI version other than whether
5724 // it's non-fragile.
5725 bool isNonFragile = objcABIVersion != 1;
5726
5727 // If we have no runtime argument, ask the toolchain for its default runtime.
5728 // However, the rewriter only really supports the Mac runtime, so assume that.
5729 ObjCRuntime runtime;
5730 if (!runtimeArg) {
5731 switch (rewriteKind) {
5732 case RK_None:
5733 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5734 break;
5735 case RK_Fragile:
5736 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5737 break;
5738 case RK_NonFragile:
5739 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5740 break;
5741 }
5742
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005743 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005744 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5745 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005746 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005747 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5748
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005749 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005750 } else {
5751 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5752 }
5753
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005754 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005755 } else {
5756 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005757 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005758 // non-fragile mode or the GCC runtime in fragile mode.
5759 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005760 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005761 else
5762 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005763 }
5764
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005765 cmdArgs.push_back(
5766 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005767 return runtime;
5768}
5769
Reid Klecknerc542d372014-06-27 17:02:02 +00005770static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5771 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5772 I += HaveDash;
5773 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005774}
Reid Klecknerc542d372014-06-27 17:02:02 +00005775
Benjamin Kramere003ca22015-10-28 13:54:16 +00005776namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005777struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005778 bool Synch = false;
5779 bool Asynch = false;
5780 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005781};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005782} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005783
5784/// /EH controls whether to run destructor cleanups when exceptions are
5785/// thrown. There are three modifiers:
5786/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5787/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5788/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5789/// - c: Assume that extern "C" functions are implicitly noexcept. This
5790/// modifier is an optimization, so we ignore it for now.
5791/// The default is /EHs-c-, meaning cleanups are disabled.
5792static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5793 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005794
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005795 std::vector<std::string> EHArgs =
5796 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005797 for (auto EHVal : EHArgs) {
5798 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5799 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005800 case 'a':
5801 EH.Asynch = maybeConsumeDash(EHVal, I);
5802 continue;
5803 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005804 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005805 continue;
5806 case 's':
5807 EH.Synch = maybeConsumeDash(EHVal, I);
5808 continue;
5809 default:
5810 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005811 }
5812 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5813 break;
5814 }
5815 }
David Majnemerb8809092016-02-20 09:23:44 +00005816 // The /GX, /GX- flags are only processed if there are not /EH flags.
5817 if (EHArgs.empty() &&
5818 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_)) {
5819 EH.Synch = true;
5820 EH.NoUnwindC = true;
5821 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005822
Reid Klecknerc542d372014-06-27 17:02:02 +00005823 return EH;
5824}
5825
Douglas Katzman3459ce22015-10-08 04:24:12 +00005826void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005827 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005828 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005829 unsigned RTOptionID = options::OPT__SLASH_MT;
5830
Hans Wennborgf1a74252013-09-10 20:18:04 +00005831 if (Args.hasArg(options::OPT__SLASH_LDd))
5832 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5833 // but defining _DEBUG is sticky.
5834 RTOptionID = options::OPT__SLASH_MTd;
5835
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005836 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005837 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005838
David Majnemere2afb472015-07-24 06:49:13 +00005839 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005840 switch (RTOptionID) {
5841 case options::OPT__SLASH_MD:
5842 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005843 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005844 CmdArgs.push_back("-D_MT");
5845 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005846 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005847 break;
5848 case options::OPT__SLASH_MDd:
5849 CmdArgs.push_back("-D_DEBUG");
5850 CmdArgs.push_back("-D_MT");
5851 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005852 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005853 break;
5854 case options::OPT__SLASH_MT:
5855 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005856 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005857 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005858 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005859 break;
5860 case options::OPT__SLASH_MTd:
5861 CmdArgs.push_back("-D_DEBUG");
5862 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005863 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005864 break;
5865 default:
5866 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005867 }
5868
David Majnemere2afb472015-07-24 06:49:13 +00005869 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5870 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5871 } else {
5872 CmdArgs.push_back(FlagForCRT.data());
5873
5874 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5875 // users want. The /Za flag to cl.exe turns this off, but it's not
5876 // implemented in clang.
5877 CmdArgs.push_back("--dependent-lib=oldnames");
5878 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005879
Hans Wennborg8858a032014-07-21 23:42:07 +00005880 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5881 // would produce interleaved output, so ignore /showIncludes in such cases.
5882 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5883 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5884 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005885
David Majnemerf6072342014-07-01 22:24:56 +00005886 // This controls whether or not we emit RTTI data for polymorphic types.
5887 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5888 /*default=*/false))
5889 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005890
Reid Kleckner124955a2015-08-05 18:51:13 +00005891 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005892 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00005893 if (*EmitCodeView)
5894 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00005895 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005896 CmdArgs.push_back("-gcodeview");
5897
Reid Klecknerc542d372014-06-27 17:02:02 +00005898 const Driver &D = getToolChain().getDriver();
5899 EHFlags EH = parseClangCLEHFlags(D, Args);
5900 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005901 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005902 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005903 CmdArgs.push_back("-fexceptions");
5904 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005905
Hans Wennborge50cec32014-06-13 20:59:54 +00005906 // /EP should expand to -E -P.
5907 if (Args.hasArg(options::OPT__SLASH_EP)) {
5908 CmdArgs.push_back("-E");
5909 CmdArgs.push_back("-P");
5910 }
5911
David Majnemera5b195a2015-02-14 01:35:12 +00005912 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005913 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5914 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005915 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5916 else
5917 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5918
5919 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5920 VolatileOptionID = A->getOption().getID();
5921
5922 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5923 CmdArgs.push_back("-fms-volatile");
5924
David Majnemer86c318f2014-02-11 21:05:00 +00005925 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5926 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5927 if (MostGeneralArg && BestCaseArg)
5928 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5929 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5930
5931 if (MostGeneralArg) {
5932 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5933 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5934 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5935
5936 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5937 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5938 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5939 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5940 << FirstConflict->getAsString(Args)
5941 << SecondConflict->getAsString(Args);
5942
5943 if (SingleArg)
5944 CmdArgs.push_back("-fms-memptr-rep=single");
5945 else if (MultipleArg)
5946 CmdArgs.push_back("-fms-memptr-rep=multiple");
5947 else
5948 CmdArgs.push_back("-fms-memptr-rep=virtual");
5949 }
5950
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005951 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5952 A->render(Args, CmdArgs);
5953
Hans Wennborg81f74482013-09-10 01:07:07 +00005954 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5955 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005956 if (Args.hasArg(options::OPT__SLASH_fallback))
5957 CmdArgs.push_back("msvc-fallback");
5958 else
5959 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005960 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005961}
5962
Douglas Katzman95354292015-06-23 20:42:09 +00005963visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005964 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005965 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005966 return CLFallback.get();
5967}
5968
Daniel Sanders7f933f42015-01-30 17:35:23 +00005969void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5970 ArgStringList &CmdArgs) const {
5971 StringRef CPUName;
5972 StringRef ABIName;
5973 const llvm::Triple &Triple = getToolChain().getTriple();
5974 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5975
5976 CmdArgs.push_back("-target-abi");
5977 CmdArgs.push_back(ABIName.data());
5978}
5979
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005980void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005981 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005982 const ArgList &Args,
5983 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005984 ArgStringList CmdArgs;
5985
5986 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5987 const InputInfo &Input = Inputs[0];
5988
James Y Knight2db38f32015-08-15 03:45:25 +00005989 std::string TripleStr =
5990 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5991 const llvm::Triple Triple(TripleStr);
5992
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005993 // Don't warn about "clang -w -c foo.s"
5994 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005995 // and "clang -emit-llvm -c foo.s"
5996 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005997
Rafael Espindola577637a2015-01-03 00:06:04 +00005998 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005999
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006000 // Invoke ourselves in -cc1as mode.
6001 //
6002 // FIXME: Implement custom jobs for internal actions.
6003 CmdArgs.push_back("-cc1as");
6004
6005 // Add the "effective" target triple.
6006 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006007 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6008
6009 // Set the output mode, we currently only expect to be used as a real
6010 // assembler.
6011 CmdArgs.push_back("-filetype");
6012 CmdArgs.push_back("obj");
6013
Eric Christopher45f2e712012-12-18 00:31:10 +00006014 // Set the main file name, so that debug info works even with
6015 // -save-temps or preprocessed assembly.
6016 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006017 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006018
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006019 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006020 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006021 if (!CPU.empty()) {
6022 CmdArgs.push_back("-target-cpu");
6023 CmdArgs.push_back(Args.MakeArgString(CPU));
6024 }
6025
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006026 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006027 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006028
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006029 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006030 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006031
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006032 // Pass along any -I options so we get proper .include search paths.
6033 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6034
Eric Christopherfc3ee562012-01-10 00:38:01 +00006035 // Determine the original source input.
6036 const Action *SourceAction = &JA;
6037 while (SourceAction->getKind() != Action::InputClass) {
6038 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6039 SourceAction = SourceAction->getInputs()[0];
6040 }
6041
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006042 // Forward -g and handle debug info related flags, assuming we are dealing
6043 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006044 if (SourceAction->getType() == types::TY_Asm ||
6045 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006046 bool WantDebug = false;
6047 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006048 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006049 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006050 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6051 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006052 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006053 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006054 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006055 if (DwarfVersion == 0)
6056 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006057 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006058 (WantDebug ? codegenoptions::LimitedDebugInfo
6059 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006060 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006061
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006062 // Add the -fdebug-compilation-dir flag if needed.
6063 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006064
6065 // Set the AT_producer to the clang version when using the integrated
6066 // assembler on assembly source files.
6067 CmdArgs.push_back("-dwarf-debug-producer");
6068 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006069
6070 // And pass along -I options
6071 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006072 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006073
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006074 // Handle -fPIC et al -- the relocation-model affects the assembler
6075 // for some targets.
6076 llvm::Reloc::Model RelocationModel;
6077 unsigned PICLevel;
6078 bool IsPIE;
6079 std::tie(RelocationModel, PICLevel, IsPIE) =
6080 ParsePICArgs(getToolChain(), Triple, Args);
6081
6082 const char *RMName = RelocationModelName(RelocationModel);
6083 if (RMName) {
6084 CmdArgs.push_back("-mrelocation-model");
6085 CmdArgs.push_back(RMName);
6086 }
6087
Kevin Enderby292dc082011-12-22 19:31:58 +00006088 // Optionally embed the -cc1as level arguments into the debug info, for build
6089 // analysis.
6090 if (getToolChain().UseDwarfDebugFlags()) {
6091 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006092 for (const auto &Arg : Args)
6093 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006094
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006095 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006096 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6097 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006098 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006099 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006100 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006101 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006102 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006103 }
6104 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006105 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006106 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006107
6108 // FIXME: Add -static support, once we have it.
6109
Daniel Sanders7f933f42015-01-30 17:35:23 +00006110 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006111 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006112 default:
6113 break;
6114
6115 case llvm::Triple::mips:
6116 case llvm::Triple::mipsel:
6117 case llvm::Triple::mips64:
6118 case llvm::Triple::mips64el:
6119 AddMIPSTargetArgs(Args, CmdArgs);
6120 break;
6121 }
6122
David Blaikie372d9502014-01-17 03:17:40 +00006123 // Consume all the warning flags. Usually this would be handled more
6124 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6125 // doesn't handle that so rather than warning about unused flags that are
6126 // actually used, we'll lie by omission instead.
6127 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006128 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006129
David Blaikie9260ed62013-07-25 21:19:01 +00006130 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6131 getToolChain().getDriver());
6132
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006133 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006134
6135 assert(Output.isFilename() && "Unexpected lipo output.");
6136 CmdArgs.push_back("-o");
6137 CmdArgs.push_back(Output.getFilename());
6138
Daniel Dunbarb440f562010-08-02 02:38:21 +00006139 assert(Input.isFilename() && "Invalid input.");
6140 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006141
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006142 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006143 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006144
6145 // Handle the debug info splitting at object creation time if we're
6146 // creating an object.
6147 // TODO: Currently only works on linux with newer objcopy.
6148 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006149 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006150 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006151 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006152}
6153
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006154void GnuTool::anchor() {}
6155
Daniel Dunbara3246a02009-03-18 08:07:30 +00006156void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006157 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006158 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006159 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006160 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006161 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006162
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006163 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006164 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006165 // It is unfortunate that we have to claim here, as this means
6166 // we will basically never report anything interesting for
6167 // platforms using a generic gcc, even if we are just using gcc
6168 // to get to the assembler.
6169 A->claim();
6170
Daniel Dunbar939c1212010-08-03 16:14:14 +00006171 // Don't forward any -g arguments to assembly steps.
6172 if (isa<AssembleJobAction>(JA) &&
6173 A->getOption().matches(options::OPT_g_Group))
6174 continue;
6175
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006176 // Don't forward any -W arguments to assembly and link steps.
6177 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6178 A->getOption().matches(options::OPT_W_Group))
6179 continue;
6180
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006181 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006182 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006183 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006184
Daniel Dunbar4e295052010-01-25 22:35:08 +00006185 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006186
6187 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006188 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006189 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006190 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006191 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006192 }
6193
Daniel Dunbar5716d872009-05-02 21:41:52 +00006194 // Try to force gcc to match the tool chain we want, if we recognize
6195 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006196 //
6197 // FIXME: The triple class should directly provide the information we want
6198 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006199 switch (getToolChain().getArch()) {
6200 default:
6201 break;
6202 case llvm::Triple::x86:
6203 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006204 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006205 break;
6206 case llvm::Triple::x86_64:
6207 case llvm::Triple::ppc64:
6208 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006209 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006210 break;
6211 case llvm::Triple::sparcel:
6212 CmdArgs.push_back("-EL");
6213 break;
6214 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006215
Daniel Dunbarb440f562010-08-02 02:38:21 +00006216 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006217 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006218 CmdArgs.push_back(Output.getFilename());
6219 } else {
6220 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006221 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006222 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006223
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006224 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006225
6226 // Only pass -x if gcc will understand it; otherwise hope gcc
6227 // understands the suffix correctly. The main use case this would go
6228 // wrong in is for linker inputs if they happened to have an odd
6229 // suffix; really the only way to get this to happen is a command
6230 // like '-x foobar a.c' which will treat a.c like a linker input.
6231 //
6232 // FIXME: For the linker case specifically, can we safely convert
6233 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006234 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006235 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006236 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006237 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006238 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006239 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006240 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006241 else if (II.getType() == types::TY_ModuleFile)
6242 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006243 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006244
Daniel Dunbara3246a02009-03-18 08:07:30 +00006245 if (types::canTypeBeUserSpecified(II.getType())) {
6246 CmdArgs.push_back("-x");
6247 CmdArgs.push_back(types::getTypeName(II.getType()));
6248 }
6249
Daniel Dunbarb440f562010-08-02 02:38:21 +00006250 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006251 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006252 else {
6253 const Arg &A = II.getInputArg();
6254
6255 // Reverse translate some rewritten options.
6256 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6257 CmdArgs.push_back("-lstdc++");
6258 continue;
6259 }
6260
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006261 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006262 A.render(Args, CmdArgs);
6263 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006264 }
6265
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006266 const std::string customGCCName = D.getCCCGenericGCCName();
6267 const char *GCCName;
6268 if (!customGCCName.empty())
6269 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006270 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006271 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006272 } else
6273 GCCName = "gcc";
6274
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006275 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006276 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006277}
6278
Douglas Katzman95354292015-06-23 20:42:09 +00006279void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6280 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006281 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006282}
6283
Douglas Katzman95354292015-06-23 20:42:09 +00006284void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6285 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006286 const Driver &D = getToolChain().getDriver();
6287
Eric Christophercc7ff502015-01-29 00:56:17 +00006288 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006289 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006290 case types::TY_LLVM_IR:
6291 case types::TY_LTO_IR:
6292 case types::TY_LLVM_BC:
6293 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006294 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006295 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006296 // We assume we've got an "integrated" assembler in that gcc will produce an
6297 // object file itself.
6298 case types::TY_Object:
6299 CmdArgs.push_back("-c");
6300 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006301 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006302 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006303 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006304 case types::TY_Nothing:
6305 CmdArgs.push_back("-fsyntax-only");
6306 break;
6307 default:
6308 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006309 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006310}
6311
Douglas Katzman95354292015-06-23 20:42:09 +00006312void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6313 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006314 // The types are (hopefully) good enough.
6315}
6316
Tony Linthicum76329bf2011-12-12 21:14:55 +00006317// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006318void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006319 ArgStringList &CmdArgs) const {
6320}
6321
Douglas Katzman95354292015-06-23 20:42:09 +00006322void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6323 const InputInfo &Output,
6324 const InputInfoList &Inputs,
6325 const ArgList &Args,
6326 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006327 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006328
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006329 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6330 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006331 ArgStringList CmdArgs;
6332
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006333 std::string MArchString = "-march=hexagon";
6334 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006335
6336 RenderExtraToolArgs(JA, CmdArgs);
6337
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006338 std::string AsName = "hexagon-llvm-mc";
6339 std::string MCpuString = "-mcpu=hexagon" +
6340 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6341 CmdArgs.push_back("-filetype=obj");
6342 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6343
Tony Linthicum76329bf2011-12-12 21:14:55 +00006344 if (Output.isFilename()) {
6345 CmdArgs.push_back("-o");
6346 CmdArgs.push_back(Output.getFilename());
6347 } else {
6348 assert(Output.isNothing() && "Unexpected output");
6349 CmdArgs.push_back("-fsyntax-only");
6350 }
6351
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006352 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6353 std::string N = llvm::utostr(G.getValue());
6354 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6355 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006356
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006357 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006358
Tony Linthicum76329bf2011-12-12 21:14:55 +00006359 // Only pass -x if gcc will understand it; otherwise hope gcc
6360 // understands the suffix correctly. The main use case this would go
6361 // wrong in is for linker inputs if they happened to have an odd
6362 // suffix; really the only way to get this to happen is a command
6363 // like '-x foobar a.c' which will treat a.c like a linker input.
6364 //
6365 // FIXME: For the linker case specifically, can we safely convert
6366 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006367 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006368 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006369 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006370 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006371 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006372 else if (II.getType() == types::TY_AST)
6373 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006374 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006375 else if (II.getType() == types::TY_ModuleFile)
6376 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006377 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006378
6379 if (II.isFilename())
6380 CmdArgs.push_back(II.getFilename());
6381 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006382 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006383 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006384 II.getInputArg().render(Args, CmdArgs);
6385 }
6386
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006387 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006388 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006389}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006390
Douglas Katzman95354292015-06-23 20:42:09 +00006391void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6392 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006393}
6394
Douglas Katzman54366072015-07-27 16:53:08 +00006395static void
6396constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006397 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006398 const InputInfo &Output, const InputInfoList &Inputs,
6399 const ArgList &Args, ArgStringList &CmdArgs,
6400 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006401
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006402 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006403
Matthew Curtise689b052012-12-06 15:46:07 +00006404 //----------------------------------------------------------------------------
6405 //
6406 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006407 bool IsStatic = Args.hasArg(options::OPT_static);
6408 bool IsShared = Args.hasArg(options::OPT_shared);
6409 bool IsPIE = Args.hasArg(options::OPT_pie);
6410 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6411 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6412 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6413 bool UseG0 = false;
6414 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006415
Matthew Curtise689b052012-12-06 15:46:07 +00006416 //----------------------------------------------------------------------------
6417 // Silence warnings for various options
6418 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006419 Args.ClaimAllArgs(options::OPT_g_Group);
6420 Args.ClaimAllArgs(options::OPT_emit_llvm);
6421 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6422 // handled somewhere else.
6423 Args.ClaimAllArgs(options::OPT_static_libgcc);
6424
6425 //----------------------------------------------------------------------------
6426 //
6427 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006428 if (Args.hasArg(options::OPT_s))
6429 CmdArgs.push_back("-s");
6430
6431 if (Args.hasArg(options::OPT_r))
6432 CmdArgs.push_back("-r");
6433
6434 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006435 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006436
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006437 CmdArgs.push_back("-march=hexagon");
6438 std::string CpuVer =
6439 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6440 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6441 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006442
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006443 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006444 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006445 // The following should be the default, but doing as hexagon-gcc does.
6446 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006447 }
6448
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006449 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006450 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006451
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006452 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006453 CmdArgs.push_back("-pie");
6454
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006455 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6456 std::string N = llvm::utostr(G.getValue());
6457 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6458 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006459 }
6460
Matthew Curtise689b052012-12-06 15:46:07 +00006461 //----------------------------------------------------------------------------
6462 //
6463 //----------------------------------------------------------------------------
6464 CmdArgs.push_back("-o");
6465 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006466
Matthew Curtise689b052012-12-06 15:46:07 +00006467 //----------------------------------------------------------------------------
6468 // moslib
6469 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006470 std::vector<std::string> OsLibs;
6471 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006472
Sean Silva14facf32015-06-09 01:57:17 +00006473 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6474 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006475 OsLibs.emplace_back(A->getValue());
6476 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006477 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006478 if (OsLibs.empty()) {
6479 OsLibs.push_back("standalone");
6480 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006481 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006482
Matthew Curtise689b052012-12-06 15:46:07 +00006483 //----------------------------------------------------------------------------
6484 // Start Files
6485 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006486 const std::string MCpuSuffix = "/" + CpuVer;
6487 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6488 const std::string RootDir =
6489 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6490 const std::string StartSubDir =
6491 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006492
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006493 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6494 const char *Name) -> std::string {
6495 std::string RelName = SubDir + Name;
6496 std::string P = HTC.GetFilePath(RelName.c_str());
6497 if (llvm::sys::fs::exists(P))
6498 return P;
6499 return RootDir + RelName;
6500 };
6501
6502 if (IncStdLib && IncStartFiles) {
6503 if (!IsShared) {
6504 if (HasStandalone) {
6505 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6506 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006507 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006508 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6509 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006510 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006511 std::string Init = UseShared
6512 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6513 : Find(RootDir, StartSubDir, "/init.o");
6514 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006515 }
6516
6517 //----------------------------------------------------------------------------
6518 // Library Search Paths
6519 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006520 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6521 for (const auto &LibPath : LibPaths)
6522 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006523
6524 //----------------------------------------------------------------------------
6525 //
6526 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006527 Args.AddAllArgs(CmdArgs,
6528 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6529 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006530
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006531 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006532
6533 //----------------------------------------------------------------------------
6534 // Libraries
6535 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006536 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006537 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006538 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006539 CmdArgs.push_back("-lm");
6540 }
6541
6542 CmdArgs.push_back("--start-group");
6543
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006544 if (!IsShared) {
6545 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006546 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006547 CmdArgs.push_back("-lc");
6548 }
6549 CmdArgs.push_back("-lgcc");
6550
6551 CmdArgs.push_back("--end-group");
6552 }
6553
6554 //----------------------------------------------------------------------------
6555 // End files
6556 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006557 if (IncStdLib && IncStartFiles) {
6558 std::string Fini = UseShared
6559 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6560 : Find(RootDir, StartSubDir, "/fini.o");
6561 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006562 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006563}
6564
Douglas Katzman95354292015-06-23 20:42:09 +00006565void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6566 const InputInfo &Output,
6567 const InputInfoList &Inputs,
6568 const ArgList &Args,
6569 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006570 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006571
6572 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006573 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006574 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006575
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006576 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006577 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006578 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006579}
6580// Hexagon tools end.
6581
Tom Stellard8fa33092015-07-18 01:49:05 +00006582void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6583 const InputInfo &Output,
6584 const InputInfoList &Inputs,
6585 const ArgList &Args,
6586 const char *LinkingOutput) const {
6587
6588 std::string Linker = getToolChain().GetProgramPath(getShortName());
6589 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006590 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6591 CmdArgs.push_back("-o");
6592 CmdArgs.push_back(Output.getFilename());
6593 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6594 CmdArgs, Inputs));
6595}
6596// AMDGPU tools end.
6597
Dan Gohman52816862015-12-16 23:30:41 +00006598wasm::Linker::Linker(const ToolChain &TC)
6599 : GnuTool("wasm::Linker", "lld", TC) {}
6600
6601bool wasm::Linker::isLinkJob() const {
6602 return true;
6603}
6604
6605bool wasm::Linker::hasIntegratedCPP() const {
6606 return false;
6607}
6608
6609void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6610 const InputInfo &Output,
6611 const InputInfoList &Inputs,
6612 const ArgList &Args,
6613 const char *LinkingOutput) const {
6614 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6615 ArgStringList CmdArgs;
6616 CmdArgs.push_back("-flavor");
6617 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006618
6619 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006620 // size is of particular importance. This is significantly facilitated by
6621 // the enabling of -ffunction-sections and -fdata-sections in
6622 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006623 if (areOptimizationsEnabled(Args))
6624 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006625
Dan Gohman52816862015-12-16 23:30:41 +00006626 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6627 CmdArgs.push_back("-o");
6628 CmdArgs.push_back(Output.getFilename());
6629 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6630}
6631
Renato Golin7c542b42015-07-27 23:44:45 +00006632const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006633 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006634 if (!Arch.empty())
6635 MArch = Arch;
6636 else
Bernard Ogden31561762013-12-12 13:27:11 +00006637 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006638 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006639
6640 // Handle -march=native.
6641 if (MArch == "native") {
6642 std::string CPU = llvm::sys::getHostCPUName();
6643 if (CPU != "generic") {
6644 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006645 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006646 // If there is no valid architecture suffix for this CPU we don't know how
6647 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006648 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006649 MArch = "";
6650 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006651 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006652 }
6653 }
6654
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006655 return MArch;
6656}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006657
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006658/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006659StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006660 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006661 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6662 // here means an -march=native that we can't handle, so instead return no CPU.
6663 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006664 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006665
John Brawna95c1a82015-05-08 12:52:18 +00006666 // We need to return an empty string here on invalid MArch values as the
6667 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006668 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006669}
6670
6671/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006672std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006673 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006674 // FIXME: Warn on inconsistent use of -mcpu and -march.
6675 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006676 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006677 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006678 // Handle -mcpu=native.
6679 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006680 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006681 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006682 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006683 }
6684
Renato Goline17c5802015-07-27 23:44:42 +00006685 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006686}
6687
6688/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006689/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006690// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006691StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6692 const llvm::Triple &Triple) {
6693 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006694 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006695 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006696 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006697 if (ArchKind == llvm::ARM::AK_INVALID)
6698 // In case of generic Arch, i.e. "arm",
6699 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006700 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006701 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006702 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6703 // armv7k triple if it's actually been specified via "-arch armv7k".
6704 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006705 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006706 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006707 }
Renato Golin3c007252015-05-28 15:05:53 +00006708 if (ArchKind == llvm::ARM::AK_INVALID)
6709 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006710 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006711}
6712
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006713void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006714 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006715 if (Args.hasArg(options::OPT_r))
6716 return;
6717
John Brawn94fd9632015-05-21 12:19:49 +00006718 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6719 // to generate BE-8 executables.
6720 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6721 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006722}
6723
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006724mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006725 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6726 // was first introduced in Release 3. However, other compilers have
6727 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006728 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6729 .Case("mips1", NanLegacy)
6730 .Case("mips2", NanLegacy)
6731 .Case("mips3", NanLegacy)
6732 .Case("mips4", NanLegacy)
6733 .Case("mips5", NanLegacy)
6734 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006735 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006736 .Case("mips32r3", NanLegacy | Nan2008)
6737 .Case("mips32r5", NanLegacy | Nan2008)
6738 .Case("mips32r6", Nan2008)
6739 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006740 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006741 .Case("mips64r3", NanLegacy | Nan2008)
6742 .Case("mips64r5", NanLegacy | Nan2008)
6743 .Case("mips64r6", Nan2008)
6744 .Default(NanLegacy);
6745}
6746
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006747bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6748 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6749 return A && (A->getValue() == StringRef(Value));
6750}
6751
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006752bool mips::isUCLibc(const ArgList &Args) {
6753 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006754 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006755}
6756
Daniel Sanders2bf13662014-07-10 14:40:57 +00006757bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006758 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6759 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006760 .Case("2008", true)
6761 .Case("legacy", false)
6762 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006763
6764 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006765 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006766 .Cases("mips32r6", "mips64r6", true)
6767 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006768
6769 return false;
6770}
6771
Daniel Sanders379d44b2014-07-16 11:52:23 +00006772bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006773 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006774 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006775 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006776 return false;
6777
6778 if (ABIName != "32")
6779 return false;
6780
Toma Tabacu94ea6862015-06-16 13:54:13 +00006781 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6782 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006783 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006784 return false;
6785
Daniel Sanders379d44b2014-07-16 11:52:23 +00006786 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006787 .Cases("mips2", "mips3", "mips4", "mips5", true)
6788 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6789 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6790 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006791}
6792
Toma Tabacu94ea6862015-06-16 13:54:13 +00006793bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6794 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006795 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006796 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6797
6798 // FPXX shouldn't be used if -msingle-float is present.
6799 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6800 options::OPT_mdouble_float))
6801 if (A->getOption().matches(options::OPT_msingle_float))
6802 UseFPXX = false;
6803
6804 return UseFPXX;
6805}
6806
Tim Northover157d9112014-01-16 08:48:16 +00006807llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006808 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6809 // archs which Darwin doesn't use.
6810
6811 // The matching this routine does is fairly pointless, since it is neither the
6812 // complete architecture list, nor a reasonable subset. The problem is that
6813 // historically the driver driver accepts this and also ties its -march=
6814 // handling to the architecture name, so we need to be careful before removing
6815 // support for it.
6816
6817 // This code must be kept in sync with Clang's Darwin specific argument
6818 // translation.
6819
6820 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006821 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6822 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6823 .Case("ppc64", llvm::Triple::ppc64)
6824 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6825 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6826 llvm::Triple::x86)
6827 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6828 // This is derived from the driver driver.
6829 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6830 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6831 .Cases("armv7s", "xscale", llvm::Triple::arm)
6832 .Case("arm64", llvm::Triple::aarch64)
6833 .Case("r600", llvm::Triple::r600)
6834 .Case("amdgcn", llvm::Triple::amdgcn)
6835 .Case("nvptx", llvm::Triple::nvptx)
6836 .Case("nvptx64", llvm::Triple::nvptx64)
6837 .Case("amdil", llvm::Triple::amdil)
6838 .Case("spir", llvm::Triple::spir)
6839 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006840}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006841
Tim Northover157d9112014-01-16 08:48:16 +00006842void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006843 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006844 T.setArch(Arch);
6845
6846 if (Str == "x86_64h")
6847 T.setArchName(Str);
6848 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6849 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006850 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006851 }
6852}
6853
Bob Wilsondecc03e2012-11-23 06:14:39 +00006854const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006855 const InputInfo &Input) {
6856 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006857}
6858
Bob Wilsondecc03e2012-11-23 06:14:39 +00006859const char *Clang::getBaseInputStem(const ArgList &Args,
6860 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006861 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006862
Chris Lattner906bb902011-01-16 08:14:11 +00006863 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006864 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006865
6866 return Str;
6867}
6868
Bob Wilsondecc03e2012-11-23 06:14:39 +00006869const char *Clang::getDependencyFileName(const ArgList &Args,
6870 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006871 // FIXME: Think about this more.
6872 std::string Res;
6873
6874 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006875 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006876 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006877 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006878 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006879 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006880 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006881}
6882
Douglas Katzman95354292015-06-23 20:42:09 +00006883void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6884 const InputInfo &Output,
6885 const InputInfoList &Inputs,
6886 const ArgList &Args,
6887 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006888 const ToolChain &ToolChain = getToolChain();
6889 const Driver &D = ToolChain.getDriver();
6890 ArgStringList CmdArgs;
6891
6892 // Silence warning for "clang -g foo.o -o foo"
6893 Args.ClaimAllArgs(options::OPT_g_Group);
6894 // and "clang -emit-llvm foo.o -o foo"
6895 Args.ClaimAllArgs(options::OPT_emit_llvm);
6896 // and for "clang -w foo.o -o foo". Other warning options are already
6897 // handled somewhere else.
6898 Args.ClaimAllArgs(options::OPT_w);
6899
6900 if (!D.SysRoot.empty())
6901 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6902
6903 // CloudABI only supports static linkage.
6904 CmdArgs.push_back("-Bstatic");
6905 CmdArgs.push_back("--eh-frame-hdr");
6906 CmdArgs.push_back("--gc-sections");
6907
6908 if (Output.isFilename()) {
6909 CmdArgs.push_back("-o");
6910 CmdArgs.push_back(Output.getFilename());
6911 } else {
6912 assert(Output.isNothing() && "Invalid output.");
6913 }
6914
Douglas Katzman78b37b02015-11-17 20:28:07 +00006915 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006916 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6917 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6918 }
6919
6920 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006921 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006922 Args.AddAllArgs(CmdArgs,
6923 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6924 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006925
Teresa Johnson945bc502015-10-15 20:35:53 +00006926 if (D.isUsingLTO())
6927 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006928
6929 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6930
Douglas Katzman78b37b02015-11-17 20:28:07 +00006931 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006932 if (D.CCCIsCXX())
6933 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6934 CmdArgs.push_back("-lc");
6935 CmdArgs.push_back("-lcompiler_rt");
6936 }
6937
Douglas Katzman78b37b02015-11-17 20:28:07 +00006938 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006939 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6940
6941 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006942 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006943}
6944
Douglas Katzman95354292015-06-23 20:42:09 +00006945void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6946 const InputInfo &Output,
6947 const InputInfoList &Inputs,
6948 const ArgList &Args,
6949 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006950 ArgStringList CmdArgs;
6951
6952 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6953 const InputInfo &Input = Inputs[0];
6954
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006955 // Determine the original source input.
6956 const Action *SourceAction = &JA;
6957 while (SourceAction->getKind() != Action::InputClass) {
6958 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6959 SourceAction = SourceAction->getInputs()[0];
6960 }
6961
Eric Christopherf5a8f492015-12-08 00:10:10 +00006962 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006963 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006964 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6965 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006966 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006967 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006968 const llvm::Triple &T(getToolChain().getTriple());
6969 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006970 CmdArgs.push_back("-Q");
6971 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006972
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006973 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006974 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006975 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006976 if (Args.hasArg(options::OPT_gstabs))
6977 CmdArgs.push_back("--gstabs");
6978 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006979 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006980 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006981
Daniel Dunbarbe220842009-03-20 16:06:39 +00006982 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006983 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006984
Daniel Dunbar6d484762010-07-22 01:47:22 +00006985 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006986 if (getToolChain().getArch() == llvm::Triple::x86 ||
6987 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006988 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6989 CmdArgs.push_back("-force_cpusubtype_ALL");
6990
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006991 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006992 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006993 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006994 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006995 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006996 CmdArgs.push_back("-static");
6997
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006998 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006999
7000 assert(Output.isFilename() && "Unexpected lipo output.");
7001 CmdArgs.push_back("-o");
7002 CmdArgs.push_back(Output.getFilename());
7003
Daniel Dunbarb440f562010-08-02 02:38:21 +00007004 assert(Input.isFilename() && "Invalid input.");
7005 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007006
7007 // asm_final spec is empty.
7008
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007009 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007010 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007011}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007012
Tim Northover157d9112014-01-16 08:48:16 +00007013void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007014
Tim Northover157d9112014-01-16 08:48:16 +00007015void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7016 ArgStringList &CmdArgs) const {
7017 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007018
Daniel Dunbarc1964212009-03-26 16:23:12 +00007019 // Derived from darwin_arch spec.
7020 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007021 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007022
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007023 // FIXME: Is this needed anymore?
7024 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007025 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007026}
7027
Douglas Katzman95354292015-06-23 20:42:09 +00007028bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007029 // We only need to generate a temp path for LTO if we aren't compiling object
7030 // files. When compiling source files, we run 'dsymutil' after linking. We
7031 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007032 for (const auto &Input : Inputs)
7033 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007034 return true;
7035
7036 return false;
7037}
7038
Douglas Katzman95354292015-06-23 20:42:09 +00007039void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7040 ArgStringList &CmdArgs,
7041 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007042 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007043 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007044
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007045 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007046 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7047 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007048 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7049 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007050 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007051 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007052 }
7053
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007054 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007055 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007056 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7057 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007058
Bob Wilson3d27dad2013-08-02 22:25:34 +00007059 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7060 CmdArgs.push_back("-export_dynamic");
7061
Bob Wilsonb111ec92015-03-02 19:01:14 +00007062 // If we are using App Extension restrictions, pass a flag to the linker
7063 // telling it that the compiled code has been audited.
7064 if (Args.hasFlag(options::OPT_fapplication_extension,
7065 options::OPT_fno_application_extension, false))
7066 CmdArgs.push_back("-application_extension");
7067
Teresa Johnson945bc502015-10-15 20:35:53 +00007068 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007069 // If we are using LTO, then automatically create a temporary file path for
7070 // the linker to use, so that it's lifetime will extend past a possible
7071 // dsymutil step.
7072 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7073 const char *TmpPath = C.getArgs().MakeArgString(
7074 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7075 C.addTempFile(TmpPath);
7076 CmdArgs.push_back("-object_path_lto");
7077 CmdArgs.push_back(TmpPath);
7078 }
7079
7080 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7081 // it in clang installed libraries. If not found, the option is not used
7082 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7083 if (Version[0] >= 133) {
7084 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7085 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7086 SmallString<128> LibLTOPath(P);
7087 llvm::sys::path::append(LibLTOPath, "lib");
7088 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7089 if (llvm::sys::fs::exists(LibLTOPath)) {
7090 CmdArgs.push_back("-lto_library");
7091 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7092 } else {
7093 D.Diag(diag::warn_drv_lto_libpath);
7094 }
7095 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007096 }
7097
Daniel Dunbarc1964212009-03-26 16:23:12 +00007098 // Derived from the "link" spec.
7099 Args.AddAllArgs(CmdArgs, options::OPT_static);
7100 if (!Args.hasArg(options::OPT_static))
7101 CmdArgs.push_back("-dynamic");
7102 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7103 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7104 // here. How do we wish to handle such things?
7105 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007106
Daniel Dunbarc1964212009-03-26 16:23:12 +00007107 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007108 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007109 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007110 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007111
7112 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7113 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7114 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7115
7116 Arg *A;
7117 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7118 (A = Args.getLastArg(options::OPT_current__version)) ||
7119 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007120 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7121 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007122
7123 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7124 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7125 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7126 } else {
7127 CmdArgs.push_back("-dylib");
7128
7129 Arg *A;
7130 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7131 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7132 (A = Args.getLastArg(options::OPT_client__name)) ||
7133 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7134 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7135 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007136 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7137 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007138
Daniel Dunbarc1964212009-03-26 16:23:12 +00007139 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7140 "-dylib_compatibility_version");
7141 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7142 "-dylib_current_version");
7143
Tim Northover157d9112014-01-16 08:48:16 +00007144 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007145
7146 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7147 "-dylib_install_name");
7148 }
7149
7150 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7151 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7152 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007153 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007154 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007155 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7156 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7157 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7158 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7159 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7160 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007161 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007162 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7163 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7164 Args.AddAllArgs(CmdArgs, options::OPT_init);
7165
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007166 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007167 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007168
Daniel Dunbarc1964212009-03-26 16:23:12 +00007169 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7170 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7171 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7172 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7173 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007174
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007175 if (const Arg *A =
7176 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7177 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007178 if (A->getOption().matches(options::OPT_fpie) ||
7179 A->getOption().matches(options::OPT_fPIE))
7180 CmdArgs.push_back("-pie");
7181 else
7182 CmdArgs.push_back("-no_pie");
7183 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007184
7185 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7186 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7187 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7188 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7189 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7190 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7191 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7192 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7193 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7194 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7195 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7196 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7197 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7198 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7199 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7200 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007201
Daniel Dunbar84384642011-05-02 21:03:47 +00007202 // Give --sysroot= preference, over the Apple specific behavior to also use
7203 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007204 StringRef sysroot = C.getSysRoot();
7205 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007206 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007207 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007208 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7209 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007210 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007211 }
7212
Daniel Dunbarc1964212009-03-26 16:23:12 +00007213 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7214 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7215 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7216 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7217 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007218 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007219 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7220 Args.AddAllArgs(CmdArgs, options::OPT_y);
7221 Args.AddLastArg(CmdArgs, options::OPT_w);
7222 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7223 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7224 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7225 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7226 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7227 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7228 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7229 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7230 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7231 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7232 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7233 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7234}
7235
Douglas Katzman95354292015-06-23 20:42:09 +00007236void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7237 const InputInfo &Output,
7238 const InputInfoList &Inputs,
7239 const ArgList &Args,
7240 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007241 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007242
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007243 // If the number of arguments surpasses the system limits, we will encode the
7244 // input files in a separate file, shortening the command line. To this end,
7245 // build a list of input file names that can be passed via a file with the
7246 // -filelist linker option.
7247 llvm::opt::ArgStringList InputFileList;
7248
Daniel Dunbarc1964212009-03-26 16:23:12 +00007249 // The logic here is derived from gcc's behavior; most of which
7250 // comes from specs (starting with link_command). Consult gcc for
7251 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007252 ArgStringList CmdArgs;
7253
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007254 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7255 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7256 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007257 for (const auto &Arg : Args)
7258 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007259 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007260 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007261 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007262 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007263 return;
7264 }
7265
Daniel Dunbarc1964212009-03-26 16:23:12 +00007266 // I'm not sure why this particular decomposition exists in gcc, but
7267 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007268 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007269
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007270 // It seems that the 'e' option is completely ignored for dynamic executables
7271 // (the default), and with static executables, the last one wins, as expected.
7272 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7273 options::OPT_Z_Flag, options::OPT_u_Group,
7274 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007275
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007276 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7277 // members of static archive libraries which implement Objective-C classes or
7278 // categories.
7279 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7280 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007281
Daniel Dunbarc1964212009-03-26 16:23:12 +00007282 CmdArgs.push_back("-o");
7283 CmdArgs.push_back(Output.getFilename());
7284
Douglas Katzman78b37b02015-11-17 20:28:07 +00007285 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007286 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007287
Peter Collingbournec4122c12015-06-15 21:08:13 +00007288 // SafeStack requires its own runtime libraries
7289 // These libraries should be linked first, to make sure the
7290 // __safestack_init constructor executes before everything else
7291 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7292 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7293 "libclang_rt.safestack_osx.a",
7294 /*AlwaysLink=*/true);
7295 }
7296
Daniel Dunbarc1964212009-03-26 16:23:12 +00007297 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007298
Douglas Gregor9295df02012-05-15 21:00:27 +00007299 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007300 // Build the input file for -filelist (list of linker input files) in case we
7301 // need it later
7302 for (const auto &II : Inputs) {
7303 if (!II.isFilename()) {
7304 // This is a linker input argument.
7305 // We cannot mix input arguments and file names in a -filelist input, thus
7306 // we prematurely stop our list (remaining files shall be passed as
7307 // arguments).
7308 if (InputFileList.size() > 0)
7309 break;
7310
7311 continue;
7312 }
7313
7314 InputFileList.push_back(II.getFilename());
7315 }
7316
Douglas Katzman78b37b02015-11-17 20:28:07 +00007317 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007318 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7319
Douglas Katzman78b37b02015-11-17 20:28:07 +00007320 if (isObjCRuntimeLinked(Args) &&
7321 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007322 // We use arclite library for both ARC and subscripting support.
7323 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7324
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007325 CmdArgs.push_back("-framework");
7326 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007327 // Link libobj.
7328 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007329 }
John McCall31168b02011-06-15 23:02:42 +00007330
Daniel Dunbarc1964212009-03-26 16:23:12 +00007331 if (LinkingOutput) {
7332 CmdArgs.push_back("-arch_multiple");
7333 CmdArgs.push_back("-final_output");
7334 CmdArgs.push_back(LinkingOutput);
7335 }
7336
Daniel Dunbarc1964212009-03-26 16:23:12 +00007337 if (Args.hasArg(options::OPT_fnested_functions))
7338 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007339
Justin Bognerc7701242015-05-12 05:44:36 +00007340 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7341
Douglas Katzman78b37b02015-11-17 20:28:07 +00007342 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007343 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007344 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007345
Daniel Dunbarc1964212009-03-26 16:23:12 +00007346 // link_ssp spec is empty.
7347
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007348 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007349 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007350 }
7351
Douglas Katzman78b37b02015-11-17 20:28:07 +00007352 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007353 // endfile_spec is empty.
7354 }
7355
7356 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7357 Args.AddAllArgs(CmdArgs, options::OPT_F);
7358
Steven Wu3ffb61b2015-02-06 18:08:29 +00007359 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007360 for (const Arg *A : Args.filtered(options::OPT_iframework))
7361 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007362
Douglas Katzman78b37b02015-11-17 20:28:07 +00007363 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007364 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7365 if (A->getValue() == StringRef("Accelerate")) {
7366 CmdArgs.push_back("-framework");
7367 CmdArgs.push_back("Accelerate");
7368 }
7369 }
7370 }
7371
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007372 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007373 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007374 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007375 Cmd->setInputFileList(std::move(InputFileList));
7376 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007377}
7378
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007379void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007380 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007381 const InputInfoList &Inputs,
7382 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007383 const char *LinkingOutput) const {
7384 ArgStringList CmdArgs;
7385
7386 CmdArgs.push_back("-create");
7387 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007388
7389 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007390 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007391
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007392 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007393 assert(II.isFilename() && "Unexpected lipo input.");
7394 CmdArgs.push_back(II.getFilename());
7395 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007396
7397 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007398 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007399}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007400
Daniel Dunbar88299622010-06-04 18:28:36 +00007401void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007402 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007403 const InputInfoList &Inputs,
7404 const ArgList &Args,
7405 const char *LinkingOutput) const {
7406 ArgStringList CmdArgs;
7407
Daniel Dunbareb86b042011-05-09 17:23:16 +00007408 CmdArgs.push_back("-o");
7409 CmdArgs.push_back(Output.getFilename());
7410
Daniel Dunbar88299622010-06-04 18:28:36 +00007411 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7412 const InputInfo &Input = Inputs[0];
7413 assert(Input.isFilename() && "Unexpected dsymutil input.");
7414 CmdArgs.push_back(Input.getFilename());
7415
Daniel Dunbar88299622010-06-04 18:28:36 +00007416 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007417 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007418 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007419}
7420
Eric Christopher551ef452011-08-23 17:56:55 +00007421void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007422 const InputInfo &Output,
7423 const InputInfoList &Inputs,
7424 const ArgList &Args,
7425 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007426 ArgStringList CmdArgs;
7427 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007428 CmdArgs.push_back("--debug-info");
7429 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007430 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007431
7432 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7433 const InputInfo &Input = Inputs[0];
7434 assert(Input.isFilename() && "Unexpected verify input");
7435
7436 // Grabbing the output of the earlier dsymutil run.
7437 CmdArgs.push_back(Input.getFilename());
7438
7439 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007440 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007441 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007442}
7443
Douglas Katzman95354292015-06-23 20:42:09 +00007444void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007445 const InputInfo &Output,
7446 const InputInfoList &Inputs,
7447 const ArgList &Args,
7448 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007449 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007450 ArgStringList CmdArgs;
7451
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007452 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007453
7454 CmdArgs.push_back("-o");
7455 CmdArgs.push_back(Output.getFilename());
7456
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007457 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007458 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007459
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007460 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007461 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007462}
7463
Douglas Katzman95354292015-06-23 20:42:09 +00007464void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7465 const InputInfo &Output,
7466 const InputInfoList &Inputs,
7467 const ArgList &Args,
7468 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007469 ArgStringList CmdArgs;
7470
David Chisnall272a0712012-02-29 15:06:12 +00007471 // Demangle C++ names in errors
7472 CmdArgs.push_back("-C");
7473
Douglas Katzman78b37b02015-11-17 20:28:07 +00007474 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007475 CmdArgs.push_back("-e");
7476 CmdArgs.push_back("_start");
7477 }
7478
7479 if (Args.hasArg(options::OPT_static)) {
7480 CmdArgs.push_back("-Bstatic");
7481 CmdArgs.push_back("-dn");
7482 } else {
7483 CmdArgs.push_back("-Bdynamic");
7484 if (Args.hasArg(options::OPT_shared)) {
7485 CmdArgs.push_back("-shared");
7486 } else {
7487 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007488 CmdArgs.push_back(
7489 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007490 }
7491 }
7492
7493 if (Output.isFilename()) {
7494 CmdArgs.push_back("-o");
7495 CmdArgs.push_back(Output.getFilename());
7496 } else {
7497 assert(Output.isNothing() && "Invalid output.");
7498 }
7499
Douglas Katzman78b37b02015-11-17 20:28:07 +00007500 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007501 if (!Args.hasArg(options::OPT_shared))
7502 CmdArgs.push_back(
7503 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7504
7505 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7506 CmdArgs.push_back(
7507 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7508 CmdArgs.push_back(
7509 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007510 }
7511
Douglas Katzman6059ef92015-11-17 17:41:23 +00007512 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007513
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007514 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7515 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007516
7517 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7518
Douglas Katzman78b37b02015-11-17 20:28:07 +00007519 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007520 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007521 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007522 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007523 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007524 if (!Args.hasArg(options::OPT_shared)) {
7525 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007526 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007527 }
David Chisnallf571cde2012-02-15 13:39:01 +00007528 }
7529
Douglas Katzman78b37b02015-11-17 20:28:07 +00007530 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007531 CmdArgs.push_back(
7532 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007533 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007534 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007535
Xinliang David Li69306c02015-10-22 06:15:31 +00007536 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007537
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007538 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007539 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007540}
7541
Douglas Katzman95354292015-06-23 20:42:09 +00007542void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7543 const InputInfo &Output,
7544 const InputInfoList &Inputs,
7545 const ArgList &Args,
7546 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007547 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007548 ArgStringList CmdArgs;
7549
Rafael Espindolacc126272014-02-28 01:55:21 +00007550 switch (getToolChain().getArch()) {
7551 case llvm::Triple::x86:
7552 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7553 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007554 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007555 break;
7556
7557 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007558 CmdArgs.push_back("-mppc");
7559 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007560 break;
7561
7562 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007563 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007564 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007565 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7566 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7567 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007568 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007569 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007570
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007571 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007572 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007573 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7574 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7575 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007576 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007577 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007578
7579 case llvm::Triple::mips64:
7580 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007581 StringRef CPUName;
7582 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007583 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007584
7585 CmdArgs.push_back("-mabi");
7586 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7587
7588 if (getToolChain().getArch() == llvm::Triple::mips64)
7589 CmdArgs.push_back("-EB");
7590 else
7591 CmdArgs.push_back("-EL");
7592
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007593 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007594 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007595 }
7596
Rafael Espindolacc126272014-02-28 01:55:21 +00007597 default:
7598 break;
7599 }
7600
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007601 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007602
7603 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007604 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007605
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007606 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007607 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007608
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007609 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007610 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007611}
7612
Douglas Katzman95354292015-06-23 20:42:09 +00007613void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7614 const InputInfo &Output,
7615 const InputInfoList &Inputs,
7616 const ArgList &Args,
7617 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007618 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007619 ArgStringList CmdArgs;
7620
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007621 // Silence warning for "clang -g foo.o -o foo"
7622 Args.ClaimAllArgs(options::OPT_g_Group);
7623 // and "clang -emit-llvm foo.o -o foo"
7624 Args.ClaimAllArgs(options::OPT_emit_llvm);
7625 // and for "clang -w foo.o -o foo". Other warning options are already
7626 // handled somewhere else.
7627 Args.ClaimAllArgs(options::OPT_w);
7628
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007629 if (getToolChain().getArch() == llvm::Triple::mips64)
7630 CmdArgs.push_back("-EB");
7631 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7632 CmdArgs.push_back("-EL");
7633
Douglas Katzman78b37b02015-11-17 20:28:07 +00007634 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007635 CmdArgs.push_back("-e");
7636 CmdArgs.push_back("__start");
7637 }
7638
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007639 if (Args.hasArg(options::OPT_static)) {
7640 CmdArgs.push_back("-Bstatic");
7641 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007642 if (Args.hasArg(options::OPT_rdynamic))
7643 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007644 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007645 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007646 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007647 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007648 } else {
7649 CmdArgs.push_back("-dynamic-linker");
7650 CmdArgs.push_back("/usr/libexec/ld.so");
7651 }
7652 }
7653
Rafael Espindola044f7832013-06-05 04:28:55 +00007654 if (Args.hasArg(options::OPT_nopie))
7655 CmdArgs.push_back("-nopie");
7656
Daniel Dunbarb440f562010-08-02 02:38:21 +00007657 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007658 CmdArgs.push_back("-o");
7659 CmdArgs.push_back(Output.getFilename());
7660 } else {
7661 assert(Output.isNothing() && "Invalid output.");
7662 }
7663
Douglas Katzman78b37b02015-11-17 20:28:07 +00007664 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007665 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007666 if (Args.hasArg(options::OPT_pg))
7667 CmdArgs.push_back(
7668 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007669 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007670 CmdArgs.push_back(
7671 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7672 CmdArgs.push_back(
7673 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007674 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007675 CmdArgs.push_back(
7676 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007677 }
7678 }
7679
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007680 std::string Triple = getToolChain().getTripleString();
7681 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007682 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007683 CmdArgs.push_back(
7684 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007685
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007686 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7687 options::OPT_e, options::OPT_s, options::OPT_t,
7688 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007689
Daniel Dunbar54423b22010-09-17 00:24:54 +00007690 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007691
Douglas Katzman78b37b02015-11-17 20:28:07 +00007692 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007693 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007694 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007695 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007696 CmdArgs.push_back("-lm_p");
7697 else
7698 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007699 }
7700
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007701 // FIXME: For some reason GCC passes -lgcc before adding
7702 // the default system libraries. Just mimic this for now.
7703 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007704
Eric Christopher17674ec2012-09-13 06:32:34 +00007705 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007706 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7707 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007708 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007709 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007710 }
7711
Chandler Carruth45661652011-12-17 22:32:42 +00007712 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007713 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007714 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007715 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007716 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007717 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007718
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007719 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007720 }
7721
Douglas Katzman78b37b02015-11-17 20:28:07 +00007722 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007723 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007724 CmdArgs.push_back(
7725 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007726 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007727 CmdArgs.push_back(
7728 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007729 }
7730
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007731 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007732 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007733}
Ed Schoutene33194b2009-04-02 19:13:12 +00007734
Douglas Katzman95354292015-06-23 20:42:09 +00007735void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7736 const InputInfo &Output,
7737 const InputInfoList &Inputs,
7738 const ArgList &Args,
7739 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007740 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007741 ArgStringList CmdArgs;
7742
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007743 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007744
7745 CmdArgs.push_back("-o");
7746 CmdArgs.push_back(Output.getFilename());
7747
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007748 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007749 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007750
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007751 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007752 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007753}
7754
Douglas Katzman95354292015-06-23 20:42:09 +00007755void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7756 const InputInfo &Output,
7757 const InputInfoList &Inputs,
7758 const ArgList &Args,
7759 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007760 const Driver &D = getToolChain().getDriver();
7761 ArgStringList CmdArgs;
7762
Douglas Katzman78b37b02015-11-17 20:28:07 +00007763 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007764 CmdArgs.push_back("-e");
7765 CmdArgs.push_back("__start");
7766 }
7767
7768 if (Args.hasArg(options::OPT_static)) {
7769 CmdArgs.push_back("-Bstatic");
7770 } else {
7771 if (Args.hasArg(options::OPT_rdynamic))
7772 CmdArgs.push_back("-export-dynamic");
7773 CmdArgs.push_back("--eh-frame-hdr");
7774 CmdArgs.push_back("-Bdynamic");
7775 if (Args.hasArg(options::OPT_shared)) {
7776 CmdArgs.push_back("-shared");
7777 } else {
7778 CmdArgs.push_back("-dynamic-linker");
7779 CmdArgs.push_back("/usr/libexec/ld.so");
7780 }
7781 }
7782
7783 if (Output.isFilename()) {
7784 CmdArgs.push_back("-o");
7785 CmdArgs.push_back(Output.getFilename());
7786 } else {
7787 assert(Output.isNothing() && "Invalid output.");
7788 }
7789
Douglas Katzman78b37b02015-11-17 20:28:07 +00007790 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007791 if (!Args.hasArg(options::OPT_shared)) {
7792 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007793 CmdArgs.push_back(
7794 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007795 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007796 CmdArgs.push_back(
7797 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7798 CmdArgs.push_back(
7799 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007800 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007801 CmdArgs.push_back(
7802 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007803 }
7804 }
7805
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007806 Args.AddAllArgs(CmdArgs,
7807 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007808
7809 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7810
Douglas Katzman78b37b02015-11-17 20:28:07 +00007811 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007812 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007813 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7814 if (Args.hasArg(options::OPT_pg))
7815 CmdArgs.push_back("-lm_p");
7816 else
7817 CmdArgs.push_back("-lm");
7818 }
7819
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007820 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007821 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007822 CmdArgs.push_back("-lpthread_p");
7823 else
7824 CmdArgs.push_back("-lpthread");
7825 }
7826
Eli Friedman9fa28852012-08-08 23:57:20 +00007827 if (!Args.hasArg(options::OPT_shared)) {
7828 if (Args.hasArg(options::OPT_pg))
7829 CmdArgs.push_back("-lc_p");
7830 else
7831 CmdArgs.push_back("-lc");
7832 }
7833
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007834 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007835 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007836 case llvm::Triple::arm:
7837 MyArch = "arm";
7838 break;
7839 case llvm::Triple::x86:
7840 MyArch = "i386";
7841 break;
7842 case llvm::Triple::x86_64:
7843 MyArch = "amd64";
7844 break;
7845 default:
7846 llvm_unreachable("Unsupported architecture");
7847 }
7848 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007849 }
7850
Douglas Katzman78b37b02015-11-17 20:28:07 +00007851 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007852 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007853 CmdArgs.push_back(
7854 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007855 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007856 CmdArgs.push_back(
7857 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007858 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007859
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007860 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007861 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007862}
7863
Douglas Katzman95354292015-06-23 20:42:09 +00007864void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7865 const InputInfo &Output,
7866 const InputInfoList &Inputs,
7867 const ArgList &Args,
7868 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007869 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007870 ArgStringList CmdArgs;
7871
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007872 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7873 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007874 switch (getToolChain().getArch()) {
7875 default:
7876 break;
7877 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007878 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007879 break;
7880 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007881 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007882 break;
7883 case llvm::Triple::mips:
7884 case llvm::Triple::mipsel:
7885 case llvm::Triple::mips64:
7886 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007887 StringRef CPUName;
7888 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007889 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007890
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007891 CmdArgs.push_back("-march");
7892 CmdArgs.push_back(CPUName.data());
7893
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007894 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007895 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007896
7897 if (getToolChain().getArch() == llvm::Triple::mips ||
7898 getToolChain().getArch() == llvm::Triple::mips64)
7899 CmdArgs.push_back("-EB");
7900 else
7901 CmdArgs.push_back("-EL");
7902
Dimitry Andric46f338c2015-12-27 10:36:44 +00007903 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7904 StringRef v = A->getValue();
7905 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7906 A->claim();
7907 }
7908
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007909 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007910 break;
7911 }
7912 case llvm::Triple::arm:
7913 case llvm::Triple::armeb:
7914 case llvm::Triple::thumb:
7915 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007916 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007917
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007918 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007919 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007920 else
Renato Golinf4421f72014-02-19 10:44:07 +00007921 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007922
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007923 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007924 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007925 case llvm::Triple::GNUEABI:
7926 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007927 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007928 break;
7929
7930 default:
7931 CmdArgs.push_back("-matpcs");
7932 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007933 break;
7934 }
7935 case llvm::Triple::sparc:
7936 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007937 case llvm::Triple::sparcv9: {
7938 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7939 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007940 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007941 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007942 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007943 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007945 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007946
7947 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007948 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007949
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007950 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007951 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007952
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007953 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007954 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007955}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007956
Douglas Katzman95354292015-06-23 20:42:09 +00007957void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7958 const InputInfo &Output,
7959 const InputInfoList &Inputs,
7960 const ArgList &Args,
7961 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007962 const toolchains::FreeBSD &ToolChain =
7963 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007964 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007965 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007966 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007967 !Args.hasArg(options::OPT_shared) &&
7968 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007969 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007970
7971 // Silence warning for "clang -g foo.o -o foo"
7972 Args.ClaimAllArgs(options::OPT_g_Group);
7973 // and "clang -emit-llvm foo.o -o foo"
7974 Args.ClaimAllArgs(options::OPT_emit_llvm);
7975 // and for "clang -w foo.o -o foo". Other warning options are already
7976 // handled somewhere else.
7977 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007978
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007979 if (!D.SysRoot.empty())
7980 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7981
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007982 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007983 CmdArgs.push_back("-pie");
7984
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007985 if (Args.hasArg(options::OPT_static)) {
7986 CmdArgs.push_back("-Bstatic");
7987 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007988 if (Args.hasArg(options::OPT_rdynamic))
7989 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007990 CmdArgs.push_back("--eh-frame-hdr");
7991 if (Args.hasArg(options::OPT_shared)) {
7992 CmdArgs.push_back("-Bshareable");
7993 } else {
7994 CmdArgs.push_back("-dynamic-linker");
7995 CmdArgs.push_back("/libexec/ld-elf.so.1");
7996 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007997 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007998 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7999 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8000 CmdArgs.push_back("--hash-style=both");
8001 }
8002 }
8003 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008004 }
8005
8006 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8007 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008008 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008009 CmdArgs.push_back("-m");
8010 CmdArgs.push_back("elf_i386_fbsd");
8011 }
8012
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008013 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008014 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008015 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008016 }
8017
Dimitry Andric904895f2015-12-27 06:47:09 +00008018 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8019 if (ToolChain.getArch() == llvm::Triple::mips ||
8020 ToolChain.getArch() == llvm::Triple::mipsel ||
8021 ToolChain.getArch() == llvm::Triple::mips64 ||
8022 ToolChain.getArch() == llvm::Triple::mips64el) {
8023 StringRef v = A->getValue();
8024 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8025 A->claim();
8026 }
8027 }
8028
Daniel Dunbarb440f562010-08-02 02:38:21 +00008029 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008030 CmdArgs.push_back("-o");
8031 CmdArgs.push_back(Output.getFilename());
8032 } else {
8033 assert(Output.isNothing() && "Invalid output.");
8034 }
8035
Douglas Katzman78b37b02015-11-17 20:28:07 +00008036 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008037 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008038 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008039 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008040 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008041 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008042 crt1 = "Scrt1.o";
8043 else
8044 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008045 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008046 if (crt1)
8047 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8048
8049 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8050
Craig Topper92fc2df2014-05-17 16:56:41 +00008051 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008052 if (Args.hasArg(options::OPT_static))
8053 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008054 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008055 crtbegin = "crtbeginS.o";
8056 else
8057 crtbegin = "crtbegin.o";
8058
8059 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008060 }
8061
8062 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008063 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008064 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8065 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008066 Args.AddAllArgs(CmdArgs, options::OPT_s);
8067 Args.AddAllArgs(CmdArgs, options::OPT_t);
8068 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8069 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008070
Teresa Johnson945bc502015-10-15 20:35:53 +00008071 if (D.isUsingLTO())
8072 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008073
Alexey Samsonov52550342014-09-15 19:58:40 +00008074 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008075 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008076
Douglas Katzman78b37b02015-11-17 20:28:07 +00008077 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008078 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008079 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008080 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008081 if (Args.hasArg(options::OPT_pg))
8082 CmdArgs.push_back("-lm_p");
8083 else
8084 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008085 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008086 if (NeedsSanitizerDeps)
8087 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008088 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8089 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008090 if (Args.hasArg(options::OPT_pg))
8091 CmdArgs.push_back("-lgcc_p");
8092 else
8093 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008094 if (Args.hasArg(options::OPT_static)) {
8095 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008096 } else if (Args.hasArg(options::OPT_pg)) {
8097 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008098 } else {
8099 CmdArgs.push_back("--as-needed");
8100 CmdArgs.push_back("-lgcc_s");
8101 CmdArgs.push_back("--no-as-needed");
8102 }
8103
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008104 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008105 if (Args.hasArg(options::OPT_pg))
8106 CmdArgs.push_back("-lpthread_p");
8107 else
8108 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008109 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008110
Roman Divacky66f22762011-02-10 16:59:40 +00008111 if (Args.hasArg(options::OPT_pg)) {
8112 if (Args.hasArg(options::OPT_shared))
8113 CmdArgs.push_back("-lc");
8114 else
8115 CmdArgs.push_back("-lc_p");
8116 CmdArgs.push_back("-lgcc_p");
8117 } else {
8118 CmdArgs.push_back("-lc");
8119 CmdArgs.push_back("-lgcc");
8120 }
8121
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008122 if (Args.hasArg(options::OPT_static)) {
8123 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008124 } else if (Args.hasArg(options::OPT_pg)) {
8125 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008126 } else {
8127 CmdArgs.push_back("--as-needed");
8128 CmdArgs.push_back("-lgcc_s");
8129 CmdArgs.push_back("--no-as-needed");
8130 }
8131 }
8132
Douglas Katzman78b37b02015-11-17 20:28:07 +00008133 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008134 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008135 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008136 else
8137 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008138 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008139 }
8140
Xinliang David Li69306c02015-10-22 06:15:31 +00008141 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008142
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008143 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008144 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008145}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008146
Douglas Katzman95354292015-06-23 20:42:09 +00008147void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008148 const InputInfo &Output,
8149 const InputInfoList &Inputs,
8150 const ArgList &Args,
8151 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008152 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008153 ArgStringList CmdArgs;
8154
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008155 // GNU as needs different flags for creating the correct output format
8156 // on architectures with different ABIs or optional feature sets.
8157 switch (getToolChain().getArch()) {
8158 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008159 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008160 break;
8161 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008162 case llvm::Triple::armeb:
8163 case llvm::Triple::thumb:
8164 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008165 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008166 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8167 std::string Arch =
8168 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008169 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008170 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008171 }
8172
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008173 case llvm::Triple::mips:
8174 case llvm::Triple::mipsel:
8175 case llvm::Triple::mips64:
8176 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008177 StringRef CPUName;
8178 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008179 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008180
8181 CmdArgs.push_back("-march");
8182 CmdArgs.push_back(CPUName.data());
8183
8184 CmdArgs.push_back("-mabi");
8185 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8186
8187 if (getToolChain().getArch() == llvm::Triple::mips ||
8188 getToolChain().getArch() == llvm::Triple::mips64)
8189 CmdArgs.push_back("-EB");
8190 else
8191 CmdArgs.push_back("-EL");
8192
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008193 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008194 break;
8195 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008196
8197 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008198 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008199 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008200 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8201 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008202 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008203 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008204 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008205
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008206 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008207 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008208 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8209 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008210 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008211 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008212 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008213
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008214 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008215 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008216 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008217
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008218 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008219
8220 CmdArgs.push_back("-o");
8221 CmdArgs.push_back(Output.getFilename());
8222
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008223 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008224 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008225
David Chisnallddbd68f2011-09-27 22:03:18 +00008226 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008227 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008228}
8229
Douglas Katzman95354292015-06-23 20:42:09 +00008230void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8231 const InputInfo &Output,
8232 const InputInfoList &Inputs,
8233 const ArgList &Args,
8234 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008235 const Driver &D = getToolChain().getDriver();
8236 ArgStringList CmdArgs;
8237
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008238 if (!D.SysRoot.empty())
8239 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8240
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008241 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008242 if (Args.hasArg(options::OPT_static)) {
8243 CmdArgs.push_back("-Bstatic");
8244 } else {
8245 if (Args.hasArg(options::OPT_rdynamic))
8246 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008247 if (Args.hasArg(options::OPT_shared)) {
8248 CmdArgs.push_back("-Bshareable");
8249 } else {
8250 CmdArgs.push_back("-dynamic-linker");
8251 CmdArgs.push_back("/libexec/ld.elf_so");
8252 }
8253 }
8254
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008255 // Many NetBSD architectures support more than one ABI.
8256 // Determine the correct emulation for ld.
8257 switch (getToolChain().getArch()) {
8258 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008259 CmdArgs.push_back("-m");
8260 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008261 break;
8262 case llvm::Triple::arm:
8263 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008264 CmdArgs.push_back("-m");
8265 switch (getToolChain().getTriple().getEnvironment()) {
8266 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008267 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008268 CmdArgs.push_back("armelf_nbsd_eabi");
8269 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008270 case llvm::Triple::EABIHF:
8271 case llvm::Triple::GNUEABIHF:
8272 CmdArgs.push_back("armelf_nbsd_eabihf");
8273 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008274 default:
8275 CmdArgs.push_back("armelf_nbsd");
8276 break;
8277 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008278 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008279 case llvm::Triple::armeb:
8280 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008281 arm::appendEBLinkFlags(
8282 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008283 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008284 CmdArgs.push_back("-m");
8285 switch (getToolChain().getTriple().getEnvironment()) {
8286 case llvm::Triple::EABI:
8287 case llvm::Triple::GNUEABI:
8288 CmdArgs.push_back("armelfb_nbsd_eabi");
8289 break;
8290 case llvm::Triple::EABIHF:
8291 case llvm::Triple::GNUEABIHF:
8292 CmdArgs.push_back("armelfb_nbsd_eabihf");
8293 break;
8294 default:
8295 CmdArgs.push_back("armelfb_nbsd");
8296 break;
8297 }
8298 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008299 case llvm::Triple::mips64:
8300 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008301 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008302 CmdArgs.push_back("-m");
8303 if (getToolChain().getArch() == llvm::Triple::mips64)
8304 CmdArgs.push_back("elf32btsmip");
8305 else
8306 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008307 } else if (mips::hasMipsAbiArg(Args, "64")) {
8308 CmdArgs.push_back("-m");
8309 if (getToolChain().getArch() == llvm::Triple::mips64)
8310 CmdArgs.push_back("elf64btsmip");
8311 else
8312 CmdArgs.push_back("elf64ltsmip");
8313 }
8314 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008315 case llvm::Triple::ppc:
8316 CmdArgs.push_back("-m");
8317 CmdArgs.push_back("elf32ppc_nbsd");
8318 break;
8319
8320 case llvm::Triple::ppc64:
8321 case llvm::Triple::ppc64le:
8322 CmdArgs.push_back("-m");
8323 CmdArgs.push_back("elf64ppc");
8324 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008325
8326 case llvm::Triple::sparc:
8327 CmdArgs.push_back("-m");
8328 CmdArgs.push_back("elf32_sparc");
8329 break;
8330
8331 case llvm::Triple::sparcv9:
8332 CmdArgs.push_back("-m");
8333 CmdArgs.push_back("elf64_sparc");
8334 break;
8335
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008336 default:
8337 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008338 }
8339
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008340 if (Output.isFilename()) {
8341 CmdArgs.push_back("-o");
8342 CmdArgs.push_back(Output.getFilename());
8343 } else {
8344 assert(Output.isNothing() && "Invalid output.");
8345 }
8346
Douglas Katzman78b37b02015-11-17 20:28:07 +00008347 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008348 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008349 CmdArgs.push_back(
8350 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8351 CmdArgs.push_back(
8352 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8353 CmdArgs.push_back(
8354 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008355 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008356 CmdArgs.push_back(
8357 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8358 CmdArgs.push_back(
8359 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008360 }
8361 }
8362
8363 Args.AddAllArgs(CmdArgs, options::OPT_L);
8364 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8365 Args.AddAllArgs(CmdArgs, options::OPT_e);
8366 Args.AddAllArgs(CmdArgs, options::OPT_s);
8367 Args.AddAllArgs(CmdArgs, options::OPT_t);
8368 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8369 Args.AddAllArgs(CmdArgs, options::OPT_r);
8370
8371 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8372
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008373 unsigned Major, Minor, Micro;
8374 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8375 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008376 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008377 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008378 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008379 case llvm::Triple::arm:
8380 case llvm::Triple::armeb:
8381 case llvm::Triple::thumb:
8382 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008383 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008384 case llvm::Triple::ppc64:
8385 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008386 case llvm::Triple::sparc:
8387 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008388 case llvm::Triple::x86:
8389 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008390 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008391 break;
8392 default:
8393 break;
8394 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008395 }
8396
Douglas Katzman78b37b02015-11-17 20:28:07 +00008397 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008398 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008399 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008400 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8401 CmdArgs.push_back("-lm");
8402 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008403 if (Args.hasArg(options::OPT_pthread))
8404 CmdArgs.push_back("-lpthread");
8405 CmdArgs.push_back("-lc");
8406
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008407 if (useLibgcc) {
8408 if (Args.hasArg(options::OPT_static)) {
8409 // libgcc_eh depends on libc, so resolve as much as possible,
8410 // pull in any new requirements from libc and then get the rest
8411 // of libgcc.
8412 CmdArgs.push_back("-lgcc_eh");
8413 CmdArgs.push_back("-lc");
8414 CmdArgs.push_back("-lgcc");
8415 } else {
8416 CmdArgs.push_back("-lgcc");
8417 CmdArgs.push_back("--as-needed");
8418 CmdArgs.push_back("-lgcc_s");
8419 CmdArgs.push_back("--no-as-needed");
8420 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008421 }
8422 }
8423
Douglas Katzman78b37b02015-11-17 20:28:07 +00008424 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008425 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008426 CmdArgs.push_back(
8427 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008428 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008429 CmdArgs.push_back(
8430 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8431 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008432 }
8433
Xinliang David Li69306c02015-10-22 06:15:31 +00008434 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008435
Logan Chieneb9162f2014-06-26 14:23:45 +00008436 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008437 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008438}
8439
Douglas Katzman95354292015-06-23 20:42:09 +00008440void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8441 const InputInfo &Output,
8442 const InputInfoList &Inputs,
8443 const ArgList &Args,
8444 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008445 claimNoWarnArgs(Args);
8446
James Y Knight2db38f32015-08-15 03:45:25 +00008447 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8448 llvm::Triple Triple = llvm::Triple(TripleStr);
8449
Rafael Espindola92b00932010-08-10 00:25:48 +00008450 ArgStringList CmdArgs;
8451
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008452 llvm::Reloc::Model RelocationModel;
8453 unsigned PICLevel;
8454 bool IsPIE;
8455 std::tie(RelocationModel, PICLevel, IsPIE) =
8456 ParsePICArgs(getToolChain(), Triple, Args);
8457
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008458 switch (getToolChain().getArch()) {
8459 default:
8460 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008461 // Add --32/--64 to make sure we get the format we want.
8462 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008463 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008464 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008465 break;
8466 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008467 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8468 CmdArgs.push_back("--x32");
8469 else
8470 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008471 break;
8472 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008473 CmdArgs.push_back("-a32");
8474 CmdArgs.push_back("-mppc");
8475 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008476 break;
8477 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008478 CmdArgs.push_back("-a64");
8479 CmdArgs.push_back("-mppc64");
8480 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008481 break;
8482 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008483 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008484 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008485 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008486 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008487 break;
8488 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008489 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008490 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008491 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8492 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8493 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008494 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008495 }
8496 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008497 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008498 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8499 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8500 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008501 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008502 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008503 case llvm::Triple::arm:
8504 case llvm::Triple::armeb:
8505 case llvm::Triple::thumb:
8506 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008507 const llvm::Triple &Triple2 = getToolChain().getTriple();
8508 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008509 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008510 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008511 break;
8512 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008513 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008514 break;
8515 default:
8516 break;
8517 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008518
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008519 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008520 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8521 case arm::FloatABI::Soft:
8522 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8523 break;
8524 case arm::FloatABI::SoftFP:
8525 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8526 break;
8527 case arm::FloatABI::Hard:
8528 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8529 break;
8530 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008531
8532 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008533
8534 // FIXME: remove krait check when GNU tools support krait cpu
8535 // for now replace it with -march=armv7-a to avoid a lower
8536 // march from being picked in the absence of a cpu flag.
8537 Arg *A;
8538 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008539 StringRef(A->getValue()).lower() == "krait")
8540 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008541 else
8542 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008543 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008544 break;
8545 }
8546 case llvm::Triple::mips:
8547 case llvm::Triple::mipsel:
8548 case llvm::Triple::mips64:
8549 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008550 StringRef CPUName;
8551 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008552 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008553 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008554
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008555 CmdArgs.push_back("-march");
8556 CmdArgs.push_back(CPUName.data());
8557
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008558 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008559 CmdArgs.push_back(ABIName.data());
8560
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008561 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8562 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008563 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008564 CmdArgs.push_back("-mno-shared");
8565
Daniel Sanders379d44b2014-07-16 11:52:23 +00008566 // LLVM doesn't support -mplt yet and acts as if it is always given.
8567 // However, -mplt has no effect with the N64 ABI.
8568 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008569
8570 if (getToolChain().getArch() == llvm::Triple::mips ||
8571 getToolChain().getArch() == llvm::Triple::mips64)
8572 CmdArgs.push_back("-EB");
8573 else
8574 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008575
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008576 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8577 if (StringRef(A->getValue()) == "2008")
8578 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8579 }
8580
Daniel Sanders379d44b2014-07-16 11:52:23 +00008581 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8582 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8583 options::OPT_mfp64)) {
8584 A->claim();
8585 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008586 } else if (mips::shouldUseFPXX(
8587 Args, getToolChain().getTriple(), CPUName, ABIName,
8588 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008589 CmdArgs.push_back("-mfpxx");
8590
8591 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8592 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008593 if (Arg *A =
8594 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008595 if (A->getOption().matches(options::OPT_mips16)) {
8596 A->claim();
8597 A->render(Args, CmdArgs);
8598 } else {
8599 A->claim();
8600 CmdArgs.push_back("-no-mips16");
8601 }
8602 }
8603
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008604 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8605 options::OPT_mno_micromips);
8606 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8607 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8608
Simon Atanasyanbd986632013-11-26 11:58:04 +00008609 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8610 // Do not use AddLastArg because not all versions of MIPS assembler
8611 // support -mmsa / -mno-msa options.
8612 if (A->getOption().matches(options::OPT_mmsa))
8613 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8614 }
8615
Daniel Sanders379d44b2014-07-16 11:52:23 +00008616 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8617 options::OPT_msoft_float);
8618
Toma Tabacub36d6102015-06-11 12:13:18 +00008619 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8620 options::OPT_msingle_float);
8621
Daniel Sanders379d44b2014-07-16 11:52:23 +00008622 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8623 options::OPT_mno_odd_spreg);
8624
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008625 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008626 break;
8627 }
8628 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008629 // Always pass an -march option, since our default of z10 is later
8630 // than the GNU assembler's default.
8631 StringRef CPUName = getSystemZTargetCPU(Args);
8632 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008633 break;
8634 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008635 }
8636
Renato Golina74bbc72015-07-22 15:32:36 +00008637 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008638 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008639
8640 CmdArgs.push_back("-o");
8641 CmdArgs.push_back(Output.getFilename());
8642
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008643 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008644 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008645
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008646 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008648
8649 // Handle the debug info splitting at object creation time if we're
8650 // creating an object.
8651 // TODO: Currently only works on linux with newer objcopy.
8652 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008653 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008654 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008655 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008656}
8657
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008658static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008659 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008660 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008661 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008662 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8663 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008664 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008665 CmdArgs.push_back("-lgcc");
8666
Logan Chien3d3373c2012-11-19 12:04:11 +00008667 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008668 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008669 CmdArgs.push_back("-lgcc");
8670 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008671 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008672 CmdArgs.push_back("--as-needed");
8673 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008674 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008675 CmdArgs.push_back("--no-as-needed");
8676 }
8677
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008678 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008679 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008680 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008681 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008682
8683 // According to Android ABI, we have to link with libdl if we are
8684 // linking with non-static libgcc.
8685 //
8686 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8687 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8688 if (isAndroid && !StaticLibgcc)
8689 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008690}
8691
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008692static std::string getLinuxDynamicLinker(const ArgList &Args,
8693 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008694 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8695
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008696 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008697 if (ToolChain.getTriple().isArch64Bit())
8698 return "/system/bin/linker64";
8699 else
8700 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008701 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8702 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008703 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008704 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008705 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008706 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008707 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008708 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008709 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008710 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008711 return "/lib/ld-linux-armhf.so.3";
8712 else
8713 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008714 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8715 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008716 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008717 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008718 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008719 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008720 return "/lib/ld-linux.so.3";
8721 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8722 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008723 std::string LibDir =
8724 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008725 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008726 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008727 if (mips::isUCLibc(Args))
8728 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008729 else if (!ToolChain.getTriple().hasEnvironment()) {
8730 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8731 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8732 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8733 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008734 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008735
8736 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008737 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008738 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008739 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008740 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8741 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008742 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008743 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008744 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8745 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008746 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008747 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008748 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008749 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008750 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008751 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008752 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8753 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008754 else
8755 return "/lib64/ld-linux-x86-64.so.2";
8756}
8757
Renato Golinc4b49242014-02-13 10:01:16 +00008758static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008759 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008760 // Make use of compiler-rt if --rtlib option is used
8761 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8762
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008763 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008764 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008765 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008766 default:
8767 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008768 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008769 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008770 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008771 break;
8772 }
Renato Golinc4b49242014-02-13 10:01:16 +00008773 break;
8774 case ToolChain::RLT_Libgcc:
8775 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8776 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008777 }
8778}
8779
Rafael Espindola1e085772014-08-15 17:14:35 +00008780static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8781 switch (T.getArch()) {
8782 case llvm::Triple::x86:
8783 return "elf_i386";
8784 case llvm::Triple::aarch64:
8785 return "aarch64linux";
8786 case llvm::Triple::aarch64_be:
8787 return "aarch64_be_linux";
8788 case llvm::Triple::arm:
8789 case llvm::Triple::thumb:
8790 return "armelf_linux_eabi";
8791 case llvm::Triple::armeb:
8792 case llvm::Triple::thumbeb:
8793 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8794 case llvm::Triple::ppc:
8795 return "elf32ppclinux";
8796 case llvm::Triple::ppc64:
8797 return "elf64ppc";
8798 case llvm::Triple::ppc64le:
8799 return "elf64lppc";
8800 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008801 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008802 return "elf32_sparc";
8803 case llvm::Triple::sparcv9:
8804 return "elf64_sparc";
8805 case llvm::Triple::mips:
8806 return "elf32btsmip";
8807 case llvm::Triple::mipsel:
8808 return "elf32ltsmip";
8809 case llvm::Triple::mips64:
8810 if (mips::hasMipsAbiArg(Args, "n32"))
8811 return "elf32btsmipn32";
8812 return "elf64btsmip";
8813 case llvm::Triple::mips64el:
8814 if (mips::hasMipsAbiArg(Args, "n32"))
8815 return "elf32ltsmipn32";
8816 return "elf64ltsmip";
8817 case llvm::Triple::systemz:
8818 return "elf64_s390";
8819 case llvm::Triple::x86_64:
8820 if (T.getEnvironment() == llvm::Triple::GNUX32)
8821 return "elf32_x86_64";
8822 return "elf_x86_64";
8823 default:
8824 llvm_unreachable("Unexpected arch");
8825 }
8826}
8827
Douglas Katzman95354292015-06-23 20:42:09 +00008828void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8829 const InputInfo &Output,
8830 const InputInfoList &Inputs,
8831 const ArgList &Args,
8832 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008833 const toolchains::Linux &ToolChain =
8834 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008835 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008836
8837 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8838 llvm::Triple Triple = llvm::Triple(TripleStr);
8839
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008840 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008841 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008842 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008843 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8844 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008845 const bool HasCRTBeginEndFiles =
8846 ToolChain.getTriple().hasEnvironment() ||
8847 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008848
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008849 ArgStringList CmdArgs;
8850
Rafael Espindolad1002f62010-11-15 18:28:16 +00008851 // Silence warning for "clang -g foo.o -o foo"
8852 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008853 // and "clang -emit-llvm foo.o -o foo"
8854 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008855 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008856 // handled somewhere else.
8857 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008858
Peter Collingbourne39719a72015-11-20 20:49:39 +00008859 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8860 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008861 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008862 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008863 CmdArgs.push_back("-target");
8864 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8865 }
8866
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008867 if (!D.SysRoot.empty())
8868 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008869
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008870 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008871 CmdArgs.push_back("-pie");
8872
Rafael Espindola1c76c592010-11-07 22:57:16 +00008873 if (Args.hasArg(options::OPT_rdynamic))
8874 CmdArgs.push_back("-export-dynamic");
8875
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008876 if (Args.hasArg(options::OPT_s))
8877 CmdArgs.push_back("-s");
8878
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008879 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008880 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008881
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008882 for (const auto &Opt : ToolChain.ExtraOpts)
8883 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008884
8885 if (!Args.hasArg(options::OPT_static)) {
8886 CmdArgs.push_back("--eh-frame-hdr");
8887 }
8888
8889 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008890 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008891
8892 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008893 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8894 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008895 CmdArgs.push_back("-Bstatic");
8896 else
8897 CmdArgs.push_back("-static");
8898 } else if (Args.hasArg(options::OPT_shared)) {
8899 CmdArgs.push_back("-shared");
8900 }
8901
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00008902 if (!Args.hasArg(options::OPT_static)) {
8903 if (Args.hasArg(options::OPT_rdynamic))
8904 CmdArgs.push_back("-export-dynamic");
8905
8906 if (!Args.hasArg(options::OPT_shared)) {
8907 const std::string Loader =
8908 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
8909 CmdArgs.push_back("-dynamic-linker");
8910 CmdArgs.push_back(Args.MakeArgString(Loader));
8911 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008912 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008913
8914 CmdArgs.push_back("-o");
8915 CmdArgs.push_back(Output.getFilename());
8916
Douglas Katzman78b37b02015-11-17 20:28:07 +00008917 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008918 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008919 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008920 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008921 if (Args.hasArg(options::OPT_pg))
8922 crt1 = "gcrt1.o";
8923 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008924 crt1 = "Scrt1.o";
8925 else
8926 crt1 = "crt1.o";
8927 }
8928 if (crt1)
8929 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008930
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008931 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8932 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008933
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008934 const char *crtbegin;
8935 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008936 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008937 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008938 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008939 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008940 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008941 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008942 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008943
8944 if (HasCRTBeginEndFiles)
8945 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008946
8947 // Add crtfastmath.o if available and fast math is enabled.
8948 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008949 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008950
8951 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008952 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008953
Douglas Katzman6059ef92015-11-17 17:41:23 +00008954 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008955
Teresa Johnson945bc502015-10-15 20:35:53 +00008956 if (D.isUsingLTO())
8957 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008958
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008959 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8960 CmdArgs.push_back("--no-demangle");
8961
Alexey Samsonov52550342014-09-15 19:58:40 +00008962 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008963 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008964 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008965 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008966
Douglas Katzman78b37b02015-11-17 20:28:07 +00008967 if (D.CCCIsCXX() &&
8968 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008969 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008970 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008971 if (OnlyLibstdcxxStatic)
8972 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008973 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008974 if (OnlyLibstdcxxStatic)
8975 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008976 CmdArgs.push_back("-lm");
8977 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008978 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8979 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008980
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008981 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008982 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8983 if (Args.hasArg(options::OPT_static))
8984 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008985
Alexey Samsonov52550342014-09-15 19:58:40 +00008986 if (NeedsSanitizerDeps)
8987 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8988
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008989 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8990 Args.hasArg(options::OPT_pthreads);
8991
8992 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8993 options::OPT_fno_openmp, false)) {
8994 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8995 // FIXME: Does this really make sense for all GNU toolchains?
8996 WantPthread = true;
8997
8998 // Also link the particular OpenMP runtimes.
8999 switch (getOpenMPRuntime(ToolChain, Args)) {
9000 case OMPRT_OMP:
9001 CmdArgs.push_back("-lomp");
9002 break;
9003 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009004 CmdArgs.push_back("-lgomp");
9005
9006 // FIXME: Exclude this for platforms with libgomp that don't require
9007 // librt. Most modern Linux platforms require it, but some may not.
9008 CmdArgs.push_back("-lrt");
9009 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009010 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009011 CmdArgs.push_back("-liomp5");
9012 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009013 case OMPRT_Unknown:
9014 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009015 break;
9016 }
Chandler Carruth01538002013-01-17 13:19:29 +00009017 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009018
Renato Golinc4b49242014-02-13 10:01:16 +00009019 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009020
Richard Smith31d1de22015-05-20 22:48:44 +00009021 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009022 CmdArgs.push_back("-lpthread");
9023
Rafael Espindolab17bc532016-01-25 18:29:16 +00009024 if (Args.hasArg(options::OPT_fsplit_stack))
9025 CmdArgs.push_back("--wrap=pthread_create");
9026
Chandler Carruth94a32012012-05-14 18:31:18 +00009027 CmdArgs.push_back("-lc");
9028
9029 if (Args.hasArg(options::OPT_static))
9030 CmdArgs.push_back("--end-group");
9031 else
Renato Golinc4b49242014-02-13 10:01:16 +00009032 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009033 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009034
Rafael Espindola81937ec2010-12-01 01:52:43 +00009035 if (!Args.hasArg(options::OPT_nostartfiles)) {
9036 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009037 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009038 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009039 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009040 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009041 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009042 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009043
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009044 if (HasCRTBeginEndFiles)
9045 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009046 if (!isAndroid)
9047 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009048 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009049 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009050
Peter Collingbourne39719a72015-11-20 20:49:39 +00009051 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009052}
9053
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009054// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9055// for the various SFI requirements like register masking. The assembly tool
9056// inserts the file containing the macros as an input into all the assembly
9057// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009058void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9059 const InputInfo &Output,
9060 const InputInfoList &Inputs,
9061 const ArgList &Args,
9062 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009063 const toolchains::NaClToolChain &ToolChain =
9064 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009065 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009066 "nacl-arm-macros.s");
9067 InputInfoList NewInputs;
9068 NewInputs.push_back(NaClMacros);
9069 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009070 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9071 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009072}
9073
Douglas Katzman750cfc52015-06-29 18:42:16 +00009074// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009075// we use static by default, do not yet support sanitizers or LTO, and a few
9076// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009077// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009078void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9079 const InputInfo &Output,
9080 const InputInfoList &Inputs,
9081 const ArgList &Args,
9082 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009083
Douglas Katzman54366072015-07-27 16:53:08 +00009084 const toolchains::NaClToolChain &ToolChain =
9085 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009086 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009087 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009088 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009089 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009090
9091 ArgStringList CmdArgs;
9092
9093 // Silence warning for "clang -g foo.o -o foo"
9094 Args.ClaimAllArgs(options::OPT_g_Group);
9095 // and "clang -emit-llvm foo.o -o foo"
9096 Args.ClaimAllArgs(options::OPT_emit_llvm);
9097 // and for "clang -w foo.o -o foo". Other warning options are already
9098 // handled somewhere else.
9099 Args.ClaimAllArgs(options::OPT_w);
9100
9101 if (!D.SysRoot.empty())
9102 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9103
9104 if (Args.hasArg(options::OPT_rdynamic))
9105 CmdArgs.push_back("-export-dynamic");
9106
9107 if (Args.hasArg(options::OPT_s))
9108 CmdArgs.push_back("-s");
9109
Douglas Katzman54366072015-07-27 16:53:08 +00009110 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9111 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009112 CmdArgs.push_back("--build-id");
9113
9114 if (!IsStatic)
9115 CmdArgs.push_back("--eh-frame-hdr");
9116
9117 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009118 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009119 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009120 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009121 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009122 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009123 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009124 else if (Arch == llvm::Triple::mipsel)
9125 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009126 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009127 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9128 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009129
9130 if (IsStatic)
9131 CmdArgs.push_back("-static");
9132 else if (Args.hasArg(options::OPT_shared))
9133 CmdArgs.push_back("-shared");
9134
9135 CmdArgs.push_back("-o");
9136 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009137 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009138 if (!Args.hasArg(options::OPT_shared))
9139 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9140 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9141
9142 const char *crtbegin;
9143 if (IsStatic)
9144 crtbegin = "crtbeginT.o";
9145 else if (Args.hasArg(options::OPT_shared))
9146 crtbegin = "crtbeginS.o";
9147 else
9148 crtbegin = "crtbegin.o";
9149 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9150 }
9151
9152 Args.AddAllArgs(CmdArgs, options::OPT_L);
9153 Args.AddAllArgs(CmdArgs, options::OPT_u);
9154
Douglas Katzman6059ef92015-11-17 17:41:23 +00009155 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009156
9157 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9158 CmdArgs.push_back("--no-demangle");
9159
9160 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9161
Douglas Katzman78b37b02015-11-17 20:28:07 +00009162 if (D.CCCIsCXX() &&
9163 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009164 bool OnlyLibstdcxxStatic =
9165 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009166 if (OnlyLibstdcxxStatic)
9167 CmdArgs.push_back("-Bstatic");
9168 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9169 if (OnlyLibstdcxxStatic)
9170 CmdArgs.push_back("-Bdynamic");
9171 CmdArgs.push_back("-lm");
9172 }
9173
9174 if (!Args.hasArg(options::OPT_nostdlib)) {
9175 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9176 // Always use groups, since it has no effect on dynamic libraries.
9177 CmdArgs.push_back("--start-group");
9178 CmdArgs.push_back("-lc");
9179 // NaCl's libc++ currently requires libpthread, so just always include it
9180 // in the group for C++.
9181 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009182 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009183 // Gold, used by Mips, handles nested groups differently than ld, and
9184 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9185 // which is not a desired behaviour here.
9186 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9187 if (getToolChain().getArch() == llvm::Triple::mipsel)
9188 CmdArgs.push_back("-lnacl");
9189
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009190 CmdArgs.push_back("-lpthread");
9191 }
9192
9193 CmdArgs.push_back("-lgcc");
9194 CmdArgs.push_back("--as-needed");
9195 if (IsStatic)
9196 CmdArgs.push_back("-lgcc_eh");
9197 else
9198 CmdArgs.push_back("-lgcc_s");
9199 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009200
9201 // Mips needs to create and use pnacl_legacy library that contains
9202 // definitions from bitcode/pnaclmm.c and definitions for
9203 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9204 if (getToolChain().getArch() == llvm::Triple::mipsel)
9205 CmdArgs.push_back("-lpnacl_legacy");
9206
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009207 CmdArgs.push_back("--end-group");
9208 }
9209
9210 if (!Args.hasArg(options::OPT_nostartfiles)) {
9211 const char *crtend;
9212 if (Args.hasArg(options::OPT_shared))
9213 crtend = "crtendS.o";
9214 else
9215 crtend = "crtend.o";
9216
9217 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9218 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9219 }
9220 }
9221
Peter Collingbourne39719a72015-11-20 20:49:39 +00009222 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9223 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009224}
9225
Douglas Katzman95354292015-06-23 20:42:09 +00009226void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9227 const InputInfo &Output,
9228 const InputInfoList &Inputs,
9229 const ArgList &Args,
9230 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009231 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009232 ArgStringList CmdArgs;
9233
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009234 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009235
9236 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009237 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009238
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009239 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009240 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009241
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009242 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009243 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009244}
9245
Douglas Katzman95354292015-06-23 20:42:09 +00009246void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9247 const InputInfo &Output,
9248 const InputInfoList &Inputs,
9249 const ArgList &Args,
9250 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009251 const Driver &D = getToolChain().getDriver();
9252 ArgStringList CmdArgs;
9253
Daniel Dunbarb440f562010-08-02 02:38:21 +00009254 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009255 CmdArgs.push_back("-o");
9256 CmdArgs.push_back(Output.getFilename());
9257 } else {
9258 assert(Output.isNothing() && "Invalid output.");
9259 }
9260
Douglas Katzman78b37b02015-11-17 20:28:07 +00009261 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009262 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9263 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9264 CmdArgs.push_back(
9265 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9266 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009267 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009268
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009269 Args.AddAllArgs(CmdArgs,
9270 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009271
Daniel Dunbar54423b22010-09-17 00:24:54 +00009272 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009273
Xinliang David Li69306c02015-10-22 06:15:31 +00009274 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009275
Douglas Katzman78b37b02015-11-17 20:28:07 +00009276 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009277 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009278 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009279 CmdArgs.push_back("-lm");
9280 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009281 }
9282
Douglas Katzman78b37b02015-11-17 20:28:07 +00009283 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009284 if (Args.hasArg(options::OPT_pthread))
9285 CmdArgs.push_back("-lpthread");
9286 CmdArgs.push_back("-lc");
9287 CmdArgs.push_back("-lCompilerRT-Generic");
9288 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9289 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009290 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009291 }
9292
Logan Chieneb9162f2014-06-26 14:23:45 +00009293 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009294 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009295}
9296
Daniel Dunbarcc912342009-05-02 18:28:39 +00009297/// DragonFly Tools
9298
9299// For now, DragonFly Assemble does just about the same as for
9300// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009301void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9302 const InputInfo &Output,
9303 const InputInfoList &Inputs,
9304 const ArgList &Args,
9305 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009306 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009307 ArgStringList CmdArgs;
9308
9309 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9310 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009311 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009312 CmdArgs.push_back("--32");
9313
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009314 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009315
9316 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009317 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009318
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009319 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009320 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009321
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009322 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009323 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009324}
9325
Douglas Katzman95354292015-06-23 20:42:09 +00009326void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9327 const InputInfo &Output,
9328 const InputInfoList &Inputs,
9329 const ArgList &Args,
9330 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009331 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009332 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009333
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009334 if (!D.SysRoot.empty())
9335 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9336
John McCall65b8da02013-04-11 22:55:55 +00009337 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009338 if (Args.hasArg(options::OPT_static)) {
9339 CmdArgs.push_back("-Bstatic");
9340 } else {
John McCall65b8da02013-04-11 22:55:55 +00009341 if (Args.hasArg(options::OPT_rdynamic))
9342 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009343 if (Args.hasArg(options::OPT_shared))
9344 CmdArgs.push_back("-Bshareable");
9345 else {
9346 CmdArgs.push_back("-dynamic-linker");
9347 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9348 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009349 CmdArgs.push_back("--hash-style=gnu");
9350 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009351 }
9352
9353 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9354 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009355 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009356 CmdArgs.push_back("-m");
9357 CmdArgs.push_back("elf_i386");
9358 }
9359
Daniel Dunbarb440f562010-08-02 02:38:21 +00009360 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009361 CmdArgs.push_back("-o");
9362 CmdArgs.push_back(Output.getFilename());
9363 } else {
9364 assert(Output.isNothing() && "Invalid output.");
9365 }
9366
Douglas Katzman78b37b02015-11-17 20:28:07 +00009367 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009368 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009369 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009370 CmdArgs.push_back(
9371 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009372 else {
9373 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009374 CmdArgs.push_back(
9375 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009376 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009377 CmdArgs.push_back(
9378 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009379 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009380 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009381 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009382 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009383 CmdArgs.push_back(
9384 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009385 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009386 CmdArgs.push_back(
9387 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009388 }
9389
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009390 Args.AddAllArgs(CmdArgs,
9391 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009392
Daniel Dunbar54423b22010-09-17 00:24:54 +00009393 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009394
Douglas Katzman78b37b02015-11-17 20:28:07 +00009395 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009396 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009397
9398 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009399 CmdArgs.push_back("-rpath");
9400 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009401 }
9402
Hans Wennborg70850d82013-07-18 20:29:38 +00009403 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009404 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009405 CmdArgs.push_back("-lm");
9406 }
9407
Daniel Dunbarcc912342009-05-02 18:28:39 +00009408 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009409 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009410
9411 if (!Args.hasArg(options::OPT_nolibc)) {
9412 CmdArgs.push_back("-lc");
9413 }
9414
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009415 if (Args.hasArg(options::OPT_static) ||
9416 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009417 CmdArgs.push_back("-lgcc");
9418 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009419 } else {
9420 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009421 CmdArgs.push_back("-lgcc_pic");
9422 if (!Args.hasArg(options::OPT_shared))
9423 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009424 } else {
John McCall65b8da02013-04-11 22:55:55 +00009425 CmdArgs.push_back("-lgcc");
9426 CmdArgs.push_back("--as-needed");
9427 CmdArgs.push_back("-lgcc_pic");
9428 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009429 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009430 }
9431 }
9432
Douglas Katzman78b37b02015-11-17 20:28:07 +00009433 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009434 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009435 CmdArgs.push_back(
9436 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009437 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009438 CmdArgs.push_back(
9439 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9440 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009441 }
9442
Xinliang David Li69306c02015-10-22 06:15:31 +00009443 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009444
Logan Chieneb9162f2014-06-26 14:23:45 +00009445 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009446 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009447}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009448
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009449// Try to find Exe from a Visual Studio distribution. This first tries to find
9450// an installed copy of Visual Studio and, failing that, looks in the PATH,
9451// making sure that whatever executable that's found is not a same-named exe
9452// from clang itself to prevent clang from falling back to itself.
9453static std::string FindVisualStudioExecutable(const ToolChain &TC,
9454 const char *Exe,
9455 const char *ClangProgramPath) {
9456 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9457 std::string visualStudioBinDir;
9458 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9459 visualStudioBinDir)) {
9460 SmallString<128> FilePath(visualStudioBinDir);
9461 llvm::sys::path::append(FilePath, Exe);
9462 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9463 return FilePath.str();
9464 }
9465
9466 return Exe;
9467}
9468
Douglas Katzman95354292015-06-23 20:42:09 +00009469void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9470 const InputInfo &Output,
9471 const InputInfoList &Inputs,
9472 const ArgList &Args,
9473 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009474 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009475 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009476
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009477 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9478 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009479 CmdArgs.push_back(
9480 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009481
Douglas Katzman78b37b02015-11-17 20:28:07 +00009482 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9483 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009484 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009485
Zachary Turner10d75b22014-10-22 20:40:43 +00009486 if (!llvm::sys::Process::GetEnv("LIB")) {
9487 // If the VC environment hasn't been configured (perhaps because the user
9488 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009489 // the environment variable is set however, assume the user knows what
9490 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009491 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009492 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009493 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9494 SmallString<128> LibDir(VisualStudioDir);
9495 llvm::sys::path::append(LibDir, "VC", "lib");
9496 switch (MSVC.getArch()) {
9497 case llvm::Triple::x86:
9498 // x86 just puts the libraries directly in lib
9499 break;
9500 case llvm::Triple::x86_64:
9501 llvm::sys::path::append(LibDir, "amd64");
9502 break;
9503 case llvm::Triple::arm:
9504 llvm::sys::path::append(LibDir, "arm");
9505 break;
9506 default:
9507 break;
9508 }
9509 CmdArgs.push_back(
9510 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009511
9512 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9513 std::string UniversalCRTLibPath;
9514 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9515 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9516 UniversalCRTLibPath.c_str()));
9517 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009518 }
9519
9520 std::string WindowsSdkLibPath;
9521 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9522 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9523 WindowsSdkLibPath.c_str()));
9524 }
9525
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009526 CmdArgs.push_back("-nologo");
9527
Reid Kleckner124955a2015-08-05 18:51:13 +00009528 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009529 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009530
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009531 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009532 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009533 if (DLL) {
9534 CmdArgs.push_back(Args.MakeArgString("-dll"));
9535
9536 SmallString<128> ImplibName(Output.getFilename());
9537 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009538 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009539 }
9540
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009541 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009542 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009543 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009544 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009545 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9546 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009547 // Make sure the dynamic runtime thunk is not optimized out at link time
9548 // to ensure proper SEH handling.
9549 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009550 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009551 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009552 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009553 for (const auto &Lib : {"asan", "asan_cxx"})
9554 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009555 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009556 }
9557
Hans Wennborg2e274592013-08-13 23:38:57 +00009558 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009559
Alexey Bataevc7e84352015-08-19 04:49:01 +00009560 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9561 options::OPT_fno_openmp, false)) {
9562 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9563 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9564 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9565 TC.getDriver().Dir + "/../lib"));
9566 switch (getOpenMPRuntime(getToolChain(), Args)) {
9567 case OMPRT_OMP:
9568 CmdArgs.push_back("-defaultlib:libomp.lib");
9569 break;
9570 case OMPRT_IOMP5:
9571 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9572 break;
9573 case OMPRT_GOMP:
9574 break;
9575 case OMPRT_Unknown:
9576 // Already diagnosed.
9577 break;
9578 }
9579 }
9580
Reid Kleckner337188f2014-09-16 19:22:00 +00009581 // Add filenames, libraries, and other linker inputs.
9582 for (const auto &Input : Inputs) {
9583 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009584 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009585 continue;
9586 }
9587
9588 const Arg &A = Input.getInputArg();
9589
9590 // Render -l options differently for the MSVC linker.
9591 if (A.getOption().matches(options::OPT_l)) {
9592 StringRef Lib = A.getValue();
9593 const char *LinkLibArg;
9594 if (Lib.endswith(".lib"))
9595 LinkLibArg = Args.MakeArgString(Lib);
9596 else
9597 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9598 CmdArgs.push_back(LinkLibArg);
9599 continue;
9600 }
9601
9602 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9603 // or -L. Render it, even if MSVC doesn't understand it.
9604 A.renderAsInput(Args, CmdArgs);
9605 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009606
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009607 TC.addProfileRTLibs(Args, CmdArgs);
9608
Zachary Turner719f58c2014-12-01 23:06:47 +00009609 // We need to special case some linker paths. In the case of lld, we need to
9610 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9611 // linker, we need to use a special search algorithm.
9612 llvm::SmallString<128> linkPath;
9613 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9614 if (Linker.equals_lower("lld"))
9615 Linker = "lld-link";
9616
9617 if (Linker.equals_lower("link")) {
9618 // If we're using the MSVC linker, it's not sufficient to just use link
9619 // from the program PATH, because other environments like GnuWin32 install
9620 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009621 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009622 C.getDriver().getClangProgramPath());
9623 } else {
9624 linkPath = Linker;
9625 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009626 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009627 }
9628
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009629 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009630 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009631}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009632
Douglas Katzman95354292015-06-23 20:42:09 +00009633void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9634 const InputInfo &Output,
9635 const InputInfoList &Inputs,
9636 const ArgList &Args,
9637 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009638 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9639}
9640
Douglas Katzman95354292015-06-23 20:42:09 +00009641std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009642 Compilation &C, const JobAction &JA, const InputInfo &Output,
9643 const InputInfoList &Inputs, const ArgList &Args,
9644 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009645 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009646 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009647 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009648 CmdArgs.push_back("/W0"); // No warnings.
9649
9650 // The goal is to be able to invoke this tool correctly based on
9651 // any flag accepted by clang-cl.
9652
9653 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009654 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009655
9656 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009657 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9658 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9659 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009660 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9661 if (A->getOption().getID() == options::OPT_O0) {
9662 CmdArgs.push_back("/Od");
9663 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009664 CmdArgs.push_back("/Og");
9665
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009666 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009667 if (OptLevel == "s" || OptLevel == "z")
9668 CmdArgs.push_back("/Os");
9669 else
9670 CmdArgs.push_back("/Ot");
9671
9672 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009673 }
9674 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009675 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9676 options::OPT_fno_omit_frame_pointer))
9677 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9678 ? "/Oy"
9679 : "/Oy-");
9680 if (!Args.hasArg(options::OPT_fwritable_strings))
9681 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009682
Nico Weber3f8dafb2015-03-12 19:37:10 +00009683 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009684 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9685
David Majnemerf6072342014-07-01 22:24:56 +00009686 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9687 /*default=*/false))
9688 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009689 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9690 options::OPT_fno_function_sections))
9691 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9692 ? "/Gy"
9693 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009694 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9695 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009696 CmdArgs.push_back(
9697 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009698 if (Args.hasArg(options::OPT_fsyntax_only))
9699 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009700 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9701 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009702 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009703
Nico Weber3f8dafb2015-03-12 19:37:10 +00009704 std::vector<std::string> Includes =
9705 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009706 for (const auto &Include : Includes)
9707 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009708
Hans Wennborg87cfa712013-09-19 20:32:16 +00009709 // Flags that can simply be passed through.
9710 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9711 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009712 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9713 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009714 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009715 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009716
9717 // The order of these flags is relevant, so pick the last one.
9718 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9719 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9720 A->render(Args, CmdArgs);
9721
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009722 // Pass through all unknown arguments so that the fallback command can see
9723 // them too.
9724 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9725
Hans Wennborg87cfa712013-09-19 20:32:16 +00009726 // Input filename.
9727 assert(Inputs.size() == 1);
9728 const InputInfo &II = Inputs[0];
9729 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9730 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9731 if (II.isFilename())
9732 CmdArgs.push_back(II.getFilename());
9733 else
9734 II.getInputArg().renderAsInput(Args, CmdArgs);
9735
9736 // Output filename.
9737 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009738 const char *Fo =
9739 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009740 CmdArgs.push_back(Fo);
9741
Hans Wennborg188382e2013-09-20 18:16:35 +00009742 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009743 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9744 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009745 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009746 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009747}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009748
Yaron Keren1c0070c2015-07-02 04:45:27 +00009749/// MinGW Tools
9750void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9751 const InputInfo &Output,
9752 const InputInfoList &Inputs,
9753 const ArgList &Args,
9754 const char *LinkingOutput) const {
9755 claimNoWarnArgs(Args);
9756 ArgStringList CmdArgs;
9757
9758 if (getToolChain().getArch() == llvm::Triple::x86) {
9759 CmdArgs.push_back("--32");
9760 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9761 CmdArgs.push_back("--64");
9762 }
9763
9764 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9765
9766 CmdArgs.push_back("-o");
9767 CmdArgs.push_back(Output.getFilename());
9768
9769 for (const auto &II : Inputs)
9770 CmdArgs.push_back(II.getFilename());
9771
9772 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009773 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009774
9775 if (Args.hasArg(options::OPT_gsplit_dwarf))
9776 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9777 SplitDebugName(Args, Inputs[0]));
9778}
9779
9780void MinGW::Linker::AddLibGCC(const ArgList &Args,
9781 ArgStringList &CmdArgs) const {
9782 if (Args.hasArg(options::OPT_mthreads))
9783 CmdArgs.push_back("-lmingwthrd");
9784 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009785
Yaron Kerenaa281332015-08-09 00:24:07 +00009786 // Make use of compiler-rt if --rtlib option is used
9787 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9788 if (RLT == ToolChain::RLT_Libgcc) {
9789 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9790 Args.hasArg(options::OPT_static);
9791 bool Shared = Args.hasArg(options::OPT_shared);
9792 bool CXX = getToolChain().getDriver().CCCIsCXX();
9793
9794 if (Static || (!CXX && !Shared)) {
9795 CmdArgs.push_back("-lgcc");
9796 CmdArgs.push_back("-lgcc_eh");
9797 } else {
9798 CmdArgs.push_back("-lgcc_s");
9799 CmdArgs.push_back("-lgcc");
9800 }
9801 } else {
9802 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9803 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009804
Yaron Keren1c0070c2015-07-02 04:45:27 +00009805 CmdArgs.push_back("-lmoldname");
9806 CmdArgs.push_back("-lmingwex");
9807 CmdArgs.push_back("-lmsvcrt");
9808}
9809
9810void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9811 const InputInfo &Output,
9812 const InputInfoList &Inputs,
9813 const ArgList &Args,
9814 const char *LinkingOutput) const {
9815 const ToolChain &TC = getToolChain();
9816 const Driver &D = TC.getDriver();
9817 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9818
9819 ArgStringList CmdArgs;
9820
9821 // Silence warning for "clang -g foo.o -o foo"
9822 Args.ClaimAllArgs(options::OPT_g_Group);
9823 // and "clang -emit-llvm foo.o -o foo"
9824 Args.ClaimAllArgs(options::OPT_emit_llvm);
9825 // and for "clang -w foo.o -o foo". Other warning options are already
9826 // handled somewhere else.
9827 Args.ClaimAllArgs(options::OPT_w);
9828
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009829 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9830 if (LinkerName.equals_lower("lld")) {
9831 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009832 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009833 } else if (!LinkerName.equals_lower("ld")) {
9834 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009835 }
9836
Yaron Keren1c0070c2015-07-02 04:45:27 +00009837 if (!D.SysRoot.empty())
9838 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9839
9840 if (Args.hasArg(options::OPT_s))
9841 CmdArgs.push_back("-s");
9842
9843 CmdArgs.push_back("-m");
9844 if (TC.getArch() == llvm::Triple::x86)
9845 CmdArgs.push_back("i386pe");
9846 if (TC.getArch() == llvm::Triple::x86_64)
9847 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009848 if (TC.getArch() == llvm::Triple::arm)
9849 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009850
9851 if (Args.hasArg(options::OPT_mwindows)) {
9852 CmdArgs.push_back("--subsystem");
9853 CmdArgs.push_back("windows");
9854 } else if (Args.hasArg(options::OPT_mconsole)) {
9855 CmdArgs.push_back("--subsystem");
9856 CmdArgs.push_back("console");
9857 }
9858
9859 if (Args.hasArg(options::OPT_static))
9860 CmdArgs.push_back("-Bstatic");
9861 else {
9862 if (Args.hasArg(options::OPT_mdll))
9863 CmdArgs.push_back("--dll");
9864 else if (Args.hasArg(options::OPT_shared))
9865 CmdArgs.push_back("--shared");
9866 CmdArgs.push_back("-Bdynamic");
9867 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9868 CmdArgs.push_back("-e");
9869 if (TC.getArch() == llvm::Triple::x86)
9870 CmdArgs.push_back("_DllMainCRTStartup@12");
9871 else
9872 CmdArgs.push_back("DllMainCRTStartup");
9873 CmdArgs.push_back("--enable-auto-image-base");
9874 }
9875 }
9876
9877 CmdArgs.push_back("-o");
9878 CmdArgs.push_back(Output.getFilename());
9879
9880 Args.AddAllArgs(CmdArgs, options::OPT_e);
9881 // FIXME: add -N, -n flags
9882 Args.AddLastArg(CmdArgs, options::OPT_r);
9883 Args.AddLastArg(CmdArgs, options::OPT_s);
9884 Args.AddLastArg(CmdArgs, options::OPT_t);
9885 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9886 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9887
Douglas Katzman78b37b02015-11-17 20:28:07 +00009888 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009889 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9890 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9891 } else {
9892 if (Args.hasArg(options::OPT_municode))
9893 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9894 else
9895 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9896 }
9897 if (Args.hasArg(options::OPT_pg))
9898 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9899 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9900 }
9901
9902 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009903 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009904 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9905
9906 // TODO: Add ASan stuff here
9907
9908 // TODO: Add profile stuff here
9909
Douglas Katzman78b37b02015-11-17 20:28:07 +00009910 if (D.CCCIsCXX() &&
9911 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009912 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9913 !Args.hasArg(options::OPT_static);
9914 if (OnlyLibstdcxxStatic)
9915 CmdArgs.push_back("-Bstatic");
9916 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9917 if (OnlyLibstdcxxStatic)
9918 CmdArgs.push_back("-Bdynamic");
9919 }
9920
9921 if (!Args.hasArg(options::OPT_nostdlib)) {
9922 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9923 if (Args.hasArg(options::OPT_static))
9924 CmdArgs.push_back("--start-group");
9925
9926 if (Args.hasArg(options::OPT_fstack_protector) ||
9927 Args.hasArg(options::OPT_fstack_protector_strong) ||
9928 Args.hasArg(options::OPT_fstack_protector_all)) {
9929 CmdArgs.push_back("-lssp_nonshared");
9930 CmdArgs.push_back("-lssp");
9931 }
9932 if (Args.hasArg(options::OPT_fopenmp))
9933 CmdArgs.push_back("-lgomp");
9934
9935 AddLibGCC(Args, CmdArgs);
9936
9937 if (Args.hasArg(options::OPT_pg))
9938 CmdArgs.push_back("-lgmon");
9939
Yaron Kerenadce68e2015-07-06 18:52:19 +00009940 if (Args.hasArg(options::OPT_pthread))
9941 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009942
9943 // add system libraries
9944 if (Args.hasArg(options::OPT_mwindows)) {
9945 CmdArgs.push_back("-lgdi32");
9946 CmdArgs.push_back("-lcomdlg32");
9947 }
9948 CmdArgs.push_back("-ladvapi32");
9949 CmdArgs.push_back("-lshell32");
9950 CmdArgs.push_back("-luser32");
9951 CmdArgs.push_back("-lkernel32");
9952
9953 if (Args.hasArg(options::OPT_static))
9954 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009955 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009956 AddLibGCC(Args, CmdArgs);
9957 }
9958
9959 if (!Args.hasArg(options::OPT_nostartfiles)) {
9960 // Add crtfastmath.o if available and fast math is enabled.
9961 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9962
9963 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9964 }
9965 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009966 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009967 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009968}
9969
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009970/// XCore Tools
9971// We pass assemble and link construction to the xcc tool.
9972
Douglas Katzman95354292015-06-23 20:42:09 +00009973void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9974 const InputInfo &Output,
9975 const InputInfoList &Inputs,
9976 const ArgList &Args,
9977 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009978 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009979 ArgStringList CmdArgs;
9980
9981 CmdArgs.push_back("-o");
9982 CmdArgs.push_back(Output.getFilename());
9983
9984 CmdArgs.push_back("-c");
9985
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009986 if (Args.hasArg(options::OPT_v))
9987 CmdArgs.push_back("-v");
9988
Robert Lytton894d25c2014-05-02 09:33:25 +00009989 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9990 if (!A->getOption().matches(options::OPT_g0))
9991 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009992
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009993 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9994 false))
9995 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009996
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009997 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009998
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009999 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010000 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010001
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010002 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010003 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010004}
10005
Douglas Katzman95354292015-06-23 20:42:09 +000010006void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10007 const InputInfo &Output,
10008 const InputInfoList &Inputs,
10009 const ArgList &Args,
10010 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010011 ArgStringList CmdArgs;
10012
10013 if (Output.isFilename()) {
10014 CmdArgs.push_back("-o");
10015 CmdArgs.push_back(Output.getFilename());
10016 } else {
10017 assert(Output.isNothing() && "Invalid output.");
10018 }
10019
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010020 if (Args.hasArg(options::OPT_v))
10021 CmdArgs.push_back("-v");
10022
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010023 // Pass -fexceptions through to the linker if it was present.
10024 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10025 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010026 CmdArgs.push_back("-fexceptions");
10027
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010028 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10029
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010030 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010031 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010032}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010033
Douglas Katzman95354292015-06-23 20:42:09 +000010034void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10035 const InputInfo &Output,
10036 const InputInfoList &Inputs,
10037 const ArgList &Args,
10038 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010039 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010040 const auto &TC =
10041 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10042 ArgStringList CmdArgs;
10043 const char *Exec;
10044
10045 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010046 default:
10047 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010048 case llvm::Triple::arm:
10049 case llvm::Triple::thumb:
10050 break;
10051 case llvm::Triple::x86:
10052 CmdArgs.push_back("--32");
10053 break;
10054 case llvm::Triple::x86_64:
10055 CmdArgs.push_back("--64");
10056 break;
10057 }
10058
10059 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10060
10061 CmdArgs.push_back("-o");
10062 CmdArgs.push_back(Output.getFilename());
10063
10064 for (const auto &Input : Inputs)
10065 CmdArgs.push_back(Input.getFilename());
10066
10067 const std::string Assembler = TC.GetProgramPath("as");
10068 Exec = Args.MakeArgString(Assembler);
10069
Justin Bognerd3371d82015-07-17 03:35:54 +000010070 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010071}
10072
Douglas Katzman95354292015-06-23 20:42:09 +000010073void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10074 const InputInfo &Output,
10075 const InputInfoList &Inputs,
10076 const ArgList &Args,
10077 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010078 const auto &TC =
10079 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10080 const llvm::Triple &T = TC.getTriple();
10081 const Driver &D = TC.getDriver();
10082 SmallString<128> EntryPoint;
10083 ArgStringList CmdArgs;
10084 const char *Exec;
10085
10086 // Silence warning for "clang -g foo.o -o foo"
10087 Args.ClaimAllArgs(options::OPT_g_Group);
10088 // and "clang -emit-llvm foo.o -o foo"
10089 Args.ClaimAllArgs(options::OPT_emit_llvm);
10090 // and for "clang -w foo.o -o foo"
10091 Args.ClaimAllArgs(options::OPT_w);
10092 // Other warning options are already handled somewhere else.
10093
10094 if (!D.SysRoot.empty())
10095 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10096
10097 if (Args.hasArg(options::OPT_pie))
10098 CmdArgs.push_back("-pie");
10099 if (Args.hasArg(options::OPT_rdynamic))
10100 CmdArgs.push_back("-export-dynamic");
10101 if (Args.hasArg(options::OPT_s))
10102 CmdArgs.push_back("--strip-all");
10103
10104 CmdArgs.push_back("-m");
10105 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010106 default:
10107 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010108 case llvm::Triple::arm:
10109 case llvm::Triple::thumb:
10110 // FIXME: this is incorrect for WinCE
10111 CmdArgs.push_back("thumb2pe");
10112 break;
10113 case llvm::Triple::x86:
10114 CmdArgs.push_back("i386pe");
10115 EntryPoint.append("_");
10116 break;
10117 case llvm::Triple::x86_64:
10118 CmdArgs.push_back("i386pep");
10119 break;
10120 }
10121
10122 if (Args.hasArg(options::OPT_shared)) {
10123 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010124 default:
10125 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010126 case llvm::Triple::arm:
10127 case llvm::Triple::thumb:
10128 case llvm::Triple::x86_64:
10129 EntryPoint.append("_DllMainCRTStartup");
10130 break;
10131 case llvm::Triple::x86:
10132 EntryPoint.append("_DllMainCRTStartup@12");
10133 break;
10134 }
10135
10136 CmdArgs.push_back("-shared");
10137 CmdArgs.push_back("-Bdynamic");
10138
10139 CmdArgs.push_back("--enable-auto-image-base");
10140
10141 CmdArgs.push_back("--entry");
10142 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10143 } else {
10144 EntryPoint.append("mainCRTStartup");
10145
10146 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10147 : "-Bdynamic");
10148
Douglas Katzman78b37b02015-11-17 20:28:07 +000010149 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010150 CmdArgs.push_back("--entry");
10151 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10152 }
10153
10154 // FIXME: handle subsystem
10155 }
10156
10157 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010158 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010159
10160 CmdArgs.push_back("-o");
10161 CmdArgs.push_back(Output.getFilename());
10162
10163 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10164 SmallString<261> ImpLib(Output.getFilename());
10165 llvm::sys::path::replace_extension(ImpLib, ".lib");
10166
10167 CmdArgs.push_back("--out-implib");
10168 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10169 }
10170
Douglas Katzman78b37b02015-11-17 20:28:07 +000010171 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010172 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10173 const char *CRTBegin;
10174
10175 CRTBegin =
10176 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10177 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10178 }
10179
10180 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010181 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010182 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10183
10184 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10185 !Args.hasArg(options::OPT_nodefaultlibs)) {
10186 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10187 !Args.hasArg(options::OPT_static);
10188 if (StaticCXX)
10189 CmdArgs.push_back("-Bstatic");
10190 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10191 if (StaticCXX)
10192 CmdArgs.push_back("-Bdynamic");
10193 }
10194
10195 if (!Args.hasArg(options::OPT_nostdlib)) {
10196 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10197 // TODO handle /MT[d] /MD[d]
10198 CmdArgs.push_back("-lmsvcrt");
10199 AddRunTimeLibs(TC, D, CmdArgs, Args);
10200 }
10201 }
10202
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010203 if (TC.getSanitizerArgs().needsAsanRt()) {
10204 // TODO handle /MT[d] /MD[d]
10205 if (Args.hasArg(options::OPT_shared)) {
10206 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10207 } else {
10208 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10209 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10210 // Make sure the dynamic runtime thunk is not optimized out at link time
10211 // to ensure proper SEH handling.
10212 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10213 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10214 ? "___asan_seh_interceptor"
10215 : "__asan_seh_interceptor"));
10216 }
10217 }
10218
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010219 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010220
Justin Bognerd3371d82015-07-17 03:35:54 +000010221 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010222}
Douglas Katzman84a75642015-06-19 14:55:19 +000010223
Douglas Katzman95354292015-06-23 20:42:09 +000010224void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10225 const InputInfo &Output,
10226 const InputInfoList &Inputs,
10227 const ArgList &Args,
10228 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010229 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010230 assert(Inputs.size() == 1);
10231 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010232 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10233 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010234
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010235 if (JA.getKind() == Action::PreprocessJobClass) {
10236 Args.ClaimAllArgs();
10237 CmdArgs.push_back("-E");
10238 } else {
10239 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10240 CmdArgs.push_back("-S");
10241 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10242 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010243 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010244 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010245
Douglas Katzmanf6071112015-08-03 14:34:22 +000010246 // Append all -I, -iquote, -isystem paths, defines/undefines,
10247 // 'f' flags, optimize flags, and warning options.
10248 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010249 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010250 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010251 options::OPT_f_Group, options::OPT_f_clang_Group,
10252 options::OPT_g_Group, options::OPT_M_Group,
10253 options::OPT_O_Group, options::OPT_W_Group});
10254
10255 // If we're producing a dependency file, and assembly is the final action,
10256 // then the name of the target in the dependency file should be the '.o'
10257 // file, not the '.s' file produced by this step. For example, instead of
10258 // /tmp/mumble.s: mumble.c .../someheader.h
10259 // the filename on the lefthand side should be "mumble.o"
10260 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10261 C.getActions().size() == 1 &&
10262 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10263 Arg *A = Args.getLastArg(options::OPT_o);
10264 if (A) {
10265 CmdArgs.push_back("-MT");
10266 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10267 }
10268 }
10269
Douglas Katzman84a75642015-06-19 14:55:19 +000010270 CmdArgs.push_back(II.getFilename());
10271 CmdArgs.push_back("-o");
10272 CmdArgs.push_back(Output.getFilename());
10273
10274 std::string Exec =
10275 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010276 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10277 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010278}
10279
Douglas Katzman95354292015-06-23 20:42:09 +000010280void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10281 const InputInfo &Output,
10282 const InputInfoList &Inputs,
10283 const ArgList &Args,
10284 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010285 ArgStringList CmdArgs;
10286
10287 assert(Inputs.size() == 1);
10288 const InputInfo &II = Inputs[0];
10289 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10290 assert(Output.getType() == types::TY_Object);
10291
10292 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010293 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010294 CmdArgs.push_back("-noSPrefixing");
10295 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010296 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10297 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10298 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010299 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010300 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010301 }
10302 CmdArgs.push_back("-elf"); // Output format.
10303 CmdArgs.push_back(II.getFilename());
10304 CmdArgs.push_back(
10305 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10306
10307 std::string Exec =
10308 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010309 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10310 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010311}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010312
10313void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10314 const InputInfo &Output,
10315 const InputInfoList &Inputs,
10316 const ArgList &Args,
10317 const char *LinkingOutput) const {
10318 const auto &TC =
10319 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10320 const llvm::Triple &T = TC.getTriple();
10321 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010322 bool UseStartfiles =
10323 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010324 bool UseDefaultLibs =
10325 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010326
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010327 if (T.getArch() == llvm::Triple::sparc)
10328 CmdArgs.push_back("-EB");
10329 else // SHAVE assumes little-endian, and sparcel is expressly so.
10330 CmdArgs.push_back("-EL");
10331
10332 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10333 // but we never pass through a --sysroot option and various other bits.
10334 // For example, there are no sanitizers (yet) nor gold linker.
10335
10336 // Eat some arguments that may be present but have no effect.
10337 Args.ClaimAllArgs(options::OPT_g_Group);
10338 Args.ClaimAllArgs(options::OPT_w);
10339 Args.ClaimAllArgs(options::OPT_static_libgcc);
10340
10341 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10342 CmdArgs.push_back("-s");
10343
10344 CmdArgs.push_back("-o");
10345 CmdArgs.push_back(Output.getFilename());
10346
10347 if (UseStartfiles) {
10348 // If you want startfiles, it means you want the builtin crti and crtbegin,
10349 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010350 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10351 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010352 }
10353
10354 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10355 options::OPT_e, options::OPT_s, options::OPT_t,
10356 options::OPT_Z_Flag, options::OPT_r});
10357
Douglas Katzman674a3122015-11-18 16:24:46 +000010358 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010359
10360 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10361
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010362 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010363 if (C.getDriver().CCCIsCXX())
10364 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010365 if (T.getOS() == llvm::Triple::RTEMS) {
10366 CmdArgs.push_back("--start-group");
10367 CmdArgs.push_back("-lc");
10368 // You must provide your own "-L" option to enable finding these.
10369 CmdArgs.push_back("-lrtemscpu");
10370 CmdArgs.push_back("-lrtemsbsp");
10371 CmdArgs.push_back("--end-group");
10372 } else {
10373 CmdArgs.push_back("-lc");
10374 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010375 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010376 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010377 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010378 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10379 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010380 }
10381
10382 std::string Exec =
10383 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10384 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10385 CmdArgs, Inputs));
10386}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010387
10388void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10389 const InputInfo &Output,
10390 const InputInfoList &Inputs,
10391 const ArgList &Args,
10392 const char *LinkingOutput) const {
10393 claimNoWarnArgs(Args);
10394 ArgStringList CmdArgs;
10395
10396 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10397
10398 CmdArgs.push_back("-o");
10399 CmdArgs.push_back(Output.getFilename());
10400
10401 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10402 const InputInfo &Input = Inputs[0];
10403 assert(Input.isFilename() && "Invalid input.");
10404 CmdArgs.push_back(Input.getFilename());
10405
10406 const char *Exec =
10407 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10408 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10409}
10410
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010411static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10412 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10413 if (SanArgs.needsUbsanRt()) {
10414 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10415 }
10416 if (SanArgs.needsAsanRt()) {
10417 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10418 }
10419}
10420
10421static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10422 const JobAction &JA, const InputInfo &Output,
10423 const InputInfoList &Inputs,
10424 const ArgList &Args,
10425 const char *LinkingOutput) {
10426 const toolchains::FreeBSD &ToolChain =
10427 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10428 const Driver &D = ToolChain.getDriver();
10429 ArgStringList CmdArgs;
10430
10431 // Silence warning for "clang -g foo.o -o foo"
10432 Args.ClaimAllArgs(options::OPT_g_Group);
10433 // and "clang -emit-llvm foo.o -o foo"
10434 Args.ClaimAllArgs(options::OPT_emit_llvm);
10435 // and for "clang -w foo.o -o foo". Other warning options are already
10436 // handled somewhere else.
10437 Args.ClaimAllArgs(options::OPT_w);
10438
10439 if (!D.SysRoot.empty())
10440 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10441
10442 if (Args.hasArg(options::OPT_pie))
10443 CmdArgs.push_back("-pie");
10444
10445 if (Args.hasArg(options::OPT_rdynamic))
10446 CmdArgs.push_back("-export-dynamic");
10447 if (Args.hasArg(options::OPT_shared))
10448 CmdArgs.push_back("--oformat=so");
10449
10450 if (Output.isFilename()) {
10451 CmdArgs.push_back("-o");
10452 CmdArgs.push_back(Output.getFilename());
10453 } else {
10454 assert(Output.isNothing() && "Invalid output.");
10455 }
10456
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010457 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10458
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010459 Args.AddAllArgs(CmdArgs, options::OPT_L);
10460 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10461 Args.AddAllArgs(CmdArgs, options::OPT_e);
10462 Args.AddAllArgs(CmdArgs, options::OPT_s);
10463 Args.AddAllArgs(CmdArgs, options::OPT_t);
10464 Args.AddAllArgs(CmdArgs, options::OPT_r);
10465
10466 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10467 CmdArgs.push_back("--no-demangle");
10468
10469 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10470
10471 if (Args.hasArg(options::OPT_pthread)) {
10472 CmdArgs.push_back("-lpthread");
10473 }
10474
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010475 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10476
10477 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10478}
10479
10480static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10481 const JobAction &JA, const InputInfo &Output,
10482 const InputInfoList &Inputs,
10483 const ArgList &Args,
10484 const char *LinkingOutput) {
10485 const toolchains::FreeBSD &ToolChain =
10486 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10487 const Driver &D = ToolChain.getDriver();
10488 ArgStringList CmdArgs;
10489
10490 // Silence warning for "clang -g foo.o -o foo"
10491 Args.ClaimAllArgs(options::OPT_g_Group);
10492 // and "clang -emit-llvm foo.o -o foo"
10493 Args.ClaimAllArgs(options::OPT_emit_llvm);
10494 // and for "clang -w foo.o -o foo". Other warning options are already
10495 // handled somewhere else.
10496 Args.ClaimAllArgs(options::OPT_w);
10497
10498 if (!D.SysRoot.empty())
10499 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10500
10501 if (Args.hasArg(options::OPT_pie))
10502 CmdArgs.push_back("-pie");
10503
10504 if (Args.hasArg(options::OPT_static)) {
10505 CmdArgs.push_back("-Bstatic");
10506 } else {
10507 if (Args.hasArg(options::OPT_rdynamic))
10508 CmdArgs.push_back("-export-dynamic");
10509 CmdArgs.push_back("--eh-frame-hdr");
10510 if (Args.hasArg(options::OPT_shared)) {
10511 CmdArgs.push_back("-Bshareable");
10512 } else {
10513 CmdArgs.push_back("-dynamic-linker");
10514 CmdArgs.push_back("/libexec/ld-elf.so.1");
10515 }
10516 CmdArgs.push_back("--enable-new-dtags");
10517 }
10518
10519 if (Output.isFilename()) {
10520 CmdArgs.push_back("-o");
10521 CmdArgs.push_back(Output.getFilename());
10522 } else {
10523 assert(Output.isNothing() && "Invalid output.");
10524 }
10525
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010526 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10527
Douglas Katzman78b37b02015-11-17 20:28:07 +000010528 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010529 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010530 if (!Args.hasArg(options::OPT_shared)) {
10531 if (Args.hasArg(options::OPT_pg))
10532 crt1 = "gcrt1.o";
10533 else if (Args.hasArg(options::OPT_pie))
10534 crt1 = "Scrt1.o";
10535 else
10536 crt1 = "crt1.o";
10537 }
10538 if (crt1)
10539 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10540
10541 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10542
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010543 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010544 if (Args.hasArg(options::OPT_static))
10545 crtbegin = "crtbeginT.o";
10546 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10547 crtbegin = "crtbeginS.o";
10548 else
10549 crtbegin = "crtbegin.o";
10550
10551 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10552 }
10553
10554 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010555 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010556 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10557 Args.AddAllArgs(CmdArgs, options::OPT_e);
10558 Args.AddAllArgs(CmdArgs, options::OPT_s);
10559 Args.AddAllArgs(CmdArgs, options::OPT_t);
10560 Args.AddAllArgs(CmdArgs, options::OPT_r);
10561
10562 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10563 CmdArgs.push_back("--no-demangle");
10564
10565 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10566
Douglas Katzman78b37b02015-11-17 20:28:07 +000010567 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010568 // For PS4, we always want to pass libm, libstdc++ and libkernel
10569 // libraries for both C and C++ compilations.
10570 CmdArgs.push_back("-lkernel");
10571 if (D.CCCIsCXX()) {
10572 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10573 if (Args.hasArg(options::OPT_pg))
10574 CmdArgs.push_back("-lm_p");
10575 else
10576 CmdArgs.push_back("-lm");
10577 }
10578 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10579 // the default system libraries. Just mimic this for now.
10580 if (Args.hasArg(options::OPT_pg))
10581 CmdArgs.push_back("-lgcc_p");
10582 else
10583 CmdArgs.push_back("-lcompiler_rt");
10584 if (Args.hasArg(options::OPT_static)) {
10585 CmdArgs.push_back("-lstdc++");
10586 } else if (Args.hasArg(options::OPT_pg)) {
10587 CmdArgs.push_back("-lgcc_eh_p");
10588 } else {
10589 CmdArgs.push_back("--as-needed");
10590 CmdArgs.push_back("-lstdc++");
10591 CmdArgs.push_back("--no-as-needed");
10592 }
10593
10594 if (Args.hasArg(options::OPT_pthread)) {
10595 if (Args.hasArg(options::OPT_pg))
10596 CmdArgs.push_back("-lpthread_p");
10597 else
10598 CmdArgs.push_back("-lpthread");
10599 }
10600
10601 if (Args.hasArg(options::OPT_pg)) {
10602 if (Args.hasArg(options::OPT_shared))
10603 CmdArgs.push_back("-lc");
10604 else {
10605 if (Args.hasArg(options::OPT_static)) {
10606 CmdArgs.push_back("--start-group");
10607 CmdArgs.push_back("-lc_p");
10608 CmdArgs.push_back("-lpthread_p");
10609 CmdArgs.push_back("--end-group");
10610 } else {
10611 CmdArgs.push_back("-lc_p");
10612 }
10613 }
10614 CmdArgs.push_back("-lgcc_p");
10615 } else {
10616 if (Args.hasArg(options::OPT_static)) {
10617 CmdArgs.push_back("--start-group");
10618 CmdArgs.push_back("-lc");
10619 CmdArgs.push_back("-lpthread");
10620 CmdArgs.push_back("--end-group");
10621 } else {
10622 CmdArgs.push_back("-lc");
10623 }
10624 CmdArgs.push_back("-lcompiler_rt");
10625 }
10626
10627 if (Args.hasArg(options::OPT_static)) {
10628 CmdArgs.push_back("-lstdc++");
10629 } else if (Args.hasArg(options::OPT_pg)) {
10630 CmdArgs.push_back("-lgcc_eh_p");
10631 } else {
10632 CmdArgs.push_back("--as-needed");
10633 CmdArgs.push_back("-lstdc++");
10634 CmdArgs.push_back("--no-as-needed");
10635 }
10636 }
10637
Douglas Katzman78b37b02015-11-17 20:28:07 +000010638 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010639 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10640 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10641 else
10642 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10643 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10644 }
10645
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010646 const char *Exec =
10647#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010648 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010649#else
10650 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10651#endif
10652
10653 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10654}
10655
10656void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10657 const InputInfo &Output,
10658 const InputInfoList &Inputs,
10659 const ArgList &Args,
10660 const char *LinkingOutput) const {
10661 const toolchains::FreeBSD &ToolChain =
10662 static_cast<const toolchains::FreeBSD &>(getToolChain());
10663 const Driver &D = ToolChain.getDriver();
10664 bool PS4Linker;
10665 StringRef LinkerOptName;
10666 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10667 LinkerOptName = A->getValue();
10668 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10669 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10670 }
10671
10672 if (LinkerOptName == "gold")
10673 PS4Linker = false;
10674 else if (LinkerOptName == "ps4")
10675 PS4Linker = true;
10676 else
10677 PS4Linker = !Args.hasArg(options::OPT_shared);
10678
10679 if (PS4Linker)
10680 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10681 else
10682 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10683}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010684
10685void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10686 const InputInfo &Output,
10687 const InputInfoList &Inputs,
10688 const ArgList &Args,
10689 const char *LinkingOutput) const {
10690 const auto &TC =
10691 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010692 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010693
10694 std::vector<std::string> gpu_archs =
10695 Args.getAllArgValues(options::OPT_march_EQ);
10696 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10697 const std::string& gpu_arch = gpu_archs[0];
10698
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010699 ArgStringList CmdArgs;
10700 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010701 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10702 // ptxas does not accept -g option if optimization is enabled, so
10703 // we ignore the compiler's -O* options if we want debug info.
10704 CmdArgs.push_back("-g");
10705 CmdArgs.push_back("--dont-merge-basicblocks");
10706 CmdArgs.push_back("--return-at-end");
10707 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10708 // Map the -O we received to -O{0,1,2,3}.
10709 //
10710 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10711 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010712
Justin Lebar2836dcd2016-01-19 19:52:21 +000010713 // -O3 seems like the least-bad option when -Osomething is specified to
10714 // clang but it isn't handled below.
10715 StringRef OOpt = "3";
10716 if (A->getOption().matches(options::OPT_O4) ||
10717 A->getOption().matches(options::OPT_Ofast))
10718 OOpt = "3";
10719 else if (A->getOption().matches(options::OPT_O0))
10720 OOpt = "0";
10721 else if (A->getOption().matches(options::OPT_O)) {
10722 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10723 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10724 .Case("1", "1")
10725 .Case("2", "2")
10726 .Case("3", "3")
10727 .Case("s", "2")
10728 .Case("z", "2")
10729 .Default("2");
10730 }
10731 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10732 } else {
10733 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10734 // to no optimizations, but ptxas's default is -O3.
10735 CmdArgs.push_back("-O0");
10736 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010737
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010738 CmdArgs.push_back("--gpu-name");
10739 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10740 CmdArgs.push_back("--output-file");
10741 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10742 for (const auto& II : Inputs)
10743 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10744
10745 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10746 CmdArgs.push_back(Args.MakeArgString(A));
10747
10748 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10749 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10750}
10751
10752// All inputs to this linker must be from CudaDeviceActions, as we need to look
10753// at the Inputs' Actions in order to figure out which GPU architecture they
10754// correspond to.
10755void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10756 const InputInfo &Output,
10757 const InputInfoList &Inputs,
10758 const ArgList &Args,
10759 const char *LinkingOutput) const {
10760 const auto &TC =
10761 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010762 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010763
10764 ArgStringList CmdArgs;
10765 CmdArgs.push_back("--cuda");
10766 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10767 CmdArgs.push_back(Args.MakeArgString("--create"));
10768 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10769
10770 for (const auto& II : Inputs) {
10771 auto* A = cast<const CudaDeviceAction>(II.getAction());
10772 // We need to pass an Arch of the form "sm_XX" for cubin files and
10773 // "compute_XX" for ptx.
10774 const char *Arch = (II.getType() == types::TY_PP_Asm)
10775 ? A->getComputeArchName()
10776 : A->getGpuArchName();
10777 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10778 Arch + ",file=" + II.getFilename()));
10779 }
10780
10781 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10782 CmdArgs.push_back(Args.MakeArgString(A));
10783
10784 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10785 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10786}