blob: 00128dc7a32dc470a8400e671d0d0dea5c7ed89c [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;
Tim Northover2279b5f2016-02-24 17:57:48 +00002127 if (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");
Tim Northover2279b5f2016-02-24 17:57:48 +00002133 } else if (CPU == "cyclone") {
2134 Features.push_back("+neon");
2135 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002136 } else if (CPU == "generic") {
2137 Features.push_back("+neon");
2138 } else {
2139 return false;
2140 }
2141
2142 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2143 return false;
2144
2145 return true;
2146}
2147
2148static bool
2149getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2150 const ArgList &Args,
2151 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002152 std::string MarchLowerCase = March.lower();
2153 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002154
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002155 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002156 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002157 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002158 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002159 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2160 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002161 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002162 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002163 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002164
2165 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2166 return false;
2167
2168 return true;
2169}
2170
2171static bool
2172getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2173 const ArgList &Args,
2174 std::vector<const char *> &Features) {
2175 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002176 std::string McpuLowerCase = Mcpu.lower();
2177 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002178 return false;
2179
2180 return true;
2181}
2182
2183static bool
2184getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2185 const ArgList &Args,
2186 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002187 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002188 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002189 if (MtuneLowerCase == "native")
2190 MtuneLowerCase = llvm::sys::getHostCPUName();
2191 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002192 Features.push_back("+zcm");
2193 Features.push_back("+zcz");
2194 }
2195 return true;
2196}
2197
2198static bool
2199getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2200 const ArgList &Args,
2201 std::vector<const char *> &Features) {
2202 StringRef CPU;
2203 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002204 std::string McpuLowerCase = Mcpu.lower();
2205 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002206 return false;
2207
2208 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2209}
2210
Justin Bognerf9052562015-11-13 23:07:31 +00002211static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002212 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002213 Arg *A;
2214 bool success = true;
2215 // Enable NEON by default.
2216 Features.push_back("+neon");
2217 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2218 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2219 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2220 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002221 else if (Args.hasArg(options::OPT_arch))
2222 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2223 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002224
2225 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2226 success =
2227 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2228 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2229 success =
2230 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002231 else if (Args.hasArg(options::OPT_arch))
2232 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2233 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002234
2235 if (!success)
2236 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002237
2238 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2239 Features.push_back("-fp-armv8");
2240 Features.push_back("-crypto");
2241 Features.push_back("-neon");
2242 }
Bradley Smith418c5932014-05-02 15:17:51 +00002243
2244 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002245 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002246 if (A->getOption().matches(options::OPT_mcrc))
2247 Features.push_back("+crc");
2248 else
2249 Features.push_back("-crc");
2250 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002251
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002252 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2253 options::OPT_munaligned_access))
2254 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2255 Features.push_back("+strict-align");
2256
Justin Bognerf9052562015-11-13 23:07:31 +00002257 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002258 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002259}
2260
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002261static void getHexagonTargetFeatures(const ArgList &Args,
2262 std::vector<const char *> &Features) {
2263 bool HasHVX = false, HasHVXD = false;
2264
Eric Christopher49062a52015-12-22 03:12:34 +00002265 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2266 // doing dependent option handling here rather than in initFeatureMap or a
2267 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002268 for (auto &A : Args) {
2269 auto &Opt = A->getOption();
2270 if (Opt.matches(options::OPT_mhexagon_hvx))
2271 HasHVX = true;
2272 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2273 HasHVXD = HasHVX = false;
2274 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2275 HasHVXD = HasHVX = true;
2276 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2277 HasHVXD = false;
2278 else
2279 continue;
2280 A->claim();
2281 }
2282
2283 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2284 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2285}
2286
Dan Gohmanc2853072015-09-03 22:51:53 +00002287static void getWebAssemblyTargetFeatures(const ArgList &Args,
2288 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002289 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002290}
2291
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002292static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002293 const ArgList &Args, ArgStringList &CmdArgs,
2294 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002295 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002296 std::vector<const char *> Features;
2297 switch (Triple.getArch()) {
2298 default:
2299 break;
2300 case llvm::Triple::mips:
2301 case llvm::Triple::mipsel:
2302 case llvm::Triple::mips64:
2303 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002304 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002305 break;
2306
2307 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002308 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002309 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002310 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002311 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002312 break;
2313
2314 case llvm::Triple::ppc:
2315 case llvm::Triple::ppc64:
2316 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002317 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002318 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002319 case llvm::Triple::systemz:
2320 getSystemZTargetFeatures(Args, Features);
2321 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002322 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002323 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002324 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002325 break;
2326 case llvm::Triple::x86:
2327 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002328 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002329 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002330 case llvm::Triple::hexagon:
2331 getHexagonTargetFeatures(Args, Features);
2332 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002333 case llvm::Triple::wasm32:
2334 case llvm::Triple::wasm64:
2335 getWebAssemblyTargetFeatures(Args, Features);
2336 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002337 }
Rafael Espindola43964802013-08-21 17:34:32 +00002338
2339 // Find the last of each feature.
2340 llvm::StringMap<unsigned> LastOpt;
2341 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2342 const char *Name = Features[I];
2343 assert(Name[0] == '-' || Name[0] == '+');
2344 LastOpt[Name + 1] = I;
2345 }
2346
2347 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2348 // If this feature was overridden, ignore it.
2349 const char *Name = Features[I];
2350 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2351 assert(LastI != LastOpt.end());
2352 unsigned Last = LastI->second;
2353 if (Last != I)
2354 continue;
2355
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002356 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002357 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002358 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002359}
2360
David Majnemerae394812014-12-09 00:12:30 +00002361static bool
2362shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2363 const llvm::Triple &Triple) {
2364 // We use the zero-cost exception tables for Objective-C if the non-fragile
2365 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2366 // later.
2367 if (runtime.isNonFragile())
2368 return true;
2369
2370 if (!Triple.isMacOSX())
2371 return false;
2372
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002373 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002374 (Triple.getArch() == llvm::Triple::x86_64 ||
2375 Triple.getArch() == llvm::Triple::arm));
2376}
2377
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002378/// Adds exception related arguments to the driver command arguments. There's a
2379/// master flag, -fexceptions and also language specific flags to enable/disable
2380/// C++ and Objective-C exceptions. This makes it possible to for example
2381/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002382static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002383 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002384 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002385 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002386 const Driver &D = TC.getDriver();
2387 const llvm::Triple &Triple = TC.getTriple();
2388
Chad Rosier4fab82c2012-03-26 22:04:46 +00002389 if (KernelOrKext) {
2390 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2391 // arguments now to avoid warnings about unused arguments.
2392 Args.ClaimAllArgs(options::OPT_fexceptions);
2393 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2394 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2395 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2396 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2397 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002398 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002399 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002400
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002401 // See if the user explicitly enabled exceptions.
2402 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2403 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002404
David Majnemerae394812014-12-09 00:12:30 +00002405 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2406 // is not necessarily sensible, but follows GCC.
2407 if (types::isObjC(InputType) &&
2408 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002409 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002410 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002411
David Majnemerae394812014-12-09 00:12:30 +00002412 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002413 }
2414
2415 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002416 // Disable C++ EH by default on XCore and PS4.
2417 bool CXXExceptionsEnabled =
2418 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002419 Arg *ExceptionArg = Args.getLastArg(
2420 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2421 options::OPT_fexceptions, options::OPT_fno_exceptions);
2422 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002423 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002424 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2425 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002426
2427 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002428 if (Triple.isPS4CPU()) {
2429 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2430 assert(ExceptionArg &&
2431 "On the PS4 exceptions should only be enabled if passing "
2432 "an argument");
2433 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2434 const Arg *RTTIArg = TC.getRTTIArg();
2435 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2436 D.Diag(diag::err_drv_argument_not_allowed_with)
2437 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2438 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2439 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2440 } else
2441 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2442
Anders Carlssone96ab552011-02-28 02:27:16 +00002443 CmdArgs.push_back("-fcxx-exceptions");
2444
David Majnemer8de68642014-12-05 08:11:58 +00002445 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002446 }
2447 }
2448
David Majnemer8de68642014-12-05 08:11:58 +00002449 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002450 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002451}
2452
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002453static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002454 bool Default = true;
2455 if (TC.getTriple().isOSDarwin()) {
2456 // The native darwin assembler doesn't support the linker_option directives,
2457 // so we disable them if we think the .s file will be passed to it.
2458 Default = TC.useIntegratedAs();
2459 }
2460 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2461 Default);
2462}
2463
Ted Kremenek62093662013-03-12 17:02:12 +00002464static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2465 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002466 bool UseDwarfDirectory =
2467 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2468 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002469 return !UseDwarfDirectory;
2470}
2471
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002472/// \brief Check whether the given input tree contains any compilation actions.
2473static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002474 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002475 return true;
2476
Nico Weber5a459f82016-02-23 19:30:43 +00002477 for (const auto &AI : A->inputs())
2478 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002479 return true;
2480
2481 return false;
2482}
2483
2484/// \brief Check if -relax-all should be passed to the internal assembler.
2485/// This is done by default when compiling non-assembler source with -O0.
2486static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2487 bool RelaxDefault = true;
2488
2489 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2490 RelaxDefault = A->getOption().matches(options::OPT_O0);
2491
2492 if (RelaxDefault) {
2493 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002494 for (const auto &Act : C.getActions()) {
2495 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002496 RelaxDefault = true;
2497 break;
2498 }
2499 }
2500 }
2501
2502 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002503 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002504}
2505
Paul Robinson0334a042015-12-19 19:41:48 +00002506// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2507// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002508static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002509 assert(A.getOption().matches(options::OPT_gN_Group) &&
2510 "Not a -g option that specifies a debug-info level");
2511 if (A.getOption().matches(options::OPT_g0) ||
2512 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002513 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002514 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2515 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002516 return codegenoptions::DebugLineTablesOnly;
2517 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002518}
2519
Douglas Katzman3459ce22015-10-08 04:24:12 +00002520// Extract the integer N from a string spelled "-dwarf-N", returning 0
2521// on mismatch. The StringRef input (rather than an Arg) allows
2522// for use by the "-Xassembler" option parser.
2523static unsigned DwarfVersionNum(StringRef ArgValue) {
2524 return llvm::StringSwitch<unsigned>(ArgValue)
2525 .Case("-gdwarf-2", 2)
2526 .Case("-gdwarf-3", 3)
2527 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002528 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002529 .Default(0);
2530}
2531
2532static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002533 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002534 unsigned DwarfVersion,
2535 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002536 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002537 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002538 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2539 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002540 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002541 CmdArgs.push_back("-debug-info-kind=limited");
2542 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002543 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002544 CmdArgs.push_back("-debug-info-kind=standalone");
2545 break;
2546 default:
2547 break;
2548 }
2549 if (DwarfVersion > 0)
2550 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002551 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002552 switch (DebuggerTuning) {
2553 case llvm::DebuggerKind::GDB:
2554 CmdArgs.push_back("-debugger-tuning=gdb");
2555 break;
2556 case llvm::DebuggerKind::LLDB:
2557 CmdArgs.push_back("-debugger-tuning=lldb");
2558 break;
2559 case llvm::DebuggerKind::SCE:
2560 CmdArgs.push_back("-debugger-tuning=sce");
2561 break;
2562 default:
2563 break;
2564 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002565}
2566
David Blaikie9260ed62013-07-25 21:19:01 +00002567static void CollectArgsForIntegratedAssembler(Compilation &C,
2568 const ArgList &Args,
2569 ArgStringList &CmdArgs,
2570 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002571 if (UseRelaxAll(C, Args))
2572 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002573
David Majnemer2b9349d2015-12-21 22:09:34 +00002574 // Only default to -mincremental-linker-compatible if we think we are
2575 // targeting the MSVC linker.
2576 bool DefaultIncrementalLinkerCompatible =
2577 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2578 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2579 options::OPT_mno_incremental_linker_compatible,
2580 DefaultIncrementalLinkerCompatible))
2581 CmdArgs.push_back("-mincremental-linker-compatible");
2582
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002583 // When passing -I arguments to the assembler we sometimes need to
2584 // unconditionally take the next argument. For example, when parsing
2585 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2586 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2587 // arg after parsing the '-I' arg.
2588 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002589
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002590 // When using an integrated assembler, translate -Wa, and -Xassembler
2591 // options.
2592 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002593 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002594 for (const Arg *A :
2595 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2596 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002597
Benjamin Kramer72e64312015-09-24 14:48:49 +00002598 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002599 if (TakeNextArg) {
2600 CmdArgs.push_back(Value.data());
2601 TakeNextArg = false;
2602 continue;
2603 }
David Blaikie9260ed62013-07-25 21:19:01 +00002604
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002605 switch (C.getDefaultToolChain().getArch()) {
2606 default:
2607 break;
2608 case llvm::Triple::mips:
2609 case llvm::Triple::mipsel:
2610 case llvm::Triple::mips64:
2611 case llvm::Triple::mips64el:
2612 if (Value == "--trap") {
2613 CmdArgs.push_back("-target-feature");
2614 CmdArgs.push_back("+use-tcc-in-div");
2615 continue;
2616 }
2617 if (Value == "--break") {
2618 CmdArgs.push_back("-target-feature");
2619 CmdArgs.push_back("-use-tcc-in-div");
2620 continue;
2621 }
2622 if (Value.startswith("-msoft-float")) {
2623 CmdArgs.push_back("-target-feature");
2624 CmdArgs.push_back("+soft-float");
2625 continue;
2626 }
2627 if (Value.startswith("-mhard-float")) {
2628 CmdArgs.push_back("-target-feature");
2629 CmdArgs.push_back("-soft-float");
2630 continue;
2631 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002632
2633 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2634 .Case("-mips1", "+mips1")
2635 .Case("-mips2", "+mips2")
2636 .Case("-mips3", "+mips3")
2637 .Case("-mips4", "+mips4")
2638 .Case("-mips5", "+mips5")
2639 .Case("-mips32", "+mips32")
2640 .Case("-mips32r2", "+mips32r2")
2641 .Case("-mips32r3", "+mips32r3")
2642 .Case("-mips32r5", "+mips32r5")
2643 .Case("-mips32r6", "+mips32r6")
2644 .Case("-mips64", "+mips64")
2645 .Case("-mips64r2", "+mips64r2")
2646 .Case("-mips64r3", "+mips64r3")
2647 .Case("-mips64r5", "+mips64r5")
2648 .Case("-mips64r6", "+mips64r6")
2649 .Default(nullptr);
2650 if (MipsTargetFeature)
2651 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002652 }
2653
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002654 if (Value == "-force_cpusubtype_ALL") {
2655 // Do nothing, this is the default and we don't support anything else.
2656 } else if (Value == "-L") {
2657 CmdArgs.push_back("-msave-temp-labels");
2658 } else if (Value == "--fatal-warnings") {
2659 CmdArgs.push_back("-massembler-fatal-warnings");
2660 } else if (Value == "--noexecstack") {
2661 CmdArgs.push_back("-mnoexecstack");
2662 } else if (Value == "-compress-debug-sections" ||
2663 Value == "--compress-debug-sections") {
2664 CompressDebugSections = true;
2665 } else if (Value == "-nocompress-debug-sections" ||
2666 Value == "--nocompress-debug-sections") {
2667 CompressDebugSections = false;
2668 } else if (Value.startswith("-I")) {
2669 CmdArgs.push_back(Value.data());
2670 // We need to consume the next argument if the current arg is a plain
2671 // -I. The next arg will be the include directory.
2672 if (Value == "-I")
2673 TakeNextArg = true;
2674 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002675 // "-gdwarf-N" options are not cc1as options.
2676 unsigned DwarfVersion = DwarfVersionNum(Value);
2677 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2678 CmdArgs.push_back(Value.data());
2679 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002680 RenderDebugEnablingArgs(Args, CmdArgs,
2681 codegenoptions::LimitedDebugInfo,
2682 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002683 }
Renato Golin7c542b42015-07-27 23:44:45 +00002684 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2685 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2686 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002687 } else {
2688 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002689 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002690 }
2691 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002692 }
2693 if (CompressDebugSections) {
2694 if (llvm::zlib::isAvailable())
2695 CmdArgs.push_back("-compress-debug-sections");
2696 else
2697 D.Diag(diag::warn_debug_compression_unavailable);
2698 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002699 if (MipsTargetFeature != nullptr) {
2700 CmdArgs.push_back("-target-feature");
2701 CmdArgs.push_back(MipsTargetFeature);
2702 }
David Blaikie9260ed62013-07-25 21:19:01 +00002703}
2704
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002705// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002706// FIXME: Make sure we can also emit shared objects if they're requested
2707// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002708static void addClangRT(const ToolChain &TC, const ArgList &Args,
2709 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002710 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002711}
2712
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002713namespace {
2714enum OpenMPRuntimeKind {
2715 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2716 /// without knowing what runtime to target.
2717 OMPRT_Unknown,
2718
2719 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2720 /// the default for Clang.
2721 OMPRT_OMP,
2722
2723 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2724 /// this runtime but can swallow the pragmas, and find and link against the
2725 /// runtime library itself.
2726 OMPRT_GOMP,
2727
Chandler Carruthc6625c62015-05-28 21:10:31 +00002728 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002729 /// OpenMP runtime. We support this mode for users with existing dependencies
2730 /// on this runtime library name.
2731 OMPRT_IOMP5
2732};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002733}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002734
2735/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002736static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2737 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002738 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2739
2740 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2741 if (A)
2742 RuntimeName = A->getValue();
2743
2744 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002745 .Case("libomp", OMPRT_OMP)
2746 .Case("libgomp", OMPRT_GOMP)
2747 .Case("libiomp5", OMPRT_IOMP5)
2748 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002749
2750 if (RT == OMPRT_Unknown) {
2751 if (A)
2752 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002753 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002754 else
2755 // FIXME: We could use a nicer diagnostic here.
2756 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2757 }
2758
2759 return RT;
2760}
2761
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002762static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2763 const ArgList &Args) {
2764 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2765 options::OPT_fno_openmp, false))
2766 return;
2767
2768 switch (getOpenMPRuntime(TC, Args)) {
2769 case OMPRT_OMP:
2770 CmdArgs.push_back("-lomp");
2771 break;
2772 case OMPRT_GOMP:
2773 CmdArgs.push_back("-lgomp");
2774 break;
2775 case OMPRT_IOMP5:
2776 CmdArgs.push_back("-liomp5");
2777 break;
2778 case OMPRT_Unknown:
2779 // Already diagnosed.
2780 break;
2781 }
2782}
2783
Alexey Samsonov52550342014-09-15 19:58:40 +00002784static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2785 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002786 bool IsShared, bool IsWhole) {
2787 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002788 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002789 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002790 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002791 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002792}
2793
Alexey Samsonov52550342014-09-15 19:58:40 +00002794// Tries to use a file with the list of dynamic symbols that need to be exported
2795// from the runtime library. Returns true if the file was found.
2796static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2797 ArgStringList &CmdArgs,
2798 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002799 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002800 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2801 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002802 return true;
2803 }
2804 return false;
2805}
2806
2807static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2808 ArgStringList &CmdArgs) {
2809 // Force linking against the system libraries sanitizers depends on
2810 // (see PR15823 why this is necessary).
2811 CmdArgs.push_back("--no-as-needed");
2812 CmdArgs.push_back("-lpthread");
2813 CmdArgs.push_back("-lrt");
2814 CmdArgs.push_back("-lm");
2815 // There's no libdl on FreeBSD.
2816 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2817 CmdArgs.push_back("-ldl");
2818}
2819
2820static void
2821collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2822 SmallVectorImpl<StringRef> &SharedRuntimes,
2823 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002824 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2825 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2826 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002827 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2828 // Collect shared runtimes.
2829 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2830 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002831 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002832 // The stats_client library is also statically linked into DSOs.
2833 if (SanArgs.needsStatsRt())
2834 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002835
Alexey Samsonov52550342014-09-15 19:58:40 +00002836 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002837 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002838 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002839 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002840 }
2841 if (SanArgs.needsAsanRt()) {
2842 if (SanArgs.needsSharedAsanRt()) {
2843 HelperStaticRuntimes.push_back("asan-preinit");
2844 } else {
2845 StaticRuntimes.push_back("asan");
2846 if (SanArgs.linkCXXRuntimes())
2847 StaticRuntimes.push_back("asan_cxx");
2848 }
2849 }
2850 if (SanArgs.needsDfsanRt())
2851 StaticRuntimes.push_back("dfsan");
2852 if (SanArgs.needsLsanRt())
2853 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002854 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002855 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002856 if (SanArgs.linkCXXRuntimes())
2857 StaticRuntimes.push_back("msan_cxx");
2858 }
2859 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002860 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002861 if (SanArgs.linkCXXRuntimes())
2862 StaticRuntimes.push_back("tsan_cxx");
2863 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002864 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002865 StaticRuntimes.push_back("ubsan_standalone");
2866 if (SanArgs.linkCXXRuntimes())
2867 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002868 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002869 if (SanArgs.needsSafeStackRt())
2870 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002871 if (SanArgs.needsCfiRt())
2872 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002873 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002874 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002875 if (SanArgs.linkCXXRuntimes())
2876 StaticRuntimes.push_back("ubsan_standalone_cxx");
2877 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002878 if (SanArgs.needsStatsRt()) {
2879 NonWholeStaticRuntimes.push_back("stats");
2880 RequiredSymbols.push_back("__sanitizer_stats_register");
2881 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002882}
2883
Alexey Samsonov52550342014-09-15 19:58:40 +00002884// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2885// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2886static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002887 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002888 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002889 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002890 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002891 NonWholeStaticRuntimes, HelperStaticRuntimes,
2892 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002893 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002894 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002895 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002896 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002897 bool AddExportDynamic = false;
2898 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002899 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002900 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2901 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002902 for (auto RT : NonWholeStaticRuntimes) {
2903 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2904 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2905 }
2906 for (auto S : RequiredSymbols) {
2907 CmdArgs.push_back("-u");
2908 CmdArgs.push_back(Args.MakeArgString(S));
2909 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002910 // If there is a static runtime with no dynamic list, force all the symbols
2911 // to be dynamic to be sure we export sanitizer interface functions.
2912 if (AddExportDynamic)
2913 CmdArgs.push_back("-export-dynamic");
2914 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002915}
2916
Reid Kleckner86ea7702015-02-04 23:45:07 +00002917static bool areOptimizationsEnabled(const ArgList &Args) {
2918 // Find the last -O arg and see if it is non-zero.
2919 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2920 return !A->getOption().matches(options::OPT_O0);
2921 // Defaults to -O0.
2922 return false;
2923}
2924
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002925static bool shouldUseFramePointerForTarget(const ArgList &Args,
2926 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002927 switch (Triple.getArch()) {
2928 case llvm::Triple::xcore:
2929 case llvm::Triple::wasm32:
2930 case llvm::Triple::wasm64:
2931 // XCore never wants frame pointers, regardless of OS.
2932 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002933 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002934 default:
2935 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002936 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002937
2938 if (Triple.isOSLinux()) {
2939 switch (Triple.getArch()) {
2940 // Don't use a frame pointer on linux if optimizing for certain targets.
2941 case llvm::Triple::mips64:
2942 case llvm::Triple::mips64el:
2943 case llvm::Triple::mips:
2944 case llvm::Triple::mipsel:
2945 case llvm::Triple::systemz:
2946 case llvm::Triple::x86:
2947 case llvm::Triple::x86_64:
2948 return !areOptimizationsEnabled(Args);
2949 default:
2950 return true;
2951 }
2952 }
2953
2954 if (Triple.isOSWindows()) {
2955 switch (Triple.getArch()) {
2956 case llvm::Triple::x86:
2957 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002958 case llvm::Triple::arm:
2959 case llvm::Triple::thumb:
2960 // Windows on ARM builds with FPO disabled to aid fast stack walking
2961 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002962 default:
2963 // All other supported Windows ISAs use xdata unwind information, so frame
2964 // pointers are not generally useful.
2965 return false;
2966 }
2967 }
2968
2969 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002970}
2971
Rafael Espindola224dd632011-12-14 21:02:23 +00002972static bool shouldUseFramePointer(const ArgList &Args,
2973 const llvm::Triple &Triple) {
2974 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2975 options::OPT_fomit_frame_pointer))
2976 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002977 if (Args.hasArg(options::OPT_pg))
2978 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002979
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002980 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002981}
2982
Eric Christopherb7d97e92013-04-03 01:58:53 +00002983static bool shouldUseLeafFramePointer(const ArgList &Args,
2984 const llvm::Triple &Triple) {
2985 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2986 options::OPT_momit_leaf_frame_pointer))
2987 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002988 if (Args.hasArg(options::OPT_pg))
2989 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002990
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002991 if (Triple.isPS4CPU())
2992 return false;
2993
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002994 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002995}
2996
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002997/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002998static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002999 SmallString<128> cwd;
3000 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003001 CmdArgs.push_back("-fdebug-compilation-dir");
3002 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003003 }
3004}
3005
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003006static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003007 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3008 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3009 SmallString<128> T(FinalOutput->getValue());
3010 llvm::sys::path::replace_extension(T, "dwo");
3011 return Args.MakeArgString(T);
3012 } else {
3013 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003014 SmallString<128> T(
3015 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003016 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003017 llvm::sys::path::replace_extension(F, "dwo");
3018 T += F;
3019 return Args.MakeArgString(F);
3020 }
3021}
3022
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003023static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3024 const JobAction &JA, const ArgList &Args,
3025 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003026 ArgStringList ExtractArgs;
3027 ExtractArgs.push_back("--extract-dwo");
3028
3029 ArgStringList StripArgs;
3030 StripArgs.push_back("--strip-dwo");
3031
3032 // Grabbing the output of the earlier compile step.
3033 StripArgs.push_back(Output.getFilename());
3034 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003035 ExtractArgs.push_back(OutFile);
3036
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003037 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003038 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003039
3040 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003041 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003042
3043 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003044 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003045}
3046
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003047/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003048/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3049static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003050 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003051 if (A->getOption().matches(options::OPT_O4) ||
3052 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003053 return true;
3054
3055 if (A->getOption().matches(options::OPT_O0))
3056 return false;
3057
3058 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3059
Rafael Espindola91780de2013-08-26 14:05:41 +00003060 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003061 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003062 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003063 return true;
3064
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003065 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003066 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003067 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003068
3069 unsigned OptLevel = 0;
3070 if (S.getAsInteger(10, OptLevel))
3071 return false;
3072
3073 return OptLevel > 1;
3074 }
3075
3076 return false;
3077}
3078
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003079/// Add -x lang to \p CmdArgs for \p Input.
3080static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3081 ArgStringList &CmdArgs) {
3082 // When using -verify-pch, we don't want to provide the type
3083 // 'precompiled-header' if it was inferred from the file extension
3084 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3085 return;
3086
3087 CmdArgs.push_back("-x");
3088 if (Args.hasArg(options::OPT_rewrite_objc))
3089 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3090 else
3091 CmdArgs.push_back(types::getTypeName(Input.getType()));
3092}
3093
David Majnemerc371ff02015-03-22 08:39:22 +00003094static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003095 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003096 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003097
3098 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003099 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003100
3101 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003102 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003103 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003104 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003105}
3106
Rafael Espindola577637a2015-01-03 00:06:04 +00003107// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003108// options that build systems might add but are unused when assembling or only
3109// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003110static void claimNoWarnArgs(const ArgList &Args) {
3111 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003112 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003113 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003114 Args.ClaimAllArgs(options::OPT_flto);
3115 Args.ClaimAllArgs(options::OPT_fno_lto);
3116}
3117
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003118static void appendUserToPath(SmallVectorImpl<char> &Result) {
3119#ifdef LLVM_ON_UNIX
3120 const char *Username = getenv("LOGNAME");
3121#else
3122 const char *Username = getenv("USERNAME");
3123#endif
3124 if (Username) {
3125 // Validate that LoginName can be used in a path, and get its length.
3126 size_t Len = 0;
3127 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003128 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003129 Username = nullptr;
3130 break;
3131 }
3132 }
3133
3134 if (Username && Len > 0) {
3135 Result.append(Username, Username + Len);
3136 return;
3137 }
3138 }
3139
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003140// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003141#ifdef LLVM_ON_UNIX
3142 std::string UID = llvm::utostr(getuid());
3143#else
3144 // FIXME: Windows seems to have an 'SID' that might work.
3145 std::string UID = "9999";
3146#endif
3147 Result.append(UID.begin(), UID.end());
3148}
3149
David Majnemere11d3732015-06-08 00:22:46 +00003150VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3151 const llvm::Triple &Triple,
3152 const llvm::opt::ArgList &Args,
3153 bool IsWindowsMSVC) {
3154 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3155 IsWindowsMSVC) ||
3156 Args.hasArg(options::OPT_fmsc_version) ||
3157 Args.hasArg(options::OPT_fms_compatibility_version)) {
3158 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3159 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003160 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003161
3162 if (MSCVersion && MSCompatibilityVersion) {
3163 if (D)
3164 D->Diag(diag::err_drv_argument_not_allowed_with)
3165 << MSCVersion->getAsString(Args)
3166 << MSCompatibilityVersion->getAsString(Args);
3167 return VersionTuple();
3168 }
3169
3170 if (MSCompatibilityVersion) {
3171 VersionTuple MSVT;
3172 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3173 D->Diag(diag::err_drv_invalid_value)
3174 << MSCompatibilityVersion->getAsString(Args)
3175 << MSCompatibilityVersion->getValue();
3176 return MSVT;
3177 }
3178
3179 if (MSCVersion) {
3180 unsigned Version = 0;
3181 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3182 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3183 << MSCVersion->getValue();
3184 return getMSCompatibilityVersion(Version);
3185 }
3186
3187 unsigned Major, Minor, Micro;
3188 Triple.getEnvironmentVersion(Major, Minor, Micro);
3189 if (Major || Minor || Micro)
3190 return VersionTuple(Major, Minor, Micro);
3191
3192 return VersionTuple(18);
3193 }
3194 return VersionTuple();
3195}
3196
Diego Novilloa0545962015-07-10 18:00:07 +00003197static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3198 const InputInfo &Output, const ArgList &Args,
3199 ArgStringList &CmdArgs) {
3200 auto *ProfileGenerateArg = Args.getLastArg(
3201 options::OPT_fprofile_instr_generate,
3202 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003203 options::OPT_fprofile_generate_EQ,
3204 options::OPT_fno_profile_instr_generate);
3205 if (ProfileGenerateArg &&
3206 ProfileGenerateArg->getOption().matches(
3207 options::OPT_fno_profile_instr_generate))
3208 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003209
3210 auto *ProfileUseArg = Args.getLastArg(
3211 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003212 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3213 options::OPT_fno_profile_instr_use);
3214 if (ProfileUseArg &&
3215 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3216 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003217
3218 if (ProfileGenerateArg && ProfileUseArg)
3219 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003220 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003221
Diego Novillo758f3f52015-08-05 21:49:51 +00003222 if (ProfileGenerateArg) {
3223 if (ProfileGenerateArg->getOption().matches(
3224 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003225 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3226 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003227 else if (ProfileGenerateArg->getOption().matches(
3228 options::OPT_fprofile_generate_EQ)) {
3229 SmallString<128> Path(ProfileGenerateArg->getValue());
3230 llvm::sys::path::append(Path, "default.profraw");
3231 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003232 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3233 }
3234 // The default is to use Clang Instrumentation.
3235 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003236 }
Diego Novilloa0545962015-07-10 18:00:07 +00003237
Diego Novillo758f3f52015-08-05 21:49:51 +00003238 if (ProfileUseArg) {
3239 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3240 ProfileUseArg->render(Args, CmdArgs);
3241 else if ((ProfileUseArg->getOption().matches(
3242 options::OPT_fprofile_use_EQ) ||
3243 ProfileUseArg->getOption().matches(
3244 options::OPT_fprofile_instr_use))) {
3245 SmallString<128> Path(
3246 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3247 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3248 llvm::sys::path::append(Path, "default.profdata");
3249 CmdArgs.push_back(
3250 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3251 }
Diego Novilloa0545962015-07-10 18:00:07 +00003252 }
3253
3254 if (Args.hasArg(options::OPT_ftest_coverage) ||
3255 Args.hasArg(options::OPT_coverage))
3256 CmdArgs.push_back("-femit-coverage-notes");
3257 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3258 false) ||
3259 Args.hasArg(options::OPT_coverage))
3260 CmdArgs.push_back("-femit-coverage-data");
3261
Diego Novilloc4b94da2015-08-05 23:27:40 +00003262 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3263 options::OPT_fno_coverage_mapping, false) &&
3264 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003265 D.Diag(diag::err_drv_argument_only_allowed_with)
3266 << "-fcoverage-mapping"
3267 << "-fprofile-instr-generate";
3268
Diego Novilloc4b94da2015-08-05 23:27:40 +00003269 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3270 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003271 CmdArgs.push_back("-fcoverage-mapping");
3272
3273 if (C.getArgs().hasArg(options::OPT_c) ||
3274 C.getArgs().hasArg(options::OPT_S)) {
3275 if (Output.isFilename()) {
3276 CmdArgs.push_back("-coverage-file");
3277 SmallString<128> CoverageFilename;
3278 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3279 CoverageFilename = FinalOutput->getValue();
3280 } else {
3281 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3282 }
3283 if (llvm::sys::path::is_relative(CoverageFilename)) {
3284 SmallString<128> Pwd;
3285 if (!llvm::sys::fs::current_path(Pwd)) {
3286 llvm::sys::path::append(Pwd, CoverageFilename);
3287 CoverageFilename.swap(Pwd);
3288 }
3289 }
3290 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3291 }
3292 }
3293}
3294
Paul Robinsond083b9a2015-12-16 17:25:27 +00003295static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3296 ArgStringList &CmdArgs) {
3297 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3298 false) ||
3299 Args.hasFlag(options::OPT_fprofile_generate,
3300 options::OPT_fno_profile_instr_generate, false) ||
3301 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3302 options::OPT_fno_profile_instr_generate, false) ||
3303 Args.hasFlag(options::OPT_fprofile_instr_generate,
3304 options::OPT_fno_profile_instr_generate, false) ||
3305 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3306 options::OPT_fno_profile_instr_generate, false) ||
3307 Args.hasArg(options::OPT_fcreate_profile) ||
3308 Args.hasArg(options::OPT_coverage)))
3309 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3310}
3311
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003312/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3313/// smooshes them together with platform defaults, to decide whether
3314/// this compile should be using PIC mode or not. Returns a tuple of
3315/// (RelocationModel, PICLevel, IsPIE).
3316static std::tuple<llvm::Reloc::Model, unsigned, bool>
3317ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3318 const ArgList &Args) {
3319 // FIXME: why does this code...and so much everywhere else, use both
3320 // ToolChain.getTriple() and Triple?
3321 bool PIE = ToolChain.isPIEDefault();
3322 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003323 // The Darwin/MachO default to use PIC does not apply when using -static.
3324 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3325 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003326 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003327 bool IsPICLevelTwo = PIC;
3328
3329 bool KernelOrKext =
3330 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3331
3332 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003333 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003334 switch (ToolChain.getArch()) {
3335 case llvm::Triple::arm:
3336 case llvm::Triple::armeb:
3337 case llvm::Triple::thumb:
3338 case llvm::Triple::thumbeb:
3339 case llvm::Triple::aarch64:
3340 case llvm::Triple::mips:
3341 case llvm::Triple::mipsel:
3342 case llvm::Triple::mips64:
3343 case llvm::Triple::mips64el:
3344 PIC = true; // "-fpic"
3345 break;
3346
3347 case llvm::Triple::x86:
3348 case llvm::Triple::x86_64:
3349 PIC = true; // "-fPIC"
3350 IsPICLevelTwo = true;
3351 break;
3352
3353 default:
3354 break;
3355 }
3356 }
3357
3358 // OpenBSD-specific defaults for PIE
3359 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3360 switch (ToolChain.getArch()) {
3361 case llvm::Triple::mips64:
3362 case llvm::Triple::mips64el:
3363 case llvm::Triple::sparcel:
3364 case llvm::Triple::x86:
3365 case llvm::Triple::x86_64:
3366 IsPICLevelTwo = false; // "-fpie"
3367 break;
3368
3369 case llvm::Triple::ppc:
3370 case llvm::Triple::sparc:
3371 case llvm::Triple::sparcv9:
3372 IsPICLevelTwo = true; // "-fPIE"
3373 break;
3374
3375 default:
3376 break;
3377 }
3378 }
3379
3380 // The last argument relating to either PIC or PIE wins, and no
3381 // other argument is used. If the last argument is any flavor of the
3382 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3383 // option implicitly enables PIC at the same level.
3384 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3385 options::OPT_fpic, options::OPT_fno_pic,
3386 options::OPT_fPIE, options::OPT_fno_PIE,
3387 options::OPT_fpie, options::OPT_fno_pie);
3388 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3389 // is forced, then neither PIC nor PIE flags will have no effect.
3390 if (!ToolChain.isPICDefaultForced()) {
3391 if (LastPICArg) {
3392 Option O = LastPICArg->getOption();
3393 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3394 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3395 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3396 PIC =
3397 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3398 IsPICLevelTwo =
3399 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3400 } else {
3401 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003402 if (Triple.isPS4CPU()) {
3403 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3404 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3405 if (Model != "kernel") {
3406 PIC = true;
3407 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3408 << LastPICArg->getSpelling();
3409 }
3410 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003411 }
3412 }
3413 }
3414
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003415 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3416 // PIC level would've been set to level 1, force it back to level 2 PIC
3417 // instead.
3418 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003419 IsPICLevelTwo |= ToolChain.isPICDefault();
3420
James Y Knightc4015d32015-08-21 04:14:55 +00003421 // This kernel flags are a trump-card: they will disable PIC/PIE
3422 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003423 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3424 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003425 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003426
3427 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3428 // This is a very special mode. It trumps the other modes, almost no one
3429 // uses it, and it isn't even valid on any OS but Darwin.
3430 if (!ToolChain.getTriple().isOSDarwin())
3431 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3432 << A->getSpelling() << ToolChain.getTriple().str();
3433
3434 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3435
3436 // Only a forced PIC mode can cause the actual compile to have PIC defines
3437 // etc., no flags are sufficient. This behavior was selected to closely
3438 // match that of llvm-gcc and Apple GCC before that.
3439 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3440
3441 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3442 }
3443
3444 if (PIC)
3445 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3446
3447 return std::make_tuple(llvm::Reloc::Static, 0, false);
3448}
3449
3450static const char *RelocationModelName(llvm::Reloc::Model Model) {
3451 switch (Model) {
3452 case llvm::Reloc::Default:
3453 return nullptr;
3454 case llvm::Reloc::Static:
3455 return "static";
3456 case llvm::Reloc::PIC_:
3457 return "pic";
3458 case llvm::Reloc::DynamicNoPIC:
3459 return "dynamic-no-pic";
3460 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003461 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003462}
3463
3464static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3465 ArgStringList &CmdArgs) {
3466 llvm::Reloc::Model RelocationModel;
3467 unsigned PICLevel;
3468 bool IsPIE;
3469 std::tie(RelocationModel, PICLevel, IsPIE) =
3470 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3471
3472 if (RelocationModel != llvm::Reloc::Static)
3473 CmdArgs.push_back("-KPIC");
3474}
3475
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003476void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003477 const InputInfo &Output, const InputInfoList &Inputs,
3478 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003479 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3480 const llvm::Triple Triple(TripleStr);
3481
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003482 bool KernelOrKext =
3483 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003484 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003485 ArgStringList CmdArgs;
3486
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003487 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003488 bool IsWindowsCygnus =
3489 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003490 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003491 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003492
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003493 // Check number of inputs for sanity. We need at least one input.
3494 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003495 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003496 // CUDA compilation may have multiple inputs (source file + results of
3497 // device-side compilations). All other jobs are expected to have exactly one
3498 // input.
3499 bool IsCuda = types::isCuda(Input.getType());
3500 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003501
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003502 // Invoke ourselves in -cc1 mode.
3503 //
3504 // FIXME: Implement custom jobs for internal actions.
3505 CmdArgs.push_back("-cc1");
3506
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003507 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003508 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003509 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003510
Artem Belevichfa11ab52015-11-17 22:28:46 +00003511 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003512 if (IsCuda) {
3513 // FIXME: We need a (better) way to pass information about
3514 // particular compilation pass we're constructing here. For now we
3515 // can check which toolchain we're using and pick the other one to
3516 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003517 if (&getToolChain() == C.getCudaDeviceToolChain())
3518 AuxToolChain = C.getCudaHostToolChain();
3519 else if (&getToolChain() == C.getCudaHostToolChain())
3520 AuxToolChain = C.getCudaDeviceToolChain();
3521 else
3522 llvm_unreachable("Can't figure out CUDA compilation mode.");
3523 assert(AuxToolChain != nullptr && "No aux toolchain.");
3524 CmdArgs.push_back("-aux-triple");
3525 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003526 CmdArgs.push_back("-fcuda-target-overloads");
3527 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003528 }
3529
James Y Knight2db38f32015-08-15 03:45:25 +00003530 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3531 Triple.getArch() == llvm::Triple::thumb)) {
3532 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003533 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003534 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003535 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003536 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003537 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003538 }
3539
Tim Northover336f1892014-03-29 13:16:12 +00003540 // Push all default warning arguments that are specific to
3541 // the given target. These come before user provided warning options
3542 // are provided.
3543 getToolChain().addClangWarningOptions(CmdArgs);
3544
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003545 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003546 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003548 if (isa<AnalyzeJobAction>(JA)) {
3549 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3550 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003551 } else if (isa<MigrateJobAction>(JA)) {
3552 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003553 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003554 if (Output.getType() == types::TY_Dependencies)
3555 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003556 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003557 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003558 if (Args.hasArg(options::OPT_rewrite_objc) &&
3559 !Args.hasArg(options::OPT_g_Group))
3560 CmdArgs.push_back("-P");
3561 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003562 } else if (isa<AssembleJobAction>(JA)) {
3563 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003564
David Blaikie9260ed62013-07-25 21:19:01 +00003565 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003566
3567 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003568 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003569 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003570 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003571 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003572
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003573 if (JA.getType() == types::TY_Nothing)
3574 CmdArgs.push_back("-fsyntax-only");
3575 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003576 CmdArgs.push_back("-emit-pch");
3577 else
3578 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003579 } else if (isa<VerifyPCHJobAction>(JA)) {
3580 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003581 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003582 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3583 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003584 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003585 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003586 } else if (JA.getType() == types::TY_LLVM_IR ||
3587 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003588 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003589 } else if (JA.getType() == types::TY_LLVM_BC ||
3590 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003591 CmdArgs.push_back("-emit-llvm-bc");
3592 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003593 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003594 } else if (JA.getType() == types::TY_AST) {
3595 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003596 } else if (JA.getType() == types::TY_ModuleFile) {
3597 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003598 } else if (JA.getType() == types::TY_RewrittenObjC) {
3599 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003600 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003601 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3602 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003603 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003604 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003605 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003606 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003607
3608 // Preserve use-list order by default when emitting bitcode, so that
3609 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3610 // same result as running passes here. For LTO, we don't need to preserve
3611 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003612 if (JA.getType() == types::TY_LLVM_BC)
3613 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003614
3615 if (D.isUsingLTO())
3616 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003617 }
3618
Teresa Johnsonaff22322015-12-07 19:21:34 +00003619 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3620 if (!types::isLLVMIR(Input.getType()))
3621 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3622 << "-x ir";
3623 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3624 }
3625
Justin Bognera88f0122014-06-20 22:59:50 +00003626 // We normally speed up the clang process a bit by skipping destructors at
3627 // exit, but when we're generating diagnostics we can rely on some of the
3628 // cleanup.
3629 if (!C.isForDiagnostics())
3630 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003631
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003632// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003633#ifdef NDEBUG
3634 CmdArgs.push_back("-disable-llvm-verifier");
3635#endif
3636
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003637 // Set the main file name, so that debug info works even with
3638 // -save-temps.
3639 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003640 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003641
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003642 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003643 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003644 if (Args.hasArg(options::OPT_static))
3645 CmdArgs.push_back("-static-define");
3646
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003647 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003648 // Enable region store model by default.
3649 CmdArgs.push_back("-analyzer-store=region");
3650
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003651 // Treat blocks as analysis entry points.
3652 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3653
Ted Kremenek49c79792011-03-24 00:28:47 +00003654 CmdArgs.push_back("-analyzer-eagerly-assume");
3655
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003656 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003657 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003658 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003659
Devin Coughlin65c77082016-01-21 20:09:49 +00003660 if (!IsWindowsMSVC) {
3661 CmdArgs.push_back("-analyzer-checker=unix");
3662 } else {
3663 // Enable "unix" checkers that also work on Windows.
3664 CmdArgs.push_back("-analyzer-checker=unix.API");
3665 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3666 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3667 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3668 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3669 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3670 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003671
Sean Evesonb38c32b2016-01-06 10:03:58 +00003672 // Disable some unix checkers for PS4.
3673 if (IsPS4CPU) {
3674 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3675 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3676 }
3677
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003678 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003679 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003680
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003681 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003682
Artem Belevichba558952015-05-06 18:20:23 +00003683 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003684 CmdArgs.push_back("-analyzer-checker=cplusplus");
3685
Sean Evesonb38c32b2016-01-06 10:03:58 +00003686 if (!IsPS4CPU) {
3687 CmdArgs.push_back(
3688 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3689 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3690 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3691 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3692 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3693 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3694 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003695
3696 // Default nullability checks.
3697 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3698 CmdArgs.push_back(
3699 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003700 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003701
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003702 // Set the output format. The default is plist, for (lame) historical
3703 // reasons.
3704 CmdArgs.push_back("-analyzer-output");
3705 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003706 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003707 else
3708 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003709
Ted Kremenekfe449a22010-03-22 22:32:05 +00003710 // Disable the presentation of standard compiler warnings when
3711 // using --analyze. We only want to show static analyzer diagnostics
3712 // or frontend errors.
3713 CmdArgs.push_back("-w");
3714
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003715 // Add -Xanalyzer arguments when running as analyzer.
3716 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003717 }
3718
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003719 CheckCodeGenerationOptions(D, Args);
3720
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003721 llvm::Reloc::Model RelocationModel;
3722 unsigned PICLevel;
3723 bool IsPIE;
3724 std::tie(RelocationModel, PICLevel, IsPIE) =
3725 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003726
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003727 const char *RMName = RelocationModelName(RelocationModel);
3728 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003729 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003730 CmdArgs.push_back(RMName);
3731 }
3732 if (PICLevel > 0) {
3733 CmdArgs.push_back("-pic-level");
3734 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3735 if (IsPIE) {
3736 CmdArgs.push_back("-pie-level");
3737 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003738 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003739 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003740
Renato Golin4854d802015-11-09 12:40:41 +00003741 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3742 CmdArgs.push_back("-meabi");
3743 CmdArgs.push_back(A->getValue());
3744 }
3745
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003746 CmdArgs.push_back("-mthread-model");
3747 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3748 CmdArgs.push_back(A->getValue());
3749 else
3750 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3751
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003752 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3753
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003754 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3755 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003756 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003757
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003758 // LLVM Code Generator Options.
3759
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003760 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3761 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003762 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3763 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003764 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003765 CmdArgs.push_back(A->getValue());
3766 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003767 }
3768 }
3769
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003770 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3771 StringRef v = A->getValue();
3772 CmdArgs.push_back("-mllvm");
3773 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3774 A->claim();
3775 }
3776
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003777 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3778 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003779 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003780 }
3781
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003782 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3783 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003784 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003785 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003786 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003787 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3788 CmdArgs.push_back("-fpcc-struct-return");
3789 } else {
3790 assert(A->getOption().matches(options::OPT_freg_struct_return));
3791 CmdArgs.push_back("-freg-struct-return");
3792 }
3793 }
3794
Roman Divacky65b88cd2011-03-01 17:40:53 +00003795 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3796 CmdArgs.push_back("-mrtd");
3797
Rafael Espindola224dd632011-12-14 21:02:23 +00003798 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003799 CmdArgs.push_back("-mdisable-fp-elim");
3800 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3801 options::OPT_fno_zero_initialized_in_bss))
3802 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003803
3804 bool OFastEnabled = isOptimizationLevelFast(Args);
3805 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3806 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003807 OptSpecifier StrictAliasingAliasOption =
3808 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003809 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3810 // doesn't do any TBAA.
3811 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003812 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003813 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003814 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003815 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3816 options::OPT_fno_struct_path_tbaa))
3817 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003818 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3819 false))
3820 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003821 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3822 options::OPT_fno_strict_vtable_pointers,
3823 false))
3824 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003825 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3826 options::OPT_fno_optimize_sibling_calls))
3827 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003828
Eric Christopher006208c2013-04-04 06:29:47 +00003829 // Handle segmented stacks.
3830 if (Args.hasArg(options::OPT_fsplit_stack))
3831 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003832
3833 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3834 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003835 OptSpecifier FastMathAliasOption =
3836 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3837
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003838 // Handle various floating point optimization flags, mapping them to the
3839 // appropriate LLVM code generation flags. The pattern for all of these is to
3840 // default off the codegen optimizations, and if any flag enables them and no
3841 // flag disables them after the flag enabling them, enable the codegen
3842 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003843 if (Arg *A = Args.getLastArg(
3844 options::OPT_ffast_math, FastMathAliasOption,
3845 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3846 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3847 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003848 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3849 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003850 A->getOption().getID() != options::OPT_fhonor_infinities)
3851 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003852 if (Arg *A = Args.getLastArg(
3853 options::OPT_ffast_math, FastMathAliasOption,
3854 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3855 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3856 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003857 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3858 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003859 A->getOption().getID() != options::OPT_fhonor_nans)
3860 CmdArgs.push_back("-menable-no-nans");
3861
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003862 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3863 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003864 if (Arg *A =
3865 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3866 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3867 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003868 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3869 // However, turning *off* -ffast_math merely restores the toolchain default
3870 // (which may be false).
3871 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3872 A->getOption().getID() == options::OPT_ffast_math ||
3873 A->getOption().getID() == options::OPT_Ofast)
3874 MathErrno = false;
3875 else if (A->getOption().getID() == options::OPT_fmath_errno)
3876 MathErrno = true;
3877 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003878 if (MathErrno)
3879 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003880
3881 // There are several flags which require disabling very specific
3882 // optimizations. Any of these being disabled forces us to turn off the
3883 // entire set of LLVM optimizations, so collect them through all the flag
3884 // madness.
3885 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003886 if (Arg *A = Args.getLastArg(
3887 options::OPT_ffast_math, FastMathAliasOption,
3888 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3889 options::OPT_fno_unsafe_math_optimizations,
3890 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003891 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3892 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003893 A->getOption().getID() != options::OPT_fno_associative_math)
3894 AssociativeMath = true;
3895 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003896 if (Arg *A = Args.getLastArg(
3897 options::OPT_ffast_math, FastMathAliasOption,
3898 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3899 options::OPT_fno_unsafe_math_optimizations,
3900 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003901 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3902 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003903 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3904 ReciprocalMath = true;
3905 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003906 if (Arg *A = Args.getLastArg(
3907 options::OPT_ffast_math, FastMathAliasOption,
3908 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3909 options::OPT_fno_unsafe_math_optimizations,
3910 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003911 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3912 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003913 A->getOption().getID() != options::OPT_fsigned_zeros)
3914 SignedZeros = false;
3915 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003916 if (Arg *A = Args.getLastArg(
3917 options::OPT_ffast_math, FastMathAliasOption,
3918 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3919 options::OPT_fno_unsafe_math_optimizations,
3920 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003921 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3922 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003923 A->getOption().getID() != options::OPT_ftrapping_math)
3924 TrappingMath = false;
3925 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3926 !TrappingMath)
3927 CmdArgs.push_back("-menable-unsafe-fp-math");
3928
Sanjay Patel76c9e092015-01-23 16:40:50 +00003929 if (!SignedZeros)
3930 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003931
Sanjay Patel359b1052015-04-09 15:03:23 +00003932 if (ReciprocalMath)
3933 CmdArgs.push_back("-freciprocal-math");
3934
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003935 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003936 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003937 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003938 options::OPT_ffp_contract)) {
3939 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003940 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003941 if (Val == "fast" || Val == "on" || Val == "off") {
3942 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3943 } else {
3944 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003945 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003946 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003947 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3948 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003949 // If fast-math is set then set the fp-contract mode to fast.
3950 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3951 }
3952 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003953
Sanjay Patel2987c292015-06-11 14:53:41 +00003954 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003955
Bob Wilson6a039162012-07-19 03:52:53 +00003956 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3957 // and if we find them, tell the frontend to provide the appropriate
3958 // preprocessor macros. This is distinct from enabling any optimizations as
3959 // these options induce language changes which must survive serialization
3960 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003961 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3962 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003963 if (!A->getOption().matches(options::OPT_fno_fast_math))
3964 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003965 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3966 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003967 if (A->getOption().matches(options::OPT_ffinite_math_only))
3968 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003969
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003970 // Decide whether to use verbose asm. Verbose assembly is the default on
3971 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003972 bool IsIntegratedAssemblerDefault =
3973 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003974 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003975 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003976 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003977 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003978
Rafael Espindolab8a12932015-05-22 20:44:03 +00003979 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3980 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003981 CmdArgs.push_back("-no-integrated-as");
3982
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003983 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3984 CmdArgs.push_back("-mdebug-pass");
3985 CmdArgs.push_back("Structure");
3986 }
3987 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3988 CmdArgs.push_back("-mdebug-pass");
3989 CmdArgs.push_back("Arguments");
3990 }
3991
Justin Lebar710a35f2016-01-25 22:36:35 +00003992 // Enable -mconstructor-aliases except on darwin, where we have to work around
3993 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
3994 // aliases aren't supported.
3995 if (!getToolChain().getTriple().isOSDarwin() &&
3996 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00003997 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003998
John McCall7ef5cb32011-03-18 02:56:14 +00003999 // Darwin's kernel doesn't support guard variables; just die if we
4000 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004001 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004002 CmdArgs.push_back("-fforbid-guard-variables");
4003
Akira Hatanaka02028482015-11-12 17:21:22 +00004004 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4005 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004006 CmdArgs.push_back("-mms-bitfields");
4007 }
John McCall8517abc2010-02-19 02:45:38 +00004008
Daniel Dunbar306945d2009-09-16 06:17:29 +00004009 // This is a coarse approximation of what llvm-gcc actually does, both
4010 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4011 // complicated ways.
4012 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004013 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4014 options::OPT_fno_asynchronous_unwind_tables,
4015 (getToolChain().IsUnwindTablesDefault() ||
4016 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4017 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004018 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4019 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004020 CmdArgs.push_back("-munwind-tables");
4021
Chandler Carruth05fb5852012-11-21 23:40:23 +00004022 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004023
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004024 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4025 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004026 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004027 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004028
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004029 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004030 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004031
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004032 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004033 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004034 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004035 }
4036
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004037 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004038 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004039 if (!CPU.empty()) {
4040 CmdArgs.push_back("-target-cpu");
4041 CmdArgs.push_back(Args.MakeArgString(CPU));
4042 }
4043
Rafael Espindolaeb265472013-08-21 21:59:03 +00004044 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4045 CmdArgs.push_back("-mfpmath");
4046 CmdArgs.push_back(A->getValue());
4047 }
4048
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004049 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004050 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004051
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004052 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004053 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004054 default:
4055 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004056
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004057 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004058 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004059 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004060 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004061 // Use the effective triple, which takes into account the deployment target.
4062 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004063 break;
4064
Tim Northover573cbee2014-05-24 12:52:07 +00004065 case llvm::Triple::aarch64:
4066 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004067 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004068 break;
4069
Eric Christopher0b26a612010-03-02 02:41:08 +00004070 case llvm::Triple::mips:
4071 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004072 case llvm::Triple::mips64:
4073 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004074 AddMIPSTargetArgs(Args, CmdArgs);
4075 break;
4076
Ulrich Weigand8afad612014-07-28 13:17:52 +00004077 case llvm::Triple::ppc:
4078 case llvm::Triple::ppc64:
4079 case llvm::Triple::ppc64le:
4080 AddPPCTargetArgs(Args, CmdArgs);
4081 break;
4082
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004083 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004084 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004085 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004086 AddSparcTargetArgs(Args, CmdArgs);
4087 break;
4088
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004089 case llvm::Triple::x86:
4090 case llvm::Triple::x86_64:
4091 AddX86TargetArgs(Args, CmdArgs);
4092 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004093
4094 case llvm::Triple::hexagon:
4095 AddHexagonTargetArgs(Args, CmdArgs);
4096 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004097
4098 case llvm::Triple::wasm32:
4099 case llvm::Triple::wasm64:
4100 AddWebAssemblyTargetArgs(Args, CmdArgs);
4101 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004102 }
4103
Douglas Katzman3459ce22015-10-08 04:24:12 +00004104 // The 'g' groups options involve a somewhat intricate sequence of decisions
4105 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004106 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004107 // * what level of debug info to generate
4108 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004109 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004110 // This avoids having to monkey around further in cc1 other than to disable
4111 // codeview if not running in a Windows environment. Perhaps even that
4112 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004113 unsigned DwarfVersion = 0;
4114 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4115 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004116 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004117 bool EmitCodeView = false;
4118
Hans Wennborg75958c42013-08-08 00:17:41 +00004119 // Add clang-cl arguments.
4120 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004121 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004122
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004123 // Pass the linker version in use.
4124 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4125 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004126 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004127 }
4128
Eric Christopherb7d97e92013-04-03 01:58:53 +00004129 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004130 CmdArgs.push_back("-momit-leaf-frame-pointer");
4131
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004132 // Explicitly error on some things we know we don't support and can't just
4133 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004134 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004135 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4136 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004137 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004138 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004139 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4140 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004141 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004142 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004143 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004144 }
4145
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004146 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004147 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004148 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004149 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004150 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4151 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004152 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004153 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004154 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004155
Chad Rosierbe10f982011-08-02 17:58:04 +00004156 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004157 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004158 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4159 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004160 }
4161
Rafael Espindola08a692a2010-03-07 04:46:18 +00004162 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004163 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004164 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004165 // If the last option explicitly specified a debug-info level, use it.
4166 if (A->getOption().matches(options::OPT_gN_Group)) {
4167 DebugInfoKind = DebugLevelToInfoKind(*A);
4168 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4169 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4170 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004171 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004172 A->getIndex() > SplitDwarfArg->getIndex())
4173 SplitDwarfArg = nullptr;
4174 } else
4175 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004176 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004177 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004178
Paul Robinson0334a042015-12-19 19:41:48 +00004179 // If a debugger tuning argument appeared, remember it.
4180 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4181 options::OPT_ggdbN_Group)) {
4182 if (A->getOption().matches(options::OPT_glldb))
4183 DebuggerTuning = llvm::DebuggerKind::LLDB;
4184 else if (A->getOption().matches(options::OPT_gsce))
4185 DebuggerTuning = llvm::DebuggerKind::SCE;
4186 else
4187 DebuggerTuning = llvm::DebuggerKind::GDB;
4188 }
4189
4190 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004191 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004192 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004193 DwarfVersion = DwarfVersionNum(A->getSpelling());
4194
Reid Kleckner124955a2015-08-05 18:51:13 +00004195 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004196 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4197 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4198 // DwarfVersion remains at 0 if no explicit choice was made.
4199 CmdArgs.push_back("-gcodeview");
4200 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004201 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004202 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4203 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004204
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004205 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4206 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004207
4208 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004209 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004210 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004211 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004212
Eric Christopher138c32b2013-09-13 22:37:55 +00004213 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004214 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004215 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004216 CmdArgs.push_back("-dwarf-ext-refs");
4217 CmdArgs.push_back("-fmodule-format=obj");
4218 }
4219
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004220 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4221 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004222 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004223 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004224 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004225 CmdArgs.push_back("-backend-option");
4226 CmdArgs.push_back("-split-dwarf=Enable");
4227 }
4228
Douglas Katzman3459ce22015-10-08 04:24:12 +00004229 // After we've dealt with all combinations of things that could
4230 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4231 // figure out if we need to "upgrade" it to standalone debug info.
4232 // We parse these two '-f' options whether or not they will be used,
4233 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4234 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4235 options::OPT_fno_standalone_debug,
4236 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004237 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4238 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004239 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4240 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004241
Eric Christopher138c32b2013-09-13 22:37:55 +00004242 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4243 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4244 CmdArgs.push_back("-backend-option");
4245 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4246 }
Eric Christophereec89c22013-06-18 00:03:50 +00004247
Eric Christopher0d403d22014-02-14 01:27:03 +00004248 // -gdwarf-aranges turns on the emission of the aranges section in the
4249 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004250 // Always enabled on the PS4.
4251 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004252 CmdArgs.push_back("-backend-option");
4253 CmdArgs.push_back("-generate-arange-section");
4254 }
4255
David Blaikief36d9ba2014-01-27 18:52:43 +00004256 if (Args.hasFlag(options::OPT_fdebug_types_section,
4257 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004258 CmdArgs.push_back("-backend-option");
4259 CmdArgs.push_back("-generate-type-units");
4260 }
Eric Christophereec89c22013-06-18 00:03:50 +00004261
Dan Gohmana5b804b2016-01-07 00:50:27 +00004262 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4263 // default.
4264 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4265 Triple.getArch() == llvm::Triple::wasm32 ||
4266 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004267
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004268 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004269 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004270 CmdArgs.push_back("-ffunction-sections");
4271 }
4272
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004273 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4274 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004275 CmdArgs.push_back("-fdata-sections");
4276 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004277
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004278 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004279 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004280 CmdArgs.push_back("-fno-unique-section-names");
4281
Chris Lattner3c77a352010-06-22 00:03:40 +00004282 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4283
Diego Novilloa0545962015-07-10 18:00:07 +00004284 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004285
Paul Robinsond083b9a2015-12-16 17:25:27 +00004286 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4287 if (getToolChain().getTriple().isPS4CPU())
4288 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4289
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004290 // Pass options for controlling the default header search paths.
4291 if (Args.hasArg(options::OPT_nostdinc)) {
4292 CmdArgs.push_back("-nostdsysteminc");
4293 CmdArgs.push_back("-nobuiltininc");
4294 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004295 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004296 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004297 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4298 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4299 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004300
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004301 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004302 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004303 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004304
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004305 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4306
Ted Kremenekf7639e12012-03-06 20:06:33 +00004307 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004308 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004309 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004310 options::OPT_ccc_arcmt_modify,
4311 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004312 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004313 switch (A->getOption().getID()) {
4314 default:
4315 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004316 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004317 CmdArgs.push_back("-arcmt-check");
4318 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004319 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004320 CmdArgs.push_back("-arcmt-modify");
4321 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004322 case options::OPT_ccc_arcmt_migrate:
4323 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004324 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004325 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004326
4327 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4328 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004329 break;
John McCalld70fb982011-06-15 23:25:17 +00004330 }
4331 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004332 } else {
4333 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4334 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4335 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004336 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004337
Ted Kremenekf7639e12012-03-06 20:06:33 +00004338 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4339 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004340 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4341 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004342 }
4343 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004344 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004345
4346 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004347 options::OPT_objcmt_migrate_subscripting,
4348 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004349 // None specified, means enable them all.
4350 CmdArgs.push_back("-objcmt-migrate-literals");
4351 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004352 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004353 } else {
4354 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4355 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004356 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004357 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004358 } else {
4359 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4360 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4361 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4362 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4363 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4364 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004365 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004366 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4367 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4368 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4369 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4370 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4371 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4372 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004373 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004374 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004375 }
4376
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004377 // Add preprocessing options like -I, -D, etc. if we are using the
4378 // preprocessor.
4379 //
4380 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004381 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004382 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4383 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004384
Rafael Espindolaa7431922011-07-21 23:40:37 +00004385 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4386 // that "The compiler can only warn and ignore the option if not recognized".
4387 // When building with ccache, it will pass -D options to clang even on
4388 // preprocessed inputs and configure concludes that -fPIC is not supported.
4389 Args.ClaimAllArgs(options::OPT_D);
4390
Alp Toker7874bdc2013-11-15 20:40:58 +00004391 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004392 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4393 if (A->getOption().matches(options::OPT_O4)) {
4394 CmdArgs.push_back("-O3");
4395 D.Diag(diag::warn_O4_is_O3);
4396 } else {
4397 A->render(Args, CmdArgs);
4398 }
4399 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004400
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004401 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004402 for (const Arg *A :
4403 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4404 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004405 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004406 }
4407
Rafael Espindola577637a2015-01-03 00:06:04 +00004408 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004409
Richard Smith3be1cb22014-08-07 00:24:21 +00004410 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004411 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004412 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4413 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004414 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004415 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004416
4417 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004418 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004419 //
4420 // If a std is supplied, only add -trigraphs if it follows the
4421 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004422 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004423 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4424 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004425 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004426 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004427 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004428 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004429 else
4430 Std->render(Args, CmdArgs);
4431
Nico Weber00721502014-12-23 22:32:37 +00004432 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004433 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004434 options::OPT_ftrigraphs,
4435 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004436 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004437 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004438 } else {
4439 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004440 //
4441 // FIXME: Clang doesn't correctly handle -std= when the input language
4442 // doesn't match. For the time being just ignore this for C++ inputs;
4443 // eventually we want to do all the standard defaulting here instead of
4444 // splitting it between the driver and clang -cc1.
4445 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004446 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4447 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004448 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004449 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004450
Nico Weber00721502014-12-23 22:32:37 +00004451 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4452 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004453 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004454
Richard Smith282b4492013-09-04 22:50:31 +00004455 // GCC's behavior for -Wwrite-strings is a bit strange:
4456 // * In C, this "warning flag" changes the types of string literals from
4457 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4458 // for the discarded qualifier.
4459 // * In C++, this is just a normal warning flag.
4460 //
4461 // Implementing this warning correctly in C is hard, so we follow GCC's
4462 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4463 // a non-const char* in C, rather than using this crude hack.
4464 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004465 // FIXME: This should behave just like a warning flag, and thus should also
4466 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4467 Arg *WriteStrings =
4468 Args.getLastArg(options::OPT_Wwrite_strings,
4469 options::OPT_Wno_write_strings, options::OPT_w);
4470 if (WriteStrings &&
4471 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004472 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004473 }
4474
Chandler Carruth61fbf622011-04-23 09:27:53 +00004475 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004476 // during C++ compilation, which it is by default. GCC keeps this define even
4477 // in the presence of '-w', match this behavior bug-for-bug.
4478 if (types::isCXX(InputType) &&
4479 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4480 true)) {
4481 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004482 }
4483
Chandler Carruthe0391482010-05-22 02:21:53 +00004484 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4485 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4486 if (Asm->getOption().matches(options::OPT_fasm))
4487 CmdArgs.push_back("-fgnu-keywords");
4488 else
4489 CmdArgs.push_back("-fno-gnu-keywords");
4490 }
4491
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004492 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4493 CmdArgs.push_back("-fno-dwarf-directory-asm");
4494
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004495 if (ShouldDisableAutolink(Args, getToolChain()))
4496 CmdArgs.push_back("-fno-autolink");
4497
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004498 // Add in -fdebug-compilation-dir if necessary.
4499 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004500
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004501 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4502 StringRef Map = A->getValue();
4503 if (Map.find('=') == StringRef::npos)
4504 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4505 else
4506 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4507 A->claim();
4508 }
4509
Richard Smith9a568822011-11-21 19:36:32 +00004510 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4511 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004512 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004513 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004514 }
4515
Richard Smith79c927b2013-11-06 19:31:51 +00004516 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4517 CmdArgs.push_back("-foperator-arrow-depth");
4518 CmdArgs.push_back(A->getValue());
4519 }
4520
Richard Smith9a568822011-11-21 19:36:32 +00004521 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4522 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004523 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004524 }
4525
Richard Smitha3d3bd22013-05-08 02:12:03 +00004526 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4527 CmdArgs.push_back("-fconstexpr-steps");
4528 CmdArgs.push_back(A->getValue());
4529 }
4530
Richard Smithb3a14522013-02-22 01:59:51 +00004531 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4532 CmdArgs.push_back("-fbracket-depth");
4533 CmdArgs.push_back(A->getValue());
4534 }
4535
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004536 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4537 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004538 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004539 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004540 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4541 } else
4542 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004543 }
4544
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004545 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004546 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004547
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004548 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4549 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004550 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004551 }
David Chisnall5778fce2009-08-31 16:41:57 +00004552
Chris Lattnere23003d2010-01-09 21:54:33 +00004553 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4554 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004555 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004556 }
4557
Chris Lattnerb35583d2010-04-07 20:49:23 +00004558 CmdArgs.push_back("-ferror-limit");
4559 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004560 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004561 else
4562 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004563
Chandler Carrutha77a7272010-05-06 04:55:18 +00004564 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4565 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004566 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004567 }
4568
4569 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4570 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004571 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004572 }
4573
Richard Smithf6f003a2011-12-16 19:06:07 +00004574 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4575 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004576 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004577 }
4578
Nick Lewycky24653262014-12-16 21:39:02 +00004579 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4580 CmdArgs.push_back("-fspell-checking-limit");
4581 CmdArgs.push_back(A->getValue());
4582 }
4583
Daniel Dunbar2c978472009-11-04 06:24:47 +00004584 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004585 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004586 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004587 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004588 } else {
4589 // If -fmessage-length=N was not specified, determine whether this is a
4590 // terminal and, if so, implicitly define -fmessage-length appropriately.
4591 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004592 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004593 }
4594
John McCallb4a99d32013-02-19 01:57:35 +00004595 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4596 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4597 options::OPT_fvisibility_ms_compat)) {
4598 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4599 CmdArgs.push_back("-fvisibility");
4600 CmdArgs.push_back(A->getValue());
4601 } else {
4602 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4603 CmdArgs.push_back("-fvisibility");
4604 CmdArgs.push_back("hidden");
4605 CmdArgs.push_back("-ftype-visibility");
4606 CmdArgs.push_back("default");
4607 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004608 }
4609
Douglas Gregor08329632010-06-15 17:05:35 +00004610 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004611
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004612 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4613
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004614 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004615 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4616 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004617 CmdArgs.push_back("-ffreestanding");
4618
Daniel Dunbare357d562009-12-03 18:42:11 +00004619 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004620 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004621 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004622 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004623 // Emulated TLS is enabled by default on Android, and can be enabled manually
4624 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004625 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004626 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4627 EmulatedTLSDefault))
4628 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004629 // AltiVec-like language extensions aren't relevant for assembling.
4630 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004631 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004632 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4633 }
Richard Trieu91844232012-06-26 18:18:47 +00004634 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4635 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004636
Alexey Bataevdb390212015-05-20 04:24:19 +00004637 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004638 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4639 options::OPT_fno_openmp, false))
4640 switch (getOpenMPRuntime(getToolChain(), Args)) {
4641 case OMPRT_OMP:
4642 case OMPRT_IOMP5:
4643 // Clang can generate useful OpenMP code for these two runtime libraries.
4644 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004645
4646 // If no option regarding the use of TLS in OpenMP codegeneration is
4647 // given, decide a default based on the target. Otherwise rely on the
4648 // options and pass the right information to the frontend.
4649 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004650 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004651 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004652 break;
4653 default:
4654 // By default, if Clang doesn't know how to generate useful OpenMP code
4655 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4656 // down to the actual compilation.
4657 // FIXME: It would be better to have a mode which *only* omits IR
4658 // generation based on the OpenMP support so that we get consistent
4659 // semantic analysis, etc.
4660 break;
4661 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004662
Peter Collingbourne32701642013-11-01 18:16:25 +00004663 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004664 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004665
Eric Christopher459d2712013-02-19 06:16:53 +00004666 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004667 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4668 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4669 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4670 Arch == llvm::Triple::ppc64le))
4671 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4672 << "ppc/ppc64/ppc64le";
4673 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004674
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004675 // -fzvector is incompatible with -faltivec.
4676 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4677 if (Args.hasArg(options::OPT_faltivec))
4678 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4679 << "-faltivec";
4680
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004681 if (getToolChain().SupportsProfiling())
4682 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004683
4684 // -flax-vector-conversions is default.
4685 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4686 options::OPT_fno_lax_vector_conversions))
4687 CmdArgs.push_back("-fno-lax-vector-conversions");
4688
John Brawna7b4ec02015-08-10 11:11:28 +00004689 if (Args.getLastArg(options::OPT_fapple_kext) ||
4690 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004691 CmdArgs.push_back("-fapple-kext");
4692
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004693 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004694 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004695 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004696 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4697 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004698
4699 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4700 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004701 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004702 }
4703
Bob Wilson14adb362012-02-03 06:27:22 +00004704 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004705
Chandler Carruth6e501032011-03-27 00:04:55 +00004706 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4707 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004708 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004709 if (A->getOption().matches(options::OPT_fwrapv))
4710 CmdArgs.push_back("-fwrapv");
4711 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4712 options::OPT_fno_strict_overflow)) {
4713 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4714 CmdArgs.push_back("-fwrapv");
4715 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004716
4717 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4718 options::OPT_fno_reroll_loops))
4719 if (A->getOption().matches(options::OPT_freroll_loops))
4720 CmdArgs.push_back("-freroll-loops");
4721
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004722 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004723 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4724 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004725
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004726 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4727
Daniel Dunbar4930e332009-11-17 08:07:36 +00004728 // -stack-protector=0 is default.
4729 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004730 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4731 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4732 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4733 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4734 Args.ClaimAllArgs(options::OPT_fstack_protector);
4735 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004736 options::OPT_fstack_protector_all,
4737 options::OPT_fstack_protector_strong,
4738 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004739 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004740 StackProtectorLevel = std::max<unsigned>(
4741 LangOptions::SSPOn,
4742 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004743 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004744 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004745 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004746 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004747 } else {
4748 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004749 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004750 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004751 if (StackProtectorLevel) {
4752 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004753 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004754 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004755
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004756 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004757 for (const Arg *A : Args.filtered(options::OPT__param)) {
4758 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004759 if (Str.startswith("ssp-buffer-size=")) {
4760 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004761 CmdArgs.push_back("-stack-protector-buffer-size");
4762 // FIXME: Verify the argument is a valid integer.
4763 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004764 }
Sean Silva14facf32015-06-09 01:57:17 +00004765 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004766 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004767 }
4768
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004769 // Translate -mstackrealign
4770 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004771 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004772 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004773
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004774 if (Args.hasArg(options::OPT_mstack_alignment)) {
4775 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4776 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004777 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004778
Hans Wennborg77dc2362015-01-20 19:45:50 +00004779 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4780 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4781
4782 if (!Size.empty())
4783 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4784 else
4785 CmdArgs.push_back("-mstack-probe-size=0");
4786 }
4787
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004788 switch (getToolChain().getArch()) {
4789 case llvm::Triple::aarch64:
4790 case llvm::Triple::aarch64_be:
4791 case llvm::Triple::arm:
4792 case llvm::Triple::armeb:
4793 case llvm::Triple::thumb:
4794 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004795 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004796 break;
4797
4798 default:
4799 break;
4800 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004801
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004802 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4803 options::OPT_mno_restrict_it)) {
4804 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4805 CmdArgs.push_back("-backend-option");
4806 CmdArgs.push_back("-arm-restrict-it");
4807 } else {
4808 CmdArgs.push_back("-backend-option");
4809 CmdArgs.push_back("-arm-no-restrict-it");
4810 }
James Y Knight2db38f32015-08-15 03:45:25 +00004811 } else if (Triple.isOSWindows() &&
4812 (Triple.getArch() == llvm::Triple::arm ||
4813 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004814 // Windows on ARM expects restricted IT blocks
4815 CmdArgs.push_back("-backend-option");
4816 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004817 }
4818
Daniel Dunbard18049a2009-04-07 21:16:11 +00004819 // Forward -f options with positive and negative forms; we translate
4820 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004821 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4822 StringRef fname = A->getValue();
4823 if (!llvm::sys::fs::exists(fname))
4824 D.Diag(diag::err_drv_no_such_file) << fname;
4825 else
4826 A->render(Args, CmdArgs);
4827 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004828
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004829 // -fbuiltin is default unless -mkernel is used.
4830 bool UseBuiltins =
4831 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4832 !Args.hasArg(options::OPT_mkernel));
4833 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004834 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004835
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004836 // -ffreestanding implies -fno-builtin.
4837 if (Args.hasArg(options::OPT_ffreestanding))
4838 UseBuiltins = false;
4839
4840 // Process the -fno-builtin-* options.
4841 for (const auto &Arg : Args) {
4842 const Option &O = Arg->getOption();
4843 if (!O.matches(options::OPT_fno_builtin_))
4844 continue;
4845
4846 Arg->claim();
4847 // If -fno-builtin is specified, then there's no need to pass the option to
4848 // the frontend.
4849 if (!UseBuiltins)
4850 continue;
4851
4852 StringRef FuncName = Arg->getValue();
4853 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4854 }
4855
Nuno Lopes13c88c72009-12-16 16:59:22 +00004856 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4857 options::OPT_fno_assume_sane_operator_new))
4858 CmdArgs.push_back("-fno-assume-sane-operator-new");
4859
Daniel Dunbar4930e332009-11-17 08:07:36 +00004860 // -fblocks=0 is default.
4861 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004862 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004863 (Args.hasArg(options::OPT_fgnu_runtime) &&
4864 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4865 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004866 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004867
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004868 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004869 !getToolChain().hasBlocksRuntime())
4870 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004871 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004872
Richard Smith47972af2015-06-16 00:08:24 +00004873 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004874 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004875 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004876 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004877 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004878 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4879 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004880 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004881 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004882 HaveModules = true;
4883 }
4884 }
4885
Richard Smith47972af2015-06-16 00:08:24 +00004886 // -fmodule-maps enables implicit reading of module map files. By default,
4887 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004888 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4889 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004890 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004891 }
4892
Daniel Jasperac42b752013-10-21 06:34:34 +00004893 // -fmodules-decluse checks that modules used are declared so (off by
4894 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004895 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004896 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004897 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004898 }
4899
Daniel Jasper962b38e2014-04-11 11:47:45 +00004900 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4901 // all #included headers are part of modules.
4902 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004903 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004904 CmdArgs.push_back("-fmodules-strict-decluse");
4905 }
4906
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004907 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4908 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4909 options::OPT_fno_implicit_modules)) {
4910 CmdArgs.push_back("-fno-implicit-modules");
4911 }
4912
Daniel Jasperac42b752013-10-21 06:34:34 +00004913 // -fmodule-name specifies the module that is currently being built (or
4914 // used for header checking by -fmodule-maps).
Richard Smith7e82e012016-02-19 22:25:36 +00004915 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
Daniel Jasperac42b752013-10-21 06:34:34 +00004916
Richard Smith9887d792014-10-17 01:42:53 +00004917 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004918 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004919 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004920
Richard Smithe842a472014-10-22 02:05:46 +00004921 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004922 if (HaveModules)
4923 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4924 else
4925 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004926
4927 // -fmodule-cache-path specifies where our implicitly-built module files
4928 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004929 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004930 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004931 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004932 if (HaveModules) {
4933 if (C.isForDiagnostics()) {
4934 // When generating crash reports, we want to emit the modules along with
4935 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004936 Path = Output.getFilename();
4937 llvm::sys::path::replace_extension(Path, ".cache");
4938 llvm::sys::path::append(Path, "modules");
4939 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004940 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004941 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004942 llvm::sys::path::append(Path, "org.llvm.clang.");
4943 appendUserToPath(Path);
4944 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004945 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004946 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004947 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4948 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004949 }
4950
4951 // When building modules and generating crashdumps, we need to dump a module
4952 // dependency VFS alongside the output.
4953 if (HaveModules && C.isForDiagnostics()) {
4954 SmallString<128> VFSDir(Output.getFilename());
4955 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004956 // Add the cache directory as a temp so the crash diagnostics pick it up.
4957 C.addTempFile(Args.MakeArgString(VFSDir));
4958
Justin Bognera88f0122014-06-20 22:59:50 +00004959 llvm::sys::path::append(VFSDir, "vfs");
4960 CmdArgs.push_back("-module-dependency-dir");
4961 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004962 }
4963
Richard Smith9887d792014-10-17 01:42:53 +00004964 if (HaveModules)
4965 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004966
Douglas Gregor35b04d62013-02-07 19:01:24 +00004967 // Pass through all -fmodules-ignore-macro arguments.
4968 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004969 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4970 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004971
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004972 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4973
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004974 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4975 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4976 D.Diag(diag::err_drv_argument_not_allowed_with)
4977 << A->getAsString(Args) << "-fbuild-session-timestamp";
4978
4979 llvm::sys::fs::file_status Status;
4980 if (llvm::sys::fs::status(A->getValue(), Status))
4981 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004982 CmdArgs.push_back(Args.MakeArgString(
4983 "-fbuild-session-timestamp=" +
4984 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004985 }
4986
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004987 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004988 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4989 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004990 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4991
4992 Args.AddLastArg(CmdArgs,
4993 options::OPT_fmodules_validate_once_per_build_session);
4994 }
4995
Ben Langmuirdcf73862014-03-12 00:06:17 +00004996 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4997
John McCalldfea9982010-04-09 19:12:06 +00004998 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004999 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005000 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005001 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005002
Anders Carlssond470fef2010-11-21 00:09:52 +00005003 // -felide-constructors is the default.
5004 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005005 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005006 CmdArgs.push_back("-fno-elide-constructors");
5007
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005008 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005009
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005010 if (KernelOrKext || (types::isCXX(InputType) &&
5011 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5012 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005013 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005014
Tony Linthicum76329bf2011-12-12 21:14:55 +00005015 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005016 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5017 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005018 CmdArgs.push_back("-fshort-enums");
5019
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005020 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005021 if (Arg *A = Args.getLastArg(
5022 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5023 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5024 if (A->getOption().matches(options::OPT_funsigned_char) ||
5025 A->getOption().matches(options::OPT_fno_signed_char)) {
5026 CmdArgs.push_back("-fno-signed-char");
5027 }
5028 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005029 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005030 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005031
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005032 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005033 if (!Args.hasFlag(
5034 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5035 !IsWindowsCygnus && !IsWindowsGNU &&
5036 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5037 getToolChain().getArch() != llvm::Triple::hexagon &&
5038 getToolChain().getArch() != llvm::Triple::xcore &&
5039 ((getToolChain().getTriple().getVendor() !=
5040 llvm::Triple::MipsTechnologies) ||
5041 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005042 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005043 CmdArgs.push_back("-fno-use-cxa-atexit");
5044
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005045 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005046 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005047 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005048 CmdArgs.push_back("-fms-extensions");
5049
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005050 // -fno-use-line-directives is default.
5051 if (Args.hasFlag(options::OPT_fuse_line_directives,
5052 options::OPT_fno_use_line_directives, false))
5053 CmdArgs.push_back("-fuse-line-directives");
5054
Francois Pichet1b4f1632011-09-17 04:32:15 +00005055 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005056 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005057 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005058 (IsWindowsMSVC &&
5059 Args.hasFlag(options::OPT_fms_extensions,
5060 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005061 CmdArgs.push_back("-fms-compatibility");
5062
David Majnemerc371ff02015-03-22 08:39:22 +00005063 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005064 VersionTuple MSVT = visualstudio::getMSVCVersion(
5065 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5066 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005067 CmdArgs.push_back(
5068 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005069
David Majnemer8db91762015-05-18 04:49:30 +00005070 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5071 if (ImplyVCPPCXXVer) {
5072 if (IsMSVC2015Compatible)
5073 CmdArgs.push_back("-std=c++14");
5074 else
5075 CmdArgs.push_back("-std=c++11");
5076 }
5077
Eric Christopher5ecce122013-02-18 00:38:31 +00005078 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005079 if (Args.hasFlag(options::OPT_fborland_extensions,
5080 options::OPT_fno_borland_extensions, false))
5081 CmdArgs.push_back("-fborland-extensions");
5082
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005083 // -fno-declspec is default, except for PS4.
5084 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5085 getToolChain().getTriple().isPS4()))
5086 CmdArgs.push_back("-fdeclspec");
5087 else if (Args.hasArg(options::OPT_fno_declspec))
5088 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5089
David Majnemerc371ff02015-03-22 08:39:22 +00005090 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5091 // than 19.
5092 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5093 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005094 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005095 CmdArgs.push_back("-fno-threadsafe-statics");
5096
Francois Pichet02744872011-09-01 16:38:08 +00005097 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5098 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005099 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005100 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005101 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005102
Chandler Carruthe03aa552010-04-17 20:17:31 +00005103 // -fgnu-keywords default varies depending on language; only pass if
5104 // specified.
5105 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005106 options::OPT_fno_gnu_keywords))
5107 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005108
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005109 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005110 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005111 CmdArgs.push_back("-fgnu89-inline");
5112
Chad Rosier9c76d242012-03-15 22:31:42 +00005113 if (Args.hasArg(options::OPT_fno_inline))
5114 CmdArgs.push_back("-fno-inline");
5115
Chad Rosier64d6be92012-03-06 21:17:19 +00005116 if (Args.hasArg(options::OPT_fno_inline_functions))
5117 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005118
John McCall5fb5df92012-06-20 06:18:46 +00005119 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005120
John McCall5fb5df92012-06-20 06:18:46 +00005121 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005122 // legacy is the default. Except for deployment taget of 10.5,
5123 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5124 // gets ignored silently.
5125 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005126 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5127 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005128 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005129 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005130 if (getToolChain().UseObjCMixedDispatch())
5131 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5132 else
5133 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5134 }
5135 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005136
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005137 // When ObjectiveC legacy runtime is in effect on MacOSX,
5138 // turn on the option to do Array/Dictionary subscripting
5139 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005140 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005141 getToolChain().getTriple().isMacOSX() &&
5142 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5143 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005144 objcRuntime.isNeXTFamily())
5145 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005146
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005147 // -fencode-extended-block-signature=1 is default.
5148 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5149 CmdArgs.push_back("-fencode-extended-block-signature");
5150 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005151
John McCall24fc0de2011-07-06 00:26:06 +00005152 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5153 // NOTE: This logic is duplicated in ToolChains.cpp.
5154 bool ARC = isObjCAutoRefCount(Args);
5155 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005156 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005157
John McCall24fc0de2011-07-06 00:26:06 +00005158 CmdArgs.push_back("-fobjc-arc");
5159
Chandler Carruth491db322011-11-04 07:34:47 +00005160 // FIXME: It seems like this entire block, and several around it should be
5161 // wrapped in isObjC, but for now we just use it here as this is where it
5162 // was being used previously.
5163 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5164 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5165 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5166 else
5167 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5168 }
5169
John McCall24fc0de2011-07-06 00:26:06 +00005170 // Allow the user to enable full exceptions code emission.
5171 // We define off for Objective-CC, on for Objective-C++.
5172 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5173 options::OPT_fno_objc_arc_exceptions,
5174 /*default*/ types::isCXX(InputType)))
5175 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005176
John McCall24fc0de2011-07-06 00:26:06 +00005177 }
5178
5179 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5180 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005181 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005182 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005183
John McCall24fc0de2011-07-06 00:26:06 +00005184 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5185 // takes precedence.
5186 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5187 if (!GCArg)
5188 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5189 if (GCArg) {
5190 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005191 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005192 } else if (getToolChain().SupportsObjCGC()) {
5193 GCArg->render(Args, CmdArgs);
5194 } else {
5195 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005196 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005197 }
5198 }
5199
John McCallfbe5ed72015-11-05 19:19:56 +00005200 // Pass down -fobjc-weak or -fno-objc-weak if present.
5201 if (types::isObjC(InputType)) {
5202 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5203 options::OPT_fno_objc_weak);
5204 if (!WeakArg) {
5205 // nothing to do
5206 } else if (GCArg) {
5207 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5208 D.Diag(diag::err_objc_weak_with_gc);
5209 } else if (!objcRuntime.allowsWeak()) {
5210 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5211 D.Diag(diag::err_objc_weak_unsupported);
5212 } else {
5213 WeakArg->render(Args, CmdArgs);
5214 }
5215 }
5216
Bob Wilsonb111ec92015-03-02 19:01:14 +00005217 if (Args.hasFlag(options::OPT_fapplication_extension,
5218 options::OPT_fno_application_extension, false))
5219 CmdArgs.push_back("-fapplication-extension");
5220
Reid Klecknerc542d372014-06-27 17:02:02 +00005221 // Handle GCC-style exception args.
5222 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005223 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5224 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005225
Tim Northovere931f9f2015-10-30 16:30:41 +00005226 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005227 CmdArgs.push_back("-fsjlj-exceptions");
5228
5229 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005230 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5231 options::OPT_fno_assume_sane_operator_new))
5232 CmdArgs.push_back("-fno-assume-sane-operator-new");
5233
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005234 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5235 // most platforms.
5236 if (Args.hasFlag(options::OPT_fsized_deallocation,
5237 options::OPT_fno_sized_deallocation, false))
5238 CmdArgs.push_back("-fsized-deallocation");
5239
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005240 // -fconstant-cfstrings is default, and may be subject to argument translation
5241 // on Darwin.
5242 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5243 options::OPT_fno_constant_cfstrings) ||
5244 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5245 options::OPT_mno_constant_cfstrings))
5246 CmdArgs.push_back("-fno-constant-cfstrings");
5247
John Thompsoned4e2952009-11-05 20:14:16 +00005248 // -fshort-wchar default varies depending on platform; only
5249 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005250 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5251 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005252 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005253
Hans Wennborg28c96312013-07-31 23:39:13 +00005254 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005255 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005256 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005257 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005258
Daniel Dunbar096ed292011-10-05 21:04:55 +00005259 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5260 // -fno-pack-struct doesn't apply to -fpack-struct=.
5261 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005262 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005263 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005264 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005265 } else if (Args.hasFlag(options::OPT_fpack_struct,
5266 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005267 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005268 }
5269
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005270 // Handle -fmax-type-align=N and -fno-type-align
5271 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5272 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5273 if (!SkipMaxTypeAlign) {
5274 std::string MaxTypeAlignStr = "-fmax-type-align=";
5275 MaxTypeAlignStr += A->getValue();
5276 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5277 }
5278 } else if (getToolChain().getTriple().isOSDarwin()) {
5279 if (!SkipMaxTypeAlign) {
5280 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5281 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5282 }
5283 }
5284
John Brawna7b4ec02015-08-10 11:11:28 +00005285 // -fcommon is the default unless compiling kernel code or the target says so
5286 bool NoCommonDefault =
5287 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5288 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5289 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005290 CmdArgs.push_back("-fno-common");
5291
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005292 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005293 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005294 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005295 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005296 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005297 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005298
Daniel Dunbar6358d682010-10-15 22:30:42 +00005299 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005300 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005301 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005302 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005303
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005304 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005305 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5306 StringRef value = inputCharset->getValue();
5307 if (value != "UTF-8")
5308 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5309 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005310 }
5311
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005312 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005313 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5314 StringRef value = execCharset->getValue();
5315 if (value != "UTF-8")
5316 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5317 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005318 }
5319
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005320 // -fcaret-diagnostics is default.
5321 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5322 options::OPT_fno_caret_diagnostics, true))
5323 CmdArgs.push_back("-fno-caret-diagnostics");
5324
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005325 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005326 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005327 options::OPT_fno_diagnostics_fixit_info))
5328 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005329
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005330 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005331 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005332 options::OPT_fno_diagnostics_show_option))
5333 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005334
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005335 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005336 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005337 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005338 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005339 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005340
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005341 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005342 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005343 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005344 }
5345
Chandler Carruthb6766f02011-03-27 01:50:55 +00005346 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005347 options::OPT_fdiagnostics_show_note_include_stack,
5348 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005349 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005350 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005351 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5352 else
5353 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5354 }
5355
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005356 // Color diagnostics are the default, unless the terminal doesn't support
5357 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005358 // Support both clang's -f[no-]color-diagnostics and gcc's
5359 // -f[no-]diagnostics-colors[=never|always|auto].
5360 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005361 for (const auto &Arg : Args) {
5362 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005363 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5364 !O.matches(options::OPT_fdiagnostics_color) &&
5365 !O.matches(options::OPT_fno_color_diagnostics) &&
5366 !O.matches(options::OPT_fno_diagnostics_color) &&
5367 !O.matches(options::OPT_fdiagnostics_color_EQ))
5368 continue;
5369
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005370 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005371 if (O.matches(options::OPT_fcolor_diagnostics) ||
5372 O.matches(options::OPT_fdiagnostics_color)) {
5373 ShowColors = Colors_On;
5374 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5375 O.matches(options::OPT_fno_diagnostics_color)) {
5376 ShowColors = Colors_Off;
5377 } else {
5378 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005379 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005380 if (value == "always")
5381 ShowColors = Colors_On;
5382 else if (value == "never")
5383 ShowColors = Colors_Off;
5384 else if (value == "auto")
5385 ShowColors = Colors_Auto;
5386 else
5387 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005388 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005389 }
5390 }
5391 if (ShowColors == Colors_On ||
5392 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005393 CmdArgs.push_back("-fcolor-diagnostics");
5394
Nico Rieck7857d462013-09-11 00:38:02 +00005395 if (Args.hasArg(options::OPT_fansi_escape_codes))
5396 CmdArgs.push_back("-fansi-escape-codes");
5397
Daniel Dunbardb097022009-06-08 21:13:54 +00005398 if (!Args.hasFlag(options::OPT_fshow_source_location,
5399 options::OPT_fno_show_source_location))
5400 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005401
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005402 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005403 true))
5404 CmdArgs.push_back("-fno-show-column");
5405
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005406 if (!Args.hasFlag(options::OPT_fspell_checking,
5407 options::OPT_fno_spell_checking))
5408 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005409
Chad Rosierc8e56e82012-12-05 21:08:21 +00005410 // -fno-asm-blocks is default.
5411 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5412 false))
5413 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005414
Steven Wucb0d13f2015-01-16 23:05:28 +00005415 // -fgnu-inline-asm is default.
5416 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5417 options::OPT_fno_gnu_inline_asm, true))
5418 CmdArgs.push_back("-fno-gnu-inline-asm");
5419
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005420 // Enable vectorization per default according to the optimization level
5421 // selected. For optimization levels that want vectorization we use the alias
5422 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005423 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005424 OptSpecifier VectorizeAliasOption =
5425 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005426 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005427 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005428 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005429
Chad Rosier136d67d2014-04-28 19:30:57 +00005430 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005431 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005432 OptSpecifier SLPVectAliasOption =
5433 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005434 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005435 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005436 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005437
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005438 // -fno-slp-vectorize-aggressive is default.
5439 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005440 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005441 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005442
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005443 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5444 A->render(Args, CmdArgs);
5445
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005446 // -fdollars-in-identifiers default varies depending on platform and
5447 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005448 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005449 options::OPT_fno_dollars_in_identifiers)) {
5450 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005451 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005452 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005453 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005454 }
5455
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005456 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5457 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005458 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005459 options::OPT_fno_unit_at_a_time)) {
5460 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005461 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005462 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005463
Eli Friedman055c9702011-11-02 01:53:16 +00005464 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5465 options::OPT_fno_apple_pragma_pack, false))
5466 CmdArgs.push_back("-fapple-pragma-pack");
5467
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005468 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005469 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5470 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005471 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005472 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005473 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005474
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005475// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5476//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005477// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005478#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005479 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005480 (getToolChain().getArch() == llvm::Triple::arm ||
5481 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005482 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5483 CmdArgs.push_back("-fno-builtin-strcat");
5484 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5485 CmdArgs.push_back("-fno-builtin-strcpy");
5486 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005487#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005488
Justin Bognera88f0122014-06-20 22:59:50 +00005489 // Enable rewrite includes if the user's asked for it or if we're generating
5490 // diagnostics.
5491 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5492 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005493 if (Args.hasFlag(options::OPT_frewrite_includes,
5494 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005495 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005496 CmdArgs.push_back("-frewrite-includes");
5497
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005498 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005499 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005500 options::OPT_traditional_cpp)) {
5501 if (isa<PreprocessJobAction>(JA))
5502 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005503 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005504 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005505 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005506
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005507 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005508 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005509
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005510 // Handle serialized diagnostics.
5511 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5512 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005513 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005514 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005515
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005516 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5517 CmdArgs.push_back("-fretain-comments-from-system-headers");
5518
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005519 // Forward -fcomment-block-commands to -cc1.
5520 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005521 // Forward -fparse-all-comments to -cc1.
5522 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005523
John Brawnad31ace2015-09-23 13:55:40 +00005524 // Turn -fplugin=name.so into -load name.so
5525 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5526 CmdArgs.push_back("-load");
5527 CmdArgs.push_back(A->getValue());
5528 A->claim();
5529 }
5530
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005531 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5532 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005533 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005534 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5535 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005536
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005537 // We translate this by hand to the -cc1 argument, since nightly test uses
5538 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005539 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005540 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005541 } else
Sean Silva14facf32015-06-09 01:57:17 +00005542 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005543 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005544
Bob Wilson23a55f12014-12-21 07:00:00 +00005545 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005546 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5547 // by the frontend.
5548 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5549 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005550
Daniel Dunbard67a3222009-03-30 06:36:42 +00005551 if (Output.getType() == types::TY_Dependencies) {
5552 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005553 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005554 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005555 CmdArgs.push_back(Output.getFilename());
5556 } else {
5557 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005558 }
5559
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005560 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005561
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005562 if (Input.isFilename())
5563 CmdArgs.push_back(Input.getFilename());
5564 else
5565 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005566
Chris Lattnere9d7d782009-11-03 19:50:27 +00005567 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5568
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005569 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005570
5571 // Optionally embed the -cc1 level arguments into the debug info, for build
5572 // analysis.
5573 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005574 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005575 for (const auto &Arg : Args)
5576 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005577
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005578 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005579 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005580 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005581 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005582 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005583 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005584 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005585 }
5586 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005587 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005588 }
5589
Eric Christopherd3804002013-02-22 20:12:52 +00005590 // Add the split debug info name to the command lines here so we
5591 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005592 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005593 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5594 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005595 const char *SplitDwarfOut;
5596 if (SplitDwarf) {
5597 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005598 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005599 CmdArgs.push_back(SplitDwarfOut);
5600 }
5601
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005602 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5603 // Include them with -fcuda-include-gpubinary.
5604 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005605 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005606 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005607 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005608 }
5609
Eric Christopherd3804002013-02-22 20:12:52 +00005610 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005611 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005612 Output.getType() == types::TY_Object &&
5613 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005614 auto CLCommand =
5615 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005616 C.addCommand(llvm::make_unique<FallbackCommand>(
5617 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005618 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005619 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005620 }
5621
Eric Christopherf1545832013-02-22 23:50:16 +00005622 // Handle the debug info splitting at object creation time if we're
5623 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005624 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005625 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005626 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005627
Roman Divacky178e01602011-02-10 16:52:03 +00005628 if (Arg *A = Args.getLastArg(options::OPT_pg))
5629 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005630 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5631 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005632
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005633 // Claim some arguments which clang supports automatically.
5634
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005635 // -fpch-preprocess is used with gcc to add a special marker in the output to
5636 // include the PCH file. Clang's PTH solution is completely transparent, so we
5637 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005638 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005639
Daniel Dunbar17731772009-03-23 19:03:36 +00005640 // Claim some arguments which clang doesn't support, but we don't
5641 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005642 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5643 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005644
Rafael Espindolab0092d72013-09-04 19:37:35 +00005645 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005646 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005647}
5648
John McCall5fb5df92012-06-20 06:18:46 +00005649/// Add options related to the Objective-C runtime/ABI.
5650///
5651/// Returns true if the runtime is non-fragile.
5652ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5653 ArgStringList &cmdArgs,
5654 RewriteKind rewriteKind) const {
5655 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005656 Arg *runtimeArg =
5657 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5658 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005659
5660 // Just forward -fobjc-runtime= to the frontend. This supercedes
5661 // options about fragility.
5662 if (runtimeArg &&
5663 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5664 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005665 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005666 if (runtime.tryParse(value)) {
5667 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005668 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005669 }
5670
5671 runtimeArg->render(args, cmdArgs);
5672 return runtime;
5673 }
5674
5675 // Otherwise, we'll need the ABI "version". Version numbers are
5676 // slightly confusing for historical reasons:
5677 // 1 - Traditional "fragile" ABI
5678 // 2 - Non-fragile ABI, version 1
5679 // 3 - Non-fragile ABI, version 2
5680 unsigned objcABIVersion = 1;
5681 // If -fobjc-abi-version= is present, use that to set the version.
5682 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005683 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005684 if (value == "1")
5685 objcABIVersion = 1;
5686 else if (value == "2")
5687 objcABIVersion = 2;
5688 else if (value == "3")
5689 objcABIVersion = 3;
5690 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005691 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005692 } else {
5693 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005694 bool nonFragileABIIsDefault =
5695 (rewriteKind == RK_NonFragile ||
5696 (rewriteKind == RK_None &&
5697 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005698 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5699 options::OPT_fno_objc_nonfragile_abi,
5700 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005701// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005702#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5703 unsigned nonFragileABIVersion = 1;
5704#else
5705 unsigned nonFragileABIVersion = 2;
5706#endif
5707
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005708 if (Arg *abiArg =
5709 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005710 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005711 if (value == "1")
5712 nonFragileABIVersion = 1;
5713 else if (value == "2")
5714 nonFragileABIVersion = 2;
5715 else
5716 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005717 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005718 }
5719
5720 objcABIVersion = 1 + nonFragileABIVersion;
5721 } else {
5722 objcABIVersion = 1;
5723 }
5724 }
5725
5726 // We don't actually care about the ABI version other than whether
5727 // it's non-fragile.
5728 bool isNonFragile = objcABIVersion != 1;
5729
5730 // If we have no runtime argument, ask the toolchain for its default runtime.
5731 // However, the rewriter only really supports the Mac runtime, so assume that.
5732 ObjCRuntime runtime;
5733 if (!runtimeArg) {
5734 switch (rewriteKind) {
5735 case RK_None:
5736 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5737 break;
5738 case RK_Fragile:
5739 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5740 break;
5741 case RK_NonFragile:
5742 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5743 break;
5744 }
5745
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005746 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005747 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5748 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005749 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005750 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005752 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005753 } else {
5754 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5755 }
5756
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005757 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005758 } else {
5759 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005760 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005761 // non-fragile mode or the GCC runtime in fragile mode.
5762 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005763 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005764 else
5765 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005766 }
5767
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005768 cmdArgs.push_back(
5769 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005770 return runtime;
5771}
5772
Reid Klecknerc542d372014-06-27 17:02:02 +00005773static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5774 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5775 I += HaveDash;
5776 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005777}
Reid Klecknerc542d372014-06-27 17:02:02 +00005778
Benjamin Kramere003ca22015-10-28 13:54:16 +00005779namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005780struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005781 bool Synch = false;
5782 bool Asynch = false;
5783 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005784};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005785} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005786
5787/// /EH controls whether to run destructor cleanups when exceptions are
5788/// thrown. There are three modifiers:
5789/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5790/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5791/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005792/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005793/// The default is /EHs-c-, meaning cleanups are disabled.
5794static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5795 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005796
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005797 std::vector<std::string> EHArgs =
5798 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005799 for (auto EHVal : EHArgs) {
5800 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5801 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005802 case 'a':
5803 EH.Asynch = maybeConsumeDash(EHVal, I);
5804 continue;
5805 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005806 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005807 continue;
5808 case 's':
5809 EH.Synch = maybeConsumeDash(EHVal, I);
5810 continue;
5811 default:
5812 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005813 }
5814 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5815 break;
5816 }
5817 }
David Majnemerb8809092016-02-20 09:23:44 +00005818 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005819 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005820 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005821 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5822 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005823 EH.Synch = true;
5824 EH.NoUnwindC = true;
5825 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005826
Reid Klecknerc542d372014-06-27 17:02:02 +00005827 return EH;
5828}
5829
Douglas Katzman3459ce22015-10-08 04:24:12 +00005830void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005831 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005832 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005833 unsigned RTOptionID = options::OPT__SLASH_MT;
5834
Hans Wennborgf1a74252013-09-10 20:18:04 +00005835 if (Args.hasArg(options::OPT__SLASH_LDd))
5836 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5837 // but defining _DEBUG is sticky.
5838 RTOptionID = options::OPT__SLASH_MTd;
5839
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005840 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005841 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005842
David Majnemere2afb472015-07-24 06:49:13 +00005843 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005844 switch (RTOptionID) {
5845 case options::OPT__SLASH_MD:
5846 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005847 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005848 CmdArgs.push_back("-D_MT");
5849 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005850 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005851 break;
5852 case options::OPT__SLASH_MDd:
5853 CmdArgs.push_back("-D_DEBUG");
5854 CmdArgs.push_back("-D_MT");
5855 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005856 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005857 break;
5858 case options::OPT__SLASH_MT:
5859 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005860 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005861 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005862 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005863 break;
5864 case options::OPT__SLASH_MTd:
5865 CmdArgs.push_back("-D_DEBUG");
5866 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005867 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005868 break;
5869 default:
5870 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005871 }
5872
David Majnemere2afb472015-07-24 06:49:13 +00005873 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5874 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5875 } else {
5876 CmdArgs.push_back(FlagForCRT.data());
5877
5878 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5879 // users want. The /Za flag to cl.exe turns this off, but it's not
5880 // implemented in clang.
5881 CmdArgs.push_back("--dependent-lib=oldnames");
5882 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005883
Hans Wennborg8858a032014-07-21 23:42:07 +00005884 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5885 // would produce interleaved output, so ignore /showIncludes in such cases.
5886 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5887 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5888 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005889
David Majnemerf6072342014-07-01 22:24:56 +00005890 // This controls whether or not we emit RTTI data for polymorphic types.
5891 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5892 /*default=*/false))
5893 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005894
Reid Kleckner124955a2015-08-05 18:51:13 +00005895 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005896 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00005897 if (*EmitCodeView)
5898 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00005899 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005900 CmdArgs.push_back("-gcodeview");
5901
Reid Klecknerc542d372014-06-27 17:02:02 +00005902 const Driver &D = getToolChain().getDriver();
5903 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005904 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005905 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005906 CmdArgs.push_back("-fexceptions");
David Majnemer960813e2016-02-20 09:23:47 +00005907 if (EH.NoUnwindC)
5908 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005909 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005910
Hans Wennborge50cec32014-06-13 20:59:54 +00005911 // /EP should expand to -E -P.
5912 if (Args.hasArg(options::OPT__SLASH_EP)) {
5913 CmdArgs.push_back("-E");
5914 CmdArgs.push_back("-P");
5915 }
5916
David Majnemera5b195a2015-02-14 01:35:12 +00005917 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005918 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5919 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005920 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5921 else
5922 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5923
5924 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5925 VolatileOptionID = A->getOption().getID();
5926
5927 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5928 CmdArgs.push_back("-fms-volatile");
5929
David Majnemer86c318f2014-02-11 21:05:00 +00005930 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5931 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5932 if (MostGeneralArg && BestCaseArg)
5933 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5934 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5935
5936 if (MostGeneralArg) {
5937 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5938 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5939 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5940
5941 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5942 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5943 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5944 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5945 << FirstConflict->getAsString(Args)
5946 << SecondConflict->getAsString(Args);
5947
5948 if (SingleArg)
5949 CmdArgs.push_back("-fms-memptr-rep=single");
5950 else if (MultipleArg)
5951 CmdArgs.push_back("-fms-memptr-rep=multiple");
5952 else
5953 CmdArgs.push_back("-fms-memptr-rep=virtual");
5954 }
5955
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005956 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5957 A->render(Args, CmdArgs);
5958
Hans Wennborg81f74482013-09-10 01:07:07 +00005959 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5960 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005961 if (Args.hasArg(options::OPT__SLASH_fallback))
5962 CmdArgs.push_back("msvc-fallback");
5963 else
5964 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005965 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005966}
5967
Douglas Katzman95354292015-06-23 20:42:09 +00005968visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005969 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005970 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005971 return CLFallback.get();
5972}
5973
Daniel Sanders7f933f42015-01-30 17:35:23 +00005974void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5975 ArgStringList &CmdArgs) const {
5976 StringRef CPUName;
5977 StringRef ABIName;
5978 const llvm::Triple &Triple = getToolChain().getTriple();
5979 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5980
5981 CmdArgs.push_back("-target-abi");
5982 CmdArgs.push_back(ABIName.data());
5983}
5984
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005985void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005986 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005987 const ArgList &Args,
5988 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005989 ArgStringList CmdArgs;
5990
5991 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5992 const InputInfo &Input = Inputs[0];
5993
James Y Knight2db38f32015-08-15 03:45:25 +00005994 std::string TripleStr =
5995 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5996 const llvm::Triple Triple(TripleStr);
5997
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005998 // Don't warn about "clang -w -c foo.s"
5999 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006000 // and "clang -emit-llvm -c foo.s"
6001 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006002
Rafael Espindola577637a2015-01-03 00:06:04 +00006003 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006004
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006005 // Invoke ourselves in -cc1as mode.
6006 //
6007 // FIXME: Implement custom jobs for internal actions.
6008 CmdArgs.push_back("-cc1as");
6009
6010 // Add the "effective" target triple.
6011 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006012 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6013
6014 // Set the output mode, we currently only expect to be used as a real
6015 // assembler.
6016 CmdArgs.push_back("-filetype");
6017 CmdArgs.push_back("obj");
6018
Eric Christopher45f2e712012-12-18 00:31:10 +00006019 // Set the main file name, so that debug info works even with
6020 // -save-temps or preprocessed assembly.
6021 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006022 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006023
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006024 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006025 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006026 if (!CPU.empty()) {
6027 CmdArgs.push_back("-target-cpu");
6028 CmdArgs.push_back(Args.MakeArgString(CPU));
6029 }
6030
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006031 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006032 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006033
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006034 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006035 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006036
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006037 // Pass along any -I options so we get proper .include search paths.
6038 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6039
Eric Christopherfc3ee562012-01-10 00:38:01 +00006040 // Determine the original source input.
6041 const Action *SourceAction = &JA;
6042 while (SourceAction->getKind() != Action::InputClass) {
6043 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6044 SourceAction = SourceAction->getInputs()[0];
6045 }
6046
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006047 // Forward -g and handle debug info related flags, assuming we are dealing
6048 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006049 if (SourceAction->getType() == types::TY_Asm ||
6050 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006051 bool WantDebug = false;
6052 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006053 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006054 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006055 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6056 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006057 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006058 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006059 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006060 if (DwarfVersion == 0)
6061 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006062 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006063 (WantDebug ? codegenoptions::LimitedDebugInfo
6064 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006065 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006066
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006067 // Add the -fdebug-compilation-dir flag if needed.
6068 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006069
6070 // Set the AT_producer to the clang version when using the integrated
6071 // assembler on assembly source files.
6072 CmdArgs.push_back("-dwarf-debug-producer");
6073 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006074
6075 // And pass along -I options
6076 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006077 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006078
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006079 // Handle -fPIC et al -- the relocation-model affects the assembler
6080 // for some targets.
6081 llvm::Reloc::Model RelocationModel;
6082 unsigned PICLevel;
6083 bool IsPIE;
6084 std::tie(RelocationModel, PICLevel, IsPIE) =
6085 ParsePICArgs(getToolChain(), Triple, Args);
6086
6087 const char *RMName = RelocationModelName(RelocationModel);
6088 if (RMName) {
6089 CmdArgs.push_back("-mrelocation-model");
6090 CmdArgs.push_back(RMName);
6091 }
6092
Kevin Enderby292dc082011-12-22 19:31:58 +00006093 // Optionally embed the -cc1as level arguments into the debug info, for build
6094 // analysis.
6095 if (getToolChain().UseDwarfDebugFlags()) {
6096 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006097 for (const auto &Arg : Args)
6098 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006099
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006100 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006101 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6102 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006103 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006104 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006105 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006106 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006107 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006108 }
6109 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006110 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006111 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006112
6113 // FIXME: Add -static support, once we have it.
6114
Daniel Sanders7f933f42015-01-30 17:35:23 +00006115 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006116 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006117 default:
6118 break;
6119
6120 case llvm::Triple::mips:
6121 case llvm::Triple::mipsel:
6122 case llvm::Triple::mips64:
6123 case llvm::Triple::mips64el:
6124 AddMIPSTargetArgs(Args, CmdArgs);
6125 break;
6126 }
6127
David Blaikie372d9502014-01-17 03:17:40 +00006128 // Consume all the warning flags. Usually this would be handled more
6129 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6130 // doesn't handle that so rather than warning about unused flags that are
6131 // actually used, we'll lie by omission instead.
6132 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006133 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006134
David Blaikie9260ed62013-07-25 21:19:01 +00006135 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6136 getToolChain().getDriver());
6137
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006138 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006139
6140 assert(Output.isFilename() && "Unexpected lipo output.");
6141 CmdArgs.push_back("-o");
6142 CmdArgs.push_back(Output.getFilename());
6143
Daniel Dunbarb440f562010-08-02 02:38:21 +00006144 assert(Input.isFilename() && "Invalid input.");
6145 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006146
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006147 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006148 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006149
6150 // Handle the debug info splitting at object creation time if we're
6151 // creating an object.
6152 // TODO: Currently only works on linux with newer objcopy.
6153 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006154 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006155 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006156 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006157}
6158
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006159void GnuTool::anchor() {}
6160
Daniel Dunbara3246a02009-03-18 08:07:30 +00006161void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006162 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006163 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006164 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006165 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006166 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006167
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006168 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006169 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006170 // It is unfortunate that we have to claim here, as this means
6171 // we will basically never report anything interesting for
6172 // platforms using a generic gcc, even if we are just using gcc
6173 // to get to the assembler.
6174 A->claim();
6175
Daniel Dunbar939c1212010-08-03 16:14:14 +00006176 // Don't forward any -g arguments to assembly steps.
6177 if (isa<AssembleJobAction>(JA) &&
6178 A->getOption().matches(options::OPT_g_Group))
6179 continue;
6180
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006181 // Don't forward any -W arguments to assembly and link steps.
6182 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6183 A->getOption().matches(options::OPT_W_Group))
6184 continue;
6185
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006186 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006187 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006188 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006189
Daniel Dunbar4e295052010-01-25 22:35:08 +00006190 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006191
6192 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006193 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006194 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006195 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006196 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006197 }
6198
Daniel Dunbar5716d872009-05-02 21:41:52 +00006199 // Try to force gcc to match the tool chain we want, if we recognize
6200 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006201 //
6202 // FIXME: The triple class should directly provide the information we want
6203 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006204 switch (getToolChain().getArch()) {
6205 default:
6206 break;
6207 case llvm::Triple::x86:
6208 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006209 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006210 break;
6211 case llvm::Triple::x86_64:
6212 case llvm::Triple::ppc64:
6213 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006214 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006215 break;
6216 case llvm::Triple::sparcel:
6217 CmdArgs.push_back("-EL");
6218 break;
6219 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006220
Daniel Dunbarb440f562010-08-02 02:38:21 +00006221 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006222 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006223 CmdArgs.push_back(Output.getFilename());
6224 } else {
6225 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006226 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006227 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006228
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006229 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006230
6231 // Only pass -x if gcc will understand it; otherwise hope gcc
6232 // understands the suffix correctly. The main use case this would go
6233 // wrong in is for linker inputs if they happened to have an odd
6234 // suffix; really the only way to get this to happen is a command
6235 // like '-x foobar a.c' which will treat a.c like a linker input.
6236 //
6237 // FIXME: For the linker case specifically, can we safely convert
6238 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006239 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006240 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006241 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006242 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006243 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006244 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006245 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006246 else if (II.getType() == types::TY_ModuleFile)
6247 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006248 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006249
Daniel Dunbara3246a02009-03-18 08:07:30 +00006250 if (types::canTypeBeUserSpecified(II.getType())) {
6251 CmdArgs.push_back("-x");
6252 CmdArgs.push_back(types::getTypeName(II.getType()));
6253 }
6254
Daniel Dunbarb440f562010-08-02 02:38:21 +00006255 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006256 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006257 else {
6258 const Arg &A = II.getInputArg();
6259
6260 // Reverse translate some rewritten options.
6261 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6262 CmdArgs.push_back("-lstdc++");
6263 continue;
6264 }
6265
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006266 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006267 A.render(Args, CmdArgs);
6268 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006269 }
6270
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006271 const std::string customGCCName = D.getCCCGenericGCCName();
6272 const char *GCCName;
6273 if (!customGCCName.empty())
6274 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006275 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006276 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006277 } else
6278 GCCName = "gcc";
6279
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006280 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006281 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006282}
6283
Douglas Katzman95354292015-06-23 20:42:09 +00006284void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6285 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006286 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006287}
6288
Douglas Katzman95354292015-06-23 20:42:09 +00006289void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6290 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006291 const Driver &D = getToolChain().getDriver();
6292
Eric Christophercc7ff502015-01-29 00:56:17 +00006293 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006294 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006295 case types::TY_LLVM_IR:
6296 case types::TY_LTO_IR:
6297 case types::TY_LLVM_BC:
6298 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006299 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006300 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006301 // We assume we've got an "integrated" assembler in that gcc will produce an
6302 // object file itself.
6303 case types::TY_Object:
6304 CmdArgs.push_back("-c");
6305 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006306 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006307 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006308 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006309 case types::TY_Nothing:
6310 CmdArgs.push_back("-fsyntax-only");
6311 break;
6312 default:
6313 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006314 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006315}
6316
Douglas Katzman95354292015-06-23 20:42:09 +00006317void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6318 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006319 // The types are (hopefully) good enough.
6320}
6321
Tony Linthicum76329bf2011-12-12 21:14:55 +00006322// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006323void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006324 ArgStringList &CmdArgs) const {
6325}
6326
Douglas Katzman95354292015-06-23 20:42:09 +00006327void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6328 const InputInfo &Output,
6329 const InputInfoList &Inputs,
6330 const ArgList &Args,
6331 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006332 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006333
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006334 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6335 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006336 ArgStringList CmdArgs;
6337
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006338 std::string MArchString = "-march=hexagon";
6339 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006340
6341 RenderExtraToolArgs(JA, CmdArgs);
6342
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006343 std::string AsName = "hexagon-llvm-mc";
6344 std::string MCpuString = "-mcpu=hexagon" +
6345 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6346 CmdArgs.push_back("-filetype=obj");
6347 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6348
Tony Linthicum76329bf2011-12-12 21:14:55 +00006349 if (Output.isFilename()) {
6350 CmdArgs.push_back("-o");
6351 CmdArgs.push_back(Output.getFilename());
6352 } else {
6353 assert(Output.isNothing() && "Unexpected output");
6354 CmdArgs.push_back("-fsyntax-only");
6355 }
6356
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006357 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6358 std::string N = llvm::utostr(G.getValue());
6359 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6360 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006361
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006362 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006363
Tony Linthicum76329bf2011-12-12 21:14:55 +00006364 // Only pass -x if gcc will understand it; otherwise hope gcc
6365 // understands the suffix correctly. The main use case this would go
6366 // wrong in is for linker inputs if they happened to have an odd
6367 // suffix; really the only way to get this to happen is a command
6368 // like '-x foobar a.c' which will treat a.c like a linker input.
6369 //
6370 // FIXME: For the linker case specifically, can we safely convert
6371 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006372 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006373 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006374 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006375 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006376 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006377 else if (II.getType() == types::TY_AST)
6378 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006379 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006380 else if (II.getType() == types::TY_ModuleFile)
6381 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006382 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006383
6384 if (II.isFilename())
6385 CmdArgs.push_back(II.getFilename());
6386 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006387 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006388 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006389 II.getInputArg().render(Args, CmdArgs);
6390 }
6391
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006392 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006393 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006394}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006395
Douglas Katzman95354292015-06-23 20:42:09 +00006396void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6397 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006398}
6399
Douglas Katzman54366072015-07-27 16:53:08 +00006400static void
6401constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006402 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006403 const InputInfo &Output, const InputInfoList &Inputs,
6404 const ArgList &Args, ArgStringList &CmdArgs,
6405 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006406
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006407 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006408
Matthew Curtise689b052012-12-06 15:46:07 +00006409 //----------------------------------------------------------------------------
6410 //
6411 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006412 bool IsStatic = Args.hasArg(options::OPT_static);
6413 bool IsShared = Args.hasArg(options::OPT_shared);
6414 bool IsPIE = Args.hasArg(options::OPT_pie);
6415 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6416 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6417 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6418 bool UseG0 = false;
6419 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006420
Matthew Curtise689b052012-12-06 15:46:07 +00006421 //----------------------------------------------------------------------------
6422 // Silence warnings for various options
6423 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006424 Args.ClaimAllArgs(options::OPT_g_Group);
6425 Args.ClaimAllArgs(options::OPT_emit_llvm);
6426 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6427 // handled somewhere else.
6428 Args.ClaimAllArgs(options::OPT_static_libgcc);
6429
6430 //----------------------------------------------------------------------------
6431 //
6432 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006433 if (Args.hasArg(options::OPT_s))
6434 CmdArgs.push_back("-s");
6435
6436 if (Args.hasArg(options::OPT_r))
6437 CmdArgs.push_back("-r");
6438
6439 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006440 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006441
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006442 CmdArgs.push_back("-march=hexagon");
6443 std::string CpuVer =
6444 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6445 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6446 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006447
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006448 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006449 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006450 // The following should be the default, but doing as hexagon-gcc does.
6451 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006452 }
6453
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006454 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006455 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006456
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006457 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006458 CmdArgs.push_back("-pie");
6459
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006460 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6461 std::string N = llvm::utostr(G.getValue());
6462 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6463 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006464 }
6465
Matthew Curtise689b052012-12-06 15:46:07 +00006466 //----------------------------------------------------------------------------
6467 //
6468 //----------------------------------------------------------------------------
6469 CmdArgs.push_back("-o");
6470 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006471
Matthew Curtise689b052012-12-06 15:46:07 +00006472 //----------------------------------------------------------------------------
6473 // moslib
6474 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006475 std::vector<std::string> OsLibs;
6476 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006477
Sean Silva14facf32015-06-09 01:57:17 +00006478 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6479 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006480 OsLibs.emplace_back(A->getValue());
6481 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006482 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006483 if (OsLibs.empty()) {
6484 OsLibs.push_back("standalone");
6485 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006486 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006487
Matthew Curtise689b052012-12-06 15:46:07 +00006488 //----------------------------------------------------------------------------
6489 // Start Files
6490 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006491 const std::string MCpuSuffix = "/" + CpuVer;
6492 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6493 const std::string RootDir =
6494 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6495 const std::string StartSubDir =
6496 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006497
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006498 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6499 const char *Name) -> std::string {
6500 std::string RelName = SubDir + Name;
6501 std::string P = HTC.GetFilePath(RelName.c_str());
6502 if (llvm::sys::fs::exists(P))
6503 return P;
6504 return RootDir + RelName;
6505 };
6506
6507 if (IncStdLib && IncStartFiles) {
6508 if (!IsShared) {
6509 if (HasStandalone) {
6510 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6511 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006512 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006513 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6514 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006515 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006516 std::string Init = UseShared
6517 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6518 : Find(RootDir, StartSubDir, "/init.o");
6519 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006520 }
6521
6522 //----------------------------------------------------------------------------
6523 // Library Search Paths
6524 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006525 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6526 for (const auto &LibPath : LibPaths)
6527 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006528
6529 //----------------------------------------------------------------------------
6530 //
6531 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006532 Args.AddAllArgs(CmdArgs,
6533 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6534 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006535
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006536 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006537
6538 //----------------------------------------------------------------------------
6539 // Libraries
6540 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006541 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006542 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006543 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006544 CmdArgs.push_back("-lm");
6545 }
6546
6547 CmdArgs.push_back("--start-group");
6548
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006549 if (!IsShared) {
6550 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006551 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006552 CmdArgs.push_back("-lc");
6553 }
6554 CmdArgs.push_back("-lgcc");
6555
6556 CmdArgs.push_back("--end-group");
6557 }
6558
6559 //----------------------------------------------------------------------------
6560 // End files
6561 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006562 if (IncStdLib && IncStartFiles) {
6563 std::string Fini = UseShared
6564 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6565 : Find(RootDir, StartSubDir, "/fini.o");
6566 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006567 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006568}
6569
Douglas Katzman95354292015-06-23 20:42:09 +00006570void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6571 const InputInfo &Output,
6572 const InputInfoList &Inputs,
6573 const ArgList &Args,
6574 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006575 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006576
6577 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006578 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006579 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006580
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006581 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006582 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006583 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006584}
6585// Hexagon tools end.
6586
Tom Stellard8fa33092015-07-18 01:49:05 +00006587void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6588 const InputInfo &Output,
6589 const InputInfoList &Inputs,
6590 const ArgList &Args,
6591 const char *LinkingOutput) const {
6592
6593 std::string Linker = getToolChain().GetProgramPath(getShortName());
6594 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006595 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6596 CmdArgs.push_back("-o");
6597 CmdArgs.push_back(Output.getFilename());
6598 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6599 CmdArgs, Inputs));
6600}
6601// AMDGPU tools end.
6602
Dan Gohman52816862015-12-16 23:30:41 +00006603wasm::Linker::Linker(const ToolChain &TC)
6604 : GnuTool("wasm::Linker", "lld", TC) {}
6605
6606bool wasm::Linker::isLinkJob() const {
6607 return true;
6608}
6609
6610bool wasm::Linker::hasIntegratedCPP() const {
6611 return false;
6612}
6613
6614void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6615 const InputInfo &Output,
6616 const InputInfoList &Inputs,
6617 const ArgList &Args,
6618 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006619
6620 const ToolChain &ToolChain = getToolChain();
6621 const Driver &D = ToolChain.getDriver();
6622 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006623 ArgStringList CmdArgs;
6624 CmdArgs.push_back("-flavor");
6625 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006626
6627 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006628 // size is of particular importance. This is significantly facilitated by
6629 // the enabling of -ffunction-sections and -fdata-sections in
6630 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006631 if (areOptimizationsEnabled(Args))
6632 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006633
Dan Gohman57b62c52016-02-22 19:26:15 +00006634 if (Args.hasArg(options::OPT_rdynamic))
6635 CmdArgs.push_back("-export-dynamic");
6636 if (Args.hasArg(options::OPT_s))
6637 CmdArgs.push_back("--strip-all");
6638 if (Args.hasArg(options::OPT_shared))
6639 CmdArgs.push_back("-shared");
6640 if (Args.hasArg(options::OPT_static))
6641 CmdArgs.push_back("-Bstatic");
6642
6643 Args.AddAllArgs(CmdArgs, options::OPT_L);
6644 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6645
6646 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6647 if (Args.hasArg(options::OPT_shared))
6648 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6649 else if (Args.hasArg(options::OPT_pie))
6650 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6651 else
6652 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6653
6654 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6655 }
6656
6657 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6658
6659 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6660 if (D.CCCIsCXX())
6661 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6662
6663 if (Args.hasArg(options::OPT_pthread))
6664 CmdArgs.push_back("-lpthread");
6665
6666 CmdArgs.push_back("-lc");
6667 CmdArgs.push_back("-lcompiler_rt");
6668 }
6669
6670 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6671 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6672
Dan Gohman52816862015-12-16 23:30:41 +00006673 CmdArgs.push_back("-o");
6674 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006675
Dan Gohman52816862015-12-16 23:30:41 +00006676 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6677}
6678
Renato Golin7c542b42015-07-27 23:44:45 +00006679const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006680 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006681 if (!Arch.empty())
6682 MArch = Arch;
6683 else
Bernard Ogden31561762013-12-12 13:27:11 +00006684 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006685 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006686
6687 // Handle -march=native.
6688 if (MArch == "native") {
6689 std::string CPU = llvm::sys::getHostCPUName();
6690 if (CPU != "generic") {
6691 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006692 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006693 // If there is no valid architecture suffix for this CPU we don't know how
6694 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006695 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006696 MArch = "";
6697 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006698 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006699 }
6700 }
6701
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006702 return MArch;
6703}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006704
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006705/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006706StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006707 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006708 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6709 // here means an -march=native that we can't handle, so instead return no CPU.
6710 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006711 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006712
John Brawna95c1a82015-05-08 12:52:18 +00006713 // We need to return an empty string here on invalid MArch values as the
6714 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006715 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006716}
6717
6718/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006719std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006720 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006721 // FIXME: Warn on inconsistent use of -mcpu and -march.
6722 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006723 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006724 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006725 // Handle -mcpu=native.
6726 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006727 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006728 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006729 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006730 }
6731
Renato Goline17c5802015-07-27 23:44:42 +00006732 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006733}
6734
6735/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006736/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006737// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006738StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6739 const llvm::Triple &Triple) {
6740 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006741 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006742 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006743 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006744 if (ArchKind == llvm::ARM::AK_INVALID)
6745 // In case of generic Arch, i.e. "arm",
6746 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006747 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006748 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006749 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6750 // armv7k triple if it's actually been specified via "-arch armv7k".
6751 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006752 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006753 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006754 }
Renato Golin3c007252015-05-28 15:05:53 +00006755 if (ArchKind == llvm::ARM::AK_INVALID)
6756 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006757 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006758}
6759
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006760void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006761 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006762 if (Args.hasArg(options::OPT_r))
6763 return;
6764
John Brawn94fd9632015-05-21 12:19:49 +00006765 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6766 // to generate BE-8 executables.
6767 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6768 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006769}
6770
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006771mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006772 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6773 // was first introduced in Release 3. However, other compilers have
6774 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006775 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6776 .Case("mips1", NanLegacy)
6777 .Case("mips2", NanLegacy)
6778 .Case("mips3", NanLegacy)
6779 .Case("mips4", NanLegacy)
6780 .Case("mips5", NanLegacy)
6781 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006782 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006783 .Case("mips32r3", NanLegacy | Nan2008)
6784 .Case("mips32r5", NanLegacy | Nan2008)
6785 .Case("mips32r6", Nan2008)
6786 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006787 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006788 .Case("mips64r3", NanLegacy | Nan2008)
6789 .Case("mips64r5", NanLegacy | Nan2008)
6790 .Case("mips64r6", Nan2008)
6791 .Default(NanLegacy);
6792}
6793
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006794bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6795 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6796 return A && (A->getValue() == StringRef(Value));
6797}
6798
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006799bool mips::isUCLibc(const ArgList &Args) {
6800 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006801 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006802}
6803
Daniel Sanders2bf13662014-07-10 14:40:57 +00006804bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006805 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6806 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006807 .Case("2008", true)
6808 .Case("legacy", false)
6809 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006810
6811 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006812 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006813 .Cases("mips32r6", "mips64r6", true)
6814 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006815
6816 return false;
6817}
6818
Daniel Sanders379d44b2014-07-16 11:52:23 +00006819bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006820 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006821 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006822 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006823 return false;
6824
6825 if (ABIName != "32")
6826 return false;
6827
Toma Tabacu94ea6862015-06-16 13:54:13 +00006828 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6829 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006830 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006831 return false;
6832
Daniel Sanders379d44b2014-07-16 11:52:23 +00006833 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006834 .Cases("mips2", "mips3", "mips4", "mips5", true)
6835 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6836 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6837 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006838}
6839
Toma Tabacu94ea6862015-06-16 13:54:13 +00006840bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6841 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006842 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006843 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6844
6845 // FPXX shouldn't be used if -msingle-float is present.
6846 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6847 options::OPT_mdouble_float))
6848 if (A->getOption().matches(options::OPT_msingle_float))
6849 UseFPXX = false;
6850
6851 return UseFPXX;
6852}
6853
Tim Northover157d9112014-01-16 08:48:16 +00006854llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006855 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6856 // archs which Darwin doesn't use.
6857
6858 // The matching this routine does is fairly pointless, since it is neither the
6859 // complete architecture list, nor a reasonable subset. The problem is that
6860 // historically the driver driver accepts this and also ties its -march=
6861 // handling to the architecture name, so we need to be careful before removing
6862 // support for it.
6863
6864 // This code must be kept in sync with Clang's Darwin specific argument
6865 // translation.
6866
6867 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006868 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6869 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6870 .Case("ppc64", llvm::Triple::ppc64)
6871 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6872 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6873 llvm::Triple::x86)
6874 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6875 // This is derived from the driver driver.
6876 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6877 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6878 .Cases("armv7s", "xscale", llvm::Triple::arm)
6879 .Case("arm64", llvm::Triple::aarch64)
6880 .Case("r600", llvm::Triple::r600)
6881 .Case("amdgcn", llvm::Triple::amdgcn)
6882 .Case("nvptx", llvm::Triple::nvptx)
6883 .Case("nvptx64", llvm::Triple::nvptx64)
6884 .Case("amdil", llvm::Triple::amdil)
6885 .Case("spir", llvm::Triple::spir)
6886 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006887}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006888
Tim Northover157d9112014-01-16 08:48:16 +00006889void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006890 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006891 T.setArch(Arch);
6892
6893 if (Str == "x86_64h")
6894 T.setArchName(Str);
6895 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6896 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006897 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006898 }
6899}
6900
Bob Wilsondecc03e2012-11-23 06:14:39 +00006901const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006902 const InputInfo &Input) {
6903 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006904}
6905
Bob Wilsondecc03e2012-11-23 06:14:39 +00006906const char *Clang::getBaseInputStem(const ArgList &Args,
6907 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006908 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006909
Chris Lattner906bb902011-01-16 08:14:11 +00006910 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006911 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006912
6913 return Str;
6914}
6915
Bob Wilsondecc03e2012-11-23 06:14:39 +00006916const char *Clang::getDependencyFileName(const ArgList &Args,
6917 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006918 // FIXME: Think about this more.
6919 std::string Res;
6920
6921 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006922 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006923 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006924 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006925 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006926 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006927 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006928}
6929
Douglas Katzman95354292015-06-23 20:42:09 +00006930void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6931 const InputInfo &Output,
6932 const InputInfoList &Inputs,
6933 const ArgList &Args,
6934 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006935 const ToolChain &ToolChain = getToolChain();
6936 const Driver &D = ToolChain.getDriver();
6937 ArgStringList CmdArgs;
6938
6939 // Silence warning for "clang -g foo.o -o foo"
6940 Args.ClaimAllArgs(options::OPT_g_Group);
6941 // and "clang -emit-llvm foo.o -o foo"
6942 Args.ClaimAllArgs(options::OPT_emit_llvm);
6943 // and for "clang -w foo.o -o foo". Other warning options are already
6944 // handled somewhere else.
6945 Args.ClaimAllArgs(options::OPT_w);
6946
6947 if (!D.SysRoot.empty())
6948 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6949
6950 // CloudABI only supports static linkage.
6951 CmdArgs.push_back("-Bstatic");
6952 CmdArgs.push_back("--eh-frame-hdr");
6953 CmdArgs.push_back("--gc-sections");
6954
6955 if (Output.isFilename()) {
6956 CmdArgs.push_back("-o");
6957 CmdArgs.push_back(Output.getFilename());
6958 } else {
6959 assert(Output.isNothing() && "Invalid output.");
6960 }
6961
Douglas Katzman78b37b02015-11-17 20:28:07 +00006962 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006963 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6964 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6965 }
6966
6967 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006968 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006969 Args.AddAllArgs(CmdArgs,
6970 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6971 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006972
Teresa Johnson945bc502015-10-15 20:35:53 +00006973 if (D.isUsingLTO())
6974 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006975
6976 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6977
Douglas Katzman78b37b02015-11-17 20:28:07 +00006978 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006979 if (D.CCCIsCXX())
6980 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6981 CmdArgs.push_back("-lc");
6982 CmdArgs.push_back("-lcompiler_rt");
6983 }
6984
Douglas Katzman78b37b02015-11-17 20:28:07 +00006985 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006986 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6987
6988 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006989 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006990}
6991
Douglas Katzman95354292015-06-23 20:42:09 +00006992void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6993 const InputInfo &Output,
6994 const InputInfoList &Inputs,
6995 const ArgList &Args,
6996 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006997 ArgStringList CmdArgs;
6998
6999 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7000 const InputInfo &Input = Inputs[0];
7001
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007002 // Determine the original source input.
7003 const Action *SourceAction = &JA;
7004 while (SourceAction->getKind() != Action::InputClass) {
7005 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7006 SourceAction = SourceAction->getInputs()[0];
7007 }
7008
Eric Christopherf5a8f492015-12-08 00:10:10 +00007009 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007010 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007011 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7012 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007013 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007014 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007015 const llvm::Triple &T(getToolChain().getTriple());
7016 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007017 CmdArgs.push_back("-Q");
7018 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007019
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007020 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007021 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007022 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007023 if (Args.hasArg(options::OPT_gstabs))
7024 CmdArgs.push_back("--gstabs");
7025 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007026 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007027 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007028
Daniel Dunbarbe220842009-03-20 16:06:39 +00007029 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007030 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007031
Daniel Dunbar6d484762010-07-22 01:47:22 +00007032 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007033 if (getToolChain().getArch() == llvm::Triple::x86 ||
7034 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007035 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7036 CmdArgs.push_back("-force_cpusubtype_ALL");
7037
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007038 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007039 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007040 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007041 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007042 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007043 CmdArgs.push_back("-static");
7044
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007045 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007046
7047 assert(Output.isFilename() && "Unexpected lipo output.");
7048 CmdArgs.push_back("-o");
7049 CmdArgs.push_back(Output.getFilename());
7050
Daniel Dunbarb440f562010-08-02 02:38:21 +00007051 assert(Input.isFilename() && "Invalid input.");
7052 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007053
7054 // asm_final spec is empty.
7055
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007056 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007057 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007058}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007059
Tim Northover157d9112014-01-16 08:48:16 +00007060void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007061
Tim Northover157d9112014-01-16 08:48:16 +00007062void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7063 ArgStringList &CmdArgs) const {
7064 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007065
Daniel Dunbarc1964212009-03-26 16:23:12 +00007066 // Derived from darwin_arch spec.
7067 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007068 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007069
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007070 // FIXME: Is this needed anymore?
7071 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007072 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007073}
7074
Douglas Katzman95354292015-06-23 20:42:09 +00007075bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007076 // We only need to generate a temp path for LTO if we aren't compiling object
7077 // files. When compiling source files, we run 'dsymutil' after linking. We
7078 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007079 for (const auto &Input : Inputs)
7080 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007081 return true;
7082
7083 return false;
7084}
7085
Douglas Katzman95354292015-06-23 20:42:09 +00007086void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7087 ArgStringList &CmdArgs,
7088 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007089 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007090 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007091
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007092 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007093 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7094 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007095 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7096 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007097 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007098 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007099 }
7100
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007101 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007102 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007103 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7104 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007105
Bob Wilson3d27dad2013-08-02 22:25:34 +00007106 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7107 CmdArgs.push_back("-export_dynamic");
7108
Bob Wilsonb111ec92015-03-02 19:01:14 +00007109 // If we are using App Extension restrictions, pass a flag to the linker
7110 // telling it that the compiled code has been audited.
7111 if (Args.hasFlag(options::OPT_fapplication_extension,
7112 options::OPT_fno_application_extension, false))
7113 CmdArgs.push_back("-application_extension");
7114
Teresa Johnson945bc502015-10-15 20:35:53 +00007115 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007116 // If we are using LTO, then automatically create a temporary file path for
7117 // the linker to use, so that it's lifetime will extend past a possible
7118 // dsymutil step.
7119 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7120 const char *TmpPath = C.getArgs().MakeArgString(
7121 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7122 C.addTempFile(TmpPath);
7123 CmdArgs.push_back("-object_path_lto");
7124 CmdArgs.push_back(TmpPath);
7125 }
7126
7127 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7128 // it in clang installed libraries. If not found, the option is not used
7129 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7130 if (Version[0] >= 133) {
7131 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7132 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7133 SmallString<128> LibLTOPath(P);
7134 llvm::sys::path::append(LibLTOPath, "lib");
7135 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7136 if (llvm::sys::fs::exists(LibLTOPath)) {
7137 CmdArgs.push_back("-lto_library");
7138 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7139 } else {
7140 D.Diag(diag::warn_drv_lto_libpath);
7141 }
7142 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007143 }
7144
Daniel Dunbarc1964212009-03-26 16:23:12 +00007145 // Derived from the "link" spec.
7146 Args.AddAllArgs(CmdArgs, options::OPT_static);
7147 if (!Args.hasArg(options::OPT_static))
7148 CmdArgs.push_back("-dynamic");
7149 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7150 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7151 // here. How do we wish to handle such things?
7152 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007153
Daniel Dunbarc1964212009-03-26 16:23:12 +00007154 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007155 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007156 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007157 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007158
7159 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7160 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7161 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7162
7163 Arg *A;
7164 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7165 (A = Args.getLastArg(options::OPT_current__version)) ||
7166 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007167 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7168 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007169
7170 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7171 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7172 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7173 } else {
7174 CmdArgs.push_back("-dylib");
7175
7176 Arg *A;
7177 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7178 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7179 (A = Args.getLastArg(options::OPT_client__name)) ||
7180 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7181 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7182 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007183 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7184 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007185
Daniel Dunbarc1964212009-03-26 16:23:12 +00007186 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7187 "-dylib_compatibility_version");
7188 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7189 "-dylib_current_version");
7190
Tim Northover157d9112014-01-16 08:48:16 +00007191 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007192
7193 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7194 "-dylib_install_name");
7195 }
7196
7197 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7198 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7199 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007200 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007201 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007202 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7203 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7204 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7205 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7206 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7207 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007208 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007209 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7210 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7211 Args.AddAllArgs(CmdArgs, options::OPT_init);
7212
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007213 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007214 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007215
Daniel Dunbarc1964212009-03-26 16:23:12 +00007216 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7217 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7218 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7219 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7220 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007221
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007222 if (const Arg *A =
7223 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7224 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007225 if (A->getOption().matches(options::OPT_fpie) ||
7226 A->getOption().matches(options::OPT_fPIE))
7227 CmdArgs.push_back("-pie");
7228 else
7229 CmdArgs.push_back("-no_pie");
7230 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007231
7232 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7233 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7234 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7235 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7236 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7237 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7238 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7239 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7240 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7241 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7242 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7243 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7244 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7245 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7246 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7247 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007248
Daniel Dunbar84384642011-05-02 21:03:47 +00007249 // Give --sysroot= preference, over the Apple specific behavior to also use
7250 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007251 StringRef sysroot = C.getSysRoot();
7252 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007253 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007254 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007255 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7256 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007257 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007258 }
7259
Daniel Dunbarc1964212009-03-26 16:23:12 +00007260 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7261 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7262 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7263 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7264 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007265 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007266 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7267 Args.AddAllArgs(CmdArgs, options::OPT_y);
7268 Args.AddLastArg(CmdArgs, options::OPT_w);
7269 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7270 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7271 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7272 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7273 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7274 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7275 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7276 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7277 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7278 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7279 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7280 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7281}
7282
Douglas Katzman95354292015-06-23 20:42:09 +00007283void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7284 const InputInfo &Output,
7285 const InputInfoList &Inputs,
7286 const ArgList &Args,
7287 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007288 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007289
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007290 // If the number of arguments surpasses the system limits, we will encode the
7291 // input files in a separate file, shortening the command line. To this end,
7292 // build a list of input file names that can be passed via a file with the
7293 // -filelist linker option.
7294 llvm::opt::ArgStringList InputFileList;
7295
Daniel Dunbarc1964212009-03-26 16:23:12 +00007296 // The logic here is derived from gcc's behavior; most of which
7297 // comes from specs (starting with link_command). Consult gcc for
7298 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007299 ArgStringList CmdArgs;
7300
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007301 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7302 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7303 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007304 for (const auto &Arg : Args)
7305 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007306 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007307 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007308 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007309 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007310 return;
7311 }
7312
Daniel Dunbarc1964212009-03-26 16:23:12 +00007313 // I'm not sure why this particular decomposition exists in gcc, but
7314 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007315 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007316
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007317 // It seems that the 'e' option is completely ignored for dynamic executables
7318 // (the default), and with static executables, the last one wins, as expected.
7319 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7320 options::OPT_Z_Flag, options::OPT_u_Group,
7321 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007322
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007323 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7324 // members of static archive libraries which implement Objective-C classes or
7325 // categories.
7326 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7327 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007328
Daniel Dunbarc1964212009-03-26 16:23:12 +00007329 CmdArgs.push_back("-o");
7330 CmdArgs.push_back(Output.getFilename());
7331
Douglas Katzman78b37b02015-11-17 20:28:07 +00007332 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007333 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007334
Peter Collingbournec4122c12015-06-15 21:08:13 +00007335 // SafeStack requires its own runtime libraries
7336 // These libraries should be linked first, to make sure the
7337 // __safestack_init constructor executes before everything else
7338 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7339 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7340 "libclang_rt.safestack_osx.a",
7341 /*AlwaysLink=*/true);
7342 }
7343
Daniel Dunbarc1964212009-03-26 16:23:12 +00007344 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007345
Douglas Gregor9295df02012-05-15 21:00:27 +00007346 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007347 // Build the input file for -filelist (list of linker input files) in case we
7348 // need it later
7349 for (const auto &II : Inputs) {
7350 if (!II.isFilename()) {
7351 // This is a linker input argument.
7352 // We cannot mix input arguments and file names in a -filelist input, thus
7353 // we prematurely stop our list (remaining files shall be passed as
7354 // arguments).
7355 if (InputFileList.size() > 0)
7356 break;
7357
7358 continue;
7359 }
7360
7361 InputFileList.push_back(II.getFilename());
7362 }
7363
Douglas Katzman78b37b02015-11-17 20:28:07 +00007364 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007365 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7366
Douglas Katzman78b37b02015-11-17 20:28:07 +00007367 if (isObjCRuntimeLinked(Args) &&
7368 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007369 // We use arclite library for both ARC and subscripting support.
7370 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7371
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007372 CmdArgs.push_back("-framework");
7373 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007374 // Link libobj.
7375 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007376 }
John McCall31168b02011-06-15 23:02:42 +00007377
Daniel Dunbarc1964212009-03-26 16:23:12 +00007378 if (LinkingOutput) {
7379 CmdArgs.push_back("-arch_multiple");
7380 CmdArgs.push_back("-final_output");
7381 CmdArgs.push_back(LinkingOutput);
7382 }
7383
Daniel Dunbarc1964212009-03-26 16:23:12 +00007384 if (Args.hasArg(options::OPT_fnested_functions))
7385 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007386
Justin Bognerc7701242015-05-12 05:44:36 +00007387 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7388
Douglas Katzman78b37b02015-11-17 20:28:07 +00007389 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007390 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007391 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007392
Daniel Dunbarc1964212009-03-26 16:23:12 +00007393 // link_ssp spec is empty.
7394
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007395 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007396 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007397 }
7398
Douglas Katzman78b37b02015-11-17 20:28:07 +00007399 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007400 // endfile_spec is empty.
7401 }
7402
7403 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7404 Args.AddAllArgs(CmdArgs, options::OPT_F);
7405
Steven Wu3ffb61b2015-02-06 18:08:29 +00007406 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007407 for (const Arg *A : Args.filtered(options::OPT_iframework))
7408 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007409
Douglas Katzman78b37b02015-11-17 20:28:07 +00007410 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007411 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7412 if (A->getValue() == StringRef("Accelerate")) {
7413 CmdArgs.push_back("-framework");
7414 CmdArgs.push_back("Accelerate");
7415 }
7416 }
7417 }
7418
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007419 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007420 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007421 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007422 Cmd->setInputFileList(std::move(InputFileList));
7423 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007424}
7425
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007426void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007427 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007428 const InputInfoList &Inputs,
7429 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007430 const char *LinkingOutput) const {
7431 ArgStringList CmdArgs;
7432
7433 CmdArgs.push_back("-create");
7434 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007435
7436 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007437 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007438
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007439 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007440 assert(II.isFilename() && "Unexpected lipo input.");
7441 CmdArgs.push_back(II.getFilename());
7442 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007443
7444 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007445 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007446}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007447
Daniel Dunbar88299622010-06-04 18:28:36 +00007448void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007449 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007450 const InputInfoList &Inputs,
7451 const ArgList &Args,
7452 const char *LinkingOutput) const {
7453 ArgStringList CmdArgs;
7454
Daniel Dunbareb86b042011-05-09 17:23:16 +00007455 CmdArgs.push_back("-o");
7456 CmdArgs.push_back(Output.getFilename());
7457
Daniel Dunbar88299622010-06-04 18:28:36 +00007458 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7459 const InputInfo &Input = Inputs[0];
7460 assert(Input.isFilename() && "Unexpected dsymutil input.");
7461 CmdArgs.push_back(Input.getFilename());
7462
Daniel Dunbar88299622010-06-04 18:28:36 +00007463 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007464 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007465 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007466}
7467
Eric Christopher551ef452011-08-23 17:56:55 +00007468void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007469 const InputInfo &Output,
7470 const InputInfoList &Inputs,
7471 const ArgList &Args,
7472 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007473 ArgStringList CmdArgs;
7474 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007475 CmdArgs.push_back("--debug-info");
7476 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007477 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007478
7479 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7480 const InputInfo &Input = Inputs[0];
7481 assert(Input.isFilename() && "Unexpected verify input");
7482
7483 // Grabbing the output of the earlier dsymutil run.
7484 CmdArgs.push_back(Input.getFilename());
7485
7486 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007487 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007488 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007489}
7490
Douglas Katzman95354292015-06-23 20:42:09 +00007491void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007492 const InputInfo &Output,
7493 const InputInfoList &Inputs,
7494 const ArgList &Args,
7495 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007496 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007497 ArgStringList CmdArgs;
7498
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007499 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007500
7501 CmdArgs.push_back("-o");
7502 CmdArgs.push_back(Output.getFilename());
7503
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007504 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007505 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007506
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007507 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007508 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007509}
7510
Douglas Katzman95354292015-06-23 20:42:09 +00007511void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7512 const InputInfo &Output,
7513 const InputInfoList &Inputs,
7514 const ArgList &Args,
7515 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007516 ArgStringList CmdArgs;
7517
David Chisnall272a0712012-02-29 15:06:12 +00007518 // Demangle C++ names in errors
7519 CmdArgs.push_back("-C");
7520
Douglas Katzman78b37b02015-11-17 20:28:07 +00007521 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007522 CmdArgs.push_back("-e");
7523 CmdArgs.push_back("_start");
7524 }
7525
7526 if (Args.hasArg(options::OPT_static)) {
7527 CmdArgs.push_back("-Bstatic");
7528 CmdArgs.push_back("-dn");
7529 } else {
7530 CmdArgs.push_back("-Bdynamic");
7531 if (Args.hasArg(options::OPT_shared)) {
7532 CmdArgs.push_back("-shared");
7533 } else {
7534 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007535 CmdArgs.push_back(
7536 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007537 }
7538 }
7539
7540 if (Output.isFilename()) {
7541 CmdArgs.push_back("-o");
7542 CmdArgs.push_back(Output.getFilename());
7543 } else {
7544 assert(Output.isNothing() && "Invalid output.");
7545 }
7546
Douglas Katzman78b37b02015-11-17 20:28:07 +00007547 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007548 if (!Args.hasArg(options::OPT_shared))
7549 CmdArgs.push_back(
7550 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7551
7552 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7553 CmdArgs.push_back(
7554 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7555 CmdArgs.push_back(
7556 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007557 }
7558
Douglas Katzman6059ef92015-11-17 17:41:23 +00007559 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007560
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007561 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7562 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007563
7564 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7565
Douglas Katzman78b37b02015-11-17 20:28:07 +00007566 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007567 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007568 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007569 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007570 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007571 if (!Args.hasArg(options::OPT_shared)) {
7572 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007573 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007574 }
David Chisnallf571cde2012-02-15 13:39:01 +00007575 }
7576
Douglas Katzman78b37b02015-11-17 20:28:07 +00007577 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007578 CmdArgs.push_back(
7579 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007580 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007581 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007582
Xinliang David Li69306c02015-10-22 06:15:31 +00007583 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007584
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007585 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007586 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007587}
7588
Douglas Katzman95354292015-06-23 20:42:09 +00007589void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7590 const InputInfo &Output,
7591 const InputInfoList &Inputs,
7592 const ArgList &Args,
7593 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007594 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007595 ArgStringList CmdArgs;
7596
Rafael Espindolacc126272014-02-28 01:55:21 +00007597 switch (getToolChain().getArch()) {
7598 case llvm::Triple::x86:
7599 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7600 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007601 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007602 break;
7603
7604 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007605 CmdArgs.push_back("-mppc");
7606 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007607 break;
7608
7609 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007610 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007611 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007612 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7613 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7614 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007615 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007616 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007617
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007618 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007619 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007620 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7621 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7622 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007623 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007624 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007625
7626 case llvm::Triple::mips64:
7627 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007628 StringRef CPUName;
7629 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007630 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007631
7632 CmdArgs.push_back("-mabi");
7633 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7634
7635 if (getToolChain().getArch() == llvm::Triple::mips64)
7636 CmdArgs.push_back("-EB");
7637 else
7638 CmdArgs.push_back("-EL");
7639
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007640 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007641 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007642 }
7643
Rafael Espindolacc126272014-02-28 01:55:21 +00007644 default:
7645 break;
7646 }
7647
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007648 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007649
7650 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007651 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007652
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007653 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007654 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007656 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007657 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007658}
7659
Douglas Katzman95354292015-06-23 20:42:09 +00007660void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7661 const InputInfo &Output,
7662 const InputInfoList &Inputs,
7663 const ArgList &Args,
7664 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007665 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007666 ArgStringList CmdArgs;
7667
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007668 // Silence warning for "clang -g foo.o -o foo"
7669 Args.ClaimAllArgs(options::OPT_g_Group);
7670 // and "clang -emit-llvm foo.o -o foo"
7671 Args.ClaimAllArgs(options::OPT_emit_llvm);
7672 // and for "clang -w foo.o -o foo". Other warning options are already
7673 // handled somewhere else.
7674 Args.ClaimAllArgs(options::OPT_w);
7675
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007676 if (getToolChain().getArch() == llvm::Triple::mips64)
7677 CmdArgs.push_back("-EB");
7678 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7679 CmdArgs.push_back("-EL");
7680
Douglas Katzman78b37b02015-11-17 20:28:07 +00007681 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007682 CmdArgs.push_back("-e");
7683 CmdArgs.push_back("__start");
7684 }
7685
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007686 if (Args.hasArg(options::OPT_static)) {
7687 CmdArgs.push_back("-Bstatic");
7688 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007689 if (Args.hasArg(options::OPT_rdynamic))
7690 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007691 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007692 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007693 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007694 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007695 } else {
7696 CmdArgs.push_back("-dynamic-linker");
7697 CmdArgs.push_back("/usr/libexec/ld.so");
7698 }
7699 }
7700
Rafael Espindola044f7832013-06-05 04:28:55 +00007701 if (Args.hasArg(options::OPT_nopie))
7702 CmdArgs.push_back("-nopie");
7703
Daniel Dunbarb440f562010-08-02 02:38:21 +00007704 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007705 CmdArgs.push_back("-o");
7706 CmdArgs.push_back(Output.getFilename());
7707 } else {
7708 assert(Output.isNothing() && "Invalid output.");
7709 }
7710
Douglas Katzman78b37b02015-11-17 20:28:07 +00007711 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007712 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007713 if (Args.hasArg(options::OPT_pg))
7714 CmdArgs.push_back(
7715 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007716 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007717 CmdArgs.push_back(
7718 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7719 CmdArgs.push_back(
7720 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007721 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007722 CmdArgs.push_back(
7723 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007724 }
7725 }
7726
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007727 std::string Triple = getToolChain().getTripleString();
7728 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007729 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007730 CmdArgs.push_back(
7731 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007732
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007733 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7734 options::OPT_e, options::OPT_s, options::OPT_t,
7735 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007736
Daniel Dunbar54423b22010-09-17 00:24:54 +00007737 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007738
Douglas Katzman78b37b02015-11-17 20:28:07 +00007739 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007740 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007741 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007742 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007743 CmdArgs.push_back("-lm_p");
7744 else
7745 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007746 }
7747
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007748 // FIXME: For some reason GCC passes -lgcc before adding
7749 // the default system libraries. Just mimic this for now.
7750 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007751
Eric Christopher17674ec2012-09-13 06:32:34 +00007752 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007753 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7754 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007755 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007756 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007757 }
7758
Chandler Carruth45661652011-12-17 22:32:42 +00007759 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007760 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007761 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007762 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007763 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007764 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007765
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007766 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007767 }
7768
Douglas Katzman78b37b02015-11-17 20:28:07 +00007769 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007770 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007771 CmdArgs.push_back(
7772 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007773 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007774 CmdArgs.push_back(
7775 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007776 }
7777
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007778 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007779 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007780}
Ed Schoutene33194b2009-04-02 19:13:12 +00007781
Douglas Katzman95354292015-06-23 20:42:09 +00007782void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7783 const InputInfo &Output,
7784 const InputInfoList &Inputs,
7785 const ArgList &Args,
7786 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007787 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007788 ArgStringList CmdArgs;
7789
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007790 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007791
7792 CmdArgs.push_back("-o");
7793 CmdArgs.push_back(Output.getFilename());
7794
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007795 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007796 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007797
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007798 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007799 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007800}
7801
Douglas Katzman95354292015-06-23 20:42:09 +00007802void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7803 const InputInfo &Output,
7804 const InputInfoList &Inputs,
7805 const ArgList &Args,
7806 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007807 const Driver &D = getToolChain().getDriver();
7808 ArgStringList CmdArgs;
7809
Douglas Katzman78b37b02015-11-17 20:28:07 +00007810 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007811 CmdArgs.push_back("-e");
7812 CmdArgs.push_back("__start");
7813 }
7814
7815 if (Args.hasArg(options::OPT_static)) {
7816 CmdArgs.push_back("-Bstatic");
7817 } else {
7818 if (Args.hasArg(options::OPT_rdynamic))
7819 CmdArgs.push_back("-export-dynamic");
7820 CmdArgs.push_back("--eh-frame-hdr");
7821 CmdArgs.push_back("-Bdynamic");
7822 if (Args.hasArg(options::OPT_shared)) {
7823 CmdArgs.push_back("-shared");
7824 } else {
7825 CmdArgs.push_back("-dynamic-linker");
7826 CmdArgs.push_back("/usr/libexec/ld.so");
7827 }
7828 }
7829
7830 if (Output.isFilename()) {
7831 CmdArgs.push_back("-o");
7832 CmdArgs.push_back(Output.getFilename());
7833 } else {
7834 assert(Output.isNothing() && "Invalid output.");
7835 }
7836
Douglas Katzman78b37b02015-11-17 20:28:07 +00007837 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007838 if (!Args.hasArg(options::OPT_shared)) {
7839 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007840 CmdArgs.push_back(
7841 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007842 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007843 CmdArgs.push_back(
7844 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7845 CmdArgs.push_back(
7846 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007847 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007848 CmdArgs.push_back(
7849 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007850 }
7851 }
7852
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007853 Args.AddAllArgs(CmdArgs,
7854 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007855
7856 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7857
Douglas Katzman78b37b02015-11-17 20:28:07 +00007858 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007859 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007860 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7861 if (Args.hasArg(options::OPT_pg))
7862 CmdArgs.push_back("-lm_p");
7863 else
7864 CmdArgs.push_back("-lm");
7865 }
7866
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007867 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007868 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007869 CmdArgs.push_back("-lpthread_p");
7870 else
7871 CmdArgs.push_back("-lpthread");
7872 }
7873
Eli Friedman9fa28852012-08-08 23:57:20 +00007874 if (!Args.hasArg(options::OPT_shared)) {
7875 if (Args.hasArg(options::OPT_pg))
7876 CmdArgs.push_back("-lc_p");
7877 else
7878 CmdArgs.push_back("-lc");
7879 }
7880
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007881 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007882 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007883 case llvm::Triple::arm:
7884 MyArch = "arm";
7885 break;
7886 case llvm::Triple::x86:
7887 MyArch = "i386";
7888 break;
7889 case llvm::Triple::x86_64:
7890 MyArch = "amd64";
7891 break;
7892 default:
7893 llvm_unreachable("Unsupported architecture");
7894 }
7895 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007896 }
7897
Douglas Katzman78b37b02015-11-17 20:28:07 +00007898 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007899 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007900 CmdArgs.push_back(
7901 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007902 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007903 CmdArgs.push_back(
7904 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007905 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007906
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007907 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007908 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007909}
7910
Douglas Katzman95354292015-06-23 20:42:09 +00007911void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7912 const InputInfo &Output,
7913 const InputInfoList &Inputs,
7914 const ArgList &Args,
7915 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007916 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007917 ArgStringList CmdArgs;
7918
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007919 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7920 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007921 switch (getToolChain().getArch()) {
7922 default:
7923 break;
7924 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007925 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007926 break;
7927 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007928 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007929 break;
7930 case llvm::Triple::mips:
7931 case llvm::Triple::mipsel:
7932 case llvm::Triple::mips64:
7933 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007934 StringRef CPUName;
7935 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007936 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007937
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007938 CmdArgs.push_back("-march");
7939 CmdArgs.push_back(CPUName.data());
7940
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007941 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007942 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007943
7944 if (getToolChain().getArch() == llvm::Triple::mips ||
7945 getToolChain().getArch() == llvm::Triple::mips64)
7946 CmdArgs.push_back("-EB");
7947 else
7948 CmdArgs.push_back("-EL");
7949
Dimitry Andric46f338c2015-12-27 10:36:44 +00007950 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7951 StringRef v = A->getValue();
7952 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7953 A->claim();
7954 }
7955
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007956 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007957 break;
7958 }
7959 case llvm::Triple::arm:
7960 case llvm::Triple::armeb:
7961 case llvm::Triple::thumb:
7962 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007963 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007964
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007965 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007966 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007967 else
Renato Golinf4421f72014-02-19 10:44:07 +00007968 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007969
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007970 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007971 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007972 case llvm::Triple::GNUEABI:
7973 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007974 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007975 break;
7976
7977 default:
7978 CmdArgs.push_back("-matpcs");
7979 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007980 break;
7981 }
7982 case llvm::Triple::sparc:
7983 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007984 case llvm::Triple::sparcv9: {
7985 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7986 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007987 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007988 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007989 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007990 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007991
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007992 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007993
7994 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007995 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007996
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007997 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007998 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007999
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008000 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008001 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008002}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008003
Douglas Katzman95354292015-06-23 20:42:09 +00008004void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8005 const InputInfo &Output,
8006 const InputInfoList &Inputs,
8007 const ArgList &Args,
8008 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008009 const toolchains::FreeBSD &ToolChain =
8010 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008011 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008012 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008013 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008014 !Args.hasArg(options::OPT_shared) &&
8015 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008016 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008017
8018 // Silence warning for "clang -g foo.o -o foo"
8019 Args.ClaimAllArgs(options::OPT_g_Group);
8020 // and "clang -emit-llvm foo.o -o foo"
8021 Args.ClaimAllArgs(options::OPT_emit_llvm);
8022 // and for "clang -w foo.o -o foo". Other warning options are already
8023 // handled somewhere else.
8024 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008025
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008026 if (!D.SysRoot.empty())
8027 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8028
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008029 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008030 CmdArgs.push_back("-pie");
8031
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008032 if (Args.hasArg(options::OPT_static)) {
8033 CmdArgs.push_back("-Bstatic");
8034 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008035 if (Args.hasArg(options::OPT_rdynamic))
8036 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008037 CmdArgs.push_back("--eh-frame-hdr");
8038 if (Args.hasArg(options::OPT_shared)) {
8039 CmdArgs.push_back("-Bshareable");
8040 } else {
8041 CmdArgs.push_back("-dynamic-linker");
8042 CmdArgs.push_back("/libexec/ld-elf.so.1");
8043 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008044 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008045 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8046 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8047 CmdArgs.push_back("--hash-style=both");
8048 }
8049 }
8050 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008051 }
8052
8053 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8054 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008055 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008056 CmdArgs.push_back("-m");
8057 CmdArgs.push_back("elf_i386_fbsd");
8058 }
8059
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008060 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008061 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008062 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008063 }
8064
Dimitry Andric904895f2015-12-27 06:47:09 +00008065 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8066 if (ToolChain.getArch() == llvm::Triple::mips ||
8067 ToolChain.getArch() == llvm::Triple::mipsel ||
8068 ToolChain.getArch() == llvm::Triple::mips64 ||
8069 ToolChain.getArch() == llvm::Triple::mips64el) {
8070 StringRef v = A->getValue();
8071 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8072 A->claim();
8073 }
8074 }
8075
Daniel Dunbarb440f562010-08-02 02:38:21 +00008076 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008077 CmdArgs.push_back("-o");
8078 CmdArgs.push_back(Output.getFilename());
8079 } else {
8080 assert(Output.isNothing() && "Invalid output.");
8081 }
8082
Douglas Katzman78b37b02015-11-17 20:28:07 +00008083 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008084 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008085 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008086 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008087 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008088 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008089 crt1 = "Scrt1.o";
8090 else
8091 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008092 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008093 if (crt1)
8094 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8095
8096 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8097
Craig Topper92fc2df2014-05-17 16:56:41 +00008098 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008099 if (Args.hasArg(options::OPT_static))
8100 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008101 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008102 crtbegin = "crtbeginS.o";
8103 else
8104 crtbegin = "crtbegin.o";
8105
8106 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008107 }
8108
8109 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008110 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008111 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8112 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008113 Args.AddAllArgs(CmdArgs, options::OPT_s);
8114 Args.AddAllArgs(CmdArgs, options::OPT_t);
8115 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8116 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008117
Teresa Johnson945bc502015-10-15 20:35:53 +00008118 if (D.isUsingLTO())
8119 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008120
Alexey Samsonov52550342014-09-15 19:58:40 +00008121 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008122 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008123
Douglas Katzman78b37b02015-11-17 20:28:07 +00008124 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008125 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008126 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008127 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008128 if (Args.hasArg(options::OPT_pg))
8129 CmdArgs.push_back("-lm_p");
8130 else
8131 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008132 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008133 if (NeedsSanitizerDeps)
8134 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008135 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8136 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008137 if (Args.hasArg(options::OPT_pg))
8138 CmdArgs.push_back("-lgcc_p");
8139 else
8140 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008141 if (Args.hasArg(options::OPT_static)) {
8142 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008143 } else if (Args.hasArg(options::OPT_pg)) {
8144 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008145 } else {
8146 CmdArgs.push_back("--as-needed");
8147 CmdArgs.push_back("-lgcc_s");
8148 CmdArgs.push_back("--no-as-needed");
8149 }
8150
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008151 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008152 if (Args.hasArg(options::OPT_pg))
8153 CmdArgs.push_back("-lpthread_p");
8154 else
8155 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008156 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008157
Roman Divacky66f22762011-02-10 16:59:40 +00008158 if (Args.hasArg(options::OPT_pg)) {
8159 if (Args.hasArg(options::OPT_shared))
8160 CmdArgs.push_back("-lc");
8161 else
8162 CmdArgs.push_back("-lc_p");
8163 CmdArgs.push_back("-lgcc_p");
8164 } else {
8165 CmdArgs.push_back("-lc");
8166 CmdArgs.push_back("-lgcc");
8167 }
8168
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008169 if (Args.hasArg(options::OPT_static)) {
8170 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008171 } else if (Args.hasArg(options::OPT_pg)) {
8172 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008173 } else {
8174 CmdArgs.push_back("--as-needed");
8175 CmdArgs.push_back("-lgcc_s");
8176 CmdArgs.push_back("--no-as-needed");
8177 }
8178 }
8179
Douglas Katzman78b37b02015-11-17 20:28:07 +00008180 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008181 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008182 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008183 else
8184 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008185 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008186 }
8187
Xinliang David Li69306c02015-10-22 06:15:31 +00008188 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008189
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008190 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008191 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008192}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008193
Douglas Katzman95354292015-06-23 20:42:09 +00008194void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008195 const InputInfo &Output,
8196 const InputInfoList &Inputs,
8197 const ArgList &Args,
8198 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008199 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008200 ArgStringList CmdArgs;
8201
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008202 // GNU as needs different flags for creating the correct output format
8203 // on architectures with different ABIs or optional feature sets.
8204 switch (getToolChain().getArch()) {
8205 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008206 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008207 break;
8208 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008209 case llvm::Triple::armeb:
8210 case llvm::Triple::thumb:
8211 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008212 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008213 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8214 std::string Arch =
8215 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008216 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008217 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008218 }
8219
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008220 case llvm::Triple::mips:
8221 case llvm::Triple::mipsel:
8222 case llvm::Triple::mips64:
8223 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008224 StringRef CPUName;
8225 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008226 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008227
8228 CmdArgs.push_back("-march");
8229 CmdArgs.push_back(CPUName.data());
8230
8231 CmdArgs.push_back("-mabi");
8232 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8233
8234 if (getToolChain().getArch() == llvm::Triple::mips ||
8235 getToolChain().getArch() == llvm::Triple::mips64)
8236 CmdArgs.push_back("-EB");
8237 else
8238 CmdArgs.push_back("-EL");
8239
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008240 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008241 break;
8242 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008243
8244 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008245 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008246 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008247 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8248 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008249 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008250 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008251 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008252
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008253 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008254 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008255 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8256 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008257 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008258 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008259 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008260
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008261 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008262 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008263 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008264
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008265 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008266
8267 CmdArgs.push_back("-o");
8268 CmdArgs.push_back(Output.getFilename());
8269
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008270 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008271 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008272
David Chisnallddbd68f2011-09-27 22:03:18 +00008273 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008274 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008275}
8276
Douglas Katzman95354292015-06-23 20:42:09 +00008277void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8278 const InputInfo &Output,
8279 const InputInfoList &Inputs,
8280 const ArgList &Args,
8281 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008282 const Driver &D = getToolChain().getDriver();
8283 ArgStringList CmdArgs;
8284
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008285 if (!D.SysRoot.empty())
8286 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8287
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008288 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008289 if (Args.hasArg(options::OPT_static)) {
8290 CmdArgs.push_back("-Bstatic");
8291 } else {
8292 if (Args.hasArg(options::OPT_rdynamic))
8293 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008294 if (Args.hasArg(options::OPT_shared)) {
8295 CmdArgs.push_back("-Bshareable");
8296 } else {
8297 CmdArgs.push_back("-dynamic-linker");
8298 CmdArgs.push_back("/libexec/ld.elf_so");
8299 }
8300 }
8301
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008302 // Many NetBSD architectures support more than one ABI.
8303 // Determine the correct emulation for ld.
8304 switch (getToolChain().getArch()) {
8305 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008306 CmdArgs.push_back("-m");
8307 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008308 break;
8309 case llvm::Triple::arm:
8310 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008311 CmdArgs.push_back("-m");
8312 switch (getToolChain().getTriple().getEnvironment()) {
8313 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008314 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008315 CmdArgs.push_back("armelf_nbsd_eabi");
8316 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008317 case llvm::Triple::EABIHF:
8318 case llvm::Triple::GNUEABIHF:
8319 CmdArgs.push_back("armelf_nbsd_eabihf");
8320 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008321 default:
8322 CmdArgs.push_back("armelf_nbsd");
8323 break;
8324 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008325 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008326 case llvm::Triple::armeb:
8327 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008328 arm::appendEBLinkFlags(
8329 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008330 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008331 CmdArgs.push_back("-m");
8332 switch (getToolChain().getTriple().getEnvironment()) {
8333 case llvm::Triple::EABI:
8334 case llvm::Triple::GNUEABI:
8335 CmdArgs.push_back("armelfb_nbsd_eabi");
8336 break;
8337 case llvm::Triple::EABIHF:
8338 case llvm::Triple::GNUEABIHF:
8339 CmdArgs.push_back("armelfb_nbsd_eabihf");
8340 break;
8341 default:
8342 CmdArgs.push_back("armelfb_nbsd");
8343 break;
8344 }
8345 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008346 case llvm::Triple::mips64:
8347 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008348 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008349 CmdArgs.push_back("-m");
8350 if (getToolChain().getArch() == llvm::Triple::mips64)
8351 CmdArgs.push_back("elf32btsmip");
8352 else
8353 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008354 } else if (mips::hasMipsAbiArg(Args, "64")) {
8355 CmdArgs.push_back("-m");
8356 if (getToolChain().getArch() == llvm::Triple::mips64)
8357 CmdArgs.push_back("elf64btsmip");
8358 else
8359 CmdArgs.push_back("elf64ltsmip");
8360 }
8361 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008362 case llvm::Triple::ppc:
8363 CmdArgs.push_back("-m");
8364 CmdArgs.push_back("elf32ppc_nbsd");
8365 break;
8366
8367 case llvm::Triple::ppc64:
8368 case llvm::Triple::ppc64le:
8369 CmdArgs.push_back("-m");
8370 CmdArgs.push_back("elf64ppc");
8371 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008372
8373 case llvm::Triple::sparc:
8374 CmdArgs.push_back("-m");
8375 CmdArgs.push_back("elf32_sparc");
8376 break;
8377
8378 case llvm::Triple::sparcv9:
8379 CmdArgs.push_back("-m");
8380 CmdArgs.push_back("elf64_sparc");
8381 break;
8382
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008383 default:
8384 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008385 }
8386
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008387 if (Output.isFilename()) {
8388 CmdArgs.push_back("-o");
8389 CmdArgs.push_back(Output.getFilename());
8390 } else {
8391 assert(Output.isNothing() && "Invalid output.");
8392 }
8393
Douglas Katzman78b37b02015-11-17 20:28:07 +00008394 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008395 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008396 CmdArgs.push_back(
8397 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8398 CmdArgs.push_back(
8399 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8400 CmdArgs.push_back(
8401 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008402 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008403 CmdArgs.push_back(
8404 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8405 CmdArgs.push_back(
8406 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008407 }
8408 }
8409
8410 Args.AddAllArgs(CmdArgs, options::OPT_L);
8411 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8412 Args.AddAllArgs(CmdArgs, options::OPT_e);
8413 Args.AddAllArgs(CmdArgs, options::OPT_s);
8414 Args.AddAllArgs(CmdArgs, options::OPT_t);
8415 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8416 Args.AddAllArgs(CmdArgs, options::OPT_r);
8417
8418 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8419
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008420 unsigned Major, Minor, Micro;
8421 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8422 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008423 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008424 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008425 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008426 case llvm::Triple::arm:
8427 case llvm::Triple::armeb:
8428 case llvm::Triple::thumb:
8429 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008430 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008431 case llvm::Triple::ppc64:
8432 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008433 case llvm::Triple::sparc:
8434 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008435 case llvm::Triple::x86:
8436 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008437 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008438 break;
8439 default:
8440 break;
8441 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008442 }
8443
Douglas Katzman78b37b02015-11-17 20:28:07 +00008444 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008445 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008446 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008447 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8448 CmdArgs.push_back("-lm");
8449 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008450 if (Args.hasArg(options::OPT_pthread))
8451 CmdArgs.push_back("-lpthread");
8452 CmdArgs.push_back("-lc");
8453
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008454 if (useLibgcc) {
8455 if (Args.hasArg(options::OPT_static)) {
8456 // libgcc_eh depends on libc, so resolve as much as possible,
8457 // pull in any new requirements from libc and then get the rest
8458 // of libgcc.
8459 CmdArgs.push_back("-lgcc_eh");
8460 CmdArgs.push_back("-lc");
8461 CmdArgs.push_back("-lgcc");
8462 } else {
8463 CmdArgs.push_back("-lgcc");
8464 CmdArgs.push_back("--as-needed");
8465 CmdArgs.push_back("-lgcc_s");
8466 CmdArgs.push_back("--no-as-needed");
8467 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008468 }
8469 }
8470
Douglas Katzman78b37b02015-11-17 20:28:07 +00008471 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008472 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008473 CmdArgs.push_back(
8474 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008475 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008476 CmdArgs.push_back(
8477 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8478 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008479 }
8480
Xinliang David Li69306c02015-10-22 06:15:31 +00008481 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008482
Logan Chieneb9162f2014-06-26 14:23:45 +00008483 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008484 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008485}
8486
Douglas Katzman95354292015-06-23 20:42:09 +00008487void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8488 const InputInfo &Output,
8489 const InputInfoList &Inputs,
8490 const ArgList &Args,
8491 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008492 claimNoWarnArgs(Args);
8493
James Y Knight2db38f32015-08-15 03:45:25 +00008494 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8495 llvm::Triple Triple = llvm::Triple(TripleStr);
8496
Rafael Espindola92b00932010-08-10 00:25:48 +00008497 ArgStringList CmdArgs;
8498
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008499 llvm::Reloc::Model RelocationModel;
8500 unsigned PICLevel;
8501 bool IsPIE;
8502 std::tie(RelocationModel, PICLevel, IsPIE) =
8503 ParsePICArgs(getToolChain(), Triple, Args);
8504
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008505 switch (getToolChain().getArch()) {
8506 default:
8507 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008508 // Add --32/--64 to make sure we get the format we want.
8509 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008510 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008511 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008512 break;
8513 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008514 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8515 CmdArgs.push_back("--x32");
8516 else
8517 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008518 break;
8519 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008520 CmdArgs.push_back("-a32");
8521 CmdArgs.push_back("-mppc");
8522 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008523 break;
8524 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008525 CmdArgs.push_back("-a64");
8526 CmdArgs.push_back("-mppc64");
8527 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008528 break;
8529 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008530 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008531 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008532 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008533 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008534 break;
8535 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008536 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008537 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008538 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8539 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8540 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008541 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008542 }
8543 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008544 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008545 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8546 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8547 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008548 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008549 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008550 case llvm::Triple::arm:
8551 case llvm::Triple::armeb:
8552 case llvm::Triple::thumb:
8553 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008554 const llvm::Triple &Triple2 = getToolChain().getTriple();
8555 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008556 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008557 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008558 break;
8559 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008560 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008561 break;
8562 default:
8563 break;
8564 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008565
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008566 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008567 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8568 case arm::FloatABI::Soft:
8569 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8570 break;
8571 case arm::FloatABI::SoftFP:
8572 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8573 break;
8574 case arm::FloatABI::Hard:
8575 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8576 break;
8577 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008578
8579 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008580
8581 // FIXME: remove krait check when GNU tools support krait cpu
8582 // for now replace it with -march=armv7-a to avoid a lower
8583 // march from being picked in the absence of a cpu flag.
8584 Arg *A;
8585 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008586 StringRef(A->getValue()).lower() == "krait")
8587 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008588 else
8589 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008590 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008591 break;
8592 }
8593 case llvm::Triple::mips:
8594 case llvm::Triple::mipsel:
8595 case llvm::Triple::mips64:
8596 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008597 StringRef CPUName;
8598 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008599 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008600 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008601
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008602 CmdArgs.push_back("-march");
8603 CmdArgs.push_back(CPUName.data());
8604
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008605 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008606 CmdArgs.push_back(ABIName.data());
8607
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008608 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8609 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008610 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008611 CmdArgs.push_back("-mno-shared");
8612
Daniel Sanders379d44b2014-07-16 11:52:23 +00008613 // LLVM doesn't support -mplt yet and acts as if it is always given.
8614 // However, -mplt has no effect with the N64 ABI.
8615 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008616
8617 if (getToolChain().getArch() == llvm::Triple::mips ||
8618 getToolChain().getArch() == llvm::Triple::mips64)
8619 CmdArgs.push_back("-EB");
8620 else
8621 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008622
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008623 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8624 if (StringRef(A->getValue()) == "2008")
8625 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8626 }
8627
Daniel Sanders379d44b2014-07-16 11:52:23 +00008628 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8629 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8630 options::OPT_mfp64)) {
8631 A->claim();
8632 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008633 } else if (mips::shouldUseFPXX(
8634 Args, getToolChain().getTriple(), CPUName, ABIName,
8635 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008636 CmdArgs.push_back("-mfpxx");
8637
8638 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8639 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008640 if (Arg *A =
8641 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008642 if (A->getOption().matches(options::OPT_mips16)) {
8643 A->claim();
8644 A->render(Args, CmdArgs);
8645 } else {
8646 A->claim();
8647 CmdArgs.push_back("-no-mips16");
8648 }
8649 }
8650
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008651 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8652 options::OPT_mno_micromips);
8653 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8654 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8655
Simon Atanasyanbd986632013-11-26 11:58:04 +00008656 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8657 // Do not use AddLastArg because not all versions of MIPS assembler
8658 // support -mmsa / -mno-msa options.
8659 if (A->getOption().matches(options::OPT_mmsa))
8660 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8661 }
8662
Daniel Sanders379d44b2014-07-16 11:52:23 +00008663 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8664 options::OPT_msoft_float);
8665
Toma Tabacub36d6102015-06-11 12:13:18 +00008666 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8667 options::OPT_msingle_float);
8668
Daniel Sanders379d44b2014-07-16 11:52:23 +00008669 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8670 options::OPT_mno_odd_spreg);
8671
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008672 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008673 break;
8674 }
8675 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008676 // Always pass an -march option, since our default of z10 is later
8677 // than the GNU assembler's default.
8678 StringRef CPUName = getSystemZTargetCPU(Args);
8679 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008680 break;
8681 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008682 }
8683
Renato Golina74bbc72015-07-22 15:32:36 +00008684 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008685 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008686
8687 CmdArgs.push_back("-o");
8688 CmdArgs.push_back(Output.getFilename());
8689
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008690 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008691 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008692
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008693 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008694 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008695
8696 // Handle the debug info splitting at object creation time if we're
8697 // creating an object.
8698 // TODO: Currently only works on linux with newer objcopy.
8699 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008700 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008701 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008702 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008703}
8704
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008705static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008706 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008707 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008708 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008709 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8710 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008711 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008712 CmdArgs.push_back("-lgcc");
8713
Logan Chien3d3373c2012-11-19 12:04:11 +00008714 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008715 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008716 CmdArgs.push_back("-lgcc");
8717 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008718 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008719 CmdArgs.push_back("--as-needed");
8720 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008721 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008722 CmdArgs.push_back("--no-as-needed");
8723 }
8724
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008725 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008726 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008727 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008728 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008729
8730 // According to Android ABI, we have to link with libdl if we are
8731 // linking with non-static libgcc.
8732 //
8733 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8734 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8735 if (isAndroid && !StaticLibgcc)
8736 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008737}
8738
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008739static std::string getLinuxDynamicLinker(const ArgList &Args,
8740 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008741 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8742
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008743 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008744 if (ToolChain.getTriple().isArch64Bit())
8745 return "/system/bin/linker64";
8746 else
8747 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008748 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8749 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008750 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008751 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008752 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008753 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008754 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008755 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008756 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008757 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008758 return "/lib/ld-linux-armhf.so.3";
8759 else
8760 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008761 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8762 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008763 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008764 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008765 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008766 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008767 return "/lib/ld-linux.so.3";
8768 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8769 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008770 std::string LibDir =
8771 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008772 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008773 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008774 if (mips::isUCLibc(Args))
8775 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008776 else if (!ToolChain.getTriple().hasEnvironment()) {
8777 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8778 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8779 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8780 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008781 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008782
8783 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008784 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008785 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008786 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008787 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8788 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008789 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008790 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008791 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8792 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008793 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008794 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008795 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008796 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008797 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008798 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008799 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8800 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008801 else
8802 return "/lib64/ld-linux-x86-64.so.2";
8803}
8804
Renato Golinc4b49242014-02-13 10:01:16 +00008805static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008806 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008807 // Make use of compiler-rt if --rtlib option is used
8808 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8809
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008810 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008811 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008812 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008813 default:
8814 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008815 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008816 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008817 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008818 break;
8819 }
Renato Golinc4b49242014-02-13 10:01:16 +00008820 break;
8821 case ToolChain::RLT_Libgcc:
8822 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8823 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008824 }
8825}
8826
Rafael Espindola1e085772014-08-15 17:14:35 +00008827static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8828 switch (T.getArch()) {
8829 case llvm::Triple::x86:
8830 return "elf_i386";
8831 case llvm::Triple::aarch64:
8832 return "aarch64linux";
8833 case llvm::Triple::aarch64_be:
8834 return "aarch64_be_linux";
8835 case llvm::Triple::arm:
8836 case llvm::Triple::thumb:
8837 return "armelf_linux_eabi";
8838 case llvm::Triple::armeb:
8839 case llvm::Triple::thumbeb:
8840 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8841 case llvm::Triple::ppc:
8842 return "elf32ppclinux";
8843 case llvm::Triple::ppc64:
8844 return "elf64ppc";
8845 case llvm::Triple::ppc64le:
8846 return "elf64lppc";
8847 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008848 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008849 return "elf32_sparc";
8850 case llvm::Triple::sparcv9:
8851 return "elf64_sparc";
8852 case llvm::Triple::mips:
8853 return "elf32btsmip";
8854 case llvm::Triple::mipsel:
8855 return "elf32ltsmip";
8856 case llvm::Triple::mips64:
8857 if (mips::hasMipsAbiArg(Args, "n32"))
8858 return "elf32btsmipn32";
8859 return "elf64btsmip";
8860 case llvm::Triple::mips64el:
8861 if (mips::hasMipsAbiArg(Args, "n32"))
8862 return "elf32ltsmipn32";
8863 return "elf64ltsmip";
8864 case llvm::Triple::systemz:
8865 return "elf64_s390";
8866 case llvm::Triple::x86_64:
8867 if (T.getEnvironment() == llvm::Triple::GNUX32)
8868 return "elf32_x86_64";
8869 return "elf_x86_64";
8870 default:
8871 llvm_unreachable("Unexpected arch");
8872 }
8873}
8874
Douglas Katzman95354292015-06-23 20:42:09 +00008875void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8876 const InputInfo &Output,
8877 const InputInfoList &Inputs,
8878 const ArgList &Args,
8879 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008880 const toolchains::Linux &ToolChain =
8881 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008882 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008883
8884 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8885 llvm::Triple Triple = llvm::Triple(TripleStr);
8886
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008887 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008888 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008889 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008890 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8891 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008892 const bool HasCRTBeginEndFiles =
8893 ToolChain.getTriple().hasEnvironment() ||
8894 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008895
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008896 ArgStringList CmdArgs;
8897
Rafael Espindolad1002f62010-11-15 18:28:16 +00008898 // Silence warning for "clang -g foo.o -o foo"
8899 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008900 // and "clang -emit-llvm foo.o -o foo"
8901 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008902 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008903 // handled somewhere else.
8904 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008905
Peter Collingbourne39719a72015-11-20 20:49:39 +00008906 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8907 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008908 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008909 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008910 CmdArgs.push_back("-target");
8911 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8912 }
8913
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008914 if (!D.SysRoot.empty())
8915 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008916
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008917 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008918 CmdArgs.push_back("-pie");
8919
Rafael Espindola1c76c592010-11-07 22:57:16 +00008920 if (Args.hasArg(options::OPT_rdynamic))
8921 CmdArgs.push_back("-export-dynamic");
8922
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008923 if (Args.hasArg(options::OPT_s))
8924 CmdArgs.push_back("-s");
8925
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008926 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008927 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008928
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008929 for (const auto &Opt : ToolChain.ExtraOpts)
8930 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008931
8932 if (!Args.hasArg(options::OPT_static)) {
8933 CmdArgs.push_back("--eh-frame-hdr");
8934 }
8935
8936 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008937 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008938
8939 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008940 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8941 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008942 CmdArgs.push_back("-Bstatic");
8943 else
8944 CmdArgs.push_back("-static");
8945 } else if (Args.hasArg(options::OPT_shared)) {
8946 CmdArgs.push_back("-shared");
8947 }
8948
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00008949 if (!Args.hasArg(options::OPT_static)) {
8950 if (Args.hasArg(options::OPT_rdynamic))
8951 CmdArgs.push_back("-export-dynamic");
8952
8953 if (!Args.hasArg(options::OPT_shared)) {
8954 const std::string Loader =
8955 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
8956 CmdArgs.push_back("-dynamic-linker");
8957 CmdArgs.push_back(Args.MakeArgString(Loader));
8958 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008959 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008960
8961 CmdArgs.push_back("-o");
8962 CmdArgs.push_back(Output.getFilename());
8963
Douglas Katzman78b37b02015-11-17 20:28:07 +00008964 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008965 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008966 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008967 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008968 if (Args.hasArg(options::OPT_pg))
8969 crt1 = "gcrt1.o";
8970 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008971 crt1 = "Scrt1.o";
8972 else
8973 crt1 = "crt1.o";
8974 }
8975 if (crt1)
8976 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008977
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008978 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8979 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008980
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008981 const char *crtbegin;
8982 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008983 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008984 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008985 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008986 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008987 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008988 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008989 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008990
8991 if (HasCRTBeginEndFiles)
8992 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008993
8994 // Add crtfastmath.o if available and fast math is enabled.
8995 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008996 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008997
8998 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008999 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009000
Douglas Katzman6059ef92015-11-17 17:41:23 +00009001 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009002
Teresa Johnson945bc502015-10-15 20:35:53 +00009003 if (D.isUsingLTO())
9004 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009005
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009006 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9007 CmdArgs.push_back("--no-demangle");
9008
Alexey Samsonov52550342014-09-15 19:58:40 +00009009 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009010 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009011 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009012 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009013
Douglas Katzman78b37b02015-11-17 20:28:07 +00009014 if (D.CCCIsCXX() &&
9015 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009016 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009017 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009018 if (OnlyLibstdcxxStatic)
9019 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009020 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009021 if (OnlyLibstdcxxStatic)
9022 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009023 CmdArgs.push_back("-lm");
9024 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009025 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9026 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009027
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009028 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009029 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9030 if (Args.hasArg(options::OPT_static))
9031 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009032
Alexey Samsonov52550342014-09-15 19:58:40 +00009033 if (NeedsSanitizerDeps)
9034 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9035
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009036 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9037 Args.hasArg(options::OPT_pthreads);
9038
9039 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9040 options::OPT_fno_openmp, false)) {
9041 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9042 // FIXME: Does this really make sense for all GNU toolchains?
9043 WantPthread = true;
9044
9045 // Also link the particular OpenMP runtimes.
9046 switch (getOpenMPRuntime(ToolChain, Args)) {
9047 case OMPRT_OMP:
9048 CmdArgs.push_back("-lomp");
9049 break;
9050 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009051 CmdArgs.push_back("-lgomp");
9052
9053 // FIXME: Exclude this for platforms with libgomp that don't require
9054 // librt. Most modern Linux platforms require it, but some may not.
9055 CmdArgs.push_back("-lrt");
9056 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009057 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009058 CmdArgs.push_back("-liomp5");
9059 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009060 case OMPRT_Unknown:
9061 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009062 break;
9063 }
Chandler Carruth01538002013-01-17 13:19:29 +00009064 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009065
Renato Golinc4b49242014-02-13 10:01:16 +00009066 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009067
Richard Smith31d1de22015-05-20 22:48:44 +00009068 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009069 CmdArgs.push_back("-lpthread");
9070
Rafael Espindolab17bc532016-01-25 18:29:16 +00009071 if (Args.hasArg(options::OPT_fsplit_stack))
9072 CmdArgs.push_back("--wrap=pthread_create");
9073
Chandler Carruth94a32012012-05-14 18:31:18 +00009074 CmdArgs.push_back("-lc");
9075
9076 if (Args.hasArg(options::OPT_static))
9077 CmdArgs.push_back("--end-group");
9078 else
Renato Golinc4b49242014-02-13 10:01:16 +00009079 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009080 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009081
Rafael Espindola81937ec2010-12-01 01:52:43 +00009082 if (!Args.hasArg(options::OPT_nostartfiles)) {
9083 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009084 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009085 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009086 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009087 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009088 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009089 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009090
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009091 if (HasCRTBeginEndFiles)
9092 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009093 if (!isAndroid)
9094 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009095 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009096 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009097
Peter Collingbourne39719a72015-11-20 20:49:39 +00009098 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009099}
9100
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009101// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9102// for the various SFI requirements like register masking. The assembly tool
9103// inserts the file containing the macros as an input into all the assembly
9104// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009105void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9106 const InputInfo &Output,
9107 const InputInfoList &Inputs,
9108 const ArgList &Args,
9109 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009110 const toolchains::NaClToolChain &ToolChain =
9111 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009112 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009113 "nacl-arm-macros.s");
9114 InputInfoList NewInputs;
9115 NewInputs.push_back(NaClMacros);
9116 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009117 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9118 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009119}
9120
Douglas Katzman750cfc52015-06-29 18:42:16 +00009121// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009122// we use static by default, do not yet support sanitizers or LTO, and a few
9123// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009124// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009125void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9126 const InputInfo &Output,
9127 const InputInfoList &Inputs,
9128 const ArgList &Args,
9129 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009130
Douglas Katzman54366072015-07-27 16:53:08 +00009131 const toolchains::NaClToolChain &ToolChain =
9132 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009133 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009134 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009135 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009136 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009137
9138 ArgStringList CmdArgs;
9139
9140 // Silence warning for "clang -g foo.o -o foo"
9141 Args.ClaimAllArgs(options::OPT_g_Group);
9142 // and "clang -emit-llvm foo.o -o foo"
9143 Args.ClaimAllArgs(options::OPT_emit_llvm);
9144 // and for "clang -w foo.o -o foo". Other warning options are already
9145 // handled somewhere else.
9146 Args.ClaimAllArgs(options::OPT_w);
9147
9148 if (!D.SysRoot.empty())
9149 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9150
9151 if (Args.hasArg(options::OPT_rdynamic))
9152 CmdArgs.push_back("-export-dynamic");
9153
9154 if (Args.hasArg(options::OPT_s))
9155 CmdArgs.push_back("-s");
9156
Douglas Katzman54366072015-07-27 16:53:08 +00009157 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9158 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009159 CmdArgs.push_back("--build-id");
9160
9161 if (!IsStatic)
9162 CmdArgs.push_back("--eh-frame-hdr");
9163
9164 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009165 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009166 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009167 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009168 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009169 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009170 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009171 else if (Arch == llvm::Triple::mipsel)
9172 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009173 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009174 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9175 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009176
9177 if (IsStatic)
9178 CmdArgs.push_back("-static");
9179 else if (Args.hasArg(options::OPT_shared))
9180 CmdArgs.push_back("-shared");
9181
9182 CmdArgs.push_back("-o");
9183 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009184 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009185 if (!Args.hasArg(options::OPT_shared))
9186 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9187 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9188
9189 const char *crtbegin;
9190 if (IsStatic)
9191 crtbegin = "crtbeginT.o";
9192 else if (Args.hasArg(options::OPT_shared))
9193 crtbegin = "crtbeginS.o";
9194 else
9195 crtbegin = "crtbegin.o";
9196 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9197 }
9198
9199 Args.AddAllArgs(CmdArgs, options::OPT_L);
9200 Args.AddAllArgs(CmdArgs, options::OPT_u);
9201
Douglas Katzman6059ef92015-11-17 17:41:23 +00009202 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009203
9204 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9205 CmdArgs.push_back("--no-demangle");
9206
9207 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9208
Douglas Katzman78b37b02015-11-17 20:28:07 +00009209 if (D.CCCIsCXX() &&
9210 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009211 bool OnlyLibstdcxxStatic =
9212 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009213 if (OnlyLibstdcxxStatic)
9214 CmdArgs.push_back("-Bstatic");
9215 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9216 if (OnlyLibstdcxxStatic)
9217 CmdArgs.push_back("-Bdynamic");
9218 CmdArgs.push_back("-lm");
9219 }
9220
9221 if (!Args.hasArg(options::OPT_nostdlib)) {
9222 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9223 // Always use groups, since it has no effect on dynamic libraries.
9224 CmdArgs.push_back("--start-group");
9225 CmdArgs.push_back("-lc");
9226 // NaCl's libc++ currently requires libpthread, so just always include it
9227 // in the group for C++.
9228 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009229 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009230 // Gold, used by Mips, handles nested groups differently than ld, and
9231 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9232 // which is not a desired behaviour here.
9233 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9234 if (getToolChain().getArch() == llvm::Triple::mipsel)
9235 CmdArgs.push_back("-lnacl");
9236
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009237 CmdArgs.push_back("-lpthread");
9238 }
9239
9240 CmdArgs.push_back("-lgcc");
9241 CmdArgs.push_back("--as-needed");
9242 if (IsStatic)
9243 CmdArgs.push_back("-lgcc_eh");
9244 else
9245 CmdArgs.push_back("-lgcc_s");
9246 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009247
9248 // Mips needs to create and use pnacl_legacy library that contains
9249 // definitions from bitcode/pnaclmm.c and definitions for
9250 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9251 if (getToolChain().getArch() == llvm::Triple::mipsel)
9252 CmdArgs.push_back("-lpnacl_legacy");
9253
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009254 CmdArgs.push_back("--end-group");
9255 }
9256
9257 if (!Args.hasArg(options::OPT_nostartfiles)) {
9258 const char *crtend;
9259 if (Args.hasArg(options::OPT_shared))
9260 crtend = "crtendS.o";
9261 else
9262 crtend = "crtend.o";
9263
9264 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9265 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9266 }
9267 }
9268
Peter Collingbourne39719a72015-11-20 20:49:39 +00009269 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9270 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009271}
9272
Douglas Katzman95354292015-06-23 20:42:09 +00009273void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9274 const InputInfo &Output,
9275 const InputInfoList &Inputs,
9276 const ArgList &Args,
9277 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009278 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009279 ArgStringList CmdArgs;
9280
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009281 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009282
9283 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009284 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009285
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009286 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009287 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009288
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009289 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009290 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009291}
9292
Douglas Katzman95354292015-06-23 20:42:09 +00009293void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9294 const InputInfo &Output,
9295 const InputInfoList &Inputs,
9296 const ArgList &Args,
9297 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009298 const Driver &D = getToolChain().getDriver();
9299 ArgStringList CmdArgs;
9300
Daniel Dunbarb440f562010-08-02 02:38:21 +00009301 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009302 CmdArgs.push_back("-o");
9303 CmdArgs.push_back(Output.getFilename());
9304 } else {
9305 assert(Output.isNothing() && "Invalid output.");
9306 }
9307
Douglas Katzman78b37b02015-11-17 20:28:07 +00009308 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009309 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9310 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9311 CmdArgs.push_back(
9312 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9313 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009314 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009315
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009316 Args.AddAllArgs(CmdArgs,
9317 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009318
Daniel Dunbar54423b22010-09-17 00:24:54 +00009319 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009320
Xinliang David Li69306c02015-10-22 06:15:31 +00009321 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009322
Douglas Katzman78b37b02015-11-17 20:28:07 +00009323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009324 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009325 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009326 CmdArgs.push_back("-lm");
9327 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009328 }
9329
Douglas Katzman78b37b02015-11-17 20:28:07 +00009330 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009331 if (Args.hasArg(options::OPT_pthread))
9332 CmdArgs.push_back("-lpthread");
9333 CmdArgs.push_back("-lc");
9334 CmdArgs.push_back("-lCompilerRT-Generic");
9335 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9336 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009337 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009338 }
9339
Logan Chieneb9162f2014-06-26 14:23:45 +00009340 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009341 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009342}
9343
Daniel Dunbarcc912342009-05-02 18:28:39 +00009344/// DragonFly Tools
9345
9346// For now, DragonFly Assemble does just about the same as for
9347// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009348void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9349 const InputInfo &Output,
9350 const InputInfoList &Inputs,
9351 const ArgList &Args,
9352 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009353 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009354 ArgStringList CmdArgs;
9355
9356 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9357 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009358 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009359 CmdArgs.push_back("--32");
9360
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009361 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009362
9363 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009364 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009365
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009366 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009367 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009368
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009369 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009370 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009371}
9372
Douglas Katzman95354292015-06-23 20:42:09 +00009373void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9374 const InputInfo &Output,
9375 const InputInfoList &Inputs,
9376 const ArgList &Args,
9377 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009378 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009379 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009380
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009381 if (!D.SysRoot.empty())
9382 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9383
John McCall65b8da02013-04-11 22:55:55 +00009384 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009385 if (Args.hasArg(options::OPT_static)) {
9386 CmdArgs.push_back("-Bstatic");
9387 } else {
John McCall65b8da02013-04-11 22:55:55 +00009388 if (Args.hasArg(options::OPT_rdynamic))
9389 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009390 if (Args.hasArg(options::OPT_shared))
9391 CmdArgs.push_back("-Bshareable");
9392 else {
9393 CmdArgs.push_back("-dynamic-linker");
9394 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9395 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009396 CmdArgs.push_back("--hash-style=gnu");
9397 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009398 }
9399
9400 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9401 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009402 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009403 CmdArgs.push_back("-m");
9404 CmdArgs.push_back("elf_i386");
9405 }
9406
Daniel Dunbarb440f562010-08-02 02:38:21 +00009407 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009408 CmdArgs.push_back("-o");
9409 CmdArgs.push_back(Output.getFilename());
9410 } else {
9411 assert(Output.isNothing() && "Invalid output.");
9412 }
9413
Douglas Katzman78b37b02015-11-17 20:28:07 +00009414 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009415 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009416 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009417 CmdArgs.push_back(
9418 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009419 else {
9420 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009421 CmdArgs.push_back(
9422 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009423 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009424 CmdArgs.push_back(
9425 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009426 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009427 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009428 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009429 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009430 CmdArgs.push_back(
9431 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009432 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009433 CmdArgs.push_back(
9434 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009435 }
9436
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009437 Args.AddAllArgs(CmdArgs,
9438 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009439
Daniel Dunbar54423b22010-09-17 00:24:54 +00009440 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009441
Douglas Katzman78b37b02015-11-17 20:28:07 +00009442 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009443 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009444
9445 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009446 CmdArgs.push_back("-rpath");
9447 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009448 }
9449
Hans Wennborg70850d82013-07-18 20:29:38 +00009450 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009451 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009452 CmdArgs.push_back("-lm");
9453 }
9454
Daniel Dunbarcc912342009-05-02 18:28:39 +00009455 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009456 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009457
9458 if (!Args.hasArg(options::OPT_nolibc)) {
9459 CmdArgs.push_back("-lc");
9460 }
9461
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009462 if (Args.hasArg(options::OPT_static) ||
9463 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009464 CmdArgs.push_back("-lgcc");
9465 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009466 } else {
9467 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009468 CmdArgs.push_back("-lgcc_pic");
9469 if (!Args.hasArg(options::OPT_shared))
9470 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009471 } else {
John McCall65b8da02013-04-11 22:55:55 +00009472 CmdArgs.push_back("-lgcc");
9473 CmdArgs.push_back("--as-needed");
9474 CmdArgs.push_back("-lgcc_pic");
9475 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009476 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009477 }
9478 }
9479
Douglas Katzman78b37b02015-11-17 20:28:07 +00009480 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009481 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009482 CmdArgs.push_back(
9483 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009484 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009485 CmdArgs.push_back(
9486 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9487 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009488 }
9489
Xinliang David Li69306c02015-10-22 06:15:31 +00009490 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009491
Logan Chieneb9162f2014-06-26 14:23:45 +00009492 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009493 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009494}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009495
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009496// Try to find Exe from a Visual Studio distribution. This first tries to find
9497// an installed copy of Visual Studio and, failing that, looks in the PATH,
9498// making sure that whatever executable that's found is not a same-named exe
9499// from clang itself to prevent clang from falling back to itself.
9500static std::string FindVisualStudioExecutable(const ToolChain &TC,
9501 const char *Exe,
9502 const char *ClangProgramPath) {
9503 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9504 std::string visualStudioBinDir;
9505 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9506 visualStudioBinDir)) {
9507 SmallString<128> FilePath(visualStudioBinDir);
9508 llvm::sys::path::append(FilePath, Exe);
9509 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9510 return FilePath.str();
9511 }
9512
9513 return Exe;
9514}
9515
Douglas Katzman95354292015-06-23 20:42:09 +00009516void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9517 const InputInfo &Output,
9518 const InputInfoList &Inputs,
9519 const ArgList &Args,
9520 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009521 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009522 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009523
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009524 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9525 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009526 CmdArgs.push_back(
9527 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009528
Douglas Katzman78b37b02015-11-17 20:28:07 +00009529 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9530 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009531 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009532
Zachary Turner10d75b22014-10-22 20:40:43 +00009533 if (!llvm::sys::Process::GetEnv("LIB")) {
9534 // If the VC environment hasn't been configured (perhaps because the user
9535 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009536 // the environment variable is set however, assume the user knows what
9537 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009538 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009539 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009540 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9541 SmallString<128> LibDir(VisualStudioDir);
9542 llvm::sys::path::append(LibDir, "VC", "lib");
9543 switch (MSVC.getArch()) {
9544 case llvm::Triple::x86:
9545 // x86 just puts the libraries directly in lib
9546 break;
9547 case llvm::Triple::x86_64:
9548 llvm::sys::path::append(LibDir, "amd64");
9549 break;
9550 case llvm::Triple::arm:
9551 llvm::sys::path::append(LibDir, "arm");
9552 break;
9553 default:
9554 break;
9555 }
9556 CmdArgs.push_back(
9557 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009558
9559 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9560 std::string UniversalCRTLibPath;
9561 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9562 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9563 UniversalCRTLibPath.c_str()));
9564 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009565 }
9566
9567 std::string WindowsSdkLibPath;
9568 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9569 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9570 WindowsSdkLibPath.c_str()));
9571 }
9572
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009573 CmdArgs.push_back("-nologo");
9574
Reid Kleckner124955a2015-08-05 18:51:13 +00009575 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009576 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009577
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009578 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009579 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009580 if (DLL) {
9581 CmdArgs.push_back(Args.MakeArgString("-dll"));
9582
9583 SmallString<128> ImplibName(Output.getFilename());
9584 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009585 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009586 }
9587
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009588 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009589 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009590 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009591 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009592 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9593 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009594 // Make sure the dynamic runtime thunk is not optimized out at link time
9595 // to ensure proper SEH handling.
9596 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009597 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009598 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009599 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009600 for (const auto &Lib : {"asan", "asan_cxx"})
9601 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009602 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009603 }
9604
Hans Wennborg2e274592013-08-13 23:38:57 +00009605 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009606
Alexey Bataevc7e84352015-08-19 04:49:01 +00009607 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9608 options::OPT_fno_openmp, false)) {
9609 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9610 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9611 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9612 TC.getDriver().Dir + "/../lib"));
9613 switch (getOpenMPRuntime(getToolChain(), Args)) {
9614 case OMPRT_OMP:
9615 CmdArgs.push_back("-defaultlib:libomp.lib");
9616 break;
9617 case OMPRT_IOMP5:
9618 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9619 break;
9620 case OMPRT_GOMP:
9621 break;
9622 case OMPRT_Unknown:
9623 // Already diagnosed.
9624 break;
9625 }
9626 }
9627
Reid Kleckner337188f2014-09-16 19:22:00 +00009628 // Add filenames, libraries, and other linker inputs.
9629 for (const auto &Input : Inputs) {
9630 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009631 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009632 continue;
9633 }
9634
9635 const Arg &A = Input.getInputArg();
9636
9637 // Render -l options differently for the MSVC linker.
9638 if (A.getOption().matches(options::OPT_l)) {
9639 StringRef Lib = A.getValue();
9640 const char *LinkLibArg;
9641 if (Lib.endswith(".lib"))
9642 LinkLibArg = Args.MakeArgString(Lib);
9643 else
9644 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9645 CmdArgs.push_back(LinkLibArg);
9646 continue;
9647 }
9648
9649 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9650 // or -L. Render it, even if MSVC doesn't understand it.
9651 A.renderAsInput(Args, CmdArgs);
9652 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009653
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009654 TC.addProfileRTLibs(Args, CmdArgs);
9655
Zachary Turner719f58c2014-12-01 23:06:47 +00009656 // We need to special case some linker paths. In the case of lld, we need to
9657 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9658 // linker, we need to use a special search algorithm.
9659 llvm::SmallString<128> linkPath;
9660 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9661 if (Linker.equals_lower("lld"))
9662 Linker = "lld-link";
9663
9664 if (Linker.equals_lower("link")) {
9665 // If we're using the MSVC linker, it's not sufficient to just use link
9666 // from the program PATH, because other environments like GnuWin32 install
9667 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009668 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009669 C.getDriver().getClangProgramPath());
9670 } else {
9671 linkPath = Linker;
9672 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009673 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009674 }
9675
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009676 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009677 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009678}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009679
Douglas Katzman95354292015-06-23 20:42:09 +00009680void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9681 const InputInfo &Output,
9682 const InputInfoList &Inputs,
9683 const ArgList &Args,
9684 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009685 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9686}
9687
Douglas Katzman95354292015-06-23 20:42:09 +00009688std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009689 Compilation &C, const JobAction &JA, const InputInfo &Output,
9690 const InputInfoList &Inputs, const ArgList &Args,
9691 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009692 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009693 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009694 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009695 CmdArgs.push_back("/W0"); // No warnings.
9696
9697 // The goal is to be able to invoke this tool correctly based on
9698 // any flag accepted by clang-cl.
9699
9700 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009701 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009702
9703 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009704 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9705 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9706 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009707 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9708 if (A->getOption().getID() == options::OPT_O0) {
9709 CmdArgs.push_back("/Od");
9710 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009711 CmdArgs.push_back("/Og");
9712
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009713 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009714 if (OptLevel == "s" || OptLevel == "z")
9715 CmdArgs.push_back("/Os");
9716 else
9717 CmdArgs.push_back("/Ot");
9718
9719 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009720 }
9721 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009722 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9723 options::OPT_fno_omit_frame_pointer))
9724 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9725 ? "/Oy"
9726 : "/Oy-");
9727 if (!Args.hasArg(options::OPT_fwritable_strings))
9728 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009729
Nico Weber3f8dafb2015-03-12 19:37:10 +00009730 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009731 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9732
David Majnemerf6072342014-07-01 22:24:56 +00009733 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9734 /*default=*/false))
9735 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009736 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9737 options::OPT_fno_function_sections))
9738 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9739 ? "/Gy"
9740 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009741 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9742 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009743 CmdArgs.push_back(
9744 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009745 if (Args.hasArg(options::OPT_fsyntax_only))
9746 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009747 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9748 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009749 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009750
Nico Weber3f8dafb2015-03-12 19:37:10 +00009751 std::vector<std::string> Includes =
9752 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009753 for (const auto &Include : Includes)
9754 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009755
Hans Wennborg87cfa712013-09-19 20:32:16 +00009756 // Flags that can simply be passed through.
9757 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9758 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009759 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9760 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009761 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009762 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009763
9764 // The order of these flags is relevant, so pick the last one.
9765 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9766 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9767 A->render(Args, CmdArgs);
9768
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009769 // Pass through all unknown arguments so that the fallback command can see
9770 // them too.
9771 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9772
Hans Wennborg87cfa712013-09-19 20:32:16 +00009773 // Input filename.
9774 assert(Inputs.size() == 1);
9775 const InputInfo &II = Inputs[0];
9776 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9777 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9778 if (II.isFilename())
9779 CmdArgs.push_back(II.getFilename());
9780 else
9781 II.getInputArg().renderAsInput(Args, CmdArgs);
9782
9783 // Output filename.
9784 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009785 const char *Fo =
9786 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009787 CmdArgs.push_back(Fo);
9788
Hans Wennborg188382e2013-09-20 18:16:35 +00009789 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009790 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9791 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009792 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009793 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009794}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009795
Yaron Keren1c0070c2015-07-02 04:45:27 +00009796/// MinGW Tools
9797void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9798 const InputInfo &Output,
9799 const InputInfoList &Inputs,
9800 const ArgList &Args,
9801 const char *LinkingOutput) const {
9802 claimNoWarnArgs(Args);
9803 ArgStringList CmdArgs;
9804
9805 if (getToolChain().getArch() == llvm::Triple::x86) {
9806 CmdArgs.push_back("--32");
9807 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9808 CmdArgs.push_back("--64");
9809 }
9810
9811 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9812
9813 CmdArgs.push_back("-o");
9814 CmdArgs.push_back(Output.getFilename());
9815
9816 for (const auto &II : Inputs)
9817 CmdArgs.push_back(II.getFilename());
9818
9819 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009820 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009821
9822 if (Args.hasArg(options::OPT_gsplit_dwarf))
9823 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9824 SplitDebugName(Args, Inputs[0]));
9825}
9826
9827void MinGW::Linker::AddLibGCC(const ArgList &Args,
9828 ArgStringList &CmdArgs) const {
9829 if (Args.hasArg(options::OPT_mthreads))
9830 CmdArgs.push_back("-lmingwthrd");
9831 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009832
Yaron Kerenaa281332015-08-09 00:24:07 +00009833 // Make use of compiler-rt if --rtlib option is used
9834 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9835 if (RLT == ToolChain::RLT_Libgcc) {
9836 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9837 Args.hasArg(options::OPT_static);
9838 bool Shared = Args.hasArg(options::OPT_shared);
9839 bool CXX = getToolChain().getDriver().CCCIsCXX();
9840
9841 if (Static || (!CXX && !Shared)) {
9842 CmdArgs.push_back("-lgcc");
9843 CmdArgs.push_back("-lgcc_eh");
9844 } else {
9845 CmdArgs.push_back("-lgcc_s");
9846 CmdArgs.push_back("-lgcc");
9847 }
9848 } else {
9849 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9850 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009851
Yaron Keren1c0070c2015-07-02 04:45:27 +00009852 CmdArgs.push_back("-lmoldname");
9853 CmdArgs.push_back("-lmingwex");
9854 CmdArgs.push_back("-lmsvcrt");
9855}
9856
9857void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9858 const InputInfo &Output,
9859 const InputInfoList &Inputs,
9860 const ArgList &Args,
9861 const char *LinkingOutput) const {
9862 const ToolChain &TC = getToolChain();
9863 const Driver &D = TC.getDriver();
9864 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9865
9866 ArgStringList CmdArgs;
9867
9868 // Silence warning for "clang -g foo.o -o foo"
9869 Args.ClaimAllArgs(options::OPT_g_Group);
9870 // and "clang -emit-llvm foo.o -o foo"
9871 Args.ClaimAllArgs(options::OPT_emit_llvm);
9872 // and for "clang -w foo.o -o foo". Other warning options are already
9873 // handled somewhere else.
9874 Args.ClaimAllArgs(options::OPT_w);
9875
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009876 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9877 if (LinkerName.equals_lower("lld")) {
9878 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009879 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009880 } else if (!LinkerName.equals_lower("ld")) {
9881 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009882 }
9883
Yaron Keren1c0070c2015-07-02 04:45:27 +00009884 if (!D.SysRoot.empty())
9885 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9886
9887 if (Args.hasArg(options::OPT_s))
9888 CmdArgs.push_back("-s");
9889
9890 CmdArgs.push_back("-m");
9891 if (TC.getArch() == llvm::Triple::x86)
9892 CmdArgs.push_back("i386pe");
9893 if (TC.getArch() == llvm::Triple::x86_64)
9894 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009895 if (TC.getArch() == llvm::Triple::arm)
9896 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009897
9898 if (Args.hasArg(options::OPT_mwindows)) {
9899 CmdArgs.push_back("--subsystem");
9900 CmdArgs.push_back("windows");
9901 } else if (Args.hasArg(options::OPT_mconsole)) {
9902 CmdArgs.push_back("--subsystem");
9903 CmdArgs.push_back("console");
9904 }
9905
9906 if (Args.hasArg(options::OPT_static))
9907 CmdArgs.push_back("-Bstatic");
9908 else {
9909 if (Args.hasArg(options::OPT_mdll))
9910 CmdArgs.push_back("--dll");
9911 else if (Args.hasArg(options::OPT_shared))
9912 CmdArgs.push_back("--shared");
9913 CmdArgs.push_back("-Bdynamic");
9914 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9915 CmdArgs.push_back("-e");
9916 if (TC.getArch() == llvm::Triple::x86)
9917 CmdArgs.push_back("_DllMainCRTStartup@12");
9918 else
9919 CmdArgs.push_back("DllMainCRTStartup");
9920 CmdArgs.push_back("--enable-auto-image-base");
9921 }
9922 }
9923
9924 CmdArgs.push_back("-o");
9925 CmdArgs.push_back(Output.getFilename());
9926
9927 Args.AddAllArgs(CmdArgs, options::OPT_e);
9928 // FIXME: add -N, -n flags
9929 Args.AddLastArg(CmdArgs, options::OPT_r);
9930 Args.AddLastArg(CmdArgs, options::OPT_s);
9931 Args.AddLastArg(CmdArgs, options::OPT_t);
9932 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9933 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9934
Douglas Katzman78b37b02015-11-17 20:28:07 +00009935 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009936 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9937 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9938 } else {
9939 if (Args.hasArg(options::OPT_municode))
9940 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9941 else
9942 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9943 }
9944 if (Args.hasArg(options::OPT_pg))
9945 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9946 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9947 }
9948
9949 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009950 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009951 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9952
9953 // TODO: Add ASan stuff here
9954
9955 // TODO: Add profile stuff here
9956
Douglas Katzman78b37b02015-11-17 20:28:07 +00009957 if (D.CCCIsCXX() &&
9958 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009959 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9960 !Args.hasArg(options::OPT_static);
9961 if (OnlyLibstdcxxStatic)
9962 CmdArgs.push_back("-Bstatic");
9963 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9964 if (OnlyLibstdcxxStatic)
9965 CmdArgs.push_back("-Bdynamic");
9966 }
9967
9968 if (!Args.hasArg(options::OPT_nostdlib)) {
9969 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9970 if (Args.hasArg(options::OPT_static))
9971 CmdArgs.push_back("--start-group");
9972
9973 if (Args.hasArg(options::OPT_fstack_protector) ||
9974 Args.hasArg(options::OPT_fstack_protector_strong) ||
9975 Args.hasArg(options::OPT_fstack_protector_all)) {
9976 CmdArgs.push_back("-lssp_nonshared");
9977 CmdArgs.push_back("-lssp");
9978 }
9979 if (Args.hasArg(options::OPT_fopenmp))
9980 CmdArgs.push_back("-lgomp");
9981
9982 AddLibGCC(Args, CmdArgs);
9983
9984 if (Args.hasArg(options::OPT_pg))
9985 CmdArgs.push_back("-lgmon");
9986
Yaron Kerenadce68e2015-07-06 18:52:19 +00009987 if (Args.hasArg(options::OPT_pthread))
9988 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009989
9990 // add system libraries
9991 if (Args.hasArg(options::OPT_mwindows)) {
9992 CmdArgs.push_back("-lgdi32");
9993 CmdArgs.push_back("-lcomdlg32");
9994 }
9995 CmdArgs.push_back("-ladvapi32");
9996 CmdArgs.push_back("-lshell32");
9997 CmdArgs.push_back("-luser32");
9998 CmdArgs.push_back("-lkernel32");
9999
10000 if (Args.hasArg(options::OPT_static))
10001 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010002 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010003 AddLibGCC(Args, CmdArgs);
10004 }
10005
10006 if (!Args.hasArg(options::OPT_nostartfiles)) {
10007 // Add crtfastmath.o if available and fast math is enabled.
10008 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10009
10010 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10011 }
10012 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010013 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010014 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010015}
10016
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010017/// XCore Tools
10018// We pass assemble and link construction to the xcc tool.
10019
Douglas Katzman95354292015-06-23 20:42:09 +000010020void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10021 const InputInfo &Output,
10022 const InputInfoList &Inputs,
10023 const ArgList &Args,
10024 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010025 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010026 ArgStringList CmdArgs;
10027
10028 CmdArgs.push_back("-o");
10029 CmdArgs.push_back(Output.getFilename());
10030
10031 CmdArgs.push_back("-c");
10032
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010033 if (Args.hasArg(options::OPT_v))
10034 CmdArgs.push_back("-v");
10035
Robert Lytton894d25c2014-05-02 09:33:25 +000010036 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10037 if (!A->getOption().matches(options::OPT_g0))
10038 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010039
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010040 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10041 false))
10042 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010043
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010044 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010045
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010046 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010047 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010048
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010049 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010050 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010051}
10052
Douglas Katzman95354292015-06-23 20:42:09 +000010053void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10054 const InputInfo &Output,
10055 const InputInfoList &Inputs,
10056 const ArgList &Args,
10057 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010058 ArgStringList CmdArgs;
10059
10060 if (Output.isFilename()) {
10061 CmdArgs.push_back("-o");
10062 CmdArgs.push_back(Output.getFilename());
10063 } else {
10064 assert(Output.isNothing() && "Invalid output.");
10065 }
10066
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010067 if (Args.hasArg(options::OPT_v))
10068 CmdArgs.push_back("-v");
10069
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010070 // Pass -fexceptions through to the linker if it was present.
10071 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10072 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010073 CmdArgs.push_back("-fexceptions");
10074
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010075 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10076
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010077 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010078 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010079}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010080
Douglas Katzman95354292015-06-23 20:42:09 +000010081void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10082 const InputInfo &Output,
10083 const InputInfoList &Inputs,
10084 const ArgList &Args,
10085 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010086 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010087 const auto &TC =
10088 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10089 ArgStringList CmdArgs;
10090 const char *Exec;
10091
10092 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010093 default:
10094 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010095 case llvm::Triple::arm:
10096 case llvm::Triple::thumb:
10097 break;
10098 case llvm::Triple::x86:
10099 CmdArgs.push_back("--32");
10100 break;
10101 case llvm::Triple::x86_64:
10102 CmdArgs.push_back("--64");
10103 break;
10104 }
10105
10106 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10107
10108 CmdArgs.push_back("-o");
10109 CmdArgs.push_back(Output.getFilename());
10110
10111 for (const auto &Input : Inputs)
10112 CmdArgs.push_back(Input.getFilename());
10113
10114 const std::string Assembler = TC.GetProgramPath("as");
10115 Exec = Args.MakeArgString(Assembler);
10116
Justin Bognerd3371d82015-07-17 03:35:54 +000010117 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010118}
10119
Douglas Katzman95354292015-06-23 20:42:09 +000010120void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10121 const InputInfo &Output,
10122 const InputInfoList &Inputs,
10123 const ArgList &Args,
10124 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010125 const auto &TC =
10126 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10127 const llvm::Triple &T = TC.getTriple();
10128 const Driver &D = TC.getDriver();
10129 SmallString<128> EntryPoint;
10130 ArgStringList CmdArgs;
10131 const char *Exec;
10132
10133 // Silence warning for "clang -g foo.o -o foo"
10134 Args.ClaimAllArgs(options::OPT_g_Group);
10135 // and "clang -emit-llvm foo.o -o foo"
10136 Args.ClaimAllArgs(options::OPT_emit_llvm);
10137 // and for "clang -w foo.o -o foo"
10138 Args.ClaimAllArgs(options::OPT_w);
10139 // Other warning options are already handled somewhere else.
10140
10141 if (!D.SysRoot.empty())
10142 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10143
10144 if (Args.hasArg(options::OPT_pie))
10145 CmdArgs.push_back("-pie");
10146 if (Args.hasArg(options::OPT_rdynamic))
10147 CmdArgs.push_back("-export-dynamic");
10148 if (Args.hasArg(options::OPT_s))
10149 CmdArgs.push_back("--strip-all");
10150
10151 CmdArgs.push_back("-m");
10152 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010153 default:
10154 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010155 case llvm::Triple::arm:
10156 case llvm::Triple::thumb:
10157 // FIXME: this is incorrect for WinCE
10158 CmdArgs.push_back("thumb2pe");
10159 break;
10160 case llvm::Triple::x86:
10161 CmdArgs.push_back("i386pe");
10162 EntryPoint.append("_");
10163 break;
10164 case llvm::Triple::x86_64:
10165 CmdArgs.push_back("i386pep");
10166 break;
10167 }
10168
10169 if (Args.hasArg(options::OPT_shared)) {
10170 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010171 default:
10172 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010173 case llvm::Triple::arm:
10174 case llvm::Triple::thumb:
10175 case llvm::Triple::x86_64:
10176 EntryPoint.append("_DllMainCRTStartup");
10177 break;
10178 case llvm::Triple::x86:
10179 EntryPoint.append("_DllMainCRTStartup@12");
10180 break;
10181 }
10182
10183 CmdArgs.push_back("-shared");
10184 CmdArgs.push_back("-Bdynamic");
10185
10186 CmdArgs.push_back("--enable-auto-image-base");
10187
10188 CmdArgs.push_back("--entry");
10189 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10190 } else {
10191 EntryPoint.append("mainCRTStartup");
10192
10193 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10194 : "-Bdynamic");
10195
Douglas Katzman78b37b02015-11-17 20:28:07 +000010196 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010197 CmdArgs.push_back("--entry");
10198 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10199 }
10200
10201 // FIXME: handle subsystem
10202 }
10203
10204 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010205 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010206
10207 CmdArgs.push_back("-o");
10208 CmdArgs.push_back(Output.getFilename());
10209
10210 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10211 SmallString<261> ImpLib(Output.getFilename());
10212 llvm::sys::path::replace_extension(ImpLib, ".lib");
10213
10214 CmdArgs.push_back("--out-implib");
10215 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10216 }
10217
Douglas Katzman78b37b02015-11-17 20:28:07 +000010218 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010219 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10220 const char *CRTBegin;
10221
10222 CRTBegin =
10223 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10224 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10225 }
10226
10227 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010228 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010229 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10230
10231 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10232 !Args.hasArg(options::OPT_nodefaultlibs)) {
10233 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10234 !Args.hasArg(options::OPT_static);
10235 if (StaticCXX)
10236 CmdArgs.push_back("-Bstatic");
10237 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10238 if (StaticCXX)
10239 CmdArgs.push_back("-Bdynamic");
10240 }
10241
10242 if (!Args.hasArg(options::OPT_nostdlib)) {
10243 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10244 // TODO handle /MT[d] /MD[d]
10245 CmdArgs.push_back("-lmsvcrt");
10246 AddRunTimeLibs(TC, D, CmdArgs, Args);
10247 }
10248 }
10249
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010250 if (TC.getSanitizerArgs().needsAsanRt()) {
10251 // TODO handle /MT[d] /MD[d]
10252 if (Args.hasArg(options::OPT_shared)) {
10253 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10254 } else {
10255 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10256 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10257 // Make sure the dynamic runtime thunk is not optimized out at link time
10258 // to ensure proper SEH handling.
10259 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10260 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10261 ? "___asan_seh_interceptor"
10262 : "__asan_seh_interceptor"));
10263 }
10264 }
10265
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010266 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010267
Justin Bognerd3371d82015-07-17 03:35:54 +000010268 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010269}
Douglas Katzman84a75642015-06-19 14:55:19 +000010270
Douglas Katzman95354292015-06-23 20:42:09 +000010271void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10272 const InputInfo &Output,
10273 const InputInfoList &Inputs,
10274 const ArgList &Args,
10275 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010276 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010277 assert(Inputs.size() == 1);
10278 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010279 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10280 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010281
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010282 if (JA.getKind() == Action::PreprocessJobClass) {
10283 Args.ClaimAllArgs();
10284 CmdArgs.push_back("-E");
10285 } else {
10286 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10287 CmdArgs.push_back("-S");
10288 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10289 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010290 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010291 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010292
Douglas Katzmanf6071112015-08-03 14:34:22 +000010293 // Append all -I, -iquote, -isystem paths, defines/undefines,
10294 // 'f' flags, optimize flags, and warning options.
10295 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010296 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010297 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010298 options::OPT_f_Group, options::OPT_f_clang_Group,
10299 options::OPT_g_Group, options::OPT_M_Group,
10300 options::OPT_O_Group, options::OPT_W_Group});
10301
10302 // If we're producing a dependency file, and assembly is the final action,
10303 // then the name of the target in the dependency file should be the '.o'
10304 // file, not the '.s' file produced by this step. For example, instead of
10305 // /tmp/mumble.s: mumble.c .../someheader.h
10306 // the filename on the lefthand side should be "mumble.o"
10307 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10308 C.getActions().size() == 1 &&
10309 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10310 Arg *A = Args.getLastArg(options::OPT_o);
10311 if (A) {
10312 CmdArgs.push_back("-MT");
10313 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10314 }
10315 }
10316
Douglas Katzman84a75642015-06-19 14:55:19 +000010317 CmdArgs.push_back(II.getFilename());
10318 CmdArgs.push_back("-o");
10319 CmdArgs.push_back(Output.getFilename());
10320
10321 std::string Exec =
10322 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010323 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10324 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010325}
10326
Douglas Katzman95354292015-06-23 20:42:09 +000010327void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10328 const InputInfo &Output,
10329 const InputInfoList &Inputs,
10330 const ArgList &Args,
10331 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010332 ArgStringList CmdArgs;
10333
10334 assert(Inputs.size() == 1);
10335 const InputInfo &II = Inputs[0];
10336 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10337 assert(Output.getType() == types::TY_Object);
10338
10339 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010340 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010341 CmdArgs.push_back("-noSPrefixing");
10342 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010343 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10344 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10345 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010346 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010347 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010348 }
10349 CmdArgs.push_back("-elf"); // Output format.
10350 CmdArgs.push_back(II.getFilename());
10351 CmdArgs.push_back(
10352 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10353
10354 std::string Exec =
10355 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010356 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10357 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010358}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010359
10360void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10361 const InputInfo &Output,
10362 const InputInfoList &Inputs,
10363 const ArgList &Args,
10364 const char *LinkingOutput) const {
10365 const auto &TC =
10366 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10367 const llvm::Triple &T = TC.getTriple();
10368 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010369 bool UseStartfiles =
10370 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010371 bool UseDefaultLibs =
10372 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010373
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010374 if (T.getArch() == llvm::Triple::sparc)
10375 CmdArgs.push_back("-EB");
10376 else // SHAVE assumes little-endian, and sparcel is expressly so.
10377 CmdArgs.push_back("-EL");
10378
10379 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10380 // but we never pass through a --sysroot option and various other bits.
10381 // For example, there are no sanitizers (yet) nor gold linker.
10382
10383 // Eat some arguments that may be present but have no effect.
10384 Args.ClaimAllArgs(options::OPT_g_Group);
10385 Args.ClaimAllArgs(options::OPT_w);
10386 Args.ClaimAllArgs(options::OPT_static_libgcc);
10387
10388 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10389 CmdArgs.push_back("-s");
10390
10391 CmdArgs.push_back("-o");
10392 CmdArgs.push_back(Output.getFilename());
10393
10394 if (UseStartfiles) {
10395 // If you want startfiles, it means you want the builtin crti and crtbegin,
10396 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010397 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10398 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010399 }
10400
10401 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10402 options::OPT_e, options::OPT_s, options::OPT_t,
10403 options::OPT_Z_Flag, options::OPT_r});
10404
Douglas Katzman674a3122015-11-18 16:24:46 +000010405 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010406
10407 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10408
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010409 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010410 if (C.getDriver().CCCIsCXX())
10411 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010412 if (T.getOS() == llvm::Triple::RTEMS) {
10413 CmdArgs.push_back("--start-group");
10414 CmdArgs.push_back("-lc");
10415 // You must provide your own "-L" option to enable finding these.
10416 CmdArgs.push_back("-lrtemscpu");
10417 CmdArgs.push_back("-lrtemsbsp");
10418 CmdArgs.push_back("--end-group");
10419 } else {
10420 CmdArgs.push_back("-lc");
10421 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010422 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010423 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010424 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010425 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10426 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010427 }
10428
10429 std::string Exec =
10430 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10431 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10432 CmdArgs, Inputs));
10433}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010434
10435void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10436 const InputInfo &Output,
10437 const InputInfoList &Inputs,
10438 const ArgList &Args,
10439 const char *LinkingOutput) const {
10440 claimNoWarnArgs(Args);
10441 ArgStringList CmdArgs;
10442
10443 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10444
10445 CmdArgs.push_back("-o");
10446 CmdArgs.push_back(Output.getFilename());
10447
10448 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10449 const InputInfo &Input = Inputs[0];
10450 assert(Input.isFilename() && "Invalid input.");
10451 CmdArgs.push_back(Input.getFilename());
10452
10453 const char *Exec =
10454 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10455 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10456}
10457
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010458static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10459 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10460 if (SanArgs.needsUbsanRt()) {
10461 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10462 }
10463 if (SanArgs.needsAsanRt()) {
10464 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10465 }
10466}
10467
10468static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10469 const JobAction &JA, const InputInfo &Output,
10470 const InputInfoList &Inputs,
10471 const ArgList &Args,
10472 const char *LinkingOutput) {
10473 const toolchains::FreeBSD &ToolChain =
10474 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10475 const Driver &D = ToolChain.getDriver();
10476 ArgStringList CmdArgs;
10477
10478 // Silence warning for "clang -g foo.o -o foo"
10479 Args.ClaimAllArgs(options::OPT_g_Group);
10480 // and "clang -emit-llvm foo.o -o foo"
10481 Args.ClaimAllArgs(options::OPT_emit_llvm);
10482 // and for "clang -w foo.o -o foo". Other warning options are already
10483 // handled somewhere else.
10484 Args.ClaimAllArgs(options::OPT_w);
10485
10486 if (!D.SysRoot.empty())
10487 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10488
10489 if (Args.hasArg(options::OPT_pie))
10490 CmdArgs.push_back("-pie");
10491
10492 if (Args.hasArg(options::OPT_rdynamic))
10493 CmdArgs.push_back("-export-dynamic");
10494 if (Args.hasArg(options::OPT_shared))
10495 CmdArgs.push_back("--oformat=so");
10496
10497 if (Output.isFilename()) {
10498 CmdArgs.push_back("-o");
10499 CmdArgs.push_back(Output.getFilename());
10500 } else {
10501 assert(Output.isNothing() && "Invalid output.");
10502 }
10503
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010504 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10505
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010506 Args.AddAllArgs(CmdArgs, options::OPT_L);
10507 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10508 Args.AddAllArgs(CmdArgs, options::OPT_e);
10509 Args.AddAllArgs(CmdArgs, options::OPT_s);
10510 Args.AddAllArgs(CmdArgs, options::OPT_t);
10511 Args.AddAllArgs(CmdArgs, options::OPT_r);
10512
10513 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10514 CmdArgs.push_back("--no-demangle");
10515
10516 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10517
10518 if (Args.hasArg(options::OPT_pthread)) {
10519 CmdArgs.push_back("-lpthread");
10520 }
10521
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010522 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10523
10524 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10525}
10526
10527static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10528 const JobAction &JA, const InputInfo &Output,
10529 const InputInfoList &Inputs,
10530 const ArgList &Args,
10531 const char *LinkingOutput) {
10532 const toolchains::FreeBSD &ToolChain =
10533 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10534 const Driver &D = ToolChain.getDriver();
10535 ArgStringList CmdArgs;
10536
10537 // Silence warning for "clang -g foo.o -o foo"
10538 Args.ClaimAllArgs(options::OPT_g_Group);
10539 // and "clang -emit-llvm foo.o -o foo"
10540 Args.ClaimAllArgs(options::OPT_emit_llvm);
10541 // and for "clang -w foo.o -o foo". Other warning options are already
10542 // handled somewhere else.
10543 Args.ClaimAllArgs(options::OPT_w);
10544
10545 if (!D.SysRoot.empty())
10546 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10547
10548 if (Args.hasArg(options::OPT_pie))
10549 CmdArgs.push_back("-pie");
10550
10551 if (Args.hasArg(options::OPT_static)) {
10552 CmdArgs.push_back("-Bstatic");
10553 } else {
10554 if (Args.hasArg(options::OPT_rdynamic))
10555 CmdArgs.push_back("-export-dynamic");
10556 CmdArgs.push_back("--eh-frame-hdr");
10557 if (Args.hasArg(options::OPT_shared)) {
10558 CmdArgs.push_back("-Bshareable");
10559 } else {
10560 CmdArgs.push_back("-dynamic-linker");
10561 CmdArgs.push_back("/libexec/ld-elf.so.1");
10562 }
10563 CmdArgs.push_back("--enable-new-dtags");
10564 }
10565
10566 if (Output.isFilename()) {
10567 CmdArgs.push_back("-o");
10568 CmdArgs.push_back(Output.getFilename());
10569 } else {
10570 assert(Output.isNothing() && "Invalid output.");
10571 }
10572
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010573 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10574
Douglas Katzman78b37b02015-11-17 20:28:07 +000010575 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010576 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010577 if (!Args.hasArg(options::OPT_shared)) {
10578 if (Args.hasArg(options::OPT_pg))
10579 crt1 = "gcrt1.o";
10580 else if (Args.hasArg(options::OPT_pie))
10581 crt1 = "Scrt1.o";
10582 else
10583 crt1 = "crt1.o";
10584 }
10585 if (crt1)
10586 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10587
10588 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10589
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010590 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010591 if (Args.hasArg(options::OPT_static))
10592 crtbegin = "crtbeginT.o";
10593 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10594 crtbegin = "crtbeginS.o";
10595 else
10596 crtbegin = "crtbegin.o";
10597
10598 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10599 }
10600
10601 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010602 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010603 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10604 Args.AddAllArgs(CmdArgs, options::OPT_e);
10605 Args.AddAllArgs(CmdArgs, options::OPT_s);
10606 Args.AddAllArgs(CmdArgs, options::OPT_t);
10607 Args.AddAllArgs(CmdArgs, options::OPT_r);
10608
10609 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10610 CmdArgs.push_back("--no-demangle");
10611
10612 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10613
Douglas Katzman78b37b02015-11-17 20:28:07 +000010614 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010615 // For PS4, we always want to pass libm, libstdc++ and libkernel
10616 // libraries for both C and C++ compilations.
10617 CmdArgs.push_back("-lkernel");
10618 if (D.CCCIsCXX()) {
10619 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10620 if (Args.hasArg(options::OPT_pg))
10621 CmdArgs.push_back("-lm_p");
10622 else
10623 CmdArgs.push_back("-lm");
10624 }
10625 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10626 // the default system libraries. Just mimic this for now.
10627 if (Args.hasArg(options::OPT_pg))
10628 CmdArgs.push_back("-lgcc_p");
10629 else
10630 CmdArgs.push_back("-lcompiler_rt");
10631 if (Args.hasArg(options::OPT_static)) {
10632 CmdArgs.push_back("-lstdc++");
10633 } else if (Args.hasArg(options::OPT_pg)) {
10634 CmdArgs.push_back("-lgcc_eh_p");
10635 } else {
10636 CmdArgs.push_back("--as-needed");
10637 CmdArgs.push_back("-lstdc++");
10638 CmdArgs.push_back("--no-as-needed");
10639 }
10640
10641 if (Args.hasArg(options::OPT_pthread)) {
10642 if (Args.hasArg(options::OPT_pg))
10643 CmdArgs.push_back("-lpthread_p");
10644 else
10645 CmdArgs.push_back("-lpthread");
10646 }
10647
10648 if (Args.hasArg(options::OPT_pg)) {
10649 if (Args.hasArg(options::OPT_shared))
10650 CmdArgs.push_back("-lc");
10651 else {
10652 if (Args.hasArg(options::OPT_static)) {
10653 CmdArgs.push_back("--start-group");
10654 CmdArgs.push_back("-lc_p");
10655 CmdArgs.push_back("-lpthread_p");
10656 CmdArgs.push_back("--end-group");
10657 } else {
10658 CmdArgs.push_back("-lc_p");
10659 }
10660 }
10661 CmdArgs.push_back("-lgcc_p");
10662 } else {
10663 if (Args.hasArg(options::OPT_static)) {
10664 CmdArgs.push_back("--start-group");
10665 CmdArgs.push_back("-lc");
10666 CmdArgs.push_back("-lpthread");
10667 CmdArgs.push_back("--end-group");
10668 } else {
10669 CmdArgs.push_back("-lc");
10670 }
10671 CmdArgs.push_back("-lcompiler_rt");
10672 }
10673
10674 if (Args.hasArg(options::OPT_static)) {
10675 CmdArgs.push_back("-lstdc++");
10676 } else if (Args.hasArg(options::OPT_pg)) {
10677 CmdArgs.push_back("-lgcc_eh_p");
10678 } else {
10679 CmdArgs.push_back("--as-needed");
10680 CmdArgs.push_back("-lstdc++");
10681 CmdArgs.push_back("--no-as-needed");
10682 }
10683 }
10684
Douglas Katzman78b37b02015-11-17 20:28:07 +000010685 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010686 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10687 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10688 else
10689 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10690 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10691 }
10692
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010693 const char *Exec =
10694#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010695 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010696#else
10697 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10698#endif
10699
10700 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10701}
10702
10703void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10704 const InputInfo &Output,
10705 const InputInfoList &Inputs,
10706 const ArgList &Args,
10707 const char *LinkingOutput) const {
10708 const toolchains::FreeBSD &ToolChain =
10709 static_cast<const toolchains::FreeBSD &>(getToolChain());
10710 const Driver &D = ToolChain.getDriver();
10711 bool PS4Linker;
10712 StringRef LinkerOptName;
10713 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10714 LinkerOptName = A->getValue();
10715 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10716 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10717 }
10718
10719 if (LinkerOptName == "gold")
10720 PS4Linker = false;
10721 else if (LinkerOptName == "ps4")
10722 PS4Linker = true;
10723 else
10724 PS4Linker = !Args.hasArg(options::OPT_shared);
10725
10726 if (PS4Linker)
10727 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10728 else
10729 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10730}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010731
10732void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10733 const InputInfo &Output,
10734 const InputInfoList &Inputs,
10735 const ArgList &Args,
10736 const char *LinkingOutput) const {
10737 const auto &TC =
10738 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010739 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010740
10741 std::vector<std::string> gpu_archs =
10742 Args.getAllArgValues(options::OPT_march_EQ);
10743 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10744 const std::string& gpu_arch = gpu_archs[0];
10745
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010746 ArgStringList CmdArgs;
10747 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010748 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10749 // ptxas does not accept -g option if optimization is enabled, so
10750 // we ignore the compiler's -O* options if we want debug info.
10751 CmdArgs.push_back("-g");
10752 CmdArgs.push_back("--dont-merge-basicblocks");
10753 CmdArgs.push_back("--return-at-end");
10754 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10755 // Map the -O we received to -O{0,1,2,3}.
10756 //
10757 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10758 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010759
Justin Lebar2836dcd2016-01-19 19:52:21 +000010760 // -O3 seems like the least-bad option when -Osomething is specified to
10761 // clang but it isn't handled below.
10762 StringRef OOpt = "3";
10763 if (A->getOption().matches(options::OPT_O4) ||
10764 A->getOption().matches(options::OPT_Ofast))
10765 OOpt = "3";
10766 else if (A->getOption().matches(options::OPT_O0))
10767 OOpt = "0";
10768 else if (A->getOption().matches(options::OPT_O)) {
10769 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10770 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10771 .Case("1", "1")
10772 .Case("2", "2")
10773 .Case("3", "3")
10774 .Case("s", "2")
10775 .Case("z", "2")
10776 .Default("2");
10777 }
10778 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10779 } else {
10780 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10781 // to no optimizations, but ptxas's default is -O3.
10782 CmdArgs.push_back("-O0");
10783 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010784
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010785 CmdArgs.push_back("--gpu-name");
10786 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10787 CmdArgs.push_back("--output-file");
10788 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10789 for (const auto& II : Inputs)
10790 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10791
10792 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10793 CmdArgs.push_back(Args.MakeArgString(A));
10794
10795 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10796 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10797}
10798
10799// All inputs to this linker must be from CudaDeviceActions, as we need to look
10800// at the Inputs' Actions in order to figure out which GPU architecture they
10801// correspond to.
10802void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10803 const InputInfo &Output,
10804 const InputInfoList &Inputs,
10805 const ArgList &Args,
10806 const char *LinkingOutput) const {
10807 const auto &TC =
10808 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010809 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010810
10811 ArgStringList CmdArgs;
10812 CmdArgs.push_back("--cuda");
10813 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10814 CmdArgs.push_back(Args.MakeArgString("--create"));
10815 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10816
10817 for (const auto& II : Inputs) {
10818 auto* A = cast<const CudaDeviceAction>(II.getAction());
10819 // We need to pass an Arch of the form "sm_XX" for cubin files and
10820 // "compute_XX" for ptx.
10821 const char *Arch = (II.getType() == types::TY_PP_Asm)
10822 ? A->getComputeArchName()
10823 : A->getGpuArchName();
10824 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10825 Arch + ",file=" + II.getFilename()));
10826 }
10827
10828 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10829 CmdArgs.push_back(Args.MakeArgString(A));
10830
10831 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10832 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10833}