blob: 7d69756647b0fb871b806a2587955c3abbcbddbd [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
419 if (getToolChain().getDriver().IsCLMode()) {
Junmo Parke19d6792016-03-17 06:41:27 +0000420 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000421 // include is compiled into foo.h, and everything after goes into
422 // the .obj file. /Yufoo.h means that all includes prior to and including
423 // foo.h are completely skipped and replaced with a use of the pch file
424 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
425 // just mean that the last one wins.) If /Yc and /Yu are both present
426 // and refer to the same file, /Yc wins.
427 // Note that OPT__SLASH_FI gets mapped to OPT_include.
428 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
429 // cl.exe seems to support both flags with different values, but that
430 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000431 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000432 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
433 if (PchIndex != -1) {
434 if (isa<PrecompileJobAction>(JA)) {
435 // When building the pch, skip all includes after the pch.
436 assert(YcIndex != -1 && PchIndex == YcIndex);
437 if (AI >= YcIndex)
438 continue;
439 } else {
440 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000441 if (AI < PchIndex) {
442 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000443 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000444 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000445 if (AI == PchIndex) {
446 A->claim();
447 CmdArgs.push_back("-include-pch");
448 CmdArgs.push_back(
449 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
450 continue;
451 }
452 }
453 }
454 } else if (A->getOption().matches(options::OPT_include)) {
455 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000456 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
457 RenderedImplicitInclude = true;
458
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000459 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000460 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000461
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000462 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000463 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000464 SmallString<128> P(A->getValue());
465 // We want the files to have a name like foo.h.pch. Add a dummy extension
466 // so that replace_extension does the right thing.
467 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000468 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000469 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000470 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000471 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000472 }
473
Douglas Gregor111af7d2009-04-18 00:34:01 +0000474 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000475 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000476 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000477 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000478 }
479
Douglas Gregor111af7d2009-04-18 00:34:01 +0000480 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000481 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000482 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000483 FoundPCH = UsePCH;
484 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000485 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000486 }
487
488 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000489 if (IsFirstImplicitInclude) {
490 A->claim();
491 if (UsePCH)
492 CmdArgs.push_back("-include-pch");
493 else
494 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000495 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000496 continue;
497 } else {
498 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000499 D.Diag(diag::warn_drv_pch_not_first_include) << P
500 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000501 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000502 }
503 }
504
505 // Not translated, render as usual.
506 A->claim();
507 A->render(Args, CmdArgs);
508 }
509
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000510 Args.AddAllArgs(CmdArgs,
511 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
512 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000513
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000514 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000515
516 // FIXME: There is a very unfortunate problem here, some troubled
517 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
518 // really support that we would have to parse and then translate
519 // those options. :(
520 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
521 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000522
523 // -I- is a deprecated GCC feature, reject it.
524 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000525 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000526
527 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
528 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000529 StringRef sysroot = C.getSysRoot();
530 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000531 if (!Args.hasArg(options::OPT_isysroot)) {
532 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000533 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000534 }
535 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000536
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000537 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000538 // FIXME: We should probably sink the logic for handling these from the
539 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000540 // CPATH - included following the user specified includes (but prior to
541 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000542 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000543 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000544 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000545 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000546 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000547 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000548 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000549 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000550 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000551
Artem Belevichfa11ab52015-11-17 22:28:46 +0000552 // Optional AuxToolChain indicates that we need to include headers
553 // for more than one target. If that's the case, add include paths
554 // from AuxToolChain right after include paths of the same kind for
555 // the current target.
556
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000557 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000558 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000559 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000560 if (AuxToolChain)
561 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
562 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000563
564 // Add system include arguments.
565 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000566 if (AuxToolChain)
567 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
568
569 // Add CUDA include arguments, if needed.
570 if (types::isCuda(Inputs[0].getType()))
571 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000572}
573
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000574// FIXME: Move to target hook.
575static bool isSignedCharDefault(const llvm::Triple &Triple) {
576 switch (Triple.getArch()) {
577 default:
578 return true;
579
Tim Northover9bb857a2013-01-31 12:13:10 +0000580 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000581 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000582 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000583 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000584 case llvm::Triple::thumb:
585 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000586 if (Triple.isOSDarwin() || Triple.isOSWindows())
587 return true;
588 return false;
589
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000590 case llvm::Triple::ppc:
591 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000592 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000593 return true;
594 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000595
David Majnemerdcecd932015-05-23 19:23:55 +0000596 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000597 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000598 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000599 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000600 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000601 }
602}
603
Robert Lytton0e076492013-08-13 09:43:10 +0000604static bool isNoCommonDefault(const llvm::Triple &Triple) {
605 switch (Triple.getArch()) {
606 default:
607 return false;
608
609 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000610 case llvm::Triple::wasm32:
611 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000612 return true;
613 }
614}
615
Renato Goline17c5802015-07-27 23:44:42 +0000616// ARM tools start.
617
618// Get SubArch (vN).
619static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
620 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000621 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000622}
623
624// True if M-profile.
625static bool isARMMProfile(const llvm::Triple &Triple) {
626 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000627 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000628 return Profile == llvm::ARM::PK_M;
629}
630
631// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000632static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
633 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000634 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
635 CPU = A->getValue();
636 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
637 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000638 if (!FromAs)
639 return;
640
641 for (const Arg *A :
642 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
643 StringRef Value = A->getValue();
644 if (Value.startswith("-mcpu="))
645 CPU = Value.substr(6);
646 if (Value.startswith("-march="))
647 Arch = Value.substr(7);
648 }
Renato Goline17c5802015-07-27 23:44:42 +0000649}
650
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000651// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000652// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000653static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000654 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000655 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000656 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
657 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000658 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
659}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000660
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000661// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000663 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000664 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000665 unsigned FPUID = llvm::ARM::parseFPU(FPU);
666 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000667 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
668}
669
Bradley Smithbbf5a002015-11-18 16:33:48 +0000670// Decode ARM features from string like +[no]featureA+[no]featureB+...
671static bool DecodeARMFeatures(const Driver &D, StringRef text,
672 std::vector<const char *> &Features) {
673 SmallVector<StringRef, 8> Split;
674 text.split(Split, StringRef("+"), -1, false);
675
676 for (StringRef Feature : Split) {
677 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
678 if (FeatureName)
679 Features.push_back(FeatureName);
680 else
681 return false;
682 }
683 return true;
684}
685
Renato Golin7c542b42015-07-27 23:44:45 +0000686// Check if -march is valid by checking if it can be canonicalised and parsed.
687// getARMArch is used here instead of just checking the -march value in order
688// to handle -march=native correctly.
689static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000690 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000691 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000692 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000693 std::pair<StringRef, StringRef> Split = ArchName.split("+");
694
Renato Goline17c5802015-07-27 23:44:42 +0000695 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000696 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
697 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000698 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000699}
700
Renato Golin7c542b42015-07-27 23:44:45 +0000701// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
702static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
703 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000704 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000705 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000706 std::pair<StringRef, StringRef> Split = CPUName.split("+");
707
Renato Goline17c5802015-07-27 23:44:42 +0000708 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000709 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
710 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000711 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000712}
713
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000714static bool useAAPCSForMachO(const llvm::Triple &T) {
715 // The backend is hardwired to assume AAPCS for M-class processors, ensure
716 // the frontend matches that.
717 return T.getEnvironment() == llvm::Triple::EABI ||
718 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
719}
720
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000721// Select the float ABI as determined by -msoft-float, -mhard-float, and
722// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000723arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
724 const Driver &D = TC.getDriver();
725 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000726 auto SubArch = getARMSubArchVersionNumber(Triple);
727 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000728 if (Arg *A =
729 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
730 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000731 if (A->getOption().matches(options::OPT_msoft_float)) {
732 ABI = FloatABI::Soft;
733 } else if (A->getOption().matches(options::OPT_mhard_float)) {
734 ABI = FloatABI::Hard;
735 } else {
736 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
737 .Case("soft", FloatABI::Soft)
738 .Case("softfp", FloatABI::SoftFP)
739 .Case("hard", FloatABI::Hard)
740 .Default(FloatABI::Invalid);
741 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000742 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000743 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000744 }
745 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000746
747 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
748 // "apcs-gnu".
749 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000750 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000751 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
752 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000753 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000754 }
755
756 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000757 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000758 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000759 case llvm::Triple::Darwin:
760 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000761 case llvm::Triple::IOS:
762 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000763 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000764 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000765 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000766 break;
767 }
Tim Northover756447a2015-10-30 16:30:36 +0000768 case llvm::Triple::WatchOS:
769 ABI = FloatABI::Hard;
770 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000771
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000772 // FIXME: this is invalid for WindowsCE
773 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000774 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000775 break;
776
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000777 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000778 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000779 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000780 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000781 break;
782 default:
783 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000784 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000785 break;
786 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000787 break;
788
Daniel Dunbar78485922009-09-10 23:00:09 +0000789 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000790 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000791 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000792 case llvm::Triple::EABIHF:
793 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000794 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000795 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000796 case llvm::Triple::EABI:
797 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000798 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000799 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000800 case llvm::Triple::Android:
801 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000802 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000803 default:
804 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000805 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000806 if (Triple.getOS() != llvm::Triple::UnknownOS ||
807 !Triple.isOSBinFormatMachO())
808 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000809 break;
810 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000811 }
812 }
813
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000814 assert(ABI != FloatABI::Invalid && "must select an ABI");
815 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000816}
817
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000818static void getARMTargetFeatures(const ToolChain &TC,
819 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000820 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000821 std::vector<const char *> &Features,
822 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000823 const Driver &D = TC.getDriver();
824
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000825 bool KernelOrKext =
826 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000827 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000828 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
829 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
830
Nico Weber6e0ebae2015-04-29 21:16:40 +0000831 if (!ForAS) {
832 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
833 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
834 // stripped out by the ARM target. We should probably pass this a new
835 // -target-option, which is handled by the -cc1/-cc1as invocation.
836 //
837 // FIXME2: For consistency, it would be ideal if we set up the target
838 // machine state the same when using the frontend or the assembler. We don't
839 // currently do that for the assembler, we pass the options directly to the
840 // backend and never even instantiate the frontend TargetInfo. If we did,
841 // and used its handleTargetFeatures hook, then we could ensure the
842 // assembler and the frontend behave the same.
843
844 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000845 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000846 Features.push_back("+soft-float");
847
848 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000849 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000850 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000851 } else {
852 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
853 // to the assembler correctly.
854 for (const Arg *A :
855 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
856 StringRef Value = A->getValue();
857 if (Value.startswith("-mfpu=")) {
858 WaFPU = A;
859 } else if (Value.startswith("-mcpu=")) {
860 WaCPU = A;
861 } else if (Value.startswith("-mhwdiv=")) {
862 WaHDiv = A;
863 } else if (Value.startswith("-march=")) {
864 WaArch = A;
865 }
866 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000867 }
868
Renato Golin7c542b42015-07-27 23:44:45 +0000869 // Check -march. ClangAs gives preference to -Wa,-march=.
870 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000871 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000872 if (WaArch) {
873 if (ArchArg)
874 D.Diag(clang::diag::warn_drv_unused_argument)
875 << ArchArg->getAsString(Args);
876 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000877 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000878 // FIXME: Set Arch.
879 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
880 } else if (ArchArg) {
881 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000882 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000883 }
884
Renato Golin7c542b42015-07-27 23:44:45 +0000885 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
886 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000887 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000888 if (WaCPU) {
889 if (CPUArg)
890 D.Diag(clang::diag::warn_drv_unused_argument)
891 << CPUArg->getAsString(Args);
892 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000893 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000894 } else if (CPUArg) {
895 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000896 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000897 }
John Brawna95c1a82015-05-08 12:52:18 +0000898
Renato Golin23459c62015-07-30 16:40:17 +0000899 // Add CPU features for generic CPUs
900 if (CPUName == "native") {
901 llvm::StringMap<bool> HostFeatures;
902 if (llvm::sys::getHostCPUFeatures(HostFeatures))
903 for (auto &F : HostFeatures)
904 Features.push_back(
905 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
906 }
907
908 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
909 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
910 if (WaFPU) {
911 if (FPUArg)
912 D.Diag(clang::diag::warn_drv_unused_argument)
913 << FPUArg->getAsString(Args);
914 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
915 Features);
916 } else if (FPUArg) {
917 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
918 }
919
920 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
921 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
922 if (WaHDiv) {
923 if (HDivArg)
924 D.Diag(clang::diag::warn_drv_unused_argument)
925 << HDivArg->getAsString(Args);
926 getARMHWDivFeatures(D, WaHDiv, Args,
927 StringRef(WaHDiv->getValue()).substr(8), Features);
928 } else if (HDivArg)
929 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
930
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000931 // Setting -msoft-float effectively disables NEON because of the GCC
932 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000933 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000934 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000935 // Also need to explicitly disable features which imply NEON.
936 Features.push_back("-crypto");
937 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000938
Eric Christopher269c2a22015-04-04 03:34:43 +0000939 // En/disable crc code generation.
940 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000941 if (A->getOption().matches(options::OPT_mcrc))
942 Features.push_back("+crc");
943 else
944 Features.push_back("-crc");
945 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000946
Akira Hatanakac2694822015-07-07 08:28:42 +0000947 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
948 // neither options are specified, see if we are compiling for kernel/kext and
949 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000950 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
951 options::OPT_mno_long_calls)) {
952 if (A->getOption().matches(options::OPT_mlong_calls))
953 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000954 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
955 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000956 Features.push_back("+long-calls");
957 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000958
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000959 // Kernel code has more strict alignment requirements.
960 if (KernelOrKext)
961 Features.push_back("+strict-align");
962 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
963 options::OPT_munaligned_access)) {
964 if (A->getOption().matches(options::OPT_munaligned_access)) {
965 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
966 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
967 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000968 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
969 // access either.
970 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
971 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000972 } else
973 Features.push_back("+strict-align");
974 } else {
975 // Assume pre-ARMv6 doesn't support unaligned accesses.
976 //
977 // ARMv6 may or may not support unaligned accesses depending on the
978 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
979 // Darwin and NetBSD targets support unaligned accesses, and others don't.
980 //
981 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
982 // which raises an alignment fault on unaligned accesses. Linux
983 // defaults this bit to 0 and handles it as a system-wide (not
984 // per-process) setting. It is therefore safe to assume that ARMv7+
985 // Linux targets support unaligned accesses. The same goes for NaCl.
986 //
987 // The above behavior is consistent with GCC.
988 int VersionNum = getARMSubArchVersionNumber(Triple);
989 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000990 if (VersionNum < 6 ||
991 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000992 Features.push_back("+strict-align");
993 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
994 if (VersionNum < 7)
995 Features.push_back("+strict-align");
996 } else
997 Features.push_back("+strict-align");
998 }
999
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001000 // llvm does not support reserving registers in general. There is support
1001 // for reserving r9 on ARM though (defined as a platform-specific register
1002 // in ARM EABI).
1003 if (Args.hasArg(options::OPT_ffixed_r9))
1004 Features.push_back("+reserve-r9");
1005
Dimitry Andric08107392016-01-06 07:42:18 +00001006 // The kext linker doesn't know how to deal with movw/movt.
1007 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001008 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001009}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001010
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001011void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1012 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001013 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001014 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001015 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001016 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001017 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001018 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001019 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001020 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001021 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001022 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001023 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001024 } else {
1025 ABIName = "apcs-gnu";
1026 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001027 } else if (Triple.isOSWindows()) {
1028 // FIXME: this is invalid for WindowsCE
1029 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001030 } else {
1031 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001032 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001033 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001034 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001035 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001036 ABIName = "aapcs-linux";
1037 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001038 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001039 case llvm::Triple::EABI:
1040 ABIName = "aapcs";
1041 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001042 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001043 if (Triple.getOS() == llvm::Triple::NetBSD)
1044 ABIName = "apcs-gnu";
1045 else
1046 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001047 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001048 }
1049 }
1050 CmdArgs.push_back("-target-abi");
1051 CmdArgs.push_back(ABIName);
1052
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001053 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001054 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001055 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001056 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001057 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001058 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001059 CmdArgs.push_back("-mfloat-abi");
1060 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001061 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001062 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001063 CmdArgs.push_back("-mfloat-abi");
1064 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001065 } else {
1066 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001067 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001068 CmdArgs.push_back("-mfloat-abi");
1069 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001070 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001071
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001072 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001073 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1074 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001075 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001076 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001077 CmdArgs.push_back("-arm-global-merge=false");
1078 else
1079 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001080 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001081
Bob Wilson9c8af452013-04-11 18:53:25 +00001082 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001083 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001084 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001085}
Renato Goline17c5802015-07-27 23:44:42 +00001086// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001087
Tim Northover573cbee2014-05-24 12:52:07 +00001088/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1089/// targeting.
1090static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001091 Arg *A;
1092 std::string CPU;
1093 // If we have -mtune or -mcpu, use that.
1094 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001095 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001096 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001097 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001098 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001099 }
1100
Kevin Qin110db6f2014-07-18 07:03:22 +00001101 // Handle CPU name is 'native'.
1102 if (CPU == "native")
1103 return llvm::sys::getHostCPUName();
1104 else if (CPU.size())
1105 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001106
James Molloy9b1586b2014-04-17 12:51:17 +00001107 // Make sure we pick "cyclone" if -arch is used.
1108 // FIXME: Should this be picked by checking the target triple instead?
1109 if (Args.getLastArg(options::OPT_arch))
1110 return "cyclone";
1111
1112 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001113}
1114
Tim Northover573cbee2014-05-24 12:52:07 +00001115void Clang::AddAArch64TargetArgs(const ArgList &Args,
1116 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001117 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1118 llvm::Triple Triple(TripleStr);
1119
1120 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1121 Args.hasArg(options::OPT_mkernel) ||
1122 Args.hasArg(options::OPT_fapple_kext))
1123 CmdArgs.push_back("-disable-red-zone");
1124
1125 if (!Args.hasFlag(options::OPT_mimplicit_float,
1126 options::OPT_mno_implicit_float, true))
1127 CmdArgs.push_back("-no-implicit-float");
1128
Craig Topper92fc2df2014-05-17 16:56:41 +00001129 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001130 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1131 ABIName = A->getValue();
1132 else if (Triple.isOSDarwin())
1133 ABIName = "darwinpcs";
1134 else
1135 ABIName = "aapcs";
1136
1137 CmdArgs.push_back("-target-abi");
1138 CmdArgs.push_back(ABIName);
1139
Bradley Smith9ff64332014-10-13 10:16:06 +00001140 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1141 options::OPT_mno_fix_cortex_a53_835769)) {
1142 CmdArgs.push_back("-backend-option");
1143 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1144 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1145 else
1146 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001147 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001148 // Enabled A53 errata (835769) workaround by default on android
1149 CmdArgs.push_back("-backend-option");
1150 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001151 }
1152
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001153 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001154 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1155 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001156 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001157 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001158 CmdArgs.push_back("-aarch64-global-merge=false");
1159 else
1160 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001161 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001162}
1163
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001164// Get CPU and ABI names. They are not independent
1165// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001166void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1167 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001168 const char *DefMips32CPU = "mips32r2";
1169 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001170
Daniel Sanders2bf13662014-07-10 14:40:57 +00001171 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1172 // default for mips64(el)?-img-linux-gnu.
1173 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1174 Triple.getEnvironment() == llvm::Triple::GNU) {
1175 DefMips32CPU = "mips32r6";
1176 DefMips64CPU = "mips64r6";
1177 }
Renato Golin7c542b42015-07-27 23:44:45 +00001178
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001179 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001180 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001181 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001182
Brad Smithba26f582015-01-06 02:53:17 +00001183 // MIPS3 is the default for mips64*-unknown-openbsd.
1184 if (Triple.getOS() == llvm::Triple::OpenBSD)
1185 DefMips64CPU = "mips3";
1186
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001187 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001188 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001189
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001190 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001191 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001192 // Convert a GNU style Mips ABI name to the name
1193 // accepted by LLVM Mips backend.
1194 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001195 .Case("32", "o32")
1196 .Case("64", "n64")
1197 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001198 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001199
1200 // Setup default CPU and ABI names.
1201 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001202 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001203 default:
1204 llvm_unreachable("Unexpected triple arch name");
1205 case llvm::Triple::mips:
1206 case llvm::Triple::mipsel:
1207 CPUName = DefMips32CPU;
1208 break;
1209 case llvm::Triple::mips64:
1210 case llvm::Triple::mips64el:
1211 CPUName = DefMips64CPU;
1212 break;
1213 }
1214 }
1215
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001216 if (ABIName.empty()) {
1217 // Deduce ABI name from the target triple.
1218 if (Triple.getArch() == llvm::Triple::mips ||
1219 Triple.getArch() == llvm::Triple::mipsel)
1220 ABIName = "o32";
1221 else
1222 ABIName = "n64";
1223 }
1224
1225 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001226 // Deduce CPU name from ABI name.
1227 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001228 .Cases("o32", "eabi", DefMips32CPU)
1229 .Cases("n32", "n64", DefMips64CPU)
1230 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001231 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001232
1233 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001234}
1235
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001236std::string mips::getMipsABILibSuffix(const ArgList &Args,
1237 const llvm::Triple &Triple) {
1238 StringRef CPUName, ABIName;
1239 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1240 return llvm::StringSwitch<std::string>(ABIName)
1241 .Case("o32", "")
1242 .Case("n32", "32")
1243 .Case("n64", "64");
1244}
1245
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001246// Convert ABI name to the GNU tools acceptable variant.
1247static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1248 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001249 .Case("o32", "32")
1250 .Case("n64", "64")
1251 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001252}
1253
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001254// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1255// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001256static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1257 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001258 if (Arg *A =
1259 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1260 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001261 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001262 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001263 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001264 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001265 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001266 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1267 .Case("soft", mips::FloatABI::Soft)
1268 .Case("hard", mips::FloatABI::Hard)
1269 .Default(mips::FloatABI::Invalid);
1270 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001271 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001272 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001273 }
1274 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001275 }
1276
1277 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001278 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001279 // Assume "hard", because it's a default value used by gcc.
1280 // When we start to recognize specific target MIPS processors,
1281 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001282 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001283 }
1284
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001285 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1286 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001287}
1288
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001289static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001290 std::vector<const char *> &Features,
1291 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001292 StringRef FeatureName) {
1293 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001294 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001295 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001296 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001297 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001298 }
1299}
1300
Daniel Sanders379d44b2014-07-16 11:52:23 +00001301static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1302 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001303 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001304 StringRef CPUName;
1305 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001306 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001307 ABIName = getGnuCompatibleMipsABIName(ABIName);
1308
Daniel Sandersfeb61302014-08-08 15:47:17 +00001309 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1310 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001311
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001312 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1313 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001314 // FIXME: Note, this is a hack. We need to pass the selected float
1315 // mode to the MipsTargetInfoBase to define appropriate macros there.
1316 // Now it is the only method.
1317 Features.push_back("+soft-float");
1318 }
1319
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001320 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001321 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001322 if (Val == "2008") {
1323 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1324 Features.push_back("+nan2008");
1325 else {
1326 Features.push_back("-nan2008");
1327 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1328 }
1329 } else if (Val == "legacy") {
1330 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1331 Features.push_back("-nan2008");
1332 else {
1333 Features.push_back("+nan2008");
1334 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1335 }
1336 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001337 D.Diag(diag::err_drv_unsupported_option_argument)
1338 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001339 }
1340
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001341 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1342 options::OPT_mdouble_float, "single-float");
1343 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1344 "mips16");
1345 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1346 options::OPT_mno_micromips, "micromips");
1347 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1348 "dsp");
1349 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1350 "dspr2");
1351 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1352 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001353
1354 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1355 // pass -mfpxx
1356 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1357 options::OPT_mfp64)) {
1358 if (A->getOption().matches(options::OPT_mfp32))
1359 Features.push_back(Args.MakeArgString("-fp64"));
1360 else if (A->getOption().matches(options::OPT_mfpxx)) {
1361 Features.push_back(Args.MakeArgString("+fpxx"));
1362 Features.push_back(Args.MakeArgString("+nooddspreg"));
1363 } else
1364 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001365 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001366 Features.push_back(Args.MakeArgString("+fpxx"));
1367 Features.push_back(Args.MakeArgString("+nooddspreg"));
1368 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001369
Daniel Sanders28e5d392014-07-10 10:39:51 +00001370 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1371 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001372}
1373
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001374void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001375 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001376 const Driver &D = getToolChain().getDriver();
1377 StringRef CPUName;
1378 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001379 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001380 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001381
1382 CmdArgs.push_back("-target-abi");
1383 CmdArgs.push_back(ABIName.data());
1384
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001385 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1386 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001387 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001388 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001389 CmdArgs.push_back("-mfloat-abi");
1390 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001391 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001392 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001393 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001394 CmdArgs.push_back("-mfloat-abi");
1395 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001396 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001397
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001398 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1399 if (A->getOption().matches(options::OPT_mxgot)) {
1400 CmdArgs.push_back("-mllvm");
1401 CmdArgs.push_back("-mxgot");
1402 }
1403 }
1404
Simon Atanasyanc580b322013-05-11 06:33:44 +00001405 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1406 options::OPT_mno_ldc1_sdc1)) {
1407 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1408 CmdArgs.push_back("-mllvm");
1409 CmdArgs.push_back("-mno-ldc1-sdc1");
1410 }
1411 }
1412
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001413 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1414 options::OPT_mno_check_zero_division)) {
1415 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1416 CmdArgs.push_back("-mllvm");
1417 CmdArgs.push_back("-mno-check-zero-division");
1418 }
1419 }
1420
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001421 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001422 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001423 CmdArgs.push_back("-mllvm");
1424 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1425 A->claim();
1426 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001427}
1428
Hal Finkel8eb59282012-06-11 22:35:19 +00001429/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1430static std::string getPPCTargetCPU(const ArgList &Args) {
1431 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001432 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001433
1434 if (CPUName == "native") {
1435 std::string CPU = llvm::sys::getHostCPUName();
1436 if (!CPU.empty() && CPU != "generic")
1437 return CPU;
1438 else
1439 return "";
1440 }
1441
1442 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001443 .Case("common", "generic")
1444 .Case("440", "440")
1445 .Case("440fp", "440")
1446 .Case("450", "450")
1447 .Case("601", "601")
1448 .Case("602", "602")
1449 .Case("603", "603")
1450 .Case("603e", "603e")
1451 .Case("603ev", "603ev")
1452 .Case("604", "604")
1453 .Case("604e", "604e")
1454 .Case("620", "620")
1455 .Case("630", "pwr3")
1456 .Case("G3", "g3")
1457 .Case("7400", "7400")
1458 .Case("G4", "g4")
1459 .Case("7450", "7450")
1460 .Case("G4+", "g4+")
1461 .Case("750", "750")
1462 .Case("970", "970")
1463 .Case("G5", "g5")
1464 .Case("a2", "a2")
1465 .Case("a2q", "a2q")
1466 .Case("e500mc", "e500mc")
1467 .Case("e5500", "e5500")
1468 .Case("power3", "pwr3")
1469 .Case("power4", "pwr4")
1470 .Case("power5", "pwr5")
1471 .Case("power5x", "pwr5x")
1472 .Case("power6", "pwr6")
1473 .Case("power6x", "pwr6x")
1474 .Case("power7", "pwr7")
1475 .Case("power8", "pwr8")
1476 .Case("pwr3", "pwr3")
1477 .Case("pwr4", "pwr4")
1478 .Case("pwr5", "pwr5")
1479 .Case("pwr5x", "pwr5x")
1480 .Case("pwr6", "pwr6")
1481 .Case("pwr6x", "pwr6x")
1482 .Case("pwr7", "pwr7")
1483 .Case("pwr8", "pwr8")
1484 .Case("powerpc", "ppc")
1485 .Case("powerpc64", "ppc64")
1486 .Case("powerpc64le", "ppc64le")
1487 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001488 }
1489
1490 return "";
1491}
1492
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001493static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1494 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001495 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001496 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001497
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001498 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1499 if (FloatABI == ppc::FloatABI::Soft &&
1500 !(Triple.getArch() == llvm::Triple::ppc64 ||
1501 Triple.getArch() == llvm::Triple::ppc64le))
1502 Features.push_back("+soft-float");
1503 else if (FloatABI == ppc::FloatABI::Soft &&
1504 (Triple.getArch() == llvm::Triple::ppc64 ||
1505 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001506 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001507 << "soft float is not supported for ppc64";
1508
Eric Christopher643bb6a2013-10-16 20:40:08 +00001509 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001510 AddTargetFeature(Args, Features, options::OPT_faltivec,
1511 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001512}
1513
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001514ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1515 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1516 if (Arg *A =
1517 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1518 options::OPT_mfloat_abi_EQ)) {
1519 if (A->getOption().matches(options::OPT_msoft_float))
1520 ABI = ppc::FloatABI::Soft;
1521 else if (A->getOption().matches(options::OPT_mhard_float))
1522 ABI = ppc::FloatABI::Hard;
1523 else {
1524 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1525 .Case("soft", ppc::FloatABI::Soft)
1526 .Case("hard", ppc::FloatABI::Hard)
1527 .Default(ppc::FloatABI::Invalid);
1528 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1529 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1530 ABI = ppc::FloatABI::Hard;
1531 }
1532 }
1533 }
1534
1535 // If unspecified, choose the default based on the platform.
1536 if (ABI == ppc::FloatABI::Invalid) {
1537 ABI = ppc::FloatABI::Hard;
1538 }
1539
1540 return ABI;
1541}
1542
Ulrich Weigand8afad612014-07-28 13:17:52 +00001543void Clang::AddPPCTargetArgs(const ArgList &Args,
1544 ArgStringList &CmdArgs) const {
1545 // Select the ABI to use.
1546 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001547 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001548 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001549 case llvm::Triple::ppc64: {
1550 // When targeting a processor that supports QPX, or if QPX is
1551 // specifically enabled, default to using the ABI that supports QPX (so
1552 // long as it is not specifically disabled).
1553 bool HasQPX = false;
1554 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1555 HasQPX = A->getValue() == StringRef("a2q");
1556 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1557 if (HasQPX) {
1558 ABIName = "elfv1-qpx";
1559 break;
1560 }
1561
Ulrich Weigand8afad612014-07-28 13:17:52 +00001562 ABIName = "elfv1";
1563 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001564 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001565 case llvm::Triple::ppc64le:
1566 ABIName = "elfv2";
1567 break;
1568 default:
1569 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001570 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001571
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001572 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1573 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1574 // the option if given as we don't have backend support for any targets
1575 // that don't use the altivec abi.
1576 if (StringRef(A->getValue()) != "altivec")
1577 ABIName = A->getValue();
1578
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001579 ppc::FloatABI FloatABI =
1580 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1581
1582 if (FloatABI == ppc::FloatABI::Soft) {
1583 // Floating point operations and argument passing are soft.
1584 CmdArgs.push_back("-msoft-float");
1585 CmdArgs.push_back("-mfloat-abi");
1586 CmdArgs.push_back("soft");
1587 } else {
1588 // Floating point operations and argument passing are hard.
1589 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1590 CmdArgs.push_back("-mfloat-abi");
1591 CmdArgs.push_back("hard");
1592 }
1593
Ulrich Weigand8afad612014-07-28 13:17:52 +00001594 if (ABIName) {
1595 CmdArgs.push_back("-target-abi");
1596 CmdArgs.push_back(ABIName);
1597 }
1598}
1599
1600bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1601 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1602 return A && (A->getValue() == StringRef(Value));
1603}
1604
Tom Stellard6674c702013-04-01 20:56:53 +00001605/// Get the (LLVM) name of the R600 gpu we are targeting.
1606static std::string getR600TargetGPU(const ArgList &Args) {
1607 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001608 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001609 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001610 .Cases("rv630", "rv635", "r600")
1611 .Cases("rv610", "rv620", "rs780", "rs880")
1612 .Case("rv740", "rv770")
1613 .Case("palm", "cedar")
1614 .Cases("sumo", "sumo2", "sumo")
1615 .Case("hemlock", "cypress")
1616 .Case("aruba", "cayman")
1617 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001618 }
1619 return "";
1620}
1621
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001622void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001623 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001624 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001625 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001626
James Y Knightb2406522015-06-15 20:51:24 +00001627 bool SoftFloatABI = false;
1628 if (Arg *A =
1629 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001630 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001631 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001632 }
1633
James Y Knightb2406522015-06-15 20:51:24 +00001634 // Only the hard-float ABI on Sparc is standardized, and it is the
1635 // default. GCC also supports a nonstandard soft-float ABI mode, and
1636 // perhaps LLVM should implement that, too. However, since llvm
1637 // currently does not support Sparc soft-float, at all, display an
1638 // error if it's requested.
1639 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001640 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1641 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001642 }
1643}
1644
Richard Sandiford4652d892013-07-19 16:51:51 +00001645static const char *getSystemZTargetCPU(const ArgList &Args) {
1646 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1647 return A->getValue();
1648 return "z10";
1649}
1650
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001651static void getSystemZTargetFeatures(const ArgList &Args,
1652 std::vector<const char *> &Features) {
1653 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001654 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001655 if (A->getOption().matches(options::OPT_mhtm))
1656 Features.push_back("+transactional-execution");
1657 else
1658 Features.push_back("-transactional-execution");
1659 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001660 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001661 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001662 if (A->getOption().matches(options::OPT_mvx))
1663 Features.push_back("+vector");
1664 else
1665 Features.push_back("-vector");
1666 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001667}
1668
Chandler Carruth953fb082013-01-13 11:46:33 +00001669static const char *getX86TargetCPU(const ArgList &Args,
1670 const llvm::Triple &Triple) {
1671 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001672 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001673 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001674 return "core-avx2";
1675
Chandler Carruth953fb082013-01-13 11:46:33 +00001676 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001677 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001678
1679 // FIXME: Reject attempts to use -march=native unless the target matches
1680 // the host.
1681 //
1682 // FIXME: We should also incorporate the detected target features for use
1683 // with -native.
1684 std::string CPU = llvm::sys::getHostCPUName();
1685 if (!CPU.empty() && CPU != "generic")
1686 return Args.MakeArgString(CPU);
1687 }
1688
Reid Kleckner3123eff2015-06-30 16:32:04 +00001689 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1690 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1691 StringRef Arch = A->getValue();
1692 const char *CPU;
1693 if (Triple.getArch() == llvm::Triple::x86) {
1694 CPU = llvm::StringSwitch<const char *>(Arch)
1695 .Case("IA32", "i386")
1696 .Case("SSE", "pentium3")
1697 .Case("SSE2", "pentium4")
1698 .Case("AVX", "sandybridge")
1699 .Case("AVX2", "haswell")
1700 .Default(nullptr);
1701 } else {
1702 CPU = llvm::StringSwitch<const char *>(Arch)
1703 .Case("AVX", "sandybridge")
1704 .Case("AVX2", "haswell")
1705 .Default(nullptr);
1706 }
1707 if (CPU)
1708 return CPU;
1709 }
1710
Chandler Carruth953fb082013-01-13 11:46:33 +00001711 // Select the default CPU if none was given (or detection failed).
1712
1713 if (Triple.getArch() != llvm::Triple::x86_64 &&
1714 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001715 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001716
1717 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1718
1719 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001720 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001721 if (Triple.getArchName() == "x86_64h")
1722 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001723 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001724 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001725
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001726 // Set up default CPU name for PS4 compilers.
1727 if (Triple.isPS4CPU())
1728 return "btver2";
1729
Alexey Bataev286d1b92014-01-31 04:07:13 +00001730 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001731 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001732 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001733
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001734 // Everything else goes to x86-64 in 64-bit mode.
1735 if (Is64Bit)
1736 return "x86-64";
1737
1738 switch (Triple.getOS()) {
1739 case llvm::Triple::FreeBSD:
1740 case llvm::Triple::NetBSD:
1741 case llvm::Triple::OpenBSD:
1742 return "i486";
1743 case llvm::Triple::Haiku:
1744 return "i586";
1745 case llvm::Triple::Bitrig:
1746 return "i686";
1747 default:
1748 // Fallback to p4.
1749 return "pentium4";
1750 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001751}
1752
Dan Gohmanc2853072015-09-03 22:51:53 +00001753/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1754static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1755 // If we have -mcpu=, use that.
1756 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1757 StringRef CPU = A->getValue();
1758
1759#ifdef __wasm__
1760 // Handle "native" by examining the host. "native" isn't meaningful when
1761 // cross compiling, so only support this when the host is also WebAssembly.
1762 if (CPU == "native")
1763 return llvm::sys::getHostCPUName();
1764#endif
1765
1766 return CPU;
1767 }
1768
1769 return "generic";
1770}
1771
Renato Golin7c542b42015-07-27 23:44:45 +00001772static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1773 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001774 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001775 default:
1776 return "";
1777
Amara Emerson703da2e2013-10-31 09:32:33 +00001778 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001779 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001780 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001781
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001782 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001783 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001784 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001785 case llvm::Triple::thumbeb: {
1786 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001787 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001788 return arm::getARMTargetCPU(MCPU, MArch, T);
1789 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001790 case llvm::Triple::mips:
1791 case llvm::Triple::mipsel:
1792 case llvm::Triple::mips64:
1793 case llvm::Triple::mips64el: {
1794 StringRef CPUName;
1795 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001796 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001797 return CPUName;
1798 }
1799
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001800 case llvm::Triple::nvptx:
1801 case llvm::Triple::nvptx64:
1802 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1803 return A->getValue();
1804 return "";
1805
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001806 case llvm::Triple::ppc:
1807 case llvm::Triple::ppc64:
1808 case llvm::Triple::ppc64le: {
1809 std::string TargetCPUName = getPPCTargetCPU(Args);
1810 // LLVM may default to generating code for the native CPU,
1811 // but, like gcc, we default to a more generic option for
1812 // each architecture. (except on Darwin)
1813 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1814 if (T.getArch() == llvm::Triple::ppc64)
1815 TargetCPUName = "ppc64";
1816 else if (T.getArch() == llvm::Triple::ppc64le)
1817 TargetCPUName = "ppc64le";
1818 else
1819 TargetCPUName = "ppc";
1820 }
1821 return TargetCPUName;
1822 }
1823
1824 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001825 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001826 case llvm::Triple::sparcv9:
1827 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001828 return A->getValue();
1829 return "";
1830
1831 case llvm::Triple::x86:
1832 case llvm::Triple::x86_64:
1833 return getX86TargetCPU(Args, T);
1834
1835 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001836 return "hexagon" +
1837 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001838
1839 case llvm::Triple::systemz:
1840 return getSystemZTargetCPU(Args);
1841
1842 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001843 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001844 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001845
1846 case llvm::Triple::wasm32:
1847 case llvm::Triple::wasm64:
1848 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001849 }
1850}
1851
Alp Tokerce365ca2013-12-02 12:43:03 +00001852static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001853 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001854 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1855 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1856 // forward.
1857 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001858 std::string Plugin =
1859 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001860 CmdArgs.push_back(Args.MakeArgString(Plugin));
1861
1862 // Try to pass driver level flags relevant to LTO code generation down to
1863 // the plugin.
1864
1865 // Handle flags for selecting CPU variants.
1866 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1867 if (!CPU.empty())
1868 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001869
James Molloyf97fdae2015-12-21 10:44:36 +00001870 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1871 StringRef OOpt;
1872 if (A->getOption().matches(options::OPT_O4) ||
1873 A->getOption().matches(options::OPT_Ofast))
1874 OOpt = "3";
1875 else if (A->getOption().matches(options::OPT_O))
1876 OOpt = A->getValue();
1877 else if (A->getOption().matches(options::OPT_O0))
1878 OOpt = "0";
1879 if (!OOpt.empty())
1880 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1881 }
1882
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001883 if (IsThinLTO)
1884 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001885
1886 // If an explicit debugger tuning argument appeared, pass it along.
1887 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1888 options::OPT_ggdbN_Group)) {
1889 if (A->getOption().matches(options::OPT_glldb))
1890 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1891 else if (A->getOption().matches(options::OPT_gsce))
1892 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1893 else
1894 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1895 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001896}
1897
Sanjay Patel2987c292015-06-11 14:53:41 +00001898/// This is a helper function for validating the optional refinement step
1899/// parameter in reciprocal argument strings. Return false if there is an error
1900/// parsing the refinement step. Otherwise, return true and set the Position
1901/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001902static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001903 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001904 const char RefinementStepToken = ':';
1905 Position = In.find(RefinementStepToken);
1906 if (Position != StringRef::npos) {
1907 StringRef Option = A.getOption().getName();
1908 StringRef RefStep = In.substr(Position + 1);
1909 // Allow exactly one numeric character for the additional refinement
1910 // step parameter. This is reasonable for all currently-supported
1911 // operations and architectures because we would expect that a larger value
1912 // of refinement steps would cause the estimate "optimization" to
1913 // under-perform the native operation. Also, if the estimate does not
1914 // converge quickly, it probably will not ever converge, so further
1915 // refinement steps will not produce a better answer.
1916 if (RefStep.size() != 1) {
1917 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1918 return false;
1919 }
1920 char RefStepChar = RefStep[0];
1921 if (RefStepChar < '0' || RefStepChar > '9') {
1922 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1923 return false;
1924 }
1925 }
1926 return true;
1927}
1928
1929/// The -mrecip flag requires processing of many optional parameters.
1930static void ParseMRecip(const Driver &D, const ArgList &Args,
1931 ArgStringList &OutStrings) {
1932 StringRef DisabledPrefixIn = "!";
1933 StringRef DisabledPrefixOut = "!";
1934 StringRef EnabledPrefixOut = "";
1935 StringRef Out = "-mrecip=";
1936
1937 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1938 if (!A)
1939 return;
1940
1941 unsigned NumOptions = A->getNumValues();
1942 if (NumOptions == 0) {
1943 // No option is the same as "all".
1944 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1945 return;
1946 }
1947
1948 // Pass through "all", "none", or "default" with an optional refinement step.
1949 if (NumOptions == 1) {
1950 StringRef Val = A->getValue(0);
1951 size_t RefStepLoc;
1952 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1953 return;
1954 StringRef ValBase = Val.slice(0, RefStepLoc);
1955 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1956 OutStrings.push_back(Args.MakeArgString(Out + Val));
1957 return;
1958 }
1959 }
1960
1961 // Each reciprocal type may be enabled or disabled individually.
1962 // Check each input value for validity, concatenate them all back together,
1963 // and pass through.
1964
1965 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001966 OptionStrings.insert(std::make_pair("divd", false));
1967 OptionStrings.insert(std::make_pair("divf", false));
1968 OptionStrings.insert(std::make_pair("vec-divd", false));
1969 OptionStrings.insert(std::make_pair("vec-divf", false));
1970 OptionStrings.insert(std::make_pair("sqrtd", false));
1971 OptionStrings.insert(std::make_pair("sqrtf", false));
1972 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1973 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001974
1975 for (unsigned i = 0; i != NumOptions; ++i) {
1976 StringRef Val = A->getValue(i);
1977
1978 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1979 // Ignore the disablement token for string matching.
1980 if (IsDisabled)
1981 Val = Val.substr(1);
1982
1983 size_t RefStep;
1984 if (!getRefinementStep(Val, D, *A, RefStep))
1985 return;
1986
1987 StringRef ValBase = Val.slice(0, RefStep);
1988 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1989 if (OptionIter == OptionStrings.end()) {
1990 // Try again specifying float suffix.
1991 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1992 if (OptionIter == OptionStrings.end()) {
1993 // The input name did not match any known option string.
1994 D.Diag(diag::err_drv_unknown_argument) << Val;
1995 return;
1996 }
1997 // The option was specified without a float or double suffix.
1998 // Make sure that the double entry was not already specified.
1999 // The float entry will be checked below.
2000 if (OptionStrings[ValBase.str() + 'd']) {
2001 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2002 return;
2003 }
2004 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002005
Sanjay Patel2987c292015-06-11 14:53:41 +00002006 if (OptionIter->second == true) {
2007 // Duplicate option specified.
2008 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2009 return;
2010 }
2011
2012 // Mark the matched option as found. Do not allow duplicate specifiers.
2013 OptionIter->second = true;
2014
2015 // If the precision was not specified, also mark the double entry as found.
2016 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2017 OptionStrings[ValBase.str() + 'd'] = true;
2018
2019 // Build the output string.
2020 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2021 Out = Args.MakeArgString(Out + Prefix + Val);
2022 if (i != NumOptions - 1)
2023 Out = Args.MakeArgString(Out + ",");
2024 }
2025
2026 OutStrings.push_back(Args.MakeArgString(Out));
2027}
2028
Eric Christopherc54920a2015-03-23 19:26:05 +00002029static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002030 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002031 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002032 // If -march=native, autodetect the feature list.
2033 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2034 if (StringRef(A->getValue()) == "native") {
2035 llvm::StringMap<bool> HostFeatures;
2036 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2037 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002038 Features.push_back(
2039 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002040 }
2041 }
2042
Jim Grosbach82eee262013-11-16 00:53:35 +00002043 if (Triple.getArchName() == "x86_64h") {
2044 // x86_64h implies quite a few of the more modern subtarget features
2045 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2046 Features.push_back("-rdrnd");
2047 Features.push_back("-aes");
2048 Features.push_back("-pclmul");
2049 Features.push_back("-rtm");
2050 Features.push_back("-hle");
2051 Features.push_back("-fsgsbase");
2052 }
2053
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002054 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002055 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002056 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002057 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002058 Features.push_back("+sse4.2");
2059 Features.push_back("+popcnt");
2060 } else
2061 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002062 }
2063
Eric Christopherc54920a2015-03-23 19:26:05 +00002064 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002065 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2066 StringRef Arch = A->getValue();
2067 bool ArchUsed = false;
2068 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002069 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002070 if (Arch == "AVX" || Arch == "AVX2") {
2071 ArchUsed = true;
2072 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2073 }
2074 }
2075 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002076 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002077 if (Arch == "IA32") {
2078 ArchUsed = true;
2079 } else if (Arch == "SSE" || Arch == "SSE2") {
2080 ArchUsed = true;
2081 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2082 }
2083 }
2084 if (!ArchUsed)
2085 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2086 }
2087
Jim Grosbach82eee262013-11-16 00:53:35 +00002088 // Now add any that the user explicitly requested on the command line,
2089 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002090 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002091}
2092
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002093void Clang::AddX86TargetArgs(const ArgList &Args,
2094 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002095 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002096 Args.hasArg(options::OPT_mkernel) ||
2097 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002098 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002099
Bob Wilson2616e2e2013-02-10 16:01:41 +00002100 // Default to avoid implicit floating-point for kernel/kext code, but allow
2101 // that to be overridden with -mno-soft-float.
2102 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2103 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002104 if (Arg *A = Args.getLastArg(
2105 options::OPT_msoft_float, options::OPT_mno_soft_float,
2106 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002107 const Option &O = A->getOption();
2108 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2109 O.matches(options::OPT_msoft_float));
2110 }
2111 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002112 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002113
2114 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2115 StringRef Value = A->getValue();
2116 if (Value == "intel" || Value == "att") {
2117 CmdArgs.push_back("-mllvm");
2118 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2119 } else {
2120 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2121 << A->getOption().getName() << Value;
2122 }
2123 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002124}
2125
Tony Linthicum76329bf2011-12-12 21:14:55 +00002126void Clang::AddHexagonTargetArgs(const ArgList &Args,
2127 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002128 CmdArgs.push_back("-mqdsp6-compat");
2129 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002130
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002131 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2132 std::string N = llvm::utostr(G.getValue());
2133 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002134 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002135 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002136 }
2137
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002138 if (!Args.hasArg(options::OPT_fno_short_enums))
2139 CmdArgs.push_back("-fshort-enums");
2140 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002141 CmdArgs.push_back("-mllvm");
2142 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002143 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002144 CmdArgs.push_back("-mllvm");
2145 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002146}
2147
Dan Gohmane3d71e12016-01-07 01:00:21 +00002148void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2149 ArgStringList &CmdArgs) const {
2150 // Default to "hidden" visibility.
2151 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2152 options::OPT_fvisibility_ms_compat)) {
2153 CmdArgs.push_back("-fvisibility");
2154 CmdArgs.push_back("hidden");
2155 }
2156}
2157
Kevin Qin110db6f2014-07-18 07:03:22 +00002158// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002159static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002160 std::vector<const char *> &Features) {
2161 SmallVector<StringRef, 8> Split;
2162 text.split(Split, StringRef("+"), -1, false);
2163
Benjamin Kramer72e64312015-09-24 14:48:49 +00002164 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002165 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002166 .Case("fp", "+fp-armv8")
2167 .Case("simd", "+neon")
2168 .Case("crc", "+crc")
2169 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002170 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002171 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002172 .Case("nofp", "-fp-armv8")
2173 .Case("nosimd", "-neon")
2174 .Case("nocrc", "-crc")
2175 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002176 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002177 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002178 .Default(nullptr);
2179 if (result)
2180 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002181 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002182 D.Diag(diag::err_drv_no_neon_modifier);
2183 else
2184 return false;
2185 }
2186 return true;
2187}
2188
2189// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2190// decode CPU and feature.
2191static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2192 std::vector<const char *> &Features) {
2193 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2194 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002195 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002196 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2197 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002198 Features.push_back("+neon");
2199 Features.push_back("+crc");
2200 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002201 } else if (CPU == "cyclone") {
2202 Features.push_back("+neon");
2203 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002204 } else if (CPU == "generic") {
2205 Features.push_back("+neon");
2206 } else {
2207 return false;
2208 }
2209
2210 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2211 return false;
2212
2213 return true;
2214}
2215
2216static bool
2217getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2218 const ArgList &Args,
2219 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002220 std::string MarchLowerCase = March.lower();
2221 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002222
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002223 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002224 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002225 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002226 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002227 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2228 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002229 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002230 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002231 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002232
2233 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2234 return false;
2235
2236 return true;
2237}
2238
2239static bool
2240getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2241 const ArgList &Args,
2242 std::vector<const char *> &Features) {
2243 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002244 std::string McpuLowerCase = Mcpu.lower();
2245 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002246 return false;
2247
2248 return true;
2249}
2250
2251static bool
2252getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2253 const ArgList &Args,
2254 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002255 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002256 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002257 if (MtuneLowerCase == "native")
2258 MtuneLowerCase = llvm::sys::getHostCPUName();
2259 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002260 Features.push_back("+zcm");
2261 Features.push_back("+zcz");
2262 }
2263 return true;
2264}
2265
2266static bool
2267getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2268 const ArgList &Args,
2269 std::vector<const char *> &Features) {
2270 StringRef CPU;
2271 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002272 std::string McpuLowerCase = Mcpu.lower();
2273 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002274 return false;
2275
2276 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2277}
2278
Justin Bognerf9052562015-11-13 23:07:31 +00002279static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002280 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002281 Arg *A;
2282 bool success = true;
2283 // Enable NEON by default.
2284 Features.push_back("+neon");
2285 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2286 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2287 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2288 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002289 else if (Args.hasArg(options::OPT_arch))
2290 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2291 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002292
2293 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2294 success =
2295 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2296 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2297 success =
2298 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002299 else if (Args.hasArg(options::OPT_arch))
2300 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2301 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002302
2303 if (!success)
2304 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002305
2306 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2307 Features.push_back("-fp-armv8");
2308 Features.push_back("-crypto");
2309 Features.push_back("-neon");
2310 }
Bradley Smith418c5932014-05-02 15:17:51 +00002311
2312 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002313 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002314 if (A->getOption().matches(options::OPT_mcrc))
2315 Features.push_back("+crc");
2316 else
2317 Features.push_back("-crc");
2318 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002319
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002320 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2321 options::OPT_munaligned_access))
2322 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2323 Features.push_back("+strict-align");
2324
Justin Bognerf9052562015-11-13 23:07:31 +00002325 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002326 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002327}
2328
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002329static void getHexagonTargetFeatures(const ArgList &Args,
2330 std::vector<const char *> &Features) {
2331 bool HasHVX = false, HasHVXD = false;
2332
Eric Christopher49062a52015-12-22 03:12:34 +00002333 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2334 // doing dependent option handling here rather than in initFeatureMap or a
2335 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002336 for (auto &A : Args) {
2337 auto &Opt = A->getOption();
2338 if (Opt.matches(options::OPT_mhexagon_hvx))
2339 HasHVX = true;
2340 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2341 HasHVXD = HasHVX = false;
2342 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2343 HasHVXD = HasHVX = true;
2344 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2345 HasHVXD = false;
2346 else
2347 continue;
2348 A->claim();
2349 }
2350
2351 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2352 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2353}
2354
Dan Gohmanc2853072015-09-03 22:51:53 +00002355static void getWebAssemblyTargetFeatures(const ArgList &Args,
2356 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002357 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002358}
2359
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002360static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002361 const ArgList &Args, ArgStringList &CmdArgs,
2362 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002363 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002364 std::vector<const char *> Features;
2365 switch (Triple.getArch()) {
2366 default:
2367 break;
2368 case llvm::Triple::mips:
2369 case llvm::Triple::mipsel:
2370 case llvm::Triple::mips64:
2371 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002372 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002373 break;
2374
2375 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002376 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002377 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002378 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002379 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002380 break;
2381
2382 case llvm::Triple::ppc:
2383 case llvm::Triple::ppc64:
2384 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002385 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002386 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002387 case llvm::Triple::systemz:
2388 getSystemZTargetFeatures(Args, Features);
2389 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002390 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002391 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002392 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002393 break;
2394 case llvm::Triple::x86:
2395 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002396 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002397 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002398 case llvm::Triple::hexagon:
2399 getHexagonTargetFeatures(Args, Features);
2400 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002401 case llvm::Triple::wasm32:
2402 case llvm::Triple::wasm64:
2403 getWebAssemblyTargetFeatures(Args, Features);
2404 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002405 }
Rafael Espindola43964802013-08-21 17:34:32 +00002406
2407 // Find the last of each feature.
2408 llvm::StringMap<unsigned> LastOpt;
2409 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2410 const char *Name = Features[I];
2411 assert(Name[0] == '-' || Name[0] == '+');
2412 LastOpt[Name + 1] = I;
2413 }
2414
2415 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2416 // If this feature was overridden, ignore it.
2417 const char *Name = Features[I];
2418 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2419 assert(LastI != LastOpt.end());
2420 unsigned Last = LastI->second;
2421 if (Last != I)
2422 continue;
2423
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002424 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002425 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002426 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002427}
2428
David Majnemerae394812014-12-09 00:12:30 +00002429static bool
2430shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2431 const llvm::Triple &Triple) {
2432 // We use the zero-cost exception tables for Objective-C if the non-fragile
2433 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2434 // later.
2435 if (runtime.isNonFragile())
2436 return true;
2437
2438 if (!Triple.isMacOSX())
2439 return false;
2440
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002441 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002442 (Triple.getArch() == llvm::Triple::x86_64 ||
2443 Triple.getArch() == llvm::Triple::arm));
2444}
2445
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002446/// Adds exception related arguments to the driver command arguments. There's a
2447/// master flag, -fexceptions and also language specific flags to enable/disable
2448/// C++ and Objective-C exceptions. This makes it possible to for example
2449/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002450static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002451 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002452 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002453 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002454 const Driver &D = TC.getDriver();
2455 const llvm::Triple &Triple = TC.getTriple();
2456
Chad Rosier4fab82c2012-03-26 22:04:46 +00002457 if (KernelOrKext) {
2458 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2459 // arguments now to avoid warnings about unused arguments.
2460 Args.ClaimAllArgs(options::OPT_fexceptions);
2461 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2462 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2463 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2464 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2465 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002466 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002467 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002468
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002469 // See if the user explicitly enabled exceptions.
2470 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2471 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002472
David Majnemerae394812014-12-09 00:12:30 +00002473 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2474 // is not necessarily sensible, but follows GCC.
2475 if (types::isObjC(InputType) &&
2476 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002477 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002478 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002479
David Majnemerae394812014-12-09 00:12:30 +00002480 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002481 }
2482
2483 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002484 // Disable C++ EH by default on XCore and PS4.
2485 bool CXXExceptionsEnabled =
2486 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002487 Arg *ExceptionArg = Args.getLastArg(
2488 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2489 options::OPT_fexceptions, options::OPT_fno_exceptions);
2490 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002491 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002492 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2493 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002494
2495 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002496 if (Triple.isPS4CPU()) {
2497 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2498 assert(ExceptionArg &&
2499 "On the PS4 exceptions should only be enabled if passing "
2500 "an argument");
2501 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2502 const Arg *RTTIArg = TC.getRTTIArg();
2503 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2504 D.Diag(diag::err_drv_argument_not_allowed_with)
2505 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2506 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2507 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2508 } else
2509 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2510
Anders Carlssone96ab552011-02-28 02:27:16 +00002511 CmdArgs.push_back("-fcxx-exceptions");
2512
David Majnemer8de68642014-12-05 08:11:58 +00002513 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002514 }
2515 }
2516
David Majnemer8de68642014-12-05 08:11:58 +00002517 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002518 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002519}
2520
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002521static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002522 bool Default = true;
2523 if (TC.getTriple().isOSDarwin()) {
2524 // The native darwin assembler doesn't support the linker_option directives,
2525 // so we disable them if we think the .s file will be passed to it.
2526 Default = TC.useIntegratedAs();
2527 }
2528 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2529 Default);
2530}
2531
Ted Kremenek62093662013-03-12 17:02:12 +00002532static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2533 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002534 bool UseDwarfDirectory =
2535 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2536 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002537 return !UseDwarfDirectory;
2538}
2539
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002540/// \brief Check whether the given input tree contains any compilation actions.
2541static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002542 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002543 return true;
2544
Nico Weber5a459f82016-02-23 19:30:43 +00002545 for (const auto &AI : A->inputs())
2546 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002547 return true;
2548
2549 return false;
2550}
2551
2552/// \brief Check if -relax-all should be passed to the internal assembler.
2553/// This is done by default when compiling non-assembler source with -O0.
2554static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2555 bool RelaxDefault = true;
2556
2557 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2558 RelaxDefault = A->getOption().matches(options::OPT_O0);
2559
2560 if (RelaxDefault) {
2561 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002562 for (const auto &Act : C.getActions()) {
2563 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002564 RelaxDefault = true;
2565 break;
2566 }
2567 }
2568 }
2569
2570 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002571 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002572}
2573
Paul Robinson0334a042015-12-19 19:41:48 +00002574// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2575// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002576static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002577 assert(A.getOption().matches(options::OPT_gN_Group) &&
2578 "Not a -g option that specifies a debug-info level");
2579 if (A.getOption().matches(options::OPT_g0) ||
2580 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002581 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002582 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2583 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002584 return codegenoptions::DebugLineTablesOnly;
2585 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002586}
2587
Douglas Katzman3459ce22015-10-08 04:24:12 +00002588// Extract the integer N from a string spelled "-dwarf-N", returning 0
2589// on mismatch. The StringRef input (rather than an Arg) allows
2590// for use by the "-Xassembler" option parser.
2591static unsigned DwarfVersionNum(StringRef ArgValue) {
2592 return llvm::StringSwitch<unsigned>(ArgValue)
2593 .Case("-gdwarf-2", 2)
2594 .Case("-gdwarf-3", 3)
2595 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002596 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002597 .Default(0);
2598}
2599
2600static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002601 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002602 unsigned DwarfVersion,
2603 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002604 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002605 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002606 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2607 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002608 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002609 CmdArgs.push_back("-debug-info-kind=limited");
2610 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002611 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002612 CmdArgs.push_back("-debug-info-kind=standalone");
2613 break;
2614 default:
2615 break;
2616 }
2617 if (DwarfVersion > 0)
2618 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002619 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002620 switch (DebuggerTuning) {
2621 case llvm::DebuggerKind::GDB:
2622 CmdArgs.push_back("-debugger-tuning=gdb");
2623 break;
2624 case llvm::DebuggerKind::LLDB:
2625 CmdArgs.push_back("-debugger-tuning=lldb");
2626 break;
2627 case llvm::DebuggerKind::SCE:
2628 CmdArgs.push_back("-debugger-tuning=sce");
2629 break;
2630 default:
2631 break;
2632 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002633}
2634
David Blaikie9260ed62013-07-25 21:19:01 +00002635static void CollectArgsForIntegratedAssembler(Compilation &C,
2636 const ArgList &Args,
2637 ArgStringList &CmdArgs,
2638 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002639 if (UseRelaxAll(C, Args))
2640 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002641
David Majnemer2b9349d2015-12-21 22:09:34 +00002642 // Only default to -mincremental-linker-compatible if we think we are
2643 // targeting the MSVC linker.
2644 bool DefaultIncrementalLinkerCompatible =
2645 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2646 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2647 options::OPT_mno_incremental_linker_compatible,
2648 DefaultIncrementalLinkerCompatible))
2649 CmdArgs.push_back("-mincremental-linker-compatible");
2650
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002651 // When passing -I arguments to the assembler we sometimes need to
2652 // unconditionally take the next argument. For example, when parsing
2653 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2654 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2655 // arg after parsing the '-I' arg.
2656 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002657
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002658 // When using an integrated assembler, translate -Wa, and -Xassembler
2659 // options.
2660 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002661 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002662 for (const Arg *A :
2663 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2664 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002665
Benjamin Kramer72e64312015-09-24 14:48:49 +00002666 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002667 if (TakeNextArg) {
2668 CmdArgs.push_back(Value.data());
2669 TakeNextArg = false;
2670 continue;
2671 }
David Blaikie9260ed62013-07-25 21:19:01 +00002672
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002673 switch (C.getDefaultToolChain().getArch()) {
2674 default:
2675 break;
2676 case llvm::Triple::mips:
2677 case llvm::Triple::mipsel:
2678 case llvm::Triple::mips64:
2679 case llvm::Triple::mips64el:
2680 if (Value == "--trap") {
2681 CmdArgs.push_back("-target-feature");
2682 CmdArgs.push_back("+use-tcc-in-div");
2683 continue;
2684 }
2685 if (Value == "--break") {
2686 CmdArgs.push_back("-target-feature");
2687 CmdArgs.push_back("-use-tcc-in-div");
2688 continue;
2689 }
2690 if (Value.startswith("-msoft-float")) {
2691 CmdArgs.push_back("-target-feature");
2692 CmdArgs.push_back("+soft-float");
2693 continue;
2694 }
2695 if (Value.startswith("-mhard-float")) {
2696 CmdArgs.push_back("-target-feature");
2697 CmdArgs.push_back("-soft-float");
2698 continue;
2699 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002700
2701 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2702 .Case("-mips1", "+mips1")
2703 .Case("-mips2", "+mips2")
2704 .Case("-mips3", "+mips3")
2705 .Case("-mips4", "+mips4")
2706 .Case("-mips5", "+mips5")
2707 .Case("-mips32", "+mips32")
2708 .Case("-mips32r2", "+mips32r2")
2709 .Case("-mips32r3", "+mips32r3")
2710 .Case("-mips32r5", "+mips32r5")
2711 .Case("-mips32r6", "+mips32r6")
2712 .Case("-mips64", "+mips64")
2713 .Case("-mips64r2", "+mips64r2")
2714 .Case("-mips64r3", "+mips64r3")
2715 .Case("-mips64r5", "+mips64r5")
2716 .Case("-mips64r6", "+mips64r6")
2717 .Default(nullptr);
2718 if (MipsTargetFeature)
2719 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002720 }
2721
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002722 if (Value == "-force_cpusubtype_ALL") {
2723 // Do nothing, this is the default and we don't support anything else.
2724 } else if (Value == "-L") {
2725 CmdArgs.push_back("-msave-temp-labels");
2726 } else if (Value == "--fatal-warnings") {
2727 CmdArgs.push_back("-massembler-fatal-warnings");
2728 } else if (Value == "--noexecstack") {
2729 CmdArgs.push_back("-mnoexecstack");
2730 } else if (Value == "-compress-debug-sections" ||
2731 Value == "--compress-debug-sections") {
2732 CompressDebugSections = true;
2733 } else if (Value == "-nocompress-debug-sections" ||
2734 Value == "--nocompress-debug-sections") {
2735 CompressDebugSections = false;
2736 } else if (Value.startswith("-I")) {
2737 CmdArgs.push_back(Value.data());
2738 // We need to consume the next argument if the current arg is a plain
2739 // -I. The next arg will be the include directory.
2740 if (Value == "-I")
2741 TakeNextArg = true;
2742 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002743 // "-gdwarf-N" options are not cc1as options.
2744 unsigned DwarfVersion = DwarfVersionNum(Value);
2745 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2746 CmdArgs.push_back(Value.data());
2747 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002748 RenderDebugEnablingArgs(Args, CmdArgs,
2749 codegenoptions::LimitedDebugInfo,
2750 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002751 }
Renato Golin7c542b42015-07-27 23:44:45 +00002752 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2753 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2754 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002755 } else {
2756 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002757 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002758 }
2759 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002760 }
2761 if (CompressDebugSections) {
2762 if (llvm::zlib::isAvailable())
2763 CmdArgs.push_back("-compress-debug-sections");
2764 else
2765 D.Diag(diag::warn_debug_compression_unavailable);
2766 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002767 if (MipsTargetFeature != nullptr) {
2768 CmdArgs.push_back("-target-feature");
2769 CmdArgs.push_back(MipsTargetFeature);
2770 }
David Blaikie9260ed62013-07-25 21:19:01 +00002771}
2772
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002773// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002774// FIXME: Make sure we can also emit shared objects if they're requested
2775// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002776static void addClangRT(const ToolChain &TC, const ArgList &Args,
2777 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002778 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002779}
2780
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002781namespace {
2782enum OpenMPRuntimeKind {
2783 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2784 /// without knowing what runtime to target.
2785 OMPRT_Unknown,
2786
2787 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2788 /// the default for Clang.
2789 OMPRT_OMP,
2790
2791 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2792 /// this runtime but can swallow the pragmas, and find and link against the
2793 /// runtime library itself.
2794 OMPRT_GOMP,
2795
Chandler Carruthc6625c62015-05-28 21:10:31 +00002796 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002797 /// OpenMP runtime. We support this mode for users with existing dependencies
2798 /// on this runtime library name.
2799 OMPRT_IOMP5
2800};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002801}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002802
2803/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002804static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2805 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002806 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2807
2808 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2809 if (A)
2810 RuntimeName = A->getValue();
2811
2812 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002813 .Case("libomp", OMPRT_OMP)
2814 .Case("libgomp", OMPRT_GOMP)
2815 .Case("libiomp5", OMPRT_IOMP5)
2816 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002817
2818 if (RT == OMPRT_Unknown) {
2819 if (A)
2820 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002821 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002822 else
2823 // FIXME: We could use a nicer diagnostic here.
2824 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2825 }
2826
2827 return RT;
2828}
2829
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002830static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2831 const ArgList &Args) {
2832 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2833 options::OPT_fno_openmp, false))
2834 return;
2835
2836 switch (getOpenMPRuntime(TC, Args)) {
2837 case OMPRT_OMP:
2838 CmdArgs.push_back("-lomp");
2839 break;
2840 case OMPRT_GOMP:
2841 CmdArgs.push_back("-lgomp");
2842 break;
2843 case OMPRT_IOMP5:
2844 CmdArgs.push_back("-liomp5");
2845 break;
2846 case OMPRT_Unknown:
2847 // Already diagnosed.
2848 break;
2849 }
2850}
2851
Alexey Samsonov52550342014-09-15 19:58:40 +00002852static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2853 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002854 bool IsShared, bool IsWhole) {
2855 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002856 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002857 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002858 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002859 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002860}
2861
Alexey Samsonov52550342014-09-15 19:58:40 +00002862// Tries to use a file with the list of dynamic symbols that need to be exported
2863// from the runtime library. Returns true if the file was found.
2864static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2865 ArgStringList &CmdArgs,
2866 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002867 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002868 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2869 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002870 return true;
2871 }
2872 return false;
2873}
2874
2875static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2876 ArgStringList &CmdArgs) {
2877 // Force linking against the system libraries sanitizers depends on
2878 // (see PR15823 why this is necessary).
2879 CmdArgs.push_back("--no-as-needed");
2880 CmdArgs.push_back("-lpthread");
2881 CmdArgs.push_back("-lrt");
2882 CmdArgs.push_back("-lm");
2883 // There's no libdl on FreeBSD.
2884 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2885 CmdArgs.push_back("-ldl");
2886}
2887
2888static void
2889collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2890 SmallVectorImpl<StringRef> &SharedRuntimes,
2891 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002892 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2893 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2894 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002895 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2896 // Collect shared runtimes.
2897 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2898 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002899 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002900 // The stats_client library is also statically linked into DSOs.
2901 if (SanArgs.needsStatsRt())
2902 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002903
Alexey Samsonov52550342014-09-15 19:58:40 +00002904 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002905 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002906 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002907 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002908 }
2909 if (SanArgs.needsAsanRt()) {
2910 if (SanArgs.needsSharedAsanRt()) {
2911 HelperStaticRuntimes.push_back("asan-preinit");
2912 } else {
2913 StaticRuntimes.push_back("asan");
2914 if (SanArgs.linkCXXRuntimes())
2915 StaticRuntimes.push_back("asan_cxx");
2916 }
2917 }
2918 if (SanArgs.needsDfsanRt())
2919 StaticRuntimes.push_back("dfsan");
2920 if (SanArgs.needsLsanRt())
2921 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002922 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002923 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002924 if (SanArgs.linkCXXRuntimes())
2925 StaticRuntimes.push_back("msan_cxx");
2926 }
2927 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002928 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002929 if (SanArgs.linkCXXRuntimes())
2930 StaticRuntimes.push_back("tsan_cxx");
2931 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002932 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002933 StaticRuntimes.push_back("ubsan_standalone");
2934 if (SanArgs.linkCXXRuntimes())
2935 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002936 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002937 if (SanArgs.needsSafeStackRt())
2938 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002939 if (SanArgs.needsCfiRt())
2940 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002941 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002942 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002943 if (SanArgs.linkCXXRuntimes())
2944 StaticRuntimes.push_back("ubsan_standalone_cxx");
2945 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002946 if (SanArgs.needsStatsRt()) {
2947 NonWholeStaticRuntimes.push_back("stats");
2948 RequiredSymbols.push_back("__sanitizer_stats_register");
2949 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002950}
2951
Alexey Samsonov52550342014-09-15 19:58:40 +00002952// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2953// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2954static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002955 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002956 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002957 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002958 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002959 NonWholeStaticRuntimes, HelperStaticRuntimes,
2960 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002961 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002962 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002963 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002964 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002965 bool AddExportDynamic = false;
2966 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002967 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002968 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2969 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002970 for (auto RT : NonWholeStaticRuntimes) {
2971 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2972 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2973 }
2974 for (auto S : RequiredSymbols) {
2975 CmdArgs.push_back("-u");
2976 CmdArgs.push_back(Args.MakeArgString(S));
2977 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002978 // If there is a static runtime with no dynamic list, force all the symbols
2979 // to be dynamic to be sure we export sanitizer interface functions.
2980 if (AddExportDynamic)
2981 CmdArgs.push_back("-export-dynamic");
2982 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002983}
2984
Reid Kleckner86ea7702015-02-04 23:45:07 +00002985static bool areOptimizationsEnabled(const ArgList &Args) {
2986 // Find the last -O arg and see if it is non-zero.
2987 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2988 return !A->getOption().matches(options::OPT_O0);
2989 // Defaults to -O0.
2990 return false;
2991}
2992
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002993static bool shouldUseFramePointerForTarget(const ArgList &Args,
2994 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002995 switch (Triple.getArch()) {
2996 case llvm::Triple::xcore:
2997 case llvm::Triple::wasm32:
2998 case llvm::Triple::wasm64:
2999 // XCore never wants frame pointers, regardless of OS.
3000 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003001 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003002 default:
3003 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003004 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003005
3006 if (Triple.isOSLinux()) {
3007 switch (Triple.getArch()) {
3008 // Don't use a frame pointer on linux if optimizing for certain targets.
3009 case llvm::Triple::mips64:
3010 case llvm::Triple::mips64el:
3011 case llvm::Triple::mips:
3012 case llvm::Triple::mipsel:
3013 case llvm::Triple::systemz:
3014 case llvm::Triple::x86:
3015 case llvm::Triple::x86_64:
3016 return !areOptimizationsEnabled(Args);
3017 default:
3018 return true;
3019 }
3020 }
3021
3022 if (Triple.isOSWindows()) {
3023 switch (Triple.getArch()) {
3024 case llvm::Triple::x86:
3025 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003026 case llvm::Triple::x86_64:
3027 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003028 case llvm::Triple::arm:
3029 case llvm::Triple::thumb:
3030 // Windows on ARM builds with FPO disabled to aid fast stack walking
3031 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003032 default:
3033 // All other supported Windows ISAs use xdata unwind information, so frame
3034 // pointers are not generally useful.
3035 return false;
3036 }
3037 }
3038
3039 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003040}
3041
Rafael Espindola224dd632011-12-14 21:02:23 +00003042static bool shouldUseFramePointer(const ArgList &Args,
3043 const llvm::Triple &Triple) {
3044 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3045 options::OPT_fomit_frame_pointer))
3046 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003047 if (Args.hasArg(options::OPT_pg))
3048 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003049
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003050 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003051}
3052
Eric Christopherb7d97e92013-04-03 01:58:53 +00003053static bool shouldUseLeafFramePointer(const ArgList &Args,
3054 const llvm::Triple &Triple) {
3055 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3056 options::OPT_momit_leaf_frame_pointer))
3057 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003058 if (Args.hasArg(options::OPT_pg))
3059 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003060
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003061 if (Triple.isPS4CPU())
3062 return false;
3063
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003064 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003065}
3066
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003067/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003068static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003069 SmallString<128> cwd;
3070 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003071 CmdArgs.push_back("-fdebug-compilation-dir");
3072 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003073 }
3074}
3075
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003076static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003077 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3078 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3079 SmallString<128> T(FinalOutput->getValue());
3080 llvm::sys::path::replace_extension(T, "dwo");
3081 return Args.MakeArgString(T);
3082 } else {
3083 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003084 SmallString<128> T(
3085 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003086 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003087 llvm::sys::path::replace_extension(F, "dwo");
3088 T += F;
3089 return Args.MakeArgString(F);
3090 }
3091}
3092
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003093static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3094 const JobAction &JA, const ArgList &Args,
3095 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003096 ArgStringList ExtractArgs;
3097 ExtractArgs.push_back("--extract-dwo");
3098
3099 ArgStringList StripArgs;
3100 StripArgs.push_back("--strip-dwo");
3101
3102 // Grabbing the output of the earlier compile step.
3103 StripArgs.push_back(Output.getFilename());
3104 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003105 ExtractArgs.push_back(OutFile);
3106
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003107 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003108 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003109
3110 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003111 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003112
3113 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003114 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003115}
3116
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003117/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003118/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3119static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003120 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003121 if (A->getOption().matches(options::OPT_O4) ||
3122 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003123 return true;
3124
3125 if (A->getOption().matches(options::OPT_O0))
3126 return false;
3127
3128 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3129
Rafael Espindola91780de2013-08-26 14:05:41 +00003130 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003131 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003132 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003133 return true;
3134
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003135 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003136 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003137 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003138
3139 unsigned OptLevel = 0;
3140 if (S.getAsInteger(10, OptLevel))
3141 return false;
3142
3143 return OptLevel > 1;
3144 }
3145
3146 return false;
3147}
3148
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003149/// Add -x lang to \p CmdArgs for \p Input.
3150static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3151 ArgStringList &CmdArgs) {
3152 // When using -verify-pch, we don't want to provide the type
3153 // 'precompiled-header' if it was inferred from the file extension
3154 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3155 return;
3156
3157 CmdArgs.push_back("-x");
3158 if (Args.hasArg(options::OPT_rewrite_objc))
3159 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3160 else
3161 CmdArgs.push_back(types::getTypeName(Input.getType()));
3162}
3163
David Majnemerc371ff02015-03-22 08:39:22 +00003164static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003165 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003166 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003167
3168 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003169 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003170
3171 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003172 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003173 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003174 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003175}
3176
Rafael Espindola577637a2015-01-03 00:06:04 +00003177// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003178// options that build systems might add but are unused when assembling or only
3179// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003180static void claimNoWarnArgs(const ArgList &Args) {
3181 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003182 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003183 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003184 Args.ClaimAllArgs(options::OPT_flto);
3185 Args.ClaimAllArgs(options::OPT_fno_lto);
3186}
3187
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003188static void appendUserToPath(SmallVectorImpl<char> &Result) {
3189#ifdef LLVM_ON_UNIX
3190 const char *Username = getenv("LOGNAME");
3191#else
3192 const char *Username = getenv("USERNAME");
3193#endif
3194 if (Username) {
3195 // Validate that LoginName can be used in a path, and get its length.
3196 size_t Len = 0;
3197 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003198 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003199 Username = nullptr;
3200 break;
3201 }
3202 }
3203
3204 if (Username && Len > 0) {
3205 Result.append(Username, Username + Len);
3206 return;
3207 }
3208 }
3209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003210// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003211#ifdef LLVM_ON_UNIX
3212 std::string UID = llvm::utostr(getuid());
3213#else
3214 // FIXME: Windows seems to have an 'SID' that might work.
3215 std::string UID = "9999";
3216#endif
3217 Result.append(UID.begin(), UID.end());
3218}
3219
David Majnemere11d3732015-06-08 00:22:46 +00003220VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3221 const llvm::Triple &Triple,
3222 const llvm::opt::ArgList &Args,
3223 bool IsWindowsMSVC) {
3224 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3225 IsWindowsMSVC) ||
3226 Args.hasArg(options::OPT_fmsc_version) ||
3227 Args.hasArg(options::OPT_fms_compatibility_version)) {
3228 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3229 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003230 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003231
3232 if (MSCVersion && MSCompatibilityVersion) {
3233 if (D)
3234 D->Diag(diag::err_drv_argument_not_allowed_with)
3235 << MSCVersion->getAsString(Args)
3236 << MSCompatibilityVersion->getAsString(Args);
3237 return VersionTuple();
3238 }
3239
3240 if (MSCompatibilityVersion) {
3241 VersionTuple MSVT;
3242 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3243 D->Diag(diag::err_drv_invalid_value)
3244 << MSCompatibilityVersion->getAsString(Args)
3245 << MSCompatibilityVersion->getValue();
3246 return MSVT;
3247 }
3248
3249 if (MSCVersion) {
3250 unsigned Version = 0;
3251 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3252 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3253 << MSCVersion->getValue();
3254 return getMSCompatibilityVersion(Version);
3255 }
3256
3257 unsigned Major, Minor, Micro;
3258 Triple.getEnvironmentVersion(Major, Minor, Micro);
3259 if (Major || Minor || Micro)
3260 return VersionTuple(Major, Minor, Micro);
3261
Nico Weber9a952752016-03-23 23:26:59 +00003262 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
David Majnemere11d3732015-06-08 00:22:46 +00003263 return VersionTuple(18);
3264 }
3265 return VersionTuple();
3266}
3267
Diego Novilloa0545962015-07-10 18:00:07 +00003268static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3269 const InputInfo &Output, const ArgList &Args,
3270 ArgStringList &CmdArgs) {
3271 auto *ProfileGenerateArg = Args.getLastArg(
3272 options::OPT_fprofile_instr_generate,
3273 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003274 options::OPT_fprofile_generate_EQ,
3275 options::OPT_fno_profile_instr_generate);
3276 if (ProfileGenerateArg &&
3277 ProfileGenerateArg->getOption().matches(
3278 options::OPT_fno_profile_instr_generate))
3279 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003280
3281 auto *ProfileUseArg = Args.getLastArg(
3282 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003283 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3284 options::OPT_fno_profile_instr_use);
3285 if (ProfileUseArg &&
3286 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3287 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003288
3289 if (ProfileGenerateArg && ProfileUseArg)
3290 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003291 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003292
Diego Novillo758f3f52015-08-05 21:49:51 +00003293 if (ProfileGenerateArg) {
3294 if (ProfileGenerateArg->getOption().matches(
3295 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003296 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3297 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003298 else if (ProfileGenerateArg->getOption().matches(
3299 options::OPT_fprofile_generate_EQ)) {
3300 SmallString<128> Path(ProfileGenerateArg->getValue());
3301 llvm::sys::path::append(Path, "default.profraw");
3302 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003303 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3304 }
3305 // The default is to use Clang Instrumentation.
3306 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003307 }
Diego Novilloa0545962015-07-10 18:00:07 +00003308
Diego Novillo758f3f52015-08-05 21:49:51 +00003309 if (ProfileUseArg) {
3310 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003311 CmdArgs.push_back(Args.MakeArgString(
3312 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003313 else if ((ProfileUseArg->getOption().matches(
3314 options::OPT_fprofile_use_EQ) ||
3315 ProfileUseArg->getOption().matches(
3316 options::OPT_fprofile_instr_use))) {
3317 SmallString<128> Path(
3318 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3319 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3320 llvm::sys::path::append(Path, "default.profdata");
3321 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003322 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003323 }
Diego Novilloa0545962015-07-10 18:00:07 +00003324 }
3325
3326 if (Args.hasArg(options::OPT_ftest_coverage) ||
3327 Args.hasArg(options::OPT_coverage))
3328 CmdArgs.push_back("-femit-coverage-notes");
3329 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3330 false) ||
3331 Args.hasArg(options::OPT_coverage))
3332 CmdArgs.push_back("-femit-coverage-data");
3333
Diego Novilloc4b94da2015-08-05 23:27:40 +00003334 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3335 options::OPT_fno_coverage_mapping, false) &&
3336 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003337 D.Diag(diag::err_drv_argument_only_allowed_with)
3338 << "-fcoverage-mapping"
3339 << "-fprofile-instr-generate";
3340
Diego Novilloc4b94da2015-08-05 23:27:40 +00003341 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3342 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003343 CmdArgs.push_back("-fcoverage-mapping");
3344
3345 if (C.getArgs().hasArg(options::OPT_c) ||
3346 C.getArgs().hasArg(options::OPT_S)) {
3347 if (Output.isFilename()) {
3348 CmdArgs.push_back("-coverage-file");
3349 SmallString<128> CoverageFilename;
3350 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3351 CoverageFilename = FinalOutput->getValue();
3352 } else {
3353 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3354 }
3355 if (llvm::sys::path::is_relative(CoverageFilename)) {
3356 SmallString<128> Pwd;
3357 if (!llvm::sys::fs::current_path(Pwd)) {
3358 llvm::sys::path::append(Pwd, CoverageFilename);
3359 CoverageFilename.swap(Pwd);
3360 }
3361 }
3362 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3363 }
3364 }
3365}
3366
Paul Robinsond083b9a2015-12-16 17:25:27 +00003367static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3368 ArgStringList &CmdArgs) {
3369 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3370 false) ||
3371 Args.hasFlag(options::OPT_fprofile_generate,
3372 options::OPT_fno_profile_instr_generate, false) ||
3373 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3374 options::OPT_fno_profile_instr_generate, false) ||
3375 Args.hasFlag(options::OPT_fprofile_instr_generate,
3376 options::OPT_fno_profile_instr_generate, false) ||
3377 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3378 options::OPT_fno_profile_instr_generate, false) ||
3379 Args.hasArg(options::OPT_fcreate_profile) ||
3380 Args.hasArg(options::OPT_coverage)))
3381 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3382}
3383
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003384/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3385/// smooshes them together with platform defaults, to decide whether
3386/// this compile should be using PIC mode or not. Returns a tuple of
3387/// (RelocationModel, PICLevel, IsPIE).
3388static std::tuple<llvm::Reloc::Model, unsigned, bool>
3389ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3390 const ArgList &Args) {
3391 // FIXME: why does this code...and so much everywhere else, use both
3392 // ToolChain.getTriple() and Triple?
3393 bool PIE = ToolChain.isPIEDefault();
3394 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003395 // The Darwin/MachO default to use PIC does not apply when using -static.
3396 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3397 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003398 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003399 bool IsPICLevelTwo = PIC;
3400
3401 bool KernelOrKext =
3402 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3403
3404 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003405 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003406 switch (ToolChain.getArch()) {
3407 case llvm::Triple::arm:
3408 case llvm::Triple::armeb:
3409 case llvm::Triple::thumb:
3410 case llvm::Triple::thumbeb:
3411 case llvm::Triple::aarch64:
3412 case llvm::Triple::mips:
3413 case llvm::Triple::mipsel:
3414 case llvm::Triple::mips64:
3415 case llvm::Triple::mips64el:
3416 PIC = true; // "-fpic"
3417 break;
3418
3419 case llvm::Triple::x86:
3420 case llvm::Triple::x86_64:
3421 PIC = true; // "-fPIC"
3422 IsPICLevelTwo = true;
3423 break;
3424
3425 default:
3426 break;
3427 }
3428 }
3429
3430 // OpenBSD-specific defaults for PIE
3431 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3432 switch (ToolChain.getArch()) {
3433 case llvm::Triple::mips64:
3434 case llvm::Triple::mips64el:
3435 case llvm::Triple::sparcel:
3436 case llvm::Triple::x86:
3437 case llvm::Triple::x86_64:
3438 IsPICLevelTwo = false; // "-fpie"
3439 break;
3440
3441 case llvm::Triple::ppc:
3442 case llvm::Triple::sparc:
3443 case llvm::Triple::sparcv9:
3444 IsPICLevelTwo = true; // "-fPIE"
3445 break;
3446
3447 default:
3448 break;
3449 }
3450 }
3451
3452 // The last argument relating to either PIC or PIE wins, and no
3453 // other argument is used. If the last argument is any flavor of the
3454 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3455 // option implicitly enables PIC at the same level.
3456 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3457 options::OPT_fpic, options::OPT_fno_pic,
3458 options::OPT_fPIE, options::OPT_fno_PIE,
3459 options::OPT_fpie, options::OPT_fno_pie);
3460 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3461 // is forced, then neither PIC nor PIE flags will have no effect.
3462 if (!ToolChain.isPICDefaultForced()) {
3463 if (LastPICArg) {
3464 Option O = LastPICArg->getOption();
3465 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3466 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3467 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3468 PIC =
3469 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3470 IsPICLevelTwo =
3471 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3472 } else {
3473 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003474 if (Triple.isPS4CPU()) {
3475 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3476 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3477 if (Model != "kernel") {
3478 PIC = true;
3479 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3480 << LastPICArg->getSpelling();
3481 }
3482 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003483 }
3484 }
3485 }
3486
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003487 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3488 // PIC level would've been set to level 1, force it back to level 2 PIC
3489 // instead.
3490 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003491 IsPICLevelTwo |= ToolChain.isPICDefault();
3492
James Y Knightc4015d32015-08-21 04:14:55 +00003493 // This kernel flags are a trump-card: they will disable PIC/PIE
3494 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003495 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3496 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003497 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003498
3499 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3500 // This is a very special mode. It trumps the other modes, almost no one
3501 // uses it, and it isn't even valid on any OS but Darwin.
3502 if (!ToolChain.getTriple().isOSDarwin())
3503 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3504 << A->getSpelling() << ToolChain.getTriple().str();
3505
3506 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3507
3508 // Only a forced PIC mode can cause the actual compile to have PIC defines
3509 // etc., no flags are sufficient. This behavior was selected to closely
3510 // match that of llvm-gcc and Apple GCC before that.
3511 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3512
3513 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3514 }
3515
3516 if (PIC)
3517 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3518
3519 return std::make_tuple(llvm::Reloc::Static, 0, false);
3520}
3521
3522static const char *RelocationModelName(llvm::Reloc::Model Model) {
3523 switch (Model) {
3524 case llvm::Reloc::Default:
3525 return nullptr;
3526 case llvm::Reloc::Static:
3527 return "static";
3528 case llvm::Reloc::PIC_:
3529 return "pic";
3530 case llvm::Reloc::DynamicNoPIC:
3531 return "dynamic-no-pic";
3532 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003533 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003534}
3535
3536static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3537 ArgStringList &CmdArgs) {
3538 llvm::Reloc::Model RelocationModel;
3539 unsigned PICLevel;
3540 bool IsPIE;
3541 std::tie(RelocationModel, PICLevel, IsPIE) =
3542 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3543
3544 if (RelocationModel != llvm::Reloc::Static)
3545 CmdArgs.push_back("-KPIC");
3546}
3547
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003548void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003549 const InputInfo &Output, const InputInfoList &Inputs,
3550 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003551 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3552 const llvm::Triple Triple(TripleStr);
3553
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003554 bool KernelOrKext =
3555 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003556 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003557 ArgStringList CmdArgs;
3558
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003559 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003560 bool IsWindowsCygnus =
3561 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003562 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003563 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003564
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003565 // Check number of inputs for sanity. We need at least one input.
3566 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003567 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003568 // CUDA compilation may have multiple inputs (source file + results of
3569 // device-side compilations). All other jobs are expected to have exactly one
3570 // input.
3571 bool IsCuda = types::isCuda(Input.getType());
3572 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003573
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003574 // Invoke ourselves in -cc1 mode.
3575 //
3576 // FIXME: Implement custom jobs for internal actions.
3577 CmdArgs.push_back("-cc1");
3578
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003579 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003580 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003581 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003582
Artem Belevichfa11ab52015-11-17 22:28:46 +00003583 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003584 if (IsCuda) {
3585 // FIXME: We need a (better) way to pass information about
3586 // particular compilation pass we're constructing here. For now we
3587 // can check which toolchain we're using and pick the other one to
3588 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003589 if (&getToolChain() == C.getCudaDeviceToolChain())
3590 AuxToolChain = C.getCudaHostToolChain();
3591 else if (&getToolChain() == C.getCudaHostToolChain())
3592 AuxToolChain = C.getCudaDeviceToolChain();
3593 else
3594 llvm_unreachable("Can't figure out CUDA compilation mode.");
3595 assert(AuxToolChain != nullptr && "No aux toolchain.");
3596 CmdArgs.push_back("-aux-triple");
3597 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003598 CmdArgs.push_back("-fcuda-target-overloads");
3599 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003600 }
3601
James Y Knight2db38f32015-08-15 03:45:25 +00003602 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3603 Triple.getArch() == llvm::Triple::thumb)) {
3604 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003605 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003606 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003607 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003608 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003609 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003610 }
3611
Tim Northover336f1892014-03-29 13:16:12 +00003612 // Push all default warning arguments that are specific to
3613 // the given target. These come before user provided warning options
3614 // are provided.
3615 getToolChain().addClangWarningOptions(CmdArgs);
3616
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003617 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003618 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003619
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003620 if (isa<AnalyzeJobAction>(JA)) {
3621 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3622 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003623 } else if (isa<MigrateJobAction>(JA)) {
3624 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003625 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003626 if (Output.getType() == types::TY_Dependencies)
3627 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003628 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003629 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003630 if (Args.hasArg(options::OPT_rewrite_objc) &&
3631 !Args.hasArg(options::OPT_g_Group))
3632 CmdArgs.push_back("-P");
3633 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003634 } else if (isa<AssembleJobAction>(JA)) {
3635 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003636
David Blaikie9260ed62013-07-25 21:19:01 +00003637 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003638
3639 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003640 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003641 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003642 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003643 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003644
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003645 if (JA.getType() == types::TY_Nothing)
3646 CmdArgs.push_back("-fsyntax-only");
3647 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003648 CmdArgs.push_back("-emit-pch");
3649 else
3650 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003651 } else if (isa<VerifyPCHJobAction>(JA)) {
3652 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003653 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003654 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3655 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003656 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003657 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003658 } else if (JA.getType() == types::TY_LLVM_IR ||
3659 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003660 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003661 } else if (JA.getType() == types::TY_LLVM_BC ||
3662 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003663 CmdArgs.push_back("-emit-llvm-bc");
3664 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003665 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003666 } else if (JA.getType() == types::TY_AST) {
3667 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003668 } else if (JA.getType() == types::TY_ModuleFile) {
3669 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003670 } else if (JA.getType() == types::TY_RewrittenObjC) {
3671 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003672 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003673 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3674 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003675 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003676 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003677 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003678 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003679
3680 // Preserve use-list order by default when emitting bitcode, so that
3681 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3682 // same result as running passes here. For LTO, we don't need to preserve
3683 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003684 if (JA.getType() == types::TY_LLVM_BC)
3685 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003686
3687 if (D.isUsingLTO())
3688 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003689 }
3690
Teresa Johnsonaff22322015-12-07 19:21:34 +00003691 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3692 if (!types::isLLVMIR(Input.getType()))
3693 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3694 << "-x ir";
3695 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3696 }
3697
Steven Wu574b0f22016-03-01 01:07:58 +00003698 // Embed-bitcode option.
3699 if (C.getDriver().embedBitcodeEnabled() &&
3700 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3701 // Add flags implied by -fembed-bitcode.
3702 CmdArgs.push_back("-fembed-bitcode");
3703 // Disable all llvm IR level optimizations.
3704 CmdArgs.push_back("-disable-llvm-optzns");
3705 }
3706 if (C.getDriver().embedBitcodeMarkerOnly())
3707 CmdArgs.push_back("-fembed-bitcode-marker");
3708
Justin Bognera88f0122014-06-20 22:59:50 +00003709 // We normally speed up the clang process a bit by skipping destructors at
3710 // exit, but when we're generating diagnostics we can rely on some of the
3711 // cleanup.
3712 if (!C.isForDiagnostics())
3713 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003714
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003715// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003716#ifdef NDEBUG
3717 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003718 // Discard LLVM value names in -asserts builds.
3719 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003720#endif
3721
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003722 // Set the main file name, so that debug info works even with
3723 // -save-temps.
3724 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003725 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003726
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003727 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003728 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003729 if (Args.hasArg(options::OPT_static))
3730 CmdArgs.push_back("-static-define");
3731
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003732 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003733 // Enable region store model by default.
3734 CmdArgs.push_back("-analyzer-store=region");
3735
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003736 // Treat blocks as analysis entry points.
3737 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3738
Ted Kremenek49c79792011-03-24 00:28:47 +00003739 CmdArgs.push_back("-analyzer-eagerly-assume");
3740
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003741 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003742 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003743 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003744
Devin Coughlin65c77082016-01-21 20:09:49 +00003745 if (!IsWindowsMSVC) {
3746 CmdArgs.push_back("-analyzer-checker=unix");
3747 } else {
3748 // Enable "unix" checkers that also work on Windows.
3749 CmdArgs.push_back("-analyzer-checker=unix.API");
3750 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3751 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3752 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3753 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3754 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3755 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003756
Sean Evesonb38c32b2016-01-06 10:03:58 +00003757 // Disable some unix checkers for PS4.
3758 if (IsPS4CPU) {
3759 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3760 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3761 }
3762
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003763 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003764 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003765
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003766 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003767
Artem Belevichba558952015-05-06 18:20:23 +00003768 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003769 CmdArgs.push_back("-analyzer-checker=cplusplus");
3770
Sean Evesonb38c32b2016-01-06 10:03:58 +00003771 if (!IsPS4CPU) {
3772 CmdArgs.push_back(
3773 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3774 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3775 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3776 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3777 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3778 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3779 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003780
3781 // Default nullability checks.
3782 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3783 CmdArgs.push_back(
3784 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003785 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003786
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003787 // Set the output format. The default is plist, for (lame) historical
3788 // reasons.
3789 CmdArgs.push_back("-analyzer-output");
3790 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003791 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003792 else
3793 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003794
Ted Kremenekfe449a22010-03-22 22:32:05 +00003795 // Disable the presentation of standard compiler warnings when
3796 // using --analyze. We only want to show static analyzer diagnostics
3797 // or frontend errors.
3798 CmdArgs.push_back("-w");
3799
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003800 // Add -Xanalyzer arguments when running as analyzer.
3801 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003802 }
3803
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003804 CheckCodeGenerationOptions(D, Args);
3805
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003806 llvm::Reloc::Model RelocationModel;
3807 unsigned PICLevel;
3808 bool IsPIE;
3809 std::tie(RelocationModel, PICLevel, IsPIE) =
3810 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003811
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003812 const char *RMName = RelocationModelName(RelocationModel);
3813 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003814 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003815 CmdArgs.push_back(RMName);
3816 }
3817 if (PICLevel > 0) {
3818 CmdArgs.push_back("-pic-level");
3819 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3820 if (IsPIE) {
3821 CmdArgs.push_back("-pie-level");
3822 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003823 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003824 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003825
Renato Golin4854d802015-11-09 12:40:41 +00003826 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3827 CmdArgs.push_back("-meabi");
3828 CmdArgs.push_back(A->getValue());
3829 }
3830
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003831 CmdArgs.push_back("-mthread-model");
3832 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3833 CmdArgs.push_back(A->getValue());
3834 else
3835 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3836
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003837 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3838
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003839 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3840 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003841 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003842
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003843 // LLVM Code Generator Options.
3844
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003845 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3846 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003847 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3848 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003849 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003850 CmdArgs.push_back(A->getValue());
3851 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003852 }
3853 }
3854
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003855 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3856 StringRef v = A->getValue();
3857 CmdArgs.push_back("-mllvm");
3858 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3859 A->claim();
3860 }
3861
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003862 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3863 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003864 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003865 }
3866
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003867 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3868 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003869 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003870 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003871 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003872 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3873 CmdArgs.push_back("-fpcc-struct-return");
3874 } else {
3875 assert(A->getOption().matches(options::OPT_freg_struct_return));
3876 CmdArgs.push_back("-freg-struct-return");
3877 }
3878 }
3879
Roman Divacky65b88cd2011-03-01 17:40:53 +00003880 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3881 CmdArgs.push_back("-mrtd");
3882
Rafael Espindola224dd632011-12-14 21:02:23 +00003883 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003884 CmdArgs.push_back("-mdisable-fp-elim");
3885 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3886 options::OPT_fno_zero_initialized_in_bss))
3887 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003888
3889 bool OFastEnabled = isOptimizationLevelFast(Args);
3890 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3891 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003892 OptSpecifier StrictAliasingAliasOption =
3893 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003894 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3895 // doesn't do any TBAA.
3896 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003897 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003898 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003899 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003900 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3901 options::OPT_fno_struct_path_tbaa))
3902 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003903 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3904 false))
3905 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003906 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3907 options::OPT_fno_strict_vtable_pointers,
3908 false))
3909 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003910 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3911 options::OPT_fno_optimize_sibling_calls))
3912 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003913
Eric Christopher006208c2013-04-04 06:29:47 +00003914 // Handle segmented stacks.
3915 if (Args.hasArg(options::OPT_fsplit_stack))
3916 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003917
3918 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3919 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003920 OptSpecifier FastMathAliasOption =
3921 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3922
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003923 // Handle various floating point optimization flags, mapping them to the
3924 // appropriate LLVM code generation flags. The pattern for all of these is to
3925 // default off the codegen optimizations, and if any flag enables them and no
3926 // flag disables them after the flag enabling them, enable the codegen
3927 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003928 if (Arg *A = Args.getLastArg(
3929 options::OPT_ffast_math, FastMathAliasOption,
3930 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3931 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3932 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003933 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3934 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003935 A->getOption().getID() != options::OPT_fhonor_infinities)
3936 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 if (Arg *A = Args.getLastArg(
3938 options::OPT_ffast_math, FastMathAliasOption,
3939 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3940 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3941 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003942 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3943 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003944 A->getOption().getID() != options::OPT_fhonor_nans)
3945 CmdArgs.push_back("-menable-no-nans");
3946
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003947 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3948 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003949 if (Arg *A =
3950 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3951 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3952 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003953 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3954 // However, turning *off* -ffast_math merely restores the toolchain default
3955 // (which may be false).
3956 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3957 A->getOption().getID() == options::OPT_ffast_math ||
3958 A->getOption().getID() == options::OPT_Ofast)
3959 MathErrno = false;
3960 else if (A->getOption().getID() == options::OPT_fmath_errno)
3961 MathErrno = true;
3962 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003963 if (MathErrno)
3964 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003965
3966 // There are several flags which require disabling very specific
3967 // optimizations. Any of these being disabled forces us to turn off the
3968 // entire set of LLVM optimizations, so collect them through all the flag
3969 // madness.
3970 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003971 if (Arg *A = Args.getLastArg(
3972 options::OPT_ffast_math, FastMathAliasOption,
3973 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3974 options::OPT_fno_unsafe_math_optimizations,
3975 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003976 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3977 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003978 A->getOption().getID() != options::OPT_fno_associative_math)
3979 AssociativeMath = true;
3980 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003981 if (Arg *A = Args.getLastArg(
3982 options::OPT_ffast_math, FastMathAliasOption,
3983 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3984 options::OPT_fno_unsafe_math_optimizations,
3985 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003986 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3987 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003988 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3989 ReciprocalMath = true;
3990 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003991 if (Arg *A = Args.getLastArg(
3992 options::OPT_ffast_math, FastMathAliasOption,
3993 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3994 options::OPT_fno_unsafe_math_optimizations,
3995 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003996 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3997 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003998 A->getOption().getID() != options::OPT_fsigned_zeros)
3999 SignedZeros = false;
4000 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004001 if (Arg *A = Args.getLastArg(
4002 options::OPT_ffast_math, FastMathAliasOption,
4003 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4004 options::OPT_fno_unsafe_math_optimizations,
4005 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004006 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4007 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004008 A->getOption().getID() != options::OPT_ftrapping_math)
4009 TrappingMath = false;
4010 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4011 !TrappingMath)
4012 CmdArgs.push_back("-menable-unsafe-fp-math");
4013
Sanjay Patel76c9e092015-01-23 16:40:50 +00004014 if (!SignedZeros)
4015 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004016
Sanjay Patel359b1052015-04-09 15:03:23 +00004017 if (ReciprocalMath)
4018 CmdArgs.push_back("-freciprocal-math");
4019
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004020 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004021 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004022 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004023 options::OPT_ffp_contract)) {
4024 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004025 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004026 if (Val == "fast" || Val == "on" || Val == "off") {
4027 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4028 } else {
4029 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004030 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004031 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004032 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4033 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004034 // If fast-math is set then set the fp-contract mode to fast.
4035 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4036 }
4037 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004038
Sanjay Patel2987c292015-06-11 14:53:41 +00004039 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004040
Bob Wilson6a039162012-07-19 03:52:53 +00004041 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4042 // and if we find them, tell the frontend to provide the appropriate
4043 // preprocessor macros. This is distinct from enabling any optimizations as
4044 // these options induce language changes which must survive serialization
4045 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004046 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4047 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004048 if (!A->getOption().matches(options::OPT_fno_fast_math))
4049 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004050 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4051 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004052 if (A->getOption().matches(options::OPT_ffinite_math_only))
4053 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004054
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004055 // Decide whether to use verbose asm. Verbose assembly is the default on
4056 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004057 bool IsIntegratedAssemblerDefault =
4058 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004059 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004060 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004061 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004062 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004063
Rafael Espindolab8a12932015-05-22 20:44:03 +00004064 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4065 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004066 CmdArgs.push_back("-no-integrated-as");
4067
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004068 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4069 CmdArgs.push_back("-mdebug-pass");
4070 CmdArgs.push_back("Structure");
4071 }
4072 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4073 CmdArgs.push_back("-mdebug-pass");
4074 CmdArgs.push_back("Arguments");
4075 }
4076
Justin Lebar710a35f2016-01-25 22:36:35 +00004077 // Enable -mconstructor-aliases except on darwin, where we have to work around
4078 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4079 // aliases aren't supported.
4080 if (!getToolChain().getTriple().isOSDarwin() &&
4081 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004082 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004083
John McCall7ef5cb32011-03-18 02:56:14 +00004084 // Darwin's kernel doesn't support guard variables; just die if we
4085 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004086 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004087 CmdArgs.push_back("-fforbid-guard-variables");
4088
Akira Hatanaka02028482015-11-12 17:21:22 +00004089 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4090 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004091 CmdArgs.push_back("-mms-bitfields");
4092 }
John McCall8517abc2010-02-19 02:45:38 +00004093
Daniel Dunbar306945d2009-09-16 06:17:29 +00004094 // This is a coarse approximation of what llvm-gcc actually does, both
4095 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4096 // complicated ways.
4097 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004098 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4099 options::OPT_fno_asynchronous_unwind_tables,
4100 (getToolChain().IsUnwindTablesDefault() ||
4101 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4102 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004103 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4104 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004105 CmdArgs.push_back("-munwind-tables");
4106
Chandler Carruth05fb5852012-11-21 23:40:23 +00004107 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004108
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004109 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4110 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004111 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004112 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004113
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004114 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004115 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004116
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004117 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004118 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004119 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004120 }
4121
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004122 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004123 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004124 if (!CPU.empty()) {
4125 CmdArgs.push_back("-target-cpu");
4126 CmdArgs.push_back(Args.MakeArgString(CPU));
4127 }
4128
Rafael Espindolaeb265472013-08-21 21:59:03 +00004129 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4130 CmdArgs.push_back("-mfpmath");
4131 CmdArgs.push_back(A->getValue());
4132 }
4133
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004134 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004135 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004136
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004137 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004138 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004139 default:
4140 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004141
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004142 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004143 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004144 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004145 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004146 // Use the effective triple, which takes into account the deployment target.
4147 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004148 break;
4149
Tim Northover573cbee2014-05-24 12:52:07 +00004150 case llvm::Triple::aarch64:
4151 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004152 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004153 break;
4154
Eric Christopher0b26a612010-03-02 02:41:08 +00004155 case llvm::Triple::mips:
4156 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004157 case llvm::Triple::mips64:
4158 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004159 AddMIPSTargetArgs(Args, CmdArgs);
4160 break;
4161
Ulrich Weigand8afad612014-07-28 13:17:52 +00004162 case llvm::Triple::ppc:
4163 case llvm::Triple::ppc64:
4164 case llvm::Triple::ppc64le:
4165 AddPPCTargetArgs(Args, CmdArgs);
4166 break;
4167
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004168 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004169 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004170 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004171 AddSparcTargetArgs(Args, CmdArgs);
4172 break;
4173
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004174 case llvm::Triple::x86:
4175 case llvm::Triple::x86_64:
4176 AddX86TargetArgs(Args, CmdArgs);
4177 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004178
4179 case llvm::Triple::hexagon:
4180 AddHexagonTargetArgs(Args, CmdArgs);
4181 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004182
4183 case llvm::Triple::wasm32:
4184 case llvm::Triple::wasm64:
4185 AddWebAssemblyTargetArgs(Args, CmdArgs);
4186 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004187 }
4188
Douglas Katzman3459ce22015-10-08 04:24:12 +00004189 // The 'g' groups options involve a somewhat intricate sequence of decisions
4190 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004191 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004192 // * what level of debug info to generate
4193 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004194 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004195 // This avoids having to monkey around further in cc1 other than to disable
4196 // codeview if not running in a Windows environment. Perhaps even that
4197 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004198 unsigned DwarfVersion = 0;
4199 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4200 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004201 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004202 bool EmitCodeView = false;
4203
Hans Wennborg75958c42013-08-08 00:17:41 +00004204 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004205 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004206 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004207 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004208
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004209 // Pass the linker version in use.
4210 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4211 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004212 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004213 }
4214
Eric Christopherb7d97e92013-04-03 01:58:53 +00004215 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004216 CmdArgs.push_back("-momit-leaf-frame-pointer");
4217
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004218 // Explicitly error on some things we know we don't support and can't just
4219 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004220 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4221 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004222 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004223 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004224 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4225 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004226 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004227 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004228 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004229 }
4230
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004231 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004232 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004233 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004234 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004235 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4236 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004237 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004238 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004239 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004240
Chad Rosierbe10f982011-08-02 17:58:04 +00004241 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004242 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004243 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4244 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004245 }
4246
Rafael Espindola08a692a2010-03-07 04:46:18 +00004247 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004248 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004249 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004250 // If the last option explicitly specified a debug-info level, use it.
4251 if (A->getOption().matches(options::OPT_gN_Group)) {
4252 DebugInfoKind = DebugLevelToInfoKind(*A);
4253 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4254 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4255 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004256 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004257 A->getIndex() > SplitDwarfArg->getIndex())
4258 SplitDwarfArg = nullptr;
4259 } else
4260 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004261 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004262 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004263
Paul Robinson0334a042015-12-19 19:41:48 +00004264 // If a debugger tuning argument appeared, remember it.
4265 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4266 options::OPT_ggdbN_Group)) {
4267 if (A->getOption().matches(options::OPT_glldb))
4268 DebuggerTuning = llvm::DebuggerKind::LLDB;
4269 else if (A->getOption().matches(options::OPT_gsce))
4270 DebuggerTuning = llvm::DebuggerKind::SCE;
4271 else
4272 DebuggerTuning = llvm::DebuggerKind::GDB;
4273 }
4274
4275 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004276 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004277 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004278 DwarfVersion = DwarfVersionNum(A->getSpelling());
4279
Reid Kleckner124955a2015-08-05 18:51:13 +00004280 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004281 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4282 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4283 // DwarfVersion remains at 0 if no explicit choice was made.
4284 CmdArgs.push_back("-gcodeview");
4285 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004286 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004287 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4288 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004289
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004290 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4291 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004292
4293 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004294 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004295 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004296 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004297
Eric Christopher138c32b2013-09-13 22:37:55 +00004298 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004299 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004300 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004301 CmdArgs.push_back("-dwarf-ext-refs");
4302 CmdArgs.push_back("-fmodule-format=obj");
4303 }
4304
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004305 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4306 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004307 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004308 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004309 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004310 CmdArgs.push_back("-backend-option");
4311 CmdArgs.push_back("-split-dwarf=Enable");
4312 }
4313
Douglas Katzman3459ce22015-10-08 04:24:12 +00004314 // After we've dealt with all combinations of things that could
4315 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4316 // figure out if we need to "upgrade" it to standalone debug info.
4317 // We parse these two '-f' options whether or not they will be used,
4318 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4319 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4320 options::OPT_fno_standalone_debug,
4321 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004322 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4323 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004324 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4325 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004326
Eric Christopher138c32b2013-09-13 22:37:55 +00004327 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4328 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4329 CmdArgs.push_back("-backend-option");
4330 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4331 }
Eric Christophereec89c22013-06-18 00:03:50 +00004332
Eric Christopher0d403d22014-02-14 01:27:03 +00004333 // -gdwarf-aranges turns on the emission of the aranges section in the
4334 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004335 // Always enabled on the PS4.
4336 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004337 CmdArgs.push_back("-backend-option");
4338 CmdArgs.push_back("-generate-arange-section");
4339 }
4340
David Blaikief36d9ba2014-01-27 18:52:43 +00004341 if (Args.hasFlag(options::OPT_fdebug_types_section,
4342 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004343 CmdArgs.push_back("-backend-option");
4344 CmdArgs.push_back("-generate-type-units");
4345 }
Eric Christophereec89c22013-06-18 00:03:50 +00004346
Dan Gohmana5b804b2016-01-07 00:50:27 +00004347 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4348 // default.
4349 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4350 Triple.getArch() == llvm::Triple::wasm32 ||
4351 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004352
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004353 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004354 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004355 CmdArgs.push_back("-ffunction-sections");
4356 }
4357
Peter Collingbourneceef1452016-02-24 22:03:06 +00004358 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4359 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004360 if (!D.isUsingLTO())
4361 D.Diag(diag::err_drv_argument_only_allowed_with)
4362 << "-fwhole-program-vtables"
4363 << "-flto";
4364 CmdArgs.push_back("-fwhole-program-vtables");
4365
4366 clang::SmallString<64> Path(D.ResourceDir);
4367 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4368 if (llvm::sys::fs::exists(Path)) {
4369 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4370 BlacklistOpt += Path.str();
4371 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4372 }
4373
4374 for (const Arg *A :
4375 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4376 A->claim();
4377 if (!llvm::sys::fs::exists(A->getValue()))
4378 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4379 }
4380
4381 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4382 }
4383
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004384 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4385 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004386 CmdArgs.push_back("-fdata-sections");
4387 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004388
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004389 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004390 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004391 CmdArgs.push_back("-fno-unique-section-names");
4392
Chris Lattner3c77a352010-06-22 00:03:40 +00004393 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4394
Diego Novilloa0545962015-07-10 18:00:07 +00004395 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004396
Paul Robinsond083b9a2015-12-16 17:25:27 +00004397 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4398 if (getToolChain().getTriple().isPS4CPU())
4399 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4400
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004401 // Pass options for controlling the default header search paths.
4402 if (Args.hasArg(options::OPT_nostdinc)) {
4403 CmdArgs.push_back("-nostdsysteminc");
4404 CmdArgs.push_back("-nobuiltininc");
4405 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004406 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004407 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004408 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4409 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4410 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004411
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004412 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004413 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004414 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004415
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004416 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4417
Ted Kremenekf7639e12012-03-06 20:06:33 +00004418 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004419 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004420 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004421 options::OPT_ccc_arcmt_modify,
4422 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004423 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004424 switch (A->getOption().getID()) {
4425 default:
4426 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004427 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004428 CmdArgs.push_back("-arcmt-check");
4429 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004430 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004431 CmdArgs.push_back("-arcmt-modify");
4432 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004433 case options::OPT_ccc_arcmt_migrate:
4434 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004435 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004436 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004437
4438 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4439 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004440 break;
John McCalld70fb982011-06-15 23:25:17 +00004441 }
4442 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004443 } else {
4444 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4445 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4446 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004447 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004448
Ted Kremenekf7639e12012-03-06 20:06:33 +00004449 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4450 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004451 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4452 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004453 }
4454 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004455 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004456
4457 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004458 options::OPT_objcmt_migrate_subscripting,
4459 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004460 // None specified, means enable them all.
4461 CmdArgs.push_back("-objcmt-migrate-literals");
4462 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004463 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004464 } else {
4465 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4466 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004467 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004468 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004469 } else {
4470 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4471 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4472 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4473 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4474 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4475 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004476 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004477 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4478 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4479 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4480 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4481 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4482 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4483 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004484 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004485 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004486 }
4487
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004488 // Add preprocessing options like -I, -D, etc. if we are using the
4489 // preprocessor.
4490 //
4491 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004492 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004493 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4494 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004495
Rafael Espindolaa7431922011-07-21 23:40:37 +00004496 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4497 // that "The compiler can only warn and ignore the option if not recognized".
4498 // When building with ccache, it will pass -D options to clang even on
4499 // preprocessed inputs and configure concludes that -fPIC is not supported.
4500 Args.ClaimAllArgs(options::OPT_D);
4501
Alp Toker7874bdc2013-11-15 20:40:58 +00004502 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004503 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4504 if (A->getOption().matches(options::OPT_O4)) {
4505 CmdArgs.push_back("-O3");
4506 D.Diag(diag::warn_O4_is_O3);
4507 } else {
4508 A->render(Args, CmdArgs);
4509 }
4510 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004511
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004512 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004513 for (const Arg *A :
4514 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4515 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004516 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004517 }
4518
Rafael Espindola577637a2015-01-03 00:06:04 +00004519 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004520
Richard Smith3be1cb22014-08-07 00:24:21 +00004521 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004522 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004523 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4524 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004525 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004526 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004527
4528 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004529 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004530 //
4531 // If a std is supplied, only add -trigraphs if it follows the
4532 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004533 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004534 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4535 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004536 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004537 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004538 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004539 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004540 else
4541 Std->render(Args, CmdArgs);
4542
Nico Weber00721502014-12-23 22:32:37 +00004543 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004544 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004545 options::OPT_ftrigraphs,
4546 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004547 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004548 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004549 } else {
4550 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004551 //
4552 // FIXME: Clang doesn't correctly handle -std= when the input language
4553 // doesn't match. For the time being just ignore this for C++ inputs;
4554 // eventually we want to do all the standard defaulting here instead of
4555 // splitting it between the driver and clang -cc1.
4556 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004557 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4558 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004559 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004560 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004561
Nico Weber00721502014-12-23 22:32:37 +00004562 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4563 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004564 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004565
Richard Smith282b4492013-09-04 22:50:31 +00004566 // GCC's behavior for -Wwrite-strings is a bit strange:
4567 // * In C, this "warning flag" changes the types of string literals from
4568 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4569 // for the discarded qualifier.
4570 // * In C++, this is just a normal warning flag.
4571 //
4572 // Implementing this warning correctly in C is hard, so we follow GCC's
4573 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4574 // a non-const char* in C, rather than using this crude hack.
4575 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004576 // FIXME: This should behave just like a warning flag, and thus should also
4577 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4578 Arg *WriteStrings =
4579 Args.getLastArg(options::OPT_Wwrite_strings,
4580 options::OPT_Wno_write_strings, options::OPT_w);
4581 if (WriteStrings &&
4582 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004583 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004584 }
4585
Chandler Carruth61fbf622011-04-23 09:27:53 +00004586 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004587 // during C++ compilation, which it is by default. GCC keeps this define even
4588 // in the presence of '-w', match this behavior bug-for-bug.
4589 if (types::isCXX(InputType) &&
4590 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4591 true)) {
4592 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004593 }
4594
Chandler Carruthe0391482010-05-22 02:21:53 +00004595 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4596 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4597 if (Asm->getOption().matches(options::OPT_fasm))
4598 CmdArgs.push_back("-fgnu-keywords");
4599 else
4600 CmdArgs.push_back("-fno-gnu-keywords");
4601 }
4602
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004603 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4604 CmdArgs.push_back("-fno-dwarf-directory-asm");
4605
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004606 if (ShouldDisableAutolink(Args, getToolChain()))
4607 CmdArgs.push_back("-fno-autolink");
4608
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004609 // Add in -fdebug-compilation-dir if necessary.
4610 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004611
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004612 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4613 StringRef Map = A->getValue();
4614 if (Map.find('=') == StringRef::npos)
4615 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4616 else
4617 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4618 A->claim();
4619 }
4620
Richard Smith9a568822011-11-21 19:36:32 +00004621 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4622 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004623 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004624 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004625 }
4626
Richard Smith79c927b2013-11-06 19:31:51 +00004627 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4628 CmdArgs.push_back("-foperator-arrow-depth");
4629 CmdArgs.push_back(A->getValue());
4630 }
4631
Richard Smith9a568822011-11-21 19:36:32 +00004632 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4633 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004634 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004635 }
4636
Richard Smitha3d3bd22013-05-08 02:12:03 +00004637 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4638 CmdArgs.push_back("-fconstexpr-steps");
4639 CmdArgs.push_back(A->getValue());
4640 }
4641
Richard Smithb3a14522013-02-22 01:59:51 +00004642 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4643 CmdArgs.push_back("-fbracket-depth");
4644 CmdArgs.push_back(A->getValue());
4645 }
4646
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004647 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4648 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004649 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004650 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004651 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4652 } else
4653 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004654 }
4655
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004656 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004657 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004658
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004659 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4660 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004661 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004662 }
David Chisnall5778fce2009-08-31 16:41:57 +00004663
Chris Lattnere23003d2010-01-09 21:54:33 +00004664 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4665 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004666 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004667 }
4668
Chris Lattnerb35583d2010-04-07 20:49:23 +00004669 CmdArgs.push_back("-ferror-limit");
4670 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004671 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004672 else
4673 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004674
Chandler Carrutha77a7272010-05-06 04:55:18 +00004675 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4676 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004677 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004678 }
4679
4680 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4681 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004682 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004683 }
4684
Richard Smithf6f003a2011-12-16 19:06:07 +00004685 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4686 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004687 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004688 }
4689
Nick Lewycky24653262014-12-16 21:39:02 +00004690 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4691 CmdArgs.push_back("-fspell-checking-limit");
4692 CmdArgs.push_back(A->getValue());
4693 }
4694
Daniel Dunbar2c978472009-11-04 06:24:47 +00004695 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004696 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004697 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004698 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004699 } else {
4700 // If -fmessage-length=N was not specified, determine whether this is a
4701 // terminal and, if so, implicitly define -fmessage-length appropriately.
4702 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004703 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004704 }
4705
John McCallb4a99d32013-02-19 01:57:35 +00004706 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4707 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4708 options::OPT_fvisibility_ms_compat)) {
4709 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4710 CmdArgs.push_back("-fvisibility");
4711 CmdArgs.push_back(A->getValue());
4712 } else {
4713 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4714 CmdArgs.push_back("-fvisibility");
4715 CmdArgs.push_back("hidden");
4716 CmdArgs.push_back("-ftype-visibility");
4717 CmdArgs.push_back("default");
4718 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004719 }
4720
Douglas Gregor08329632010-06-15 17:05:35 +00004721 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004722
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004723 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4724
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004725 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004726 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4727 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004728 CmdArgs.push_back("-ffreestanding");
4729
Daniel Dunbare357d562009-12-03 18:42:11 +00004730 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004731 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004732 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004733 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004734 // Emulated TLS is enabled by default on Android, and can be enabled manually
4735 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004736 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004737 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4738 EmulatedTLSDefault))
4739 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004740 // AltiVec-like language extensions aren't relevant for assembling.
4741 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004742 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004743 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4744 }
Richard Trieu91844232012-06-26 18:18:47 +00004745 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4746 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004747
Alexey Bataevdb390212015-05-20 04:24:19 +00004748 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004749 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4750 options::OPT_fno_openmp, false))
4751 switch (getOpenMPRuntime(getToolChain(), Args)) {
4752 case OMPRT_OMP:
4753 case OMPRT_IOMP5:
4754 // Clang can generate useful OpenMP code for these two runtime libraries.
4755 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004756
4757 // If no option regarding the use of TLS in OpenMP codegeneration is
4758 // given, decide a default based on the target. Otherwise rely on the
4759 // options and pass the right information to the frontend.
4760 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004761 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004762 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004763 break;
4764 default:
4765 // By default, if Clang doesn't know how to generate useful OpenMP code
4766 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4767 // down to the actual compilation.
4768 // FIXME: It would be better to have a mode which *only* omits IR
4769 // generation based on the OpenMP support so that we get consistent
4770 // semantic analysis, etc.
4771 break;
4772 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004773
Peter Collingbourne32701642013-11-01 18:16:25 +00004774 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004775 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004776
Eric Christopher459d2712013-02-19 06:16:53 +00004777 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004778 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4779 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4780 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4781 Arch == llvm::Triple::ppc64le))
4782 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4783 << "ppc/ppc64/ppc64le";
4784 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004785
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004786 // -fzvector is incompatible with -faltivec.
4787 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4788 if (Args.hasArg(options::OPT_faltivec))
4789 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4790 << "-faltivec";
4791
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004792 if (getToolChain().SupportsProfiling())
4793 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004794
4795 // -flax-vector-conversions is default.
4796 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4797 options::OPT_fno_lax_vector_conversions))
4798 CmdArgs.push_back("-fno-lax-vector-conversions");
4799
John Brawna7b4ec02015-08-10 11:11:28 +00004800 if (Args.getLastArg(options::OPT_fapple_kext) ||
4801 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004802 CmdArgs.push_back("-fapple-kext");
4803
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004804 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004805 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004806 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004807 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4808 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004809
4810 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4811 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004812 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004813 }
4814
Bob Wilson14adb362012-02-03 06:27:22 +00004815 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004816
Chandler Carruth6e501032011-03-27 00:04:55 +00004817 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4818 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004819 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004820 if (A->getOption().matches(options::OPT_fwrapv))
4821 CmdArgs.push_back("-fwrapv");
4822 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4823 options::OPT_fno_strict_overflow)) {
4824 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4825 CmdArgs.push_back("-fwrapv");
4826 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004827
4828 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4829 options::OPT_fno_reroll_loops))
4830 if (A->getOption().matches(options::OPT_freroll_loops))
4831 CmdArgs.push_back("-freroll-loops");
4832
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004833 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004834 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4835 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004836
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004837 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4838
Daniel Dunbar4930e332009-11-17 08:07:36 +00004839 // -stack-protector=0 is default.
4840 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004841 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4842 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4843 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4844 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4845 Args.ClaimAllArgs(options::OPT_fstack_protector);
4846 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004847 options::OPT_fstack_protector_all,
4848 options::OPT_fstack_protector_strong,
4849 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004850 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004851 StackProtectorLevel = std::max<unsigned>(
4852 LangOptions::SSPOn,
4853 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004854 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004855 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004856 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004857 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004858 } else {
4859 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004860 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004861 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004862 if (StackProtectorLevel) {
4863 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004864 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004865 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004866
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004867 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004868 for (const Arg *A : Args.filtered(options::OPT__param)) {
4869 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004870 if (Str.startswith("ssp-buffer-size=")) {
4871 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004872 CmdArgs.push_back("-stack-protector-buffer-size");
4873 // FIXME: Verify the argument is a valid integer.
4874 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004875 }
Sean Silva14facf32015-06-09 01:57:17 +00004876 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004877 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004878 }
4879
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004880 // Translate -mstackrealign
4881 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004882 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004883 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004884
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004885 if (Args.hasArg(options::OPT_mstack_alignment)) {
4886 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4887 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004888 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004889
Hans Wennborg77dc2362015-01-20 19:45:50 +00004890 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4891 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4892
4893 if (!Size.empty())
4894 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4895 else
4896 CmdArgs.push_back("-mstack-probe-size=0");
4897 }
4898
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004899 switch (getToolChain().getArch()) {
4900 case llvm::Triple::aarch64:
4901 case llvm::Triple::aarch64_be:
4902 case llvm::Triple::arm:
4903 case llvm::Triple::armeb:
4904 case llvm::Triple::thumb:
4905 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004906 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004907 break;
4908
4909 default:
4910 break;
4911 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004912
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004913 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4914 options::OPT_mno_restrict_it)) {
4915 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4916 CmdArgs.push_back("-backend-option");
4917 CmdArgs.push_back("-arm-restrict-it");
4918 } else {
4919 CmdArgs.push_back("-backend-option");
4920 CmdArgs.push_back("-arm-no-restrict-it");
4921 }
James Y Knight2db38f32015-08-15 03:45:25 +00004922 } else if (Triple.isOSWindows() &&
4923 (Triple.getArch() == llvm::Triple::arm ||
4924 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004925 // Windows on ARM expects restricted IT blocks
4926 CmdArgs.push_back("-backend-option");
4927 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004928 }
4929
Daniel Dunbard18049a2009-04-07 21:16:11 +00004930 // Forward -f options with positive and negative forms; we translate
4931 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004932 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4933 StringRef fname = A->getValue();
4934 if (!llvm::sys::fs::exists(fname))
4935 D.Diag(diag::err_drv_no_such_file) << fname;
4936 else
4937 A->render(Args, CmdArgs);
4938 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004939
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004940 // -fbuiltin is default unless -mkernel is used.
4941 bool UseBuiltins =
4942 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4943 !Args.hasArg(options::OPT_mkernel));
4944 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004945 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004946
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004947 // -ffreestanding implies -fno-builtin.
4948 if (Args.hasArg(options::OPT_ffreestanding))
4949 UseBuiltins = false;
4950
4951 // Process the -fno-builtin-* options.
4952 for (const auto &Arg : Args) {
4953 const Option &O = Arg->getOption();
4954 if (!O.matches(options::OPT_fno_builtin_))
4955 continue;
4956
4957 Arg->claim();
4958 // If -fno-builtin is specified, then there's no need to pass the option to
4959 // the frontend.
4960 if (!UseBuiltins)
4961 continue;
4962
4963 StringRef FuncName = Arg->getValue();
4964 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4965 }
4966
Nuno Lopes13c88c72009-12-16 16:59:22 +00004967 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4968 options::OPT_fno_assume_sane_operator_new))
4969 CmdArgs.push_back("-fno-assume-sane-operator-new");
4970
Daniel Dunbar4930e332009-11-17 08:07:36 +00004971 // -fblocks=0 is default.
4972 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004973 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004974 (Args.hasArg(options::OPT_fgnu_runtime) &&
4975 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4976 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004977 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004978
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004979 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004980 !getToolChain().hasBlocksRuntime())
4981 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004982 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004983
Richard Smith47972af2015-06-16 00:08:24 +00004984 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004985 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004986 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004987 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004988 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004989 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4990 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004991 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004992 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004993 HaveModules = true;
4994 }
4995 }
4996
Richard Smith47972af2015-06-16 00:08:24 +00004997 // -fmodule-maps enables implicit reading of module map files. By default,
4998 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004999 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5000 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005001 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005002 }
5003
Daniel Jasperac42b752013-10-21 06:34:34 +00005004 // -fmodules-decluse checks that modules used are declared so (off by
5005 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005006 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005007 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005008 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005009 }
5010
Daniel Jasper962b38e2014-04-11 11:47:45 +00005011 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5012 // all #included headers are part of modules.
5013 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005014 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005015 CmdArgs.push_back("-fmodules-strict-decluse");
5016 }
5017
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005018 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5019 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5020 options::OPT_fno_implicit_modules)) {
5021 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005022 } else if (HaveModules) {
5023 // -fmodule-cache-path specifies where our implicitly-built module files
5024 // should be written.
5025 SmallString<128> Path;
5026 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5027 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005028 if (C.isForDiagnostics()) {
5029 // When generating crash reports, we want to emit the modules along with
5030 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005031 Path = Output.getFilename();
5032 llvm::sys::path::replace_extension(Path, ".cache");
5033 llvm::sys::path::append(Path, "modules");
5034 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005035 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005036 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005037 llvm::sys::path::append(Path, "org.llvm.clang.");
5038 appendUserToPath(Path);
5039 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005040 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005041 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005042 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5043 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005044 }
5045
Richard Smith8d83d6d2016-03-21 19:06:06 +00005046 // -fmodule-name specifies the module that is currently being built (or
5047 // used for header checking by -fmodule-maps).
5048 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5049
5050 // -fmodule-map-file can be used to specify files containing module
5051 // definitions.
5052 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5053
5054 // -fmodule-file can be used to specify files containing precompiled modules.
5055 if (HaveModules)
5056 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5057 else
5058 Args.ClaimAllArgs(options::OPT_fmodule_file);
5059
Justin Bognera88f0122014-06-20 22:59:50 +00005060 // When building modules and generating crashdumps, we need to dump a module
5061 // dependency VFS alongside the output.
5062 if (HaveModules && C.isForDiagnostics()) {
5063 SmallString<128> VFSDir(Output.getFilename());
5064 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005065 // Add the cache directory as a temp so the crash diagnostics pick it up.
5066 C.addTempFile(Args.MakeArgString(VFSDir));
5067
Justin Bognera88f0122014-06-20 22:59:50 +00005068 llvm::sys::path::append(VFSDir, "vfs");
5069 CmdArgs.push_back("-module-dependency-dir");
5070 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005071 }
5072
Richard Smith9887d792014-10-17 01:42:53 +00005073 if (HaveModules)
5074 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005075
Douglas Gregor35b04d62013-02-07 19:01:24 +00005076 // Pass through all -fmodules-ignore-macro arguments.
5077 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005078 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5079 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005080
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005081 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5082
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005083 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5084 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5085 D.Diag(diag::err_drv_argument_not_allowed_with)
5086 << A->getAsString(Args) << "-fbuild-session-timestamp";
5087
5088 llvm::sys::fs::file_status Status;
5089 if (llvm::sys::fs::status(A->getValue(), Status))
5090 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005091 CmdArgs.push_back(Args.MakeArgString(
5092 "-fbuild-session-timestamp=" +
5093 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005094 }
5095
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005096 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005097 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5098 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005099 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5100
5101 Args.AddLastArg(CmdArgs,
5102 options::OPT_fmodules_validate_once_per_build_session);
5103 }
5104
Ben Langmuirdcf73862014-03-12 00:06:17 +00005105 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5106
John McCalldfea9982010-04-09 19:12:06 +00005107 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005108 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005109 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005110 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005111
Anders Carlssond470fef2010-11-21 00:09:52 +00005112 // -felide-constructors is the default.
5113 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005114 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005115 CmdArgs.push_back("-fno-elide-constructors");
5116
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005117 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005118
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005119 if (KernelOrKext || (types::isCXX(InputType) &&
5120 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5121 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005122 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005123
Tony Linthicum76329bf2011-12-12 21:14:55 +00005124 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005125 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5126 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005127 CmdArgs.push_back("-fshort-enums");
5128
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005129 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005130 if (Arg *A = Args.getLastArg(
5131 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5132 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5133 if (A->getOption().matches(options::OPT_funsigned_char) ||
5134 A->getOption().matches(options::OPT_fno_signed_char)) {
5135 CmdArgs.push_back("-fno-signed-char");
5136 }
5137 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005138 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005139 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005140
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005141 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005142 if (!Args.hasFlag(
5143 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5144 !IsWindowsCygnus && !IsWindowsGNU &&
5145 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5146 getToolChain().getArch() != llvm::Triple::hexagon &&
5147 getToolChain().getArch() != llvm::Triple::xcore &&
5148 ((getToolChain().getTriple().getVendor() !=
5149 llvm::Triple::MipsTechnologies) ||
5150 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005151 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005152 CmdArgs.push_back("-fno-use-cxa-atexit");
5153
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005154 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005155 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005156 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005157 CmdArgs.push_back("-fms-extensions");
5158
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005159 // -fno-use-line-directives is default.
5160 if (Args.hasFlag(options::OPT_fuse_line_directives,
5161 options::OPT_fno_use_line_directives, false))
5162 CmdArgs.push_back("-fuse-line-directives");
5163
Francois Pichet1b4f1632011-09-17 04:32:15 +00005164 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005165 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005166 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005167 (IsWindowsMSVC &&
5168 Args.hasFlag(options::OPT_fms_extensions,
5169 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005170 CmdArgs.push_back("-fms-compatibility");
5171
David Majnemerc371ff02015-03-22 08:39:22 +00005172 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005173 VersionTuple MSVT = visualstudio::getMSVCVersion(
5174 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5175 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005176 CmdArgs.push_back(
5177 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005178
David Majnemer8db91762015-05-18 04:49:30 +00005179 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5180 if (ImplyVCPPCXXVer) {
5181 if (IsMSVC2015Compatible)
5182 CmdArgs.push_back("-std=c++14");
5183 else
5184 CmdArgs.push_back("-std=c++11");
5185 }
5186
Eric Christopher5ecce122013-02-18 00:38:31 +00005187 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005188 if (Args.hasFlag(options::OPT_fborland_extensions,
5189 options::OPT_fno_borland_extensions, false))
5190 CmdArgs.push_back("-fborland-extensions");
5191
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005192 // -fno-declspec is default, except for PS4.
5193 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5194 getToolChain().getTriple().isPS4()))
5195 CmdArgs.push_back("-fdeclspec");
5196 else if (Args.hasArg(options::OPT_fno_declspec))
5197 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5198
David Majnemerc371ff02015-03-22 08:39:22 +00005199 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5200 // than 19.
5201 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5202 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005203 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005204 CmdArgs.push_back("-fno-threadsafe-statics");
5205
Francois Pichet02744872011-09-01 16:38:08 +00005206 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5207 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005208 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005209 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005210 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005211
Chandler Carruthe03aa552010-04-17 20:17:31 +00005212 // -fgnu-keywords default varies depending on language; only pass if
5213 // specified.
5214 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005215 options::OPT_fno_gnu_keywords))
5216 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005217
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005218 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005219 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005220 CmdArgs.push_back("-fgnu89-inline");
5221
Chad Rosier9c76d242012-03-15 22:31:42 +00005222 if (Args.hasArg(options::OPT_fno_inline))
5223 CmdArgs.push_back("-fno-inline");
5224
Chad Rosier64d6be92012-03-06 21:17:19 +00005225 if (Args.hasArg(options::OPT_fno_inline_functions))
5226 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005227
John McCall5fb5df92012-06-20 06:18:46 +00005228 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005229
John McCall5fb5df92012-06-20 06:18:46 +00005230 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005231 // legacy is the default. Except for deployment taget of 10.5,
5232 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5233 // gets ignored silently.
5234 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005235 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5236 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005237 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005238 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005239 if (getToolChain().UseObjCMixedDispatch())
5240 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5241 else
5242 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5243 }
5244 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005245
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005246 // When ObjectiveC legacy runtime is in effect on MacOSX,
5247 // turn on the option to do Array/Dictionary subscripting
5248 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005249 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005250 getToolChain().getTriple().isMacOSX() &&
5251 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5252 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005253 objcRuntime.isNeXTFamily())
5254 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005255
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005256 // -fencode-extended-block-signature=1 is default.
5257 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5258 CmdArgs.push_back("-fencode-extended-block-signature");
5259 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005260
John McCall24fc0de2011-07-06 00:26:06 +00005261 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5262 // NOTE: This logic is duplicated in ToolChains.cpp.
5263 bool ARC = isObjCAutoRefCount(Args);
5264 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005265 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005266
John McCall24fc0de2011-07-06 00:26:06 +00005267 CmdArgs.push_back("-fobjc-arc");
5268
Chandler Carruth491db322011-11-04 07:34:47 +00005269 // FIXME: It seems like this entire block, and several around it should be
5270 // wrapped in isObjC, but for now we just use it here as this is where it
5271 // was being used previously.
5272 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5273 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5274 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5275 else
5276 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5277 }
5278
John McCall24fc0de2011-07-06 00:26:06 +00005279 // Allow the user to enable full exceptions code emission.
5280 // We define off for Objective-CC, on for Objective-C++.
5281 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5282 options::OPT_fno_objc_arc_exceptions,
5283 /*default*/ types::isCXX(InputType)))
5284 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005285
John McCall24fc0de2011-07-06 00:26:06 +00005286 }
5287
5288 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5289 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005290 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005291 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005292
John McCall24fc0de2011-07-06 00:26:06 +00005293 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5294 // takes precedence.
5295 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5296 if (!GCArg)
5297 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5298 if (GCArg) {
5299 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005300 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005301 } else if (getToolChain().SupportsObjCGC()) {
5302 GCArg->render(Args, CmdArgs);
5303 } else {
5304 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005305 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005306 }
5307 }
5308
John McCallfbe5ed72015-11-05 19:19:56 +00005309 // Pass down -fobjc-weak or -fno-objc-weak if present.
5310 if (types::isObjC(InputType)) {
5311 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5312 options::OPT_fno_objc_weak);
5313 if (!WeakArg) {
5314 // nothing to do
5315 } else if (GCArg) {
5316 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5317 D.Diag(diag::err_objc_weak_with_gc);
5318 } else if (!objcRuntime.allowsWeak()) {
5319 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5320 D.Diag(diag::err_objc_weak_unsupported);
5321 } else {
5322 WeakArg->render(Args, CmdArgs);
5323 }
5324 }
5325
Bob Wilsonb111ec92015-03-02 19:01:14 +00005326 if (Args.hasFlag(options::OPT_fapplication_extension,
5327 options::OPT_fno_application_extension, false))
5328 CmdArgs.push_back("-fapplication-extension");
5329
Reid Klecknerc542d372014-06-27 17:02:02 +00005330 // Handle GCC-style exception args.
5331 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005332 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5333 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005334
Tim Northovere931f9f2015-10-30 16:30:41 +00005335 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005336 CmdArgs.push_back("-fsjlj-exceptions");
5337
5338 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005339 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5340 options::OPT_fno_assume_sane_operator_new))
5341 CmdArgs.push_back("-fno-assume-sane-operator-new");
5342
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005343 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5344 // most platforms.
5345 if (Args.hasFlag(options::OPT_fsized_deallocation,
5346 options::OPT_fno_sized_deallocation, false))
5347 CmdArgs.push_back("-fsized-deallocation");
5348
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005349 // -fconstant-cfstrings is default, and may be subject to argument translation
5350 // on Darwin.
5351 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5352 options::OPT_fno_constant_cfstrings) ||
5353 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5354 options::OPT_mno_constant_cfstrings))
5355 CmdArgs.push_back("-fno-constant-cfstrings");
5356
John Thompsoned4e2952009-11-05 20:14:16 +00005357 // -fshort-wchar default varies depending on platform; only
5358 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005359 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5360 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005361 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005362
Hans Wennborg28c96312013-07-31 23:39:13 +00005363 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005364 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005365 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005366 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005367
Daniel Dunbar096ed292011-10-05 21:04:55 +00005368 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5369 // -fno-pack-struct doesn't apply to -fpack-struct=.
5370 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005371 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005372 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005373 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005374 } else if (Args.hasFlag(options::OPT_fpack_struct,
5375 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005376 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005377 }
5378
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005379 // Handle -fmax-type-align=N and -fno-type-align
5380 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5381 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5382 if (!SkipMaxTypeAlign) {
5383 std::string MaxTypeAlignStr = "-fmax-type-align=";
5384 MaxTypeAlignStr += A->getValue();
5385 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5386 }
5387 } else if (getToolChain().getTriple().isOSDarwin()) {
5388 if (!SkipMaxTypeAlign) {
5389 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5390 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5391 }
5392 }
5393
John Brawna7b4ec02015-08-10 11:11:28 +00005394 // -fcommon is the default unless compiling kernel code or the target says so
5395 bool NoCommonDefault =
5396 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5397 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5398 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005399 CmdArgs.push_back("-fno-common");
5400
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005401 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005402 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005403 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005404 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005405 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005406 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005407
Daniel Dunbar6358d682010-10-15 22:30:42 +00005408 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005409 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005410 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005411 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005412
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005413 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005414 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5415 StringRef value = inputCharset->getValue();
5416 if (value != "UTF-8")
5417 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5418 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005419 }
5420
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005421 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005422 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5423 StringRef value = execCharset->getValue();
5424 if (value != "UTF-8")
5425 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5426 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005427 }
5428
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005429 // -fcaret-diagnostics is default.
5430 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5431 options::OPT_fno_caret_diagnostics, true))
5432 CmdArgs.push_back("-fno-caret-diagnostics");
5433
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005434 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005435 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005436 options::OPT_fno_diagnostics_fixit_info))
5437 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005438
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005439 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005440 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005441 options::OPT_fno_diagnostics_show_option))
5442 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005443
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005444 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005445 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005446 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005447 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005448 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005449
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005450 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005451 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005452 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005453 }
5454
Chandler Carruthb6766f02011-03-27 01:50:55 +00005455 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005456 options::OPT_fdiagnostics_show_note_include_stack,
5457 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005458 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005459 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005460 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5461 else
5462 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5463 }
5464
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005465 // Color diagnostics are the default, unless the terminal doesn't support
5466 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005467 // Support both clang's -f[no-]color-diagnostics and gcc's
5468 // -f[no-]diagnostics-colors[=never|always|auto].
5469 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005470 for (const auto &Arg : Args) {
5471 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005472 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5473 !O.matches(options::OPT_fdiagnostics_color) &&
5474 !O.matches(options::OPT_fno_color_diagnostics) &&
5475 !O.matches(options::OPT_fno_diagnostics_color) &&
5476 !O.matches(options::OPT_fdiagnostics_color_EQ))
5477 continue;
5478
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005479 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005480 if (O.matches(options::OPT_fcolor_diagnostics) ||
5481 O.matches(options::OPT_fdiagnostics_color)) {
5482 ShowColors = Colors_On;
5483 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5484 O.matches(options::OPT_fno_diagnostics_color)) {
5485 ShowColors = Colors_Off;
5486 } else {
5487 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005488 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005489 if (value == "always")
5490 ShowColors = Colors_On;
5491 else if (value == "never")
5492 ShowColors = Colors_Off;
5493 else if (value == "auto")
5494 ShowColors = Colors_Auto;
5495 else
5496 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005497 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005498 }
5499 }
5500 if (ShowColors == Colors_On ||
5501 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005502 CmdArgs.push_back("-fcolor-diagnostics");
5503
Nico Rieck7857d462013-09-11 00:38:02 +00005504 if (Args.hasArg(options::OPT_fansi_escape_codes))
5505 CmdArgs.push_back("-fansi-escape-codes");
5506
Daniel Dunbardb097022009-06-08 21:13:54 +00005507 if (!Args.hasFlag(options::OPT_fshow_source_location,
5508 options::OPT_fno_show_source_location))
5509 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005510
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005511 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005512 true))
5513 CmdArgs.push_back("-fno-show-column");
5514
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005515 if (!Args.hasFlag(options::OPT_fspell_checking,
5516 options::OPT_fno_spell_checking))
5517 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005518
Chad Rosierc8e56e82012-12-05 21:08:21 +00005519 // -fno-asm-blocks is default.
5520 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5521 false))
5522 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005523
Steven Wucb0d13f2015-01-16 23:05:28 +00005524 // -fgnu-inline-asm is default.
5525 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5526 options::OPT_fno_gnu_inline_asm, true))
5527 CmdArgs.push_back("-fno-gnu-inline-asm");
5528
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005529 // Enable vectorization per default according to the optimization level
5530 // selected. For optimization levels that want vectorization we use the alias
5531 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005532 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005533 OptSpecifier VectorizeAliasOption =
5534 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005535 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005536 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005537 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005538
Chad Rosier136d67d2014-04-28 19:30:57 +00005539 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005540 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005541 OptSpecifier SLPVectAliasOption =
5542 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005543 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005544 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005545 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005546
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005547 // -fno-slp-vectorize-aggressive is default.
5548 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005549 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005550 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005551
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005552 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5553 A->render(Args, CmdArgs);
5554
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005555 // -fdollars-in-identifiers default varies depending on platform and
5556 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005557 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005558 options::OPT_fno_dollars_in_identifiers)) {
5559 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005560 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005561 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005562 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005563 }
5564
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005565 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5566 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005567 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005568 options::OPT_fno_unit_at_a_time)) {
5569 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005570 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005571 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005572
Eli Friedman055c9702011-11-02 01:53:16 +00005573 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5574 options::OPT_fno_apple_pragma_pack, false))
5575 CmdArgs.push_back("-fapple-pragma-pack");
5576
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005577 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005578 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5579 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005580 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005581 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005582 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005583
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005584// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5585//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005586// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005587#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005588 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005589 (getToolChain().getArch() == llvm::Triple::arm ||
5590 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005591 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5592 CmdArgs.push_back("-fno-builtin-strcat");
5593 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5594 CmdArgs.push_back("-fno-builtin-strcpy");
5595 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005596#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005597
Justin Bognera88f0122014-06-20 22:59:50 +00005598 // Enable rewrite includes if the user's asked for it or if we're generating
5599 // diagnostics.
5600 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5601 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005602 if (Args.hasFlag(options::OPT_frewrite_includes,
5603 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005604 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005605 CmdArgs.push_back("-frewrite-includes");
5606
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005607 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005608 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005609 options::OPT_traditional_cpp)) {
5610 if (isa<PreprocessJobAction>(JA))
5611 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005612 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005613 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005614 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005615
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005616 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005617 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005618
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005619 // Handle serialized diagnostics.
5620 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5621 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005622 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005623 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005624
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005625 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5626 CmdArgs.push_back("-fretain-comments-from-system-headers");
5627
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005628 // Forward -fcomment-block-commands to -cc1.
5629 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005630 // Forward -fparse-all-comments to -cc1.
5631 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005632
John Brawnad31ace2015-09-23 13:55:40 +00005633 // Turn -fplugin=name.so into -load name.so
5634 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5635 CmdArgs.push_back("-load");
5636 CmdArgs.push_back(A->getValue());
5637 A->claim();
5638 }
5639
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005640 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5641 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005642 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005643 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5644 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005645
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005646 // We translate this by hand to the -cc1 argument, since nightly test uses
5647 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005648 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005649 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005650 } else
Sean Silva14facf32015-06-09 01:57:17 +00005651 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005652 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005653
Bob Wilson23a55f12014-12-21 07:00:00 +00005654 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005655 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5656 // by the frontend.
5657 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5658 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005659
Daniel Dunbard67a3222009-03-30 06:36:42 +00005660 if (Output.getType() == types::TY_Dependencies) {
5661 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005662 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005663 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005664 CmdArgs.push_back(Output.getFilename());
5665 } else {
5666 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005667 }
5668
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005669 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005670
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005671 if (Input.isFilename())
5672 CmdArgs.push_back(Input.getFilename());
5673 else
5674 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005675
Chris Lattnere9d7d782009-11-03 19:50:27 +00005676 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5677
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005678 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005679
5680 // Optionally embed the -cc1 level arguments into the debug info, for build
5681 // analysis.
5682 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005683 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005684 for (const auto &Arg : Args)
5685 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005686
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005687 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005688 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005689 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005690 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005691 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005692 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005693 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005694 }
5695 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005696 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005697 }
5698
Eric Christopherd3804002013-02-22 20:12:52 +00005699 // Add the split debug info name to the command lines here so we
5700 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005701 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005702 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5703 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005704 const char *SplitDwarfOut;
5705 if (SplitDwarf) {
5706 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005707 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005708 CmdArgs.push_back(SplitDwarfOut);
5709 }
5710
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005711 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5712 // Include them with -fcuda-include-gpubinary.
5713 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005714 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005715 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005716 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005717 }
5718
Eric Christopherd3804002013-02-22 20:12:52 +00005719 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005720 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005721 Output.getType() == types::TY_Object &&
5722 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005723 auto CLCommand =
5724 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005725 C.addCommand(llvm::make_unique<FallbackCommand>(
5726 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005727 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5728 isa<PrecompileJobAction>(JA)) {
5729 // In /fallback builds, run the main compilation even if the pch generation
5730 // fails, so that the main compilation's fallback to cl.exe runs.
5731 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5732 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005733 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005734 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005735 }
5736
Eric Christopherf1545832013-02-22 23:50:16 +00005737 // Handle the debug info splitting at object creation time if we're
5738 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005739 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005740 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005741 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005742
Roman Divacky178e01602011-02-10 16:52:03 +00005743 if (Arg *A = Args.getLastArg(options::OPT_pg))
5744 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005745 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5746 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005747
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005748 // Claim some arguments which clang supports automatically.
5749
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005750 // -fpch-preprocess is used with gcc to add a special marker in the output to
5751 // include the PCH file. Clang's PTH solution is completely transparent, so we
5752 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005753 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005754
Daniel Dunbar17731772009-03-23 19:03:36 +00005755 // Claim some arguments which clang doesn't support, but we don't
5756 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005757 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5758 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005759
Rafael Espindolab0092d72013-09-04 19:37:35 +00005760 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005761 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005762}
5763
John McCall5fb5df92012-06-20 06:18:46 +00005764/// Add options related to the Objective-C runtime/ABI.
5765///
5766/// Returns true if the runtime is non-fragile.
5767ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5768 ArgStringList &cmdArgs,
5769 RewriteKind rewriteKind) const {
5770 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005771 Arg *runtimeArg =
5772 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5773 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005774
5775 // Just forward -fobjc-runtime= to the frontend. This supercedes
5776 // options about fragility.
5777 if (runtimeArg &&
5778 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5779 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005780 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005781 if (runtime.tryParse(value)) {
5782 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005783 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005784 }
5785
5786 runtimeArg->render(args, cmdArgs);
5787 return runtime;
5788 }
5789
5790 // Otherwise, we'll need the ABI "version". Version numbers are
5791 // slightly confusing for historical reasons:
5792 // 1 - Traditional "fragile" ABI
5793 // 2 - Non-fragile ABI, version 1
5794 // 3 - Non-fragile ABI, version 2
5795 unsigned objcABIVersion = 1;
5796 // If -fobjc-abi-version= is present, use that to set the version.
5797 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005798 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005799 if (value == "1")
5800 objcABIVersion = 1;
5801 else if (value == "2")
5802 objcABIVersion = 2;
5803 else if (value == "3")
5804 objcABIVersion = 3;
5805 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005806 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005807 } else {
5808 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005809 bool nonFragileABIIsDefault =
5810 (rewriteKind == RK_NonFragile ||
5811 (rewriteKind == RK_None &&
5812 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005813 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5814 options::OPT_fno_objc_nonfragile_abi,
5815 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005816// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005817#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5818 unsigned nonFragileABIVersion = 1;
5819#else
5820 unsigned nonFragileABIVersion = 2;
5821#endif
5822
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005823 if (Arg *abiArg =
5824 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005825 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005826 if (value == "1")
5827 nonFragileABIVersion = 1;
5828 else if (value == "2")
5829 nonFragileABIVersion = 2;
5830 else
5831 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005832 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005833 }
5834
5835 objcABIVersion = 1 + nonFragileABIVersion;
5836 } else {
5837 objcABIVersion = 1;
5838 }
5839 }
5840
5841 // We don't actually care about the ABI version other than whether
5842 // it's non-fragile.
5843 bool isNonFragile = objcABIVersion != 1;
5844
5845 // If we have no runtime argument, ask the toolchain for its default runtime.
5846 // However, the rewriter only really supports the Mac runtime, so assume that.
5847 ObjCRuntime runtime;
5848 if (!runtimeArg) {
5849 switch (rewriteKind) {
5850 case RK_None:
5851 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5852 break;
5853 case RK_Fragile:
5854 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5855 break;
5856 case RK_NonFragile:
5857 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5858 break;
5859 }
5860
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005861 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005862 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5863 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005864 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005865 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5866
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005867 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005868 } else {
5869 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5870 }
5871
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005872 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005873 } else {
5874 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005875 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005876 // non-fragile mode or the GCC runtime in fragile mode.
5877 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005878 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005879 else
5880 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005881 }
5882
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005883 cmdArgs.push_back(
5884 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005885 return runtime;
5886}
5887
Reid Klecknerc542d372014-06-27 17:02:02 +00005888static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5889 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5890 I += HaveDash;
5891 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005892}
Reid Klecknerc542d372014-06-27 17:02:02 +00005893
Benjamin Kramere003ca22015-10-28 13:54:16 +00005894namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005895struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005896 bool Synch = false;
5897 bool Asynch = false;
5898 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005899};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005900} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005901
5902/// /EH controls whether to run destructor cleanups when exceptions are
5903/// thrown. There are three modifiers:
5904/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5905/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5906/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005907/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005908/// The default is /EHs-c-, meaning cleanups are disabled.
5909static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5910 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005911
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005912 std::vector<std::string> EHArgs =
5913 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005914 for (auto EHVal : EHArgs) {
5915 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5916 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005917 case 'a':
5918 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005919 if (EH.Asynch)
5920 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005921 continue;
5922 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005923 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005924 continue;
5925 case 's':
5926 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005927 if (EH.Synch)
5928 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005929 continue;
5930 default:
5931 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005932 }
5933 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5934 break;
5935 }
5936 }
David Majnemerb8809092016-02-20 09:23:44 +00005937 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005938 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005939 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005940 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5941 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005942 EH.Synch = true;
5943 EH.NoUnwindC = true;
5944 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005945
Reid Klecknerc542d372014-06-27 17:02:02 +00005946 return EH;
5947}
5948
David Majnemercd5855e2016-02-29 01:40:36 +00005949void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
5950 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005951 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005952 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005953 unsigned RTOptionID = options::OPT__SLASH_MT;
5954
Hans Wennborgf1a74252013-09-10 20:18:04 +00005955 if (Args.hasArg(options::OPT__SLASH_LDd))
5956 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5957 // but defining _DEBUG is sticky.
5958 RTOptionID = options::OPT__SLASH_MTd;
5959
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005960 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005961 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005962
David Majnemere2afb472015-07-24 06:49:13 +00005963 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005964 switch (RTOptionID) {
5965 case options::OPT__SLASH_MD:
5966 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005967 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005968 CmdArgs.push_back("-D_MT");
5969 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005970 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005971 break;
5972 case options::OPT__SLASH_MDd:
5973 CmdArgs.push_back("-D_DEBUG");
5974 CmdArgs.push_back("-D_MT");
5975 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005976 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005977 break;
5978 case options::OPT__SLASH_MT:
5979 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005980 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005981 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005982 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005983 break;
5984 case options::OPT__SLASH_MTd:
5985 CmdArgs.push_back("-D_DEBUG");
5986 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005987 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005988 break;
5989 default:
5990 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005991 }
5992
David Majnemere2afb472015-07-24 06:49:13 +00005993 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5994 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5995 } else {
5996 CmdArgs.push_back(FlagForCRT.data());
5997
5998 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5999 // users want. The /Za flag to cl.exe turns this off, but it's not
6000 // implemented in clang.
6001 CmdArgs.push_back("--dependent-lib=oldnames");
6002 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006003
Hans Wennborg8858a032014-07-21 23:42:07 +00006004 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6005 // would produce interleaved output, so ignore /showIncludes in such cases.
6006 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6007 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6008 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006009
David Majnemerf6072342014-07-01 22:24:56 +00006010 // This controls whether or not we emit RTTI data for polymorphic types.
6011 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6012 /*default=*/false))
6013 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006014
Reid Kleckner124955a2015-08-05 18:51:13 +00006015 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006016 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006017 if (*EmitCodeView)
6018 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006019 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006020 CmdArgs.push_back("-gcodeview");
6021
Reid Klecknerc542d372014-06-27 17:02:02 +00006022 const Driver &D = getToolChain().getDriver();
6023 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006024 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006025 if (types::isCXX(InputType))
6026 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006027 CmdArgs.push_back("-fexceptions");
6028 }
David Majnemercd5855e2016-02-29 01:40:36 +00006029 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6030 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006031
Hans Wennborge50cec32014-06-13 20:59:54 +00006032 // /EP should expand to -E -P.
6033 if (Args.hasArg(options::OPT__SLASH_EP)) {
6034 CmdArgs.push_back("-E");
6035 CmdArgs.push_back("-P");
6036 }
6037
David Majnemera5b195a2015-02-14 01:35:12 +00006038 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006039 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6040 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006041 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6042 else
6043 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6044
6045 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6046 VolatileOptionID = A->getOption().getID();
6047
6048 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6049 CmdArgs.push_back("-fms-volatile");
6050
David Majnemer86c318f2014-02-11 21:05:00 +00006051 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6052 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6053 if (MostGeneralArg && BestCaseArg)
6054 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6055 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6056
6057 if (MostGeneralArg) {
6058 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6059 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6060 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6061
6062 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6063 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6064 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6065 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6066 << FirstConflict->getAsString(Args)
6067 << SecondConflict->getAsString(Args);
6068
6069 if (SingleArg)
6070 CmdArgs.push_back("-fms-memptr-rep=single");
6071 else if (MultipleArg)
6072 CmdArgs.push_back("-fms-memptr-rep=multiple");
6073 else
6074 CmdArgs.push_back("-fms-memptr-rep=virtual");
6075 }
6076
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006077 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6078 A->render(Args, CmdArgs);
6079
Hans Wennborg81f74482013-09-10 01:07:07 +00006080 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6081 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006082 if (Args.hasArg(options::OPT__SLASH_fallback))
6083 CmdArgs.push_back("msvc-fallback");
6084 else
6085 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006086 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006087}
6088
Douglas Katzman95354292015-06-23 20:42:09 +00006089visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006090 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006091 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006092 return CLFallback.get();
6093}
6094
Daniel Sanders7f933f42015-01-30 17:35:23 +00006095void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6096 ArgStringList &CmdArgs) const {
6097 StringRef CPUName;
6098 StringRef ABIName;
6099 const llvm::Triple &Triple = getToolChain().getTriple();
6100 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6101
6102 CmdArgs.push_back("-target-abi");
6103 CmdArgs.push_back(ABIName.data());
6104}
6105
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006106void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006107 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006108 const ArgList &Args,
6109 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006110 ArgStringList CmdArgs;
6111
6112 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6113 const InputInfo &Input = Inputs[0];
6114
James Y Knight2db38f32015-08-15 03:45:25 +00006115 std::string TripleStr =
6116 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6117 const llvm::Triple Triple(TripleStr);
6118
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006119 // Don't warn about "clang -w -c foo.s"
6120 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006121 // and "clang -emit-llvm -c foo.s"
6122 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006123
Rafael Espindola577637a2015-01-03 00:06:04 +00006124 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006125
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006126 // Invoke ourselves in -cc1as mode.
6127 //
6128 // FIXME: Implement custom jobs for internal actions.
6129 CmdArgs.push_back("-cc1as");
6130
6131 // Add the "effective" target triple.
6132 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006133 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6134
6135 // Set the output mode, we currently only expect to be used as a real
6136 // assembler.
6137 CmdArgs.push_back("-filetype");
6138 CmdArgs.push_back("obj");
6139
Eric Christopher45f2e712012-12-18 00:31:10 +00006140 // Set the main file name, so that debug info works even with
6141 // -save-temps or preprocessed assembly.
6142 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006143 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006144
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006145 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006146 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006147 if (!CPU.empty()) {
6148 CmdArgs.push_back("-target-cpu");
6149 CmdArgs.push_back(Args.MakeArgString(CPU));
6150 }
6151
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006152 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006153 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006154
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006155 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006156 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006157
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006158 // Pass along any -I options so we get proper .include search paths.
6159 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6160
Eric Christopherfc3ee562012-01-10 00:38:01 +00006161 // Determine the original source input.
6162 const Action *SourceAction = &JA;
6163 while (SourceAction->getKind() != Action::InputClass) {
6164 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6165 SourceAction = SourceAction->getInputs()[0];
6166 }
6167
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006168 // Forward -g and handle debug info related flags, assuming we are dealing
6169 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006170 if (SourceAction->getType() == types::TY_Asm ||
6171 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006172 bool WantDebug = false;
6173 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006174 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006175 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006176 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6177 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006178 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006179 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006180 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006181 if (DwarfVersion == 0)
6182 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006183 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006184 (WantDebug ? codegenoptions::LimitedDebugInfo
6185 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006186 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006187
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006188 // Add the -fdebug-compilation-dir flag if needed.
6189 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006190
6191 // Set the AT_producer to the clang version when using the integrated
6192 // assembler on assembly source files.
6193 CmdArgs.push_back("-dwarf-debug-producer");
6194 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006195
6196 // And pass along -I options
6197 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006198 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006199
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006200 // Handle -fPIC et al -- the relocation-model affects the assembler
6201 // for some targets.
6202 llvm::Reloc::Model RelocationModel;
6203 unsigned PICLevel;
6204 bool IsPIE;
6205 std::tie(RelocationModel, PICLevel, IsPIE) =
6206 ParsePICArgs(getToolChain(), Triple, Args);
6207
6208 const char *RMName = RelocationModelName(RelocationModel);
6209 if (RMName) {
6210 CmdArgs.push_back("-mrelocation-model");
6211 CmdArgs.push_back(RMName);
6212 }
6213
Kevin Enderby292dc082011-12-22 19:31:58 +00006214 // Optionally embed the -cc1as level arguments into the debug info, for build
6215 // analysis.
6216 if (getToolChain().UseDwarfDebugFlags()) {
6217 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006218 for (const auto &Arg : Args)
6219 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006220
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006221 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006222 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6223 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006224 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006225 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006226 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006227 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006228 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006229 }
6230 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006231 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006232 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006233
6234 // FIXME: Add -static support, once we have it.
6235
Daniel Sanders7f933f42015-01-30 17:35:23 +00006236 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006237 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006238 default:
6239 break;
6240
6241 case llvm::Triple::mips:
6242 case llvm::Triple::mipsel:
6243 case llvm::Triple::mips64:
6244 case llvm::Triple::mips64el:
6245 AddMIPSTargetArgs(Args, CmdArgs);
6246 break;
6247 }
6248
David Blaikie372d9502014-01-17 03:17:40 +00006249 // Consume all the warning flags. Usually this would be handled more
6250 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6251 // doesn't handle that so rather than warning about unused flags that are
6252 // actually used, we'll lie by omission instead.
6253 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006254 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006255
David Blaikie9260ed62013-07-25 21:19:01 +00006256 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6257 getToolChain().getDriver());
6258
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006259 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006260
6261 assert(Output.isFilename() && "Unexpected lipo output.");
6262 CmdArgs.push_back("-o");
6263 CmdArgs.push_back(Output.getFilename());
6264
Daniel Dunbarb440f562010-08-02 02:38:21 +00006265 assert(Input.isFilename() && "Invalid input.");
6266 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006267
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006268 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006269 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006270
6271 // Handle the debug info splitting at object creation time if we're
6272 // creating an object.
6273 // TODO: Currently only works on linux with newer objcopy.
6274 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006275 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006276 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006277 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006278}
6279
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006280void GnuTool::anchor() {}
6281
Daniel Dunbara3246a02009-03-18 08:07:30 +00006282void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006283 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006284 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006285 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006286 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006287 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006288
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006289 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006290 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006291 // It is unfortunate that we have to claim here, as this means
6292 // we will basically never report anything interesting for
6293 // platforms using a generic gcc, even if we are just using gcc
6294 // to get to the assembler.
6295 A->claim();
6296
Daniel Dunbar939c1212010-08-03 16:14:14 +00006297 // Don't forward any -g arguments to assembly steps.
6298 if (isa<AssembleJobAction>(JA) &&
6299 A->getOption().matches(options::OPT_g_Group))
6300 continue;
6301
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006302 // Don't forward any -W arguments to assembly and link steps.
6303 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6304 A->getOption().matches(options::OPT_W_Group))
6305 continue;
6306
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006307 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006308 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006309 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006310
Daniel Dunbar4e295052010-01-25 22:35:08 +00006311 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006312
6313 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006314 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006315 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006316 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006317 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006318 }
6319
Daniel Dunbar5716d872009-05-02 21:41:52 +00006320 // Try to force gcc to match the tool chain we want, if we recognize
6321 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006322 //
6323 // FIXME: The triple class should directly provide the information we want
6324 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006325 switch (getToolChain().getArch()) {
6326 default:
6327 break;
6328 case llvm::Triple::x86:
6329 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006330 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006331 break;
6332 case llvm::Triple::x86_64:
6333 case llvm::Triple::ppc64:
6334 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006335 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006336 break;
6337 case llvm::Triple::sparcel:
6338 CmdArgs.push_back("-EL");
6339 break;
6340 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006341
Daniel Dunbarb440f562010-08-02 02:38:21 +00006342 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006343 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006344 CmdArgs.push_back(Output.getFilename());
6345 } else {
6346 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006347 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006348 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006349
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006350 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006351
6352 // Only pass -x if gcc will understand it; otherwise hope gcc
6353 // understands the suffix correctly. The main use case this would go
6354 // wrong in is for linker inputs if they happened to have an odd
6355 // suffix; really the only way to get this to happen is a command
6356 // like '-x foobar a.c' which will treat a.c like a linker input.
6357 //
6358 // FIXME: For the linker case specifically, can we safely convert
6359 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006360 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006361 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006362 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006363 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006364 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006365 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006366 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006367 else if (II.getType() == types::TY_ModuleFile)
6368 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006369 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006370
Daniel Dunbara3246a02009-03-18 08:07:30 +00006371 if (types::canTypeBeUserSpecified(II.getType())) {
6372 CmdArgs.push_back("-x");
6373 CmdArgs.push_back(types::getTypeName(II.getType()));
6374 }
6375
Daniel Dunbarb440f562010-08-02 02:38:21 +00006376 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006377 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006378 else {
6379 const Arg &A = II.getInputArg();
6380
6381 // Reverse translate some rewritten options.
6382 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6383 CmdArgs.push_back("-lstdc++");
6384 continue;
6385 }
6386
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006387 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006388 A.render(Args, CmdArgs);
6389 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006390 }
6391
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006392 const std::string customGCCName = D.getCCCGenericGCCName();
6393 const char *GCCName;
6394 if (!customGCCName.empty())
6395 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006396 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006397 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006398 } else
6399 GCCName = "gcc";
6400
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006401 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006402 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006403}
6404
Douglas Katzman95354292015-06-23 20:42:09 +00006405void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6406 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006407 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006408}
6409
Douglas Katzman95354292015-06-23 20:42:09 +00006410void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6411 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006412 const Driver &D = getToolChain().getDriver();
6413
Eric Christophercc7ff502015-01-29 00:56:17 +00006414 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006415 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006416 case types::TY_LLVM_IR:
6417 case types::TY_LTO_IR:
6418 case types::TY_LLVM_BC:
6419 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006420 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006421 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006422 // We assume we've got an "integrated" assembler in that gcc will produce an
6423 // object file itself.
6424 case types::TY_Object:
6425 CmdArgs.push_back("-c");
6426 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006427 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006428 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006429 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006430 case types::TY_Nothing:
6431 CmdArgs.push_back("-fsyntax-only");
6432 break;
6433 default:
6434 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006435 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006436}
6437
Douglas Katzman95354292015-06-23 20:42:09 +00006438void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6439 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006440 // The types are (hopefully) good enough.
6441}
6442
Tony Linthicum76329bf2011-12-12 21:14:55 +00006443// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006444void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006445 ArgStringList &CmdArgs) const {
6446}
6447
Douglas Katzman95354292015-06-23 20:42:09 +00006448void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6449 const InputInfo &Output,
6450 const InputInfoList &Inputs,
6451 const ArgList &Args,
6452 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006453 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006455 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6456 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006457 ArgStringList CmdArgs;
6458
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006459 std::string MArchString = "-march=hexagon";
6460 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006461
6462 RenderExtraToolArgs(JA, CmdArgs);
6463
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006464 std::string AsName = "hexagon-llvm-mc";
6465 std::string MCpuString = "-mcpu=hexagon" +
6466 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6467 CmdArgs.push_back("-filetype=obj");
6468 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6469
Tony Linthicum76329bf2011-12-12 21:14:55 +00006470 if (Output.isFilename()) {
6471 CmdArgs.push_back("-o");
6472 CmdArgs.push_back(Output.getFilename());
6473 } else {
6474 assert(Output.isNothing() && "Unexpected output");
6475 CmdArgs.push_back("-fsyntax-only");
6476 }
6477
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006478 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6479 std::string N = llvm::utostr(G.getValue());
6480 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6481 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006482
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006483 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006484
Tony Linthicum76329bf2011-12-12 21:14:55 +00006485 // Only pass -x if gcc will understand it; otherwise hope gcc
6486 // understands the suffix correctly. The main use case this would go
6487 // wrong in is for linker inputs if they happened to have an odd
6488 // suffix; really the only way to get this to happen is a command
6489 // like '-x foobar a.c' which will treat a.c like a linker input.
6490 //
6491 // FIXME: For the linker case specifically, can we safely convert
6492 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006493 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006494 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006495 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006496 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006497 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006498 else if (II.getType() == types::TY_AST)
6499 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006500 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006501 else if (II.getType() == types::TY_ModuleFile)
6502 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006503 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006504
6505 if (II.isFilename())
6506 CmdArgs.push_back(II.getFilename());
6507 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006508 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006509 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006510 II.getInputArg().render(Args, CmdArgs);
6511 }
6512
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006513 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006514 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006515}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006516
Douglas Katzman95354292015-06-23 20:42:09 +00006517void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6518 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006519}
6520
Douglas Katzman54366072015-07-27 16:53:08 +00006521static void
6522constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006523 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006524 const InputInfo &Output, const InputInfoList &Inputs,
6525 const ArgList &Args, ArgStringList &CmdArgs,
6526 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006527
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006528 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006529
Matthew Curtise689b052012-12-06 15:46:07 +00006530 //----------------------------------------------------------------------------
6531 //
6532 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006533 bool IsStatic = Args.hasArg(options::OPT_static);
6534 bool IsShared = Args.hasArg(options::OPT_shared);
6535 bool IsPIE = Args.hasArg(options::OPT_pie);
6536 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6537 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6538 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6539 bool UseG0 = false;
6540 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006541
Matthew Curtise689b052012-12-06 15:46:07 +00006542 //----------------------------------------------------------------------------
6543 // Silence warnings for various options
6544 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006545 Args.ClaimAllArgs(options::OPT_g_Group);
6546 Args.ClaimAllArgs(options::OPT_emit_llvm);
6547 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6548 // handled somewhere else.
6549 Args.ClaimAllArgs(options::OPT_static_libgcc);
6550
6551 //----------------------------------------------------------------------------
6552 //
6553 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006554 if (Args.hasArg(options::OPT_s))
6555 CmdArgs.push_back("-s");
6556
6557 if (Args.hasArg(options::OPT_r))
6558 CmdArgs.push_back("-r");
6559
6560 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006561 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006562
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006563 CmdArgs.push_back("-march=hexagon");
6564 std::string CpuVer =
6565 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6566 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6567 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006568
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006569 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006570 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006571 // The following should be the default, but doing as hexagon-gcc does.
6572 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006573 }
6574
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006575 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006576 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006577
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006578 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006579 CmdArgs.push_back("-pie");
6580
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006581 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6582 std::string N = llvm::utostr(G.getValue());
6583 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6584 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006585 }
6586
Matthew Curtise689b052012-12-06 15:46:07 +00006587 //----------------------------------------------------------------------------
6588 //
6589 //----------------------------------------------------------------------------
6590 CmdArgs.push_back("-o");
6591 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006592
Matthew Curtise689b052012-12-06 15:46:07 +00006593 //----------------------------------------------------------------------------
6594 // moslib
6595 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006596 std::vector<std::string> OsLibs;
6597 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006598
Sean Silva14facf32015-06-09 01:57:17 +00006599 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6600 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006601 OsLibs.emplace_back(A->getValue());
6602 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006603 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006604 if (OsLibs.empty()) {
6605 OsLibs.push_back("standalone");
6606 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006607 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006608
Matthew Curtise689b052012-12-06 15:46:07 +00006609 //----------------------------------------------------------------------------
6610 // Start Files
6611 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006612 const std::string MCpuSuffix = "/" + CpuVer;
6613 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6614 const std::string RootDir =
6615 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6616 const std::string StartSubDir =
6617 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006618
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006619 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6620 const char *Name) -> std::string {
6621 std::string RelName = SubDir + Name;
6622 std::string P = HTC.GetFilePath(RelName.c_str());
6623 if (llvm::sys::fs::exists(P))
6624 return P;
6625 return RootDir + RelName;
6626 };
6627
6628 if (IncStdLib && IncStartFiles) {
6629 if (!IsShared) {
6630 if (HasStandalone) {
6631 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6632 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006633 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006634 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6635 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006636 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006637 std::string Init = UseShared
6638 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6639 : Find(RootDir, StartSubDir, "/init.o");
6640 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006641 }
6642
6643 //----------------------------------------------------------------------------
6644 // Library Search Paths
6645 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006646 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6647 for (const auto &LibPath : LibPaths)
6648 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006649
6650 //----------------------------------------------------------------------------
6651 //
6652 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006653 Args.AddAllArgs(CmdArgs,
6654 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6655 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006656
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006657 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006658
6659 //----------------------------------------------------------------------------
6660 // Libraries
6661 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006662 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006663 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006664 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006665 CmdArgs.push_back("-lm");
6666 }
6667
6668 CmdArgs.push_back("--start-group");
6669
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006670 if (!IsShared) {
6671 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006672 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006673 CmdArgs.push_back("-lc");
6674 }
6675 CmdArgs.push_back("-lgcc");
6676
6677 CmdArgs.push_back("--end-group");
6678 }
6679
6680 //----------------------------------------------------------------------------
6681 // End files
6682 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006683 if (IncStdLib && IncStartFiles) {
6684 std::string Fini = UseShared
6685 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6686 : Find(RootDir, StartSubDir, "/fini.o");
6687 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006688 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006689}
6690
Douglas Katzman95354292015-06-23 20:42:09 +00006691void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6692 const InputInfo &Output,
6693 const InputInfoList &Inputs,
6694 const ArgList &Args,
6695 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006696 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006697
6698 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006699 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006700 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006701
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006702 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006703 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006704 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006705}
6706// Hexagon tools end.
6707
Tom Stellard8fa33092015-07-18 01:49:05 +00006708void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6709 const InputInfo &Output,
6710 const InputInfoList &Inputs,
6711 const ArgList &Args,
6712 const char *LinkingOutput) const {
6713
6714 std::string Linker = getToolChain().GetProgramPath(getShortName());
6715 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006716 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6717 CmdArgs.push_back("-o");
6718 CmdArgs.push_back(Output.getFilename());
6719 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6720 CmdArgs, Inputs));
6721}
6722// AMDGPU tools end.
6723
Dan Gohman52816862015-12-16 23:30:41 +00006724wasm::Linker::Linker(const ToolChain &TC)
6725 : GnuTool("wasm::Linker", "lld", TC) {}
6726
6727bool wasm::Linker::isLinkJob() const {
6728 return true;
6729}
6730
6731bool wasm::Linker::hasIntegratedCPP() const {
6732 return false;
6733}
6734
6735void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6736 const InputInfo &Output,
6737 const InputInfoList &Inputs,
6738 const ArgList &Args,
6739 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006740
6741 const ToolChain &ToolChain = getToolChain();
6742 const Driver &D = ToolChain.getDriver();
6743 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006744 ArgStringList CmdArgs;
6745 CmdArgs.push_back("-flavor");
6746 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006747
6748 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006749 // size is of particular importance. This is significantly facilitated by
6750 // the enabling of -ffunction-sections and -fdata-sections in
6751 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006752 if (areOptimizationsEnabled(Args))
6753 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006754
Dan Gohman57b62c52016-02-22 19:26:15 +00006755 if (Args.hasArg(options::OPT_rdynamic))
6756 CmdArgs.push_back("-export-dynamic");
6757 if (Args.hasArg(options::OPT_s))
6758 CmdArgs.push_back("--strip-all");
6759 if (Args.hasArg(options::OPT_shared))
6760 CmdArgs.push_back("-shared");
6761 if (Args.hasArg(options::OPT_static))
6762 CmdArgs.push_back("-Bstatic");
6763
6764 Args.AddAllArgs(CmdArgs, options::OPT_L);
6765 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6766
6767 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6768 if (Args.hasArg(options::OPT_shared))
6769 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6770 else if (Args.hasArg(options::OPT_pie))
6771 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6772 else
6773 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6774
6775 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6776 }
6777
6778 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6779
6780 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6781 if (D.CCCIsCXX())
6782 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6783
6784 if (Args.hasArg(options::OPT_pthread))
6785 CmdArgs.push_back("-lpthread");
6786
6787 CmdArgs.push_back("-lc");
6788 CmdArgs.push_back("-lcompiler_rt");
6789 }
6790
6791 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6792 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6793
Dan Gohman52816862015-12-16 23:30:41 +00006794 CmdArgs.push_back("-o");
6795 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006796
Dan Gohman52816862015-12-16 23:30:41 +00006797 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6798}
6799
Renato Golin7c542b42015-07-27 23:44:45 +00006800const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006801 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006802 if (!Arch.empty())
6803 MArch = Arch;
6804 else
Bernard Ogden31561762013-12-12 13:27:11 +00006805 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006806 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006807
6808 // Handle -march=native.
6809 if (MArch == "native") {
6810 std::string CPU = llvm::sys::getHostCPUName();
6811 if (CPU != "generic") {
6812 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006813 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006814 // If there is no valid architecture suffix for this CPU we don't know how
6815 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006816 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006817 MArch = "";
6818 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006819 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006820 }
6821 }
6822
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006823 return MArch;
6824}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006825
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006826/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006827StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006828 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006829 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6830 // here means an -march=native that we can't handle, so instead return no CPU.
6831 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006832 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006833
John Brawna95c1a82015-05-08 12:52:18 +00006834 // We need to return an empty string here on invalid MArch values as the
6835 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006836 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006837}
6838
6839/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006840std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006841 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006842 // FIXME: Warn on inconsistent use of -mcpu and -march.
6843 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006844 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006845 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006846 // Handle -mcpu=native.
6847 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006848 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006849 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006850 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006851 }
6852
Renato Goline17c5802015-07-27 23:44:42 +00006853 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006854}
6855
6856/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006857/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006858// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006859StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6860 const llvm::Triple &Triple) {
6861 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006862 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006863 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006864 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006865 if (ArchKind == llvm::ARM::AK_INVALID)
6866 // In case of generic Arch, i.e. "arm",
6867 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006868 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006869 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006870 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6871 // armv7k triple if it's actually been specified via "-arch armv7k".
6872 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006873 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006874 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006875 }
Renato Golin3c007252015-05-28 15:05:53 +00006876 if (ArchKind == llvm::ARM::AK_INVALID)
6877 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006878 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006879}
6880
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006881void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006882 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006883 if (Args.hasArg(options::OPT_r))
6884 return;
6885
John Brawn94fd9632015-05-21 12:19:49 +00006886 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6887 // to generate BE-8 executables.
6888 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6889 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006890}
6891
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006892mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006893 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6894 // was first introduced in Release 3. However, other compilers have
6895 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006896 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6897 .Case("mips1", NanLegacy)
6898 .Case("mips2", NanLegacy)
6899 .Case("mips3", NanLegacy)
6900 .Case("mips4", NanLegacy)
6901 .Case("mips5", NanLegacy)
6902 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006903 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006904 .Case("mips32r3", NanLegacy | Nan2008)
6905 .Case("mips32r5", NanLegacy | Nan2008)
6906 .Case("mips32r6", Nan2008)
6907 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006908 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006909 .Case("mips64r3", NanLegacy | Nan2008)
6910 .Case("mips64r5", NanLegacy | Nan2008)
6911 .Case("mips64r6", Nan2008)
6912 .Default(NanLegacy);
6913}
6914
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006915bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6916 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6917 return A && (A->getValue() == StringRef(Value));
6918}
6919
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006920bool mips::isUCLibc(const ArgList &Args) {
6921 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006922 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006923}
6924
Daniel Sanders2bf13662014-07-10 14:40:57 +00006925bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006926 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6927 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006928 .Case("2008", true)
6929 .Case("legacy", false)
6930 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006931
6932 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006933 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006934 .Cases("mips32r6", "mips64r6", true)
6935 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006936
6937 return false;
6938}
6939
Daniel Sanders379d44b2014-07-16 11:52:23 +00006940bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006941 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006942 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006943 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006944 return false;
6945
6946 if (ABIName != "32")
6947 return false;
6948
Toma Tabacu94ea6862015-06-16 13:54:13 +00006949 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6950 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006951 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006952 return false;
6953
Daniel Sanders379d44b2014-07-16 11:52:23 +00006954 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006955 .Cases("mips2", "mips3", "mips4", "mips5", true)
6956 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6957 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6958 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006959}
6960
Toma Tabacu94ea6862015-06-16 13:54:13 +00006961bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6962 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006963 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006964 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6965
6966 // FPXX shouldn't be used if -msingle-float is present.
6967 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6968 options::OPT_mdouble_float))
6969 if (A->getOption().matches(options::OPT_msingle_float))
6970 UseFPXX = false;
6971
6972 return UseFPXX;
6973}
6974
Tim Northover157d9112014-01-16 08:48:16 +00006975llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006976 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6977 // archs which Darwin doesn't use.
6978
6979 // The matching this routine does is fairly pointless, since it is neither the
6980 // complete architecture list, nor a reasonable subset. The problem is that
6981 // historically the driver driver accepts this and also ties its -march=
6982 // handling to the architecture name, so we need to be careful before removing
6983 // support for it.
6984
6985 // This code must be kept in sync with Clang's Darwin specific argument
6986 // translation.
6987
6988 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006989 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6990 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6991 .Case("ppc64", llvm::Triple::ppc64)
6992 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6993 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6994 llvm::Triple::x86)
6995 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6996 // This is derived from the driver driver.
6997 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6998 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6999 .Cases("armv7s", "xscale", llvm::Triple::arm)
7000 .Case("arm64", llvm::Triple::aarch64)
7001 .Case("r600", llvm::Triple::r600)
7002 .Case("amdgcn", llvm::Triple::amdgcn)
7003 .Case("nvptx", llvm::Triple::nvptx)
7004 .Case("nvptx64", llvm::Triple::nvptx64)
7005 .Case("amdil", llvm::Triple::amdil)
7006 .Case("spir", llvm::Triple::spir)
7007 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007008}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007009
Tim Northover157d9112014-01-16 08:48:16 +00007010void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007011 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007012 T.setArch(Arch);
7013
7014 if (Str == "x86_64h")
7015 T.setArchName(Str);
7016 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7017 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007018 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007019 }
7020}
7021
Bob Wilsondecc03e2012-11-23 06:14:39 +00007022const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007023 const InputInfo &Input) {
7024 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007025}
7026
Bob Wilsondecc03e2012-11-23 06:14:39 +00007027const char *Clang::getBaseInputStem(const ArgList &Args,
7028 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007029 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007030
Chris Lattner906bb902011-01-16 08:14:11 +00007031 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007032 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007033
7034 return Str;
7035}
7036
Bob Wilsondecc03e2012-11-23 06:14:39 +00007037const char *Clang::getDependencyFileName(const ArgList &Args,
7038 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007039 // FIXME: Think about this more.
7040 std::string Res;
7041
7042 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007043 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007044 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007045 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007046 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007047 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007048 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007049}
7050
Douglas Katzman95354292015-06-23 20:42:09 +00007051void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7052 const InputInfo &Output,
7053 const InputInfoList &Inputs,
7054 const ArgList &Args,
7055 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007056 const ToolChain &ToolChain = getToolChain();
7057 const Driver &D = ToolChain.getDriver();
7058 ArgStringList CmdArgs;
7059
7060 // Silence warning for "clang -g foo.o -o foo"
7061 Args.ClaimAllArgs(options::OPT_g_Group);
7062 // and "clang -emit-llvm foo.o -o foo"
7063 Args.ClaimAllArgs(options::OPT_emit_llvm);
7064 // and for "clang -w foo.o -o foo". Other warning options are already
7065 // handled somewhere else.
7066 Args.ClaimAllArgs(options::OPT_w);
7067
7068 if (!D.SysRoot.empty())
7069 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7070
7071 // CloudABI only supports static linkage.
7072 CmdArgs.push_back("-Bstatic");
7073 CmdArgs.push_back("--eh-frame-hdr");
7074 CmdArgs.push_back("--gc-sections");
7075
7076 if (Output.isFilename()) {
7077 CmdArgs.push_back("-o");
7078 CmdArgs.push_back(Output.getFilename());
7079 } else {
7080 assert(Output.isNothing() && "Invalid output.");
7081 }
7082
Douglas Katzman78b37b02015-11-17 20:28:07 +00007083 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007084 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7085 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7086 }
7087
7088 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007089 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007090 Args.AddAllArgs(CmdArgs,
7091 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7092 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007093
Teresa Johnson945bc502015-10-15 20:35:53 +00007094 if (D.isUsingLTO())
7095 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007096
7097 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7098
Douglas Katzman78b37b02015-11-17 20:28:07 +00007099 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007100 if (D.CCCIsCXX())
7101 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7102 CmdArgs.push_back("-lc");
7103 CmdArgs.push_back("-lcompiler_rt");
7104 }
7105
Douglas Katzman78b37b02015-11-17 20:28:07 +00007106 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007107 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7108
7109 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007110 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007111}
7112
Douglas Katzman95354292015-06-23 20:42:09 +00007113void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7114 const InputInfo &Output,
7115 const InputInfoList &Inputs,
7116 const ArgList &Args,
7117 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007118 ArgStringList CmdArgs;
7119
7120 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7121 const InputInfo &Input = Inputs[0];
7122
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007123 // Determine the original source input.
7124 const Action *SourceAction = &JA;
7125 while (SourceAction->getKind() != Action::InputClass) {
7126 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7127 SourceAction = SourceAction->getInputs()[0];
7128 }
7129
Eric Christopherf5a8f492015-12-08 00:10:10 +00007130 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007131 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007132 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7133 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007134 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007135 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007136 const llvm::Triple &T(getToolChain().getTriple());
7137 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007138 CmdArgs.push_back("-Q");
7139 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007140
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007141 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007142 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007143 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007144 if (Args.hasArg(options::OPT_gstabs))
7145 CmdArgs.push_back("--gstabs");
7146 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007147 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007148 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007149
Daniel Dunbarbe220842009-03-20 16:06:39 +00007150 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007151 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007152
Daniel Dunbar6d484762010-07-22 01:47:22 +00007153 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007154 if (getToolChain().getArch() == llvm::Triple::x86 ||
7155 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007156 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7157 CmdArgs.push_back("-force_cpusubtype_ALL");
7158
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007159 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007160 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007161 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007162 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007163 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007164 CmdArgs.push_back("-static");
7165
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007166 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007167
7168 assert(Output.isFilename() && "Unexpected lipo output.");
7169 CmdArgs.push_back("-o");
7170 CmdArgs.push_back(Output.getFilename());
7171
Daniel Dunbarb440f562010-08-02 02:38:21 +00007172 assert(Input.isFilename() && "Invalid input.");
7173 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007174
7175 // asm_final spec is empty.
7176
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007177 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007178 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007179}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007180
Tim Northover157d9112014-01-16 08:48:16 +00007181void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007182
Tim Northover157d9112014-01-16 08:48:16 +00007183void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7184 ArgStringList &CmdArgs) const {
7185 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007186
Daniel Dunbarc1964212009-03-26 16:23:12 +00007187 // Derived from darwin_arch spec.
7188 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007189 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007190
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007191 // FIXME: Is this needed anymore?
7192 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007193 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007194}
7195
Douglas Katzman95354292015-06-23 20:42:09 +00007196bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007197 // We only need to generate a temp path for LTO if we aren't compiling object
7198 // files. When compiling source files, we run 'dsymutil' after linking. We
7199 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007200 for (const auto &Input : Inputs)
7201 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007202 return true;
7203
7204 return false;
7205}
7206
Douglas Katzman95354292015-06-23 20:42:09 +00007207void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7208 ArgStringList &CmdArgs,
7209 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007210 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007211 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007212
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007213 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007214 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7215 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007216 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7217 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007218 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007219 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007220 }
7221
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007222 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007223 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007224 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7225 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007226
Bob Wilson3d27dad2013-08-02 22:25:34 +00007227 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7228 CmdArgs.push_back("-export_dynamic");
7229
Bob Wilsonb111ec92015-03-02 19:01:14 +00007230 // If we are using App Extension restrictions, pass a flag to the linker
7231 // telling it that the compiled code has been audited.
7232 if (Args.hasFlag(options::OPT_fapplication_extension,
7233 options::OPT_fno_application_extension, false))
7234 CmdArgs.push_back("-application_extension");
7235
Teresa Johnson945bc502015-10-15 20:35:53 +00007236 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007237 // If we are using LTO, then automatically create a temporary file path for
7238 // the linker to use, so that it's lifetime will extend past a possible
7239 // dsymutil step.
7240 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7241 const char *TmpPath = C.getArgs().MakeArgString(
7242 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7243 C.addTempFile(TmpPath);
7244 CmdArgs.push_back("-object_path_lto");
7245 CmdArgs.push_back(TmpPath);
7246 }
7247
7248 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7249 // it in clang installed libraries. If not found, the option is not used
7250 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7251 if (Version[0] >= 133) {
7252 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7253 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7254 SmallString<128> LibLTOPath(P);
7255 llvm::sys::path::append(LibLTOPath, "lib");
7256 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7257 if (llvm::sys::fs::exists(LibLTOPath)) {
7258 CmdArgs.push_back("-lto_library");
7259 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7260 } else {
7261 D.Diag(diag::warn_drv_lto_libpath);
7262 }
7263 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007264 }
7265
Daniel Dunbarc1964212009-03-26 16:23:12 +00007266 // Derived from the "link" spec.
7267 Args.AddAllArgs(CmdArgs, options::OPT_static);
7268 if (!Args.hasArg(options::OPT_static))
7269 CmdArgs.push_back("-dynamic");
7270 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7271 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7272 // here. How do we wish to handle such things?
7273 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007274
Daniel Dunbarc1964212009-03-26 16:23:12 +00007275 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007276 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007277 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007278 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007279
7280 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7281 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7282 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7283
7284 Arg *A;
7285 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7286 (A = Args.getLastArg(options::OPT_current__version)) ||
7287 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007288 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7289 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007290
7291 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7292 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7293 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7294 } else {
7295 CmdArgs.push_back("-dylib");
7296
7297 Arg *A;
7298 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7299 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7300 (A = Args.getLastArg(options::OPT_client__name)) ||
7301 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7302 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7303 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007304 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7305 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007306
Daniel Dunbarc1964212009-03-26 16:23:12 +00007307 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7308 "-dylib_compatibility_version");
7309 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7310 "-dylib_current_version");
7311
Tim Northover157d9112014-01-16 08:48:16 +00007312 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007313
7314 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7315 "-dylib_install_name");
7316 }
7317
7318 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7319 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7320 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007321 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007322 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007323 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7324 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7325 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7326 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7327 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7328 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007329 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007330 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7331 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7332 Args.AddAllArgs(CmdArgs, options::OPT_init);
7333
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007334 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007335 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007336
Daniel Dunbarc1964212009-03-26 16:23:12 +00007337 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7338 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7339 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7340 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7341 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007342
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007343 if (const Arg *A =
7344 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7345 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007346 if (A->getOption().matches(options::OPT_fpie) ||
7347 A->getOption().matches(options::OPT_fPIE))
7348 CmdArgs.push_back("-pie");
7349 else
7350 CmdArgs.push_back("-no_pie");
7351 }
Steven Wu574b0f22016-03-01 01:07:58 +00007352 // for embed-bitcode, use -bitcode_bundle in linker command
7353 if (C.getDriver().embedBitcodeEnabled() ||
7354 C.getDriver().embedBitcodeMarkerOnly()) {
7355 // Check if the toolchain supports bitcode build flow.
7356 if (MachOTC.SupportsEmbeddedBitcode())
7357 CmdArgs.push_back("-bitcode_bundle");
7358 else
7359 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7360 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007361
7362 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7363 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7364 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7365 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7366 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7367 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7368 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7369 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7370 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7371 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7372 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7373 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7374 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7375 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7376 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7377 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007378
Daniel Dunbar84384642011-05-02 21:03:47 +00007379 // Give --sysroot= preference, over the Apple specific behavior to also use
7380 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007381 StringRef sysroot = C.getSysRoot();
7382 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007383 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007384 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007385 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7386 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007387 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007388 }
7389
Daniel Dunbarc1964212009-03-26 16:23:12 +00007390 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7391 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7392 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7393 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7394 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007395 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007396 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7397 Args.AddAllArgs(CmdArgs, options::OPT_y);
7398 Args.AddLastArg(CmdArgs, options::OPT_w);
7399 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7400 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7401 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7402 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7403 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7404 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7405 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7406 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7407 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7408 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7409 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7410 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7411}
7412
Douglas Katzman95354292015-06-23 20:42:09 +00007413void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7414 const InputInfo &Output,
7415 const InputInfoList &Inputs,
7416 const ArgList &Args,
7417 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007418 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007419
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007420 // If the number of arguments surpasses the system limits, we will encode the
7421 // input files in a separate file, shortening the command line. To this end,
7422 // build a list of input file names that can be passed via a file with the
7423 // -filelist linker option.
7424 llvm::opt::ArgStringList InputFileList;
7425
Daniel Dunbarc1964212009-03-26 16:23:12 +00007426 // The logic here is derived from gcc's behavior; most of which
7427 // comes from specs (starting with link_command). Consult gcc for
7428 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007429 ArgStringList CmdArgs;
7430
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007431 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7432 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7433 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007434 for (const auto &Arg : Args)
7435 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007436 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007437 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007438 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007439 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007440 return;
7441 }
7442
Daniel Dunbarc1964212009-03-26 16:23:12 +00007443 // I'm not sure why this particular decomposition exists in gcc, but
7444 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007445 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007446
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007447 // It seems that the 'e' option is completely ignored for dynamic executables
7448 // (the default), and with static executables, the last one wins, as expected.
7449 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7450 options::OPT_Z_Flag, options::OPT_u_Group,
7451 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007452
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007453 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7454 // members of static archive libraries which implement Objective-C classes or
7455 // categories.
7456 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7457 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007458
Daniel Dunbarc1964212009-03-26 16:23:12 +00007459 CmdArgs.push_back("-o");
7460 CmdArgs.push_back(Output.getFilename());
7461
Douglas Katzman78b37b02015-11-17 20:28:07 +00007462 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007463 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007464
Peter Collingbournec4122c12015-06-15 21:08:13 +00007465 // SafeStack requires its own runtime libraries
7466 // These libraries should be linked first, to make sure the
7467 // __safestack_init constructor executes before everything else
7468 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7469 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7470 "libclang_rt.safestack_osx.a",
7471 /*AlwaysLink=*/true);
7472 }
7473
Daniel Dunbarc1964212009-03-26 16:23:12 +00007474 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007475
Douglas Gregor9295df02012-05-15 21:00:27 +00007476 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007477 // Build the input file for -filelist (list of linker input files) in case we
7478 // need it later
7479 for (const auto &II : Inputs) {
7480 if (!II.isFilename()) {
7481 // This is a linker input argument.
7482 // We cannot mix input arguments and file names in a -filelist input, thus
7483 // we prematurely stop our list (remaining files shall be passed as
7484 // arguments).
7485 if (InputFileList.size() > 0)
7486 break;
7487
7488 continue;
7489 }
7490
7491 InputFileList.push_back(II.getFilename());
7492 }
7493
Douglas Katzman78b37b02015-11-17 20:28:07 +00007494 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007495 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7496
Douglas Katzman78b37b02015-11-17 20:28:07 +00007497 if (isObjCRuntimeLinked(Args) &&
7498 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007499 // We use arclite library for both ARC and subscripting support.
7500 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7501
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007502 CmdArgs.push_back("-framework");
7503 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007504 // Link libobj.
7505 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007506 }
John McCall31168b02011-06-15 23:02:42 +00007507
Daniel Dunbarc1964212009-03-26 16:23:12 +00007508 if (LinkingOutput) {
7509 CmdArgs.push_back("-arch_multiple");
7510 CmdArgs.push_back("-final_output");
7511 CmdArgs.push_back(LinkingOutput);
7512 }
7513
Daniel Dunbarc1964212009-03-26 16:23:12 +00007514 if (Args.hasArg(options::OPT_fnested_functions))
7515 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007516
Justin Bognerc7701242015-05-12 05:44:36 +00007517 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7518
Douglas Katzman78b37b02015-11-17 20:28:07 +00007519 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007520 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007521 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007522
Daniel Dunbarc1964212009-03-26 16:23:12 +00007523 // link_ssp spec is empty.
7524
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007525 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007526 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007527 }
7528
Douglas Katzman78b37b02015-11-17 20:28:07 +00007529 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007530 // endfile_spec is empty.
7531 }
7532
7533 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7534 Args.AddAllArgs(CmdArgs, options::OPT_F);
7535
Steven Wu3ffb61b2015-02-06 18:08:29 +00007536 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007537 for (const Arg *A : Args.filtered(options::OPT_iframework))
7538 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007539
Douglas Katzman78b37b02015-11-17 20:28:07 +00007540 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007541 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7542 if (A->getValue() == StringRef("Accelerate")) {
7543 CmdArgs.push_back("-framework");
7544 CmdArgs.push_back("Accelerate");
7545 }
7546 }
7547 }
7548
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007549 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007550 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007551 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007552 Cmd->setInputFileList(std::move(InputFileList));
7553 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007554}
7555
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007556void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007557 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007558 const InputInfoList &Inputs,
7559 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007560 const char *LinkingOutput) const {
7561 ArgStringList CmdArgs;
7562
7563 CmdArgs.push_back("-create");
7564 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007565
7566 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007567 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007568
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007569 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007570 assert(II.isFilename() && "Unexpected lipo input.");
7571 CmdArgs.push_back(II.getFilename());
7572 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007573
7574 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007575 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007576}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007577
Daniel Dunbar88299622010-06-04 18:28:36 +00007578void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007579 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007580 const InputInfoList &Inputs,
7581 const ArgList &Args,
7582 const char *LinkingOutput) const {
7583 ArgStringList CmdArgs;
7584
Daniel Dunbareb86b042011-05-09 17:23:16 +00007585 CmdArgs.push_back("-o");
7586 CmdArgs.push_back(Output.getFilename());
7587
Daniel Dunbar88299622010-06-04 18:28:36 +00007588 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7589 const InputInfo &Input = Inputs[0];
7590 assert(Input.isFilename() && "Unexpected dsymutil input.");
7591 CmdArgs.push_back(Input.getFilename());
7592
Daniel Dunbar88299622010-06-04 18:28:36 +00007593 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007594 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007595 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007596}
7597
Eric Christopher551ef452011-08-23 17:56:55 +00007598void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007599 const InputInfo &Output,
7600 const InputInfoList &Inputs,
7601 const ArgList &Args,
7602 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007603 ArgStringList CmdArgs;
7604 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007605 CmdArgs.push_back("--debug-info");
7606 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007607 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007608
7609 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7610 const InputInfo &Input = Inputs[0];
7611 assert(Input.isFilename() && "Unexpected verify input");
7612
7613 // Grabbing the output of the earlier dsymutil run.
7614 CmdArgs.push_back(Input.getFilename());
7615
7616 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007617 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007618 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007619}
7620
Douglas Katzman95354292015-06-23 20:42:09 +00007621void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007622 const InputInfo &Output,
7623 const InputInfoList &Inputs,
7624 const ArgList &Args,
7625 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007626 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007627 ArgStringList CmdArgs;
7628
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007629 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007630
7631 CmdArgs.push_back("-o");
7632 CmdArgs.push_back(Output.getFilename());
7633
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007634 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007635 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007636
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007637 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007638 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007639}
7640
Douglas Katzman95354292015-06-23 20:42:09 +00007641void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7642 const InputInfo &Output,
7643 const InputInfoList &Inputs,
7644 const ArgList &Args,
7645 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007646 ArgStringList CmdArgs;
7647
David Chisnall272a0712012-02-29 15:06:12 +00007648 // Demangle C++ names in errors
7649 CmdArgs.push_back("-C");
7650
Douglas Katzman78b37b02015-11-17 20:28:07 +00007651 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007652 CmdArgs.push_back("-e");
7653 CmdArgs.push_back("_start");
7654 }
7655
7656 if (Args.hasArg(options::OPT_static)) {
7657 CmdArgs.push_back("-Bstatic");
7658 CmdArgs.push_back("-dn");
7659 } else {
7660 CmdArgs.push_back("-Bdynamic");
7661 if (Args.hasArg(options::OPT_shared)) {
7662 CmdArgs.push_back("-shared");
7663 } else {
7664 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007665 CmdArgs.push_back(
7666 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007667 }
7668 }
7669
7670 if (Output.isFilename()) {
7671 CmdArgs.push_back("-o");
7672 CmdArgs.push_back(Output.getFilename());
7673 } else {
7674 assert(Output.isNothing() && "Invalid output.");
7675 }
7676
Douglas Katzman78b37b02015-11-17 20:28:07 +00007677 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007678 if (!Args.hasArg(options::OPT_shared))
7679 CmdArgs.push_back(
7680 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7681
7682 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7683 CmdArgs.push_back(
7684 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7685 CmdArgs.push_back(
7686 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007687 }
7688
Douglas Katzman6059ef92015-11-17 17:41:23 +00007689 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007690
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007691 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7692 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007693
7694 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7695
Douglas Katzman78b37b02015-11-17 20:28:07 +00007696 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007697 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007698 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007699 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007700 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007701 if (!Args.hasArg(options::OPT_shared)) {
7702 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007703 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007704 }
David Chisnallf571cde2012-02-15 13:39:01 +00007705 }
7706
Douglas Katzman78b37b02015-11-17 20:28:07 +00007707 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007708 CmdArgs.push_back(
7709 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007710 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007711 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007712
Xinliang David Li69306c02015-10-22 06:15:31 +00007713 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007714
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007715 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007716 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007717}
7718
Douglas Katzman95354292015-06-23 20:42:09 +00007719void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7720 const InputInfo &Output,
7721 const InputInfoList &Inputs,
7722 const ArgList &Args,
7723 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007724 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007725 ArgStringList CmdArgs;
7726
Rafael Espindolacc126272014-02-28 01:55:21 +00007727 switch (getToolChain().getArch()) {
7728 case llvm::Triple::x86:
7729 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7730 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007731 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007732 break;
7733
7734 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007735 CmdArgs.push_back("-mppc");
7736 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007737 break;
7738
7739 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007740 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007741 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007742 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7743 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7744 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007745 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007746 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007747
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007748 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007749 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007750 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7751 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7752 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007753 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007754 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007755
7756 case llvm::Triple::mips64:
7757 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007758 StringRef CPUName;
7759 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007760 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007761
7762 CmdArgs.push_back("-mabi");
7763 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7764
7765 if (getToolChain().getArch() == llvm::Triple::mips64)
7766 CmdArgs.push_back("-EB");
7767 else
7768 CmdArgs.push_back("-EL");
7769
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007770 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007771 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007772 }
7773
Rafael Espindolacc126272014-02-28 01:55:21 +00007774 default:
7775 break;
7776 }
7777
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007778 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007779
7780 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007781 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007782
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007783 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007784 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007785
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007786 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007787 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007788}
7789
Douglas Katzman95354292015-06-23 20:42:09 +00007790void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7791 const InputInfo &Output,
7792 const InputInfoList &Inputs,
7793 const ArgList &Args,
7794 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007795 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007796 ArgStringList CmdArgs;
7797
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007798 // Silence warning for "clang -g foo.o -o foo"
7799 Args.ClaimAllArgs(options::OPT_g_Group);
7800 // and "clang -emit-llvm foo.o -o foo"
7801 Args.ClaimAllArgs(options::OPT_emit_llvm);
7802 // and for "clang -w foo.o -o foo". Other warning options are already
7803 // handled somewhere else.
7804 Args.ClaimAllArgs(options::OPT_w);
7805
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007806 if (getToolChain().getArch() == llvm::Triple::mips64)
7807 CmdArgs.push_back("-EB");
7808 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7809 CmdArgs.push_back("-EL");
7810
Douglas Katzman78b37b02015-11-17 20:28:07 +00007811 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007812 CmdArgs.push_back("-e");
7813 CmdArgs.push_back("__start");
7814 }
7815
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007816 if (Args.hasArg(options::OPT_static)) {
7817 CmdArgs.push_back("-Bstatic");
7818 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007819 if (Args.hasArg(options::OPT_rdynamic))
7820 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007821 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007822 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007823 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007824 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007825 } else {
7826 CmdArgs.push_back("-dynamic-linker");
7827 CmdArgs.push_back("/usr/libexec/ld.so");
7828 }
7829 }
7830
Rafael Espindola044f7832013-06-05 04:28:55 +00007831 if (Args.hasArg(options::OPT_nopie))
7832 CmdArgs.push_back("-nopie");
7833
Daniel Dunbarb440f562010-08-02 02:38:21 +00007834 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007835 CmdArgs.push_back("-o");
7836 CmdArgs.push_back(Output.getFilename());
7837 } else {
7838 assert(Output.isNothing() && "Invalid output.");
7839 }
7840
Douglas Katzman78b37b02015-11-17 20:28:07 +00007841 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007842 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007843 if (Args.hasArg(options::OPT_pg))
7844 CmdArgs.push_back(
7845 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007846 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007847 CmdArgs.push_back(
7848 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7849 CmdArgs.push_back(
7850 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007851 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007852 CmdArgs.push_back(
7853 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007854 }
7855 }
7856
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007857 std::string Triple = getToolChain().getTripleString();
7858 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007859 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007860 CmdArgs.push_back(
7861 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007862
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007863 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7864 options::OPT_e, options::OPT_s, options::OPT_t,
7865 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007866
Daniel Dunbar54423b22010-09-17 00:24:54 +00007867 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007868
Douglas Katzman78b37b02015-11-17 20:28:07 +00007869 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007870 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007871 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007872 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007873 CmdArgs.push_back("-lm_p");
7874 else
7875 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007876 }
7877
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007878 // FIXME: For some reason GCC passes -lgcc before adding
7879 // the default system libraries. Just mimic this for now.
7880 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007881
Eric Christopher17674ec2012-09-13 06:32:34 +00007882 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007883 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7884 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007885 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007886 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007887 }
7888
Chandler Carruth45661652011-12-17 22:32:42 +00007889 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007890 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007891 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007892 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007893 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007894 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007895
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007896 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007897 }
7898
Douglas Katzman78b37b02015-11-17 20:28:07 +00007899 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007900 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007901 CmdArgs.push_back(
7902 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007903 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007904 CmdArgs.push_back(
7905 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007906 }
7907
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007908 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007909 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007910}
Ed Schoutene33194b2009-04-02 19:13:12 +00007911
Douglas Katzman95354292015-06-23 20:42:09 +00007912void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7913 const InputInfo &Output,
7914 const InputInfoList &Inputs,
7915 const ArgList &Args,
7916 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007917 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007918 ArgStringList CmdArgs;
7919
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007920 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007921
7922 CmdArgs.push_back("-o");
7923 CmdArgs.push_back(Output.getFilename());
7924
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007925 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007926 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007927
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007928 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007929 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007930}
7931
Douglas Katzman95354292015-06-23 20:42:09 +00007932void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7933 const InputInfo &Output,
7934 const InputInfoList &Inputs,
7935 const ArgList &Args,
7936 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007937 const Driver &D = getToolChain().getDriver();
7938 ArgStringList CmdArgs;
7939
Douglas Katzman78b37b02015-11-17 20:28:07 +00007940 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007941 CmdArgs.push_back("-e");
7942 CmdArgs.push_back("__start");
7943 }
7944
7945 if (Args.hasArg(options::OPT_static)) {
7946 CmdArgs.push_back("-Bstatic");
7947 } else {
7948 if (Args.hasArg(options::OPT_rdynamic))
7949 CmdArgs.push_back("-export-dynamic");
7950 CmdArgs.push_back("--eh-frame-hdr");
7951 CmdArgs.push_back("-Bdynamic");
7952 if (Args.hasArg(options::OPT_shared)) {
7953 CmdArgs.push_back("-shared");
7954 } else {
7955 CmdArgs.push_back("-dynamic-linker");
7956 CmdArgs.push_back("/usr/libexec/ld.so");
7957 }
7958 }
7959
7960 if (Output.isFilename()) {
7961 CmdArgs.push_back("-o");
7962 CmdArgs.push_back(Output.getFilename());
7963 } else {
7964 assert(Output.isNothing() && "Invalid output.");
7965 }
7966
Douglas Katzman78b37b02015-11-17 20:28:07 +00007967 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007968 if (!Args.hasArg(options::OPT_shared)) {
7969 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007970 CmdArgs.push_back(
7971 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007972 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007973 CmdArgs.push_back(
7974 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7975 CmdArgs.push_back(
7976 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007977 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007978 CmdArgs.push_back(
7979 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007980 }
7981 }
7982
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007983 Args.AddAllArgs(CmdArgs,
7984 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007985
7986 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7987
Douglas Katzman78b37b02015-11-17 20:28:07 +00007988 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007989 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007990 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7991 if (Args.hasArg(options::OPT_pg))
7992 CmdArgs.push_back("-lm_p");
7993 else
7994 CmdArgs.push_back("-lm");
7995 }
7996
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007997 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007998 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007999 CmdArgs.push_back("-lpthread_p");
8000 else
8001 CmdArgs.push_back("-lpthread");
8002 }
8003
Eli Friedman9fa28852012-08-08 23:57:20 +00008004 if (!Args.hasArg(options::OPT_shared)) {
8005 if (Args.hasArg(options::OPT_pg))
8006 CmdArgs.push_back("-lc_p");
8007 else
8008 CmdArgs.push_back("-lc");
8009 }
8010
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008011 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008012 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008013 case llvm::Triple::arm:
8014 MyArch = "arm";
8015 break;
8016 case llvm::Triple::x86:
8017 MyArch = "i386";
8018 break;
8019 case llvm::Triple::x86_64:
8020 MyArch = "amd64";
8021 break;
8022 default:
8023 llvm_unreachable("Unsupported architecture");
8024 }
8025 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008026 }
8027
Douglas Katzman78b37b02015-11-17 20:28:07 +00008028 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008029 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008030 CmdArgs.push_back(
8031 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008032 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008033 CmdArgs.push_back(
8034 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008035 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008036
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008037 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008038 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008039}
8040
Douglas Katzman95354292015-06-23 20:42:09 +00008041void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8042 const InputInfo &Output,
8043 const InputInfoList &Inputs,
8044 const ArgList &Args,
8045 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008046 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008047 ArgStringList CmdArgs;
8048
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008049 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8050 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008051 switch (getToolChain().getArch()) {
8052 default:
8053 break;
8054 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008055 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008056 break;
8057 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008058 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008059 break;
8060 case llvm::Triple::mips:
8061 case llvm::Triple::mipsel:
8062 case llvm::Triple::mips64:
8063 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008064 StringRef CPUName;
8065 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008066 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008067
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008068 CmdArgs.push_back("-march");
8069 CmdArgs.push_back(CPUName.data());
8070
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008071 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008072 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008073
8074 if (getToolChain().getArch() == llvm::Triple::mips ||
8075 getToolChain().getArch() == llvm::Triple::mips64)
8076 CmdArgs.push_back("-EB");
8077 else
8078 CmdArgs.push_back("-EL");
8079
Dimitry Andric46f338c2015-12-27 10:36:44 +00008080 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8081 StringRef v = A->getValue();
8082 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8083 A->claim();
8084 }
8085
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008086 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008087 break;
8088 }
8089 case llvm::Triple::arm:
8090 case llvm::Triple::armeb:
8091 case llvm::Triple::thumb:
8092 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008093 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008094
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008095 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008096 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008097 else
Renato Golinf4421f72014-02-19 10:44:07 +00008098 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008099
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008100 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008101 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008102 case llvm::Triple::GNUEABI:
8103 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008104 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008105 break;
8106
8107 default:
8108 CmdArgs.push_back("-matpcs");
8109 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008110 break;
8111 }
8112 case llvm::Triple::sparc:
8113 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008114 case llvm::Triple::sparcv9: {
8115 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8116 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008117 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008118 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008119 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008120 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008121
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008122 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008123
8124 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008125 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008126
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008127 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008128 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008129
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008130 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008131 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008132}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008133
Douglas Katzman95354292015-06-23 20:42:09 +00008134void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8135 const InputInfo &Output,
8136 const InputInfoList &Inputs,
8137 const ArgList &Args,
8138 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008139 const toolchains::FreeBSD &ToolChain =
8140 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008141 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008142 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008143 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008144 !Args.hasArg(options::OPT_shared) &&
8145 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008146 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008147
8148 // Silence warning for "clang -g foo.o -o foo"
8149 Args.ClaimAllArgs(options::OPT_g_Group);
8150 // and "clang -emit-llvm foo.o -o foo"
8151 Args.ClaimAllArgs(options::OPT_emit_llvm);
8152 // and for "clang -w foo.o -o foo". Other warning options are already
8153 // handled somewhere else.
8154 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008155
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008156 if (!D.SysRoot.empty())
8157 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8158
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008159 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008160 CmdArgs.push_back("-pie");
8161
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008162 if (Args.hasArg(options::OPT_static)) {
8163 CmdArgs.push_back("-Bstatic");
8164 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008165 if (Args.hasArg(options::OPT_rdynamic))
8166 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008167 CmdArgs.push_back("--eh-frame-hdr");
8168 if (Args.hasArg(options::OPT_shared)) {
8169 CmdArgs.push_back("-Bshareable");
8170 } else {
8171 CmdArgs.push_back("-dynamic-linker");
8172 CmdArgs.push_back("/libexec/ld-elf.so.1");
8173 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008174 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008175 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8176 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8177 CmdArgs.push_back("--hash-style=both");
8178 }
8179 }
8180 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008181 }
8182
8183 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8184 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008185 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008186 CmdArgs.push_back("-m");
8187 CmdArgs.push_back("elf_i386_fbsd");
8188 }
8189
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008190 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008191 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008192 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008193 }
8194
Dimitry Andric904895f2015-12-27 06:47:09 +00008195 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8196 if (ToolChain.getArch() == llvm::Triple::mips ||
8197 ToolChain.getArch() == llvm::Triple::mipsel ||
8198 ToolChain.getArch() == llvm::Triple::mips64 ||
8199 ToolChain.getArch() == llvm::Triple::mips64el) {
8200 StringRef v = A->getValue();
8201 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8202 A->claim();
8203 }
8204 }
8205
Daniel Dunbarb440f562010-08-02 02:38:21 +00008206 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008207 CmdArgs.push_back("-o");
8208 CmdArgs.push_back(Output.getFilename());
8209 } else {
8210 assert(Output.isNothing() && "Invalid output.");
8211 }
8212
Douglas Katzman78b37b02015-11-17 20:28:07 +00008213 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008214 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008215 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008216 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008217 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008218 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008219 crt1 = "Scrt1.o";
8220 else
8221 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008222 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008223 if (crt1)
8224 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8225
8226 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8227
Craig Topper92fc2df2014-05-17 16:56:41 +00008228 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008229 if (Args.hasArg(options::OPT_static))
8230 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008231 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008232 crtbegin = "crtbeginS.o";
8233 else
8234 crtbegin = "crtbegin.o";
8235
8236 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008237 }
8238
8239 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008240 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008241 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8242 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008243 Args.AddAllArgs(CmdArgs, options::OPT_s);
8244 Args.AddAllArgs(CmdArgs, options::OPT_t);
8245 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8246 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008247
Teresa Johnson945bc502015-10-15 20:35:53 +00008248 if (D.isUsingLTO())
8249 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008250
Alexey Samsonov52550342014-09-15 19:58:40 +00008251 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008252 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008253
Douglas Katzman78b37b02015-11-17 20:28:07 +00008254 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008255 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008256 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008257 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008258 if (Args.hasArg(options::OPT_pg))
8259 CmdArgs.push_back("-lm_p");
8260 else
8261 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008262 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008263 if (NeedsSanitizerDeps)
8264 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008265 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8266 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008267 if (Args.hasArg(options::OPT_pg))
8268 CmdArgs.push_back("-lgcc_p");
8269 else
8270 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008271 if (Args.hasArg(options::OPT_static)) {
8272 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008273 } else if (Args.hasArg(options::OPT_pg)) {
8274 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008275 } else {
8276 CmdArgs.push_back("--as-needed");
8277 CmdArgs.push_back("-lgcc_s");
8278 CmdArgs.push_back("--no-as-needed");
8279 }
8280
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008281 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008282 if (Args.hasArg(options::OPT_pg))
8283 CmdArgs.push_back("-lpthread_p");
8284 else
8285 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008286 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008287
Roman Divacky66f22762011-02-10 16:59:40 +00008288 if (Args.hasArg(options::OPT_pg)) {
8289 if (Args.hasArg(options::OPT_shared))
8290 CmdArgs.push_back("-lc");
8291 else
8292 CmdArgs.push_back("-lc_p");
8293 CmdArgs.push_back("-lgcc_p");
8294 } else {
8295 CmdArgs.push_back("-lc");
8296 CmdArgs.push_back("-lgcc");
8297 }
8298
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008299 if (Args.hasArg(options::OPT_static)) {
8300 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008301 } else if (Args.hasArg(options::OPT_pg)) {
8302 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008303 } else {
8304 CmdArgs.push_back("--as-needed");
8305 CmdArgs.push_back("-lgcc_s");
8306 CmdArgs.push_back("--no-as-needed");
8307 }
8308 }
8309
Douglas Katzman78b37b02015-11-17 20:28:07 +00008310 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008311 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008312 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008313 else
8314 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008315 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008316 }
8317
Xinliang David Li69306c02015-10-22 06:15:31 +00008318 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008319
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008320 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008321 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008322}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008323
Douglas Katzman95354292015-06-23 20:42:09 +00008324void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008325 const InputInfo &Output,
8326 const InputInfoList &Inputs,
8327 const ArgList &Args,
8328 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008329 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008330 ArgStringList CmdArgs;
8331
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008332 // GNU as needs different flags for creating the correct output format
8333 // on architectures with different ABIs or optional feature sets.
8334 switch (getToolChain().getArch()) {
8335 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008336 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008337 break;
8338 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008339 case llvm::Triple::armeb:
8340 case llvm::Triple::thumb:
8341 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008342 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008343 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8344 std::string Arch =
8345 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008346 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008347 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008348 }
8349
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008350 case llvm::Triple::mips:
8351 case llvm::Triple::mipsel:
8352 case llvm::Triple::mips64:
8353 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008354 StringRef CPUName;
8355 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008356 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008357
8358 CmdArgs.push_back("-march");
8359 CmdArgs.push_back(CPUName.data());
8360
8361 CmdArgs.push_back("-mabi");
8362 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8363
8364 if (getToolChain().getArch() == llvm::Triple::mips ||
8365 getToolChain().getArch() == llvm::Triple::mips64)
8366 CmdArgs.push_back("-EB");
8367 else
8368 CmdArgs.push_back("-EL");
8369
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008370 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008371 break;
8372 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008373
8374 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008375 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008376 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008377 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8378 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008379 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008380 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008381 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008382
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008383 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008384 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008385 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8386 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008387 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008388 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008389 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008390
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008391 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008392 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008393 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008394
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008395 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008396
8397 CmdArgs.push_back("-o");
8398 CmdArgs.push_back(Output.getFilename());
8399
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008400 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008401 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008402
David Chisnallddbd68f2011-09-27 22:03:18 +00008403 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008404 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008405}
8406
Douglas Katzman95354292015-06-23 20:42:09 +00008407void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8408 const InputInfo &Output,
8409 const InputInfoList &Inputs,
8410 const ArgList &Args,
8411 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008412 const Driver &D = getToolChain().getDriver();
8413 ArgStringList CmdArgs;
8414
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008415 if (!D.SysRoot.empty())
8416 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8417
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008418 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008419 if (Args.hasArg(options::OPT_static)) {
8420 CmdArgs.push_back("-Bstatic");
8421 } else {
8422 if (Args.hasArg(options::OPT_rdynamic))
8423 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008424 if (Args.hasArg(options::OPT_shared)) {
8425 CmdArgs.push_back("-Bshareable");
8426 } else {
8427 CmdArgs.push_back("-dynamic-linker");
8428 CmdArgs.push_back("/libexec/ld.elf_so");
8429 }
8430 }
8431
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008432 // Many NetBSD architectures support more than one ABI.
8433 // Determine the correct emulation for ld.
8434 switch (getToolChain().getArch()) {
8435 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008436 CmdArgs.push_back("-m");
8437 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008438 break;
8439 case llvm::Triple::arm:
8440 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008441 CmdArgs.push_back("-m");
8442 switch (getToolChain().getTriple().getEnvironment()) {
8443 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008444 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008445 CmdArgs.push_back("armelf_nbsd_eabi");
8446 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008447 case llvm::Triple::EABIHF:
8448 case llvm::Triple::GNUEABIHF:
8449 CmdArgs.push_back("armelf_nbsd_eabihf");
8450 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008451 default:
8452 CmdArgs.push_back("armelf_nbsd");
8453 break;
8454 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008455 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008456 case llvm::Triple::armeb:
8457 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008458 arm::appendEBLinkFlags(
8459 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008460 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008461 CmdArgs.push_back("-m");
8462 switch (getToolChain().getTriple().getEnvironment()) {
8463 case llvm::Triple::EABI:
8464 case llvm::Triple::GNUEABI:
8465 CmdArgs.push_back("armelfb_nbsd_eabi");
8466 break;
8467 case llvm::Triple::EABIHF:
8468 case llvm::Triple::GNUEABIHF:
8469 CmdArgs.push_back("armelfb_nbsd_eabihf");
8470 break;
8471 default:
8472 CmdArgs.push_back("armelfb_nbsd");
8473 break;
8474 }
8475 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008476 case llvm::Triple::mips64:
8477 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008478 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008479 CmdArgs.push_back("-m");
8480 if (getToolChain().getArch() == llvm::Triple::mips64)
8481 CmdArgs.push_back("elf32btsmip");
8482 else
8483 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008484 } else if (mips::hasMipsAbiArg(Args, "64")) {
8485 CmdArgs.push_back("-m");
8486 if (getToolChain().getArch() == llvm::Triple::mips64)
8487 CmdArgs.push_back("elf64btsmip");
8488 else
8489 CmdArgs.push_back("elf64ltsmip");
8490 }
8491 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008492 case llvm::Triple::ppc:
8493 CmdArgs.push_back("-m");
8494 CmdArgs.push_back("elf32ppc_nbsd");
8495 break;
8496
8497 case llvm::Triple::ppc64:
8498 case llvm::Triple::ppc64le:
8499 CmdArgs.push_back("-m");
8500 CmdArgs.push_back("elf64ppc");
8501 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008502
8503 case llvm::Triple::sparc:
8504 CmdArgs.push_back("-m");
8505 CmdArgs.push_back("elf32_sparc");
8506 break;
8507
8508 case llvm::Triple::sparcv9:
8509 CmdArgs.push_back("-m");
8510 CmdArgs.push_back("elf64_sparc");
8511 break;
8512
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008513 default:
8514 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008515 }
8516
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008517 if (Output.isFilename()) {
8518 CmdArgs.push_back("-o");
8519 CmdArgs.push_back(Output.getFilename());
8520 } else {
8521 assert(Output.isNothing() && "Invalid output.");
8522 }
8523
Douglas Katzman78b37b02015-11-17 20:28:07 +00008524 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008525 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008526 CmdArgs.push_back(
8527 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8528 CmdArgs.push_back(
8529 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8530 CmdArgs.push_back(
8531 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008532 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008533 CmdArgs.push_back(
8534 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8535 CmdArgs.push_back(
8536 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008537 }
8538 }
8539
8540 Args.AddAllArgs(CmdArgs, options::OPT_L);
8541 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8542 Args.AddAllArgs(CmdArgs, options::OPT_e);
8543 Args.AddAllArgs(CmdArgs, options::OPT_s);
8544 Args.AddAllArgs(CmdArgs, options::OPT_t);
8545 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8546 Args.AddAllArgs(CmdArgs, options::OPT_r);
8547
8548 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8549
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008550 unsigned Major, Minor, Micro;
8551 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8552 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008553 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008554 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008555 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008556 case llvm::Triple::arm:
8557 case llvm::Triple::armeb:
8558 case llvm::Triple::thumb:
8559 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008560 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008561 case llvm::Triple::ppc64:
8562 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008563 case llvm::Triple::sparc:
8564 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008565 case llvm::Triple::x86:
8566 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008567 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008568 break;
8569 default:
8570 break;
8571 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008572 }
8573
Douglas Katzman78b37b02015-11-17 20:28:07 +00008574 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008575 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008576 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008577 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8578 CmdArgs.push_back("-lm");
8579 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008580 if (Args.hasArg(options::OPT_pthread))
8581 CmdArgs.push_back("-lpthread");
8582 CmdArgs.push_back("-lc");
8583
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008584 if (useLibgcc) {
8585 if (Args.hasArg(options::OPT_static)) {
8586 // libgcc_eh depends on libc, so resolve as much as possible,
8587 // pull in any new requirements from libc and then get the rest
8588 // of libgcc.
8589 CmdArgs.push_back("-lgcc_eh");
8590 CmdArgs.push_back("-lc");
8591 CmdArgs.push_back("-lgcc");
8592 } else {
8593 CmdArgs.push_back("-lgcc");
8594 CmdArgs.push_back("--as-needed");
8595 CmdArgs.push_back("-lgcc_s");
8596 CmdArgs.push_back("--no-as-needed");
8597 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008598 }
8599 }
8600
Douglas Katzman78b37b02015-11-17 20:28:07 +00008601 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008602 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008603 CmdArgs.push_back(
8604 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008605 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008606 CmdArgs.push_back(
8607 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8608 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008609 }
8610
Xinliang David Li69306c02015-10-22 06:15:31 +00008611 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008612
Logan Chieneb9162f2014-06-26 14:23:45 +00008613 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008614 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008615}
8616
Douglas Katzman95354292015-06-23 20:42:09 +00008617void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8618 const InputInfo &Output,
8619 const InputInfoList &Inputs,
8620 const ArgList &Args,
8621 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008622 claimNoWarnArgs(Args);
8623
James Y Knight2db38f32015-08-15 03:45:25 +00008624 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8625 llvm::Triple Triple = llvm::Triple(TripleStr);
8626
Rafael Espindola92b00932010-08-10 00:25:48 +00008627 ArgStringList CmdArgs;
8628
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008629 llvm::Reloc::Model RelocationModel;
8630 unsigned PICLevel;
8631 bool IsPIE;
8632 std::tie(RelocationModel, PICLevel, IsPIE) =
8633 ParsePICArgs(getToolChain(), Triple, Args);
8634
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008635 switch (getToolChain().getArch()) {
8636 default:
8637 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008638 // Add --32/--64 to make sure we get the format we want.
8639 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008640 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008641 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008642 break;
8643 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008644 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8645 CmdArgs.push_back("--x32");
8646 else
8647 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008648 break;
8649 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008650 CmdArgs.push_back("-a32");
8651 CmdArgs.push_back("-mppc");
8652 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008653 break;
8654 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008655 CmdArgs.push_back("-a64");
8656 CmdArgs.push_back("-mppc64");
8657 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008658 break;
8659 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008660 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008661 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008662 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008663 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008664 break;
8665 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008666 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008667 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008668 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8669 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8670 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008671 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008672 }
8673 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008674 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008675 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8676 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8677 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008678 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008679 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008680 case llvm::Triple::arm:
8681 case llvm::Triple::armeb:
8682 case llvm::Triple::thumb:
8683 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008684 const llvm::Triple &Triple2 = getToolChain().getTriple();
8685 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008686 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008687 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008688 break;
8689 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008690 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008691 break;
8692 default:
8693 break;
8694 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008695
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008696 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008697 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8698 case arm::FloatABI::Soft:
8699 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8700 break;
8701 case arm::FloatABI::SoftFP:
8702 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8703 break;
8704 case arm::FloatABI::Hard:
8705 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8706 break;
8707 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008708
8709 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008710
8711 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008712 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008713 // march from being picked in the absence of a cpu flag.
8714 Arg *A;
8715 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008716 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008717 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008718 else
8719 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008720 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008721 break;
8722 }
8723 case llvm::Triple::mips:
8724 case llvm::Triple::mipsel:
8725 case llvm::Triple::mips64:
8726 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008727 StringRef CPUName;
8728 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008729 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008730 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008731
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008732 CmdArgs.push_back("-march");
8733 CmdArgs.push_back(CPUName.data());
8734
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008735 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008736 CmdArgs.push_back(ABIName.data());
8737
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008738 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8739 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008740 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008741 CmdArgs.push_back("-mno-shared");
8742
Daniel Sanders379d44b2014-07-16 11:52:23 +00008743 // LLVM doesn't support -mplt yet and acts as if it is always given.
8744 // However, -mplt has no effect with the N64 ABI.
8745 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008746
8747 if (getToolChain().getArch() == llvm::Triple::mips ||
8748 getToolChain().getArch() == llvm::Triple::mips64)
8749 CmdArgs.push_back("-EB");
8750 else
8751 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008752
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008753 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8754 if (StringRef(A->getValue()) == "2008")
8755 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8756 }
8757
Daniel Sanders379d44b2014-07-16 11:52:23 +00008758 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8759 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8760 options::OPT_mfp64)) {
8761 A->claim();
8762 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008763 } else if (mips::shouldUseFPXX(
8764 Args, getToolChain().getTriple(), CPUName, ABIName,
8765 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008766 CmdArgs.push_back("-mfpxx");
8767
8768 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8769 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008770 if (Arg *A =
8771 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008772 if (A->getOption().matches(options::OPT_mips16)) {
8773 A->claim();
8774 A->render(Args, CmdArgs);
8775 } else {
8776 A->claim();
8777 CmdArgs.push_back("-no-mips16");
8778 }
8779 }
8780
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008781 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8782 options::OPT_mno_micromips);
8783 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8784 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8785
Simon Atanasyanbd986632013-11-26 11:58:04 +00008786 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8787 // Do not use AddLastArg because not all versions of MIPS assembler
8788 // support -mmsa / -mno-msa options.
8789 if (A->getOption().matches(options::OPT_mmsa))
8790 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8791 }
8792
Daniel Sanders379d44b2014-07-16 11:52:23 +00008793 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8794 options::OPT_msoft_float);
8795
Toma Tabacub36d6102015-06-11 12:13:18 +00008796 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8797 options::OPT_msingle_float);
8798
Daniel Sanders379d44b2014-07-16 11:52:23 +00008799 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8800 options::OPT_mno_odd_spreg);
8801
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008802 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008803 break;
8804 }
8805 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008806 // Always pass an -march option, since our default of z10 is later
8807 // than the GNU assembler's default.
8808 StringRef CPUName = getSystemZTargetCPU(Args);
8809 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008810 break;
8811 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008812 }
8813
Renato Golina74bbc72015-07-22 15:32:36 +00008814 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008815 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008816
8817 CmdArgs.push_back("-o");
8818 CmdArgs.push_back(Output.getFilename());
8819
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008820 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008821 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008822
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008823 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008824 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008825
8826 // Handle the debug info splitting at object creation time if we're
8827 // creating an object.
8828 // TODO: Currently only works on linux with newer objcopy.
8829 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008830 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008831 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008832 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008833}
8834
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008835static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008836 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008837 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008838 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008839 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8840 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008841 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008842 CmdArgs.push_back("-lgcc");
8843
Logan Chien3d3373c2012-11-19 12:04:11 +00008844 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008845 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008846 CmdArgs.push_back("-lgcc");
8847 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008848 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008849 CmdArgs.push_back("--as-needed");
8850 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008851 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008852 CmdArgs.push_back("--no-as-needed");
8853 }
8854
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008855 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008856 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008857 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008858 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008859
8860 // According to Android ABI, we have to link with libdl if we are
8861 // linking with non-static libgcc.
8862 //
8863 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8864 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8865 if (isAndroid && !StaticLibgcc)
8866 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008867}
8868
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008869static std::string getLinuxDynamicLinker(const ArgList &Args,
8870 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008871 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8872
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008873 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008874 if (ToolChain.getTriple().isArch64Bit())
8875 return "/system/bin/linker64";
8876 else
8877 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008878 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8879 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008880 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008881 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008882 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008883 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008884 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008885 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008886 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008887 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008888 return "/lib/ld-linux-armhf.so.3";
8889 else
8890 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008891 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8892 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008893 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008894 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008895 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008896 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008897 return "/lib/ld-linux.so.3";
8898 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8899 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008900 std::string LibDir =
8901 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008902 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008903 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008904 if (mips::isUCLibc(Args))
8905 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008906 else if (!ToolChain.getTriple().hasEnvironment()) {
8907 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8908 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8909 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8910 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008911 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008912
8913 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008914 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008915 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008916 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008917 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8918 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008919 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008920 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008921 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8922 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008923 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008924 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008925 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008926 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008927 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008928 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008929 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8930 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008931 else
8932 return "/lib64/ld-linux-x86-64.so.2";
8933}
8934
Renato Golinc4b49242014-02-13 10:01:16 +00008935static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008936 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008937 // Make use of compiler-rt if --rtlib option is used
8938 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8939
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008940 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008941 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008942 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008943 default:
8944 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008945 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008946 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008947 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008948 break;
8949 }
Renato Golinc4b49242014-02-13 10:01:16 +00008950 break;
8951 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00008952 // Make sure libgcc is not used under MSVC environment by default
8953 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
8954 // Issue error diagnostic if libgcc is explicitly specified
8955 // through command line as --rtlib option argument.
8956 if (Args.hasArg(options::OPT_rtlib_EQ)) {
8957 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
8958 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
8959 }
8960 } else
8961 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00008962 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008963 }
8964}
8965
Rafael Espindola1e085772014-08-15 17:14:35 +00008966static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8967 switch (T.getArch()) {
8968 case llvm::Triple::x86:
8969 return "elf_i386";
8970 case llvm::Triple::aarch64:
8971 return "aarch64linux";
8972 case llvm::Triple::aarch64_be:
8973 return "aarch64_be_linux";
8974 case llvm::Triple::arm:
8975 case llvm::Triple::thumb:
8976 return "armelf_linux_eabi";
8977 case llvm::Triple::armeb:
8978 case llvm::Triple::thumbeb:
8979 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8980 case llvm::Triple::ppc:
8981 return "elf32ppclinux";
8982 case llvm::Triple::ppc64:
8983 return "elf64ppc";
8984 case llvm::Triple::ppc64le:
8985 return "elf64lppc";
8986 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008987 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008988 return "elf32_sparc";
8989 case llvm::Triple::sparcv9:
8990 return "elf64_sparc";
8991 case llvm::Triple::mips:
8992 return "elf32btsmip";
8993 case llvm::Triple::mipsel:
8994 return "elf32ltsmip";
8995 case llvm::Triple::mips64:
8996 if (mips::hasMipsAbiArg(Args, "n32"))
8997 return "elf32btsmipn32";
8998 return "elf64btsmip";
8999 case llvm::Triple::mips64el:
9000 if (mips::hasMipsAbiArg(Args, "n32"))
9001 return "elf32ltsmipn32";
9002 return "elf64ltsmip";
9003 case llvm::Triple::systemz:
9004 return "elf64_s390";
9005 case llvm::Triple::x86_64:
9006 if (T.getEnvironment() == llvm::Triple::GNUX32)
9007 return "elf32_x86_64";
9008 return "elf_x86_64";
9009 default:
9010 llvm_unreachable("Unexpected arch");
9011 }
9012}
9013
Douglas Katzman95354292015-06-23 20:42:09 +00009014void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9015 const InputInfo &Output,
9016 const InputInfoList &Inputs,
9017 const ArgList &Args,
9018 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009019 const toolchains::Linux &ToolChain =
9020 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009021 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009022
9023 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9024 llvm::Triple Triple = llvm::Triple(TripleStr);
9025
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009026 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009027 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009028 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009029 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9030 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009031 const bool HasCRTBeginEndFiles =
9032 ToolChain.getTriple().hasEnvironment() ||
9033 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009034
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009035 ArgStringList CmdArgs;
9036
Rafael Espindolad1002f62010-11-15 18:28:16 +00009037 // Silence warning for "clang -g foo.o -o foo"
9038 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009039 // and "clang -emit-llvm foo.o -o foo"
9040 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009041 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009042 // handled somewhere else.
9043 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009044
Peter Collingbourne39719a72015-11-20 20:49:39 +00009045 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9046 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009047 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009048 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009049 CmdArgs.push_back("-target");
9050 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9051 }
9052
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009053 if (!D.SysRoot.empty())
9054 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009055
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009056 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009057 CmdArgs.push_back("-pie");
9058
Rafael Espindola1c76c592010-11-07 22:57:16 +00009059 if (Args.hasArg(options::OPT_rdynamic))
9060 CmdArgs.push_back("-export-dynamic");
9061
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009062 if (Args.hasArg(options::OPT_s))
9063 CmdArgs.push_back("-s");
9064
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009065 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009066 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009067
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009068 for (const auto &Opt : ToolChain.ExtraOpts)
9069 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009070
9071 if (!Args.hasArg(options::OPT_static)) {
9072 CmdArgs.push_back("--eh-frame-hdr");
9073 }
9074
9075 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009076 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009077
9078 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009079 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9080 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009081 CmdArgs.push_back("-Bstatic");
9082 else
9083 CmdArgs.push_back("-static");
9084 } else if (Args.hasArg(options::OPT_shared)) {
9085 CmdArgs.push_back("-shared");
9086 }
9087
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009088 if (!Args.hasArg(options::OPT_static)) {
9089 if (Args.hasArg(options::OPT_rdynamic))
9090 CmdArgs.push_back("-export-dynamic");
9091
9092 if (!Args.hasArg(options::OPT_shared)) {
9093 const std::string Loader =
9094 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9095 CmdArgs.push_back("-dynamic-linker");
9096 CmdArgs.push_back(Args.MakeArgString(Loader));
9097 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009098 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009099
9100 CmdArgs.push_back("-o");
9101 CmdArgs.push_back(Output.getFilename());
9102
Douglas Katzman78b37b02015-11-17 20:28:07 +00009103 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009104 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009105 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009106 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009107 if (Args.hasArg(options::OPT_pg))
9108 crt1 = "gcrt1.o";
9109 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009110 crt1 = "Scrt1.o";
9111 else
9112 crt1 = "crt1.o";
9113 }
9114 if (crt1)
9115 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009116
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009117 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9118 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009119
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009120 const char *crtbegin;
9121 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009122 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009123 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009124 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009125 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009126 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009127 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009128 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009129
9130 if (HasCRTBeginEndFiles)
9131 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009132
9133 // Add crtfastmath.o if available and fast math is enabled.
9134 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009135 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009136
9137 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009138 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009139
Douglas Katzman6059ef92015-11-17 17:41:23 +00009140 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009141
Teresa Johnson945bc502015-10-15 20:35:53 +00009142 if (D.isUsingLTO())
9143 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009144
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009145 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9146 CmdArgs.push_back("--no-demangle");
9147
Alexey Samsonov52550342014-09-15 19:58:40 +00009148 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009149 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009150 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009151 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009152
Douglas Katzman78b37b02015-11-17 20:28:07 +00009153 if (D.CCCIsCXX() &&
9154 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009155 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009156 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009157 if (OnlyLibstdcxxStatic)
9158 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009159 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009160 if (OnlyLibstdcxxStatic)
9161 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009162 CmdArgs.push_back("-lm");
9163 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009164 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9165 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009166
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009167 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009168 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9169 if (Args.hasArg(options::OPT_static))
9170 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009171
Alexey Samsonov52550342014-09-15 19:58:40 +00009172 if (NeedsSanitizerDeps)
9173 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9174
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009175 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9176 Args.hasArg(options::OPT_pthreads);
9177
9178 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9179 options::OPT_fno_openmp, false)) {
9180 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9181 // FIXME: Does this really make sense for all GNU toolchains?
9182 WantPthread = true;
9183
9184 // Also link the particular OpenMP runtimes.
9185 switch (getOpenMPRuntime(ToolChain, Args)) {
9186 case OMPRT_OMP:
9187 CmdArgs.push_back("-lomp");
9188 break;
9189 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009190 CmdArgs.push_back("-lgomp");
9191
9192 // FIXME: Exclude this for platforms with libgomp that don't require
9193 // librt. Most modern Linux platforms require it, but some may not.
9194 CmdArgs.push_back("-lrt");
9195 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009196 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009197 CmdArgs.push_back("-liomp5");
9198 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009199 case OMPRT_Unknown:
9200 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009201 break;
9202 }
Chandler Carruth01538002013-01-17 13:19:29 +00009203 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009204
Renato Golinc4b49242014-02-13 10:01:16 +00009205 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009206
Richard Smith31d1de22015-05-20 22:48:44 +00009207 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009208 CmdArgs.push_back("-lpthread");
9209
Rafael Espindolab17bc532016-01-25 18:29:16 +00009210 if (Args.hasArg(options::OPT_fsplit_stack))
9211 CmdArgs.push_back("--wrap=pthread_create");
9212
Chandler Carruth94a32012012-05-14 18:31:18 +00009213 CmdArgs.push_back("-lc");
9214
9215 if (Args.hasArg(options::OPT_static))
9216 CmdArgs.push_back("--end-group");
9217 else
Renato Golinc4b49242014-02-13 10:01:16 +00009218 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009219 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009220
Rafael Espindola81937ec2010-12-01 01:52:43 +00009221 if (!Args.hasArg(options::OPT_nostartfiles)) {
9222 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009223 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009224 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009225 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009226 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009227 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009228 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009229
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009230 if (HasCRTBeginEndFiles)
9231 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009232 if (!isAndroid)
9233 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009234 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009235 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009236
Peter Collingbourne39719a72015-11-20 20:49:39 +00009237 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009238}
9239
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009240// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9241// for the various SFI requirements like register masking. The assembly tool
9242// inserts the file containing the macros as an input into all the assembly
9243// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009244void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9245 const InputInfo &Output,
9246 const InputInfoList &Inputs,
9247 const ArgList &Args,
9248 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009249 const toolchains::NaClToolChain &ToolChain =
9250 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009251 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009252 "nacl-arm-macros.s");
9253 InputInfoList NewInputs;
9254 NewInputs.push_back(NaClMacros);
9255 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009256 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9257 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009258}
9259
Douglas Katzman750cfc52015-06-29 18:42:16 +00009260// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009261// we use static by default, do not yet support sanitizers or LTO, and a few
9262// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009263// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009264void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9265 const InputInfo &Output,
9266 const InputInfoList &Inputs,
9267 const ArgList &Args,
9268 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009269
Douglas Katzman54366072015-07-27 16:53:08 +00009270 const toolchains::NaClToolChain &ToolChain =
9271 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009272 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009273 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009274 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009275 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009276
9277 ArgStringList CmdArgs;
9278
9279 // Silence warning for "clang -g foo.o -o foo"
9280 Args.ClaimAllArgs(options::OPT_g_Group);
9281 // and "clang -emit-llvm foo.o -o foo"
9282 Args.ClaimAllArgs(options::OPT_emit_llvm);
9283 // and for "clang -w foo.o -o foo". Other warning options are already
9284 // handled somewhere else.
9285 Args.ClaimAllArgs(options::OPT_w);
9286
9287 if (!D.SysRoot.empty())
9288 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9289
9290 if (Args.hasArg(options::OPT_rdynamic))
9291 CmdArgs.push_back("-export-dynamic");
9292
9293 if (Args.hasArg(options::OPT_s))
9294 CmdArgs.push_back("-s");
9295
Douglas Katzman54366072015-07-27 16:53:08 +00009296 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9297 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009298 CmdArgs.push_back("--build-id");
9299
9300 if (!IsStatic)
9301 CmdArgs.push_back("--eh-frame-hdr");
9302
9303 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009304 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009305 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009306 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009307 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009308 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009309 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009310 else if (Arch == llvm::Triple::mipsel)
9311 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009312 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009313 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9314 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009315
9316 if (IsStatic)
9317 CmdArgs.push_back("-static");
9318 else if (Args.hasArg(options::OPT_shared))
9319 CmdArgs.push_back("-shared");
9320
9321 CmdArgs.push_back("-o");
9322 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009324 if (!Args.hasArg(options::OPT_shared))
9325 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9326 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9327
9328 const char *crtbegin;
9329 if (IsStatic)
9330 crtbegin = "crtbeginT.o";
9331 else if (Args.hasArg(options::OPT_shared))
9332 crtbegin = "crtbeginS.o";
9333 else
9334 crtbegin = "crtbegin.o";
9335 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9336 }
9337
9338 Args.AddAllArgs(CmdArgs, options::OPT_L);
9339 Args.AddAllArgs(CmdArgs, options::OPT_u);
9340
Douglas Katzman6059ef92015-11-17 17:41:23 +00009341 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009342
9343 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9344 CmdArgs.push_back("--no-demangle");
9345
9346 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9347
Douglas Katzman78b37b02015-11-17 20:28:07 +00009348 if (D.CCCIsCXX() &&
9349 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009350 bool OnlyLibstdcxxStatic =
9351 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009352 if (OnlyLibstdcxxStatic)
9353 CmdArgs.push_back("-Bstatic");
9354 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9355 if (OnlyLibstdcxxStatic)
9356 CmdArgs.push_back("-Bdynamic");
9357 CmdArgs.push_back("-lm");
9358 }
9359
9360 if (!Args.hasArg(options::OPT_nostdlib)) {
9361 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9362 // Always use groups, since it has no effect on dynamic libraries.
9363 CmdArgs.push_back("--start-group");
9364 CmdArgs.push_back("-lc");
9365 // NaCl's libc++ currently requires libpthread, so just always include it
9366 // in the group for C++.
9367 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009368 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009369 // Gold, used by Mips, handles nested groups differently than ld, and
9370 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9371 // which is not a desired behaviour here.
9372 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9373 if (getToolChain().getArch() == llvm::Triple::mipsel)
9374 CmdArgs.push_back("-lnacl");
9375
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009376 CmdArgs.push_back("-lpthread");
9377 }
9378
9379 CmdArgs.push_back("-lgcc");
9380 CmdArgs.push_back("--as-needed");
9381 if (IsStatic)
9382 CmdArgs.push_back("-lgcc_eh");
9383 else
9384 CmdArgs.push_back("-lgcc_s");
9385 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009386
9387 // Mips needs to create and use pnacl_legacy library that contains
9388 // definitions from bitcode/pnaclmm.c and definitions for
9389 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9390 if (getToolChain().getArch() == llvm::Triple::mipsel)
9391 CmdArgs.push_back("-lpnacl_legacy");
9392
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009393 CmdArgs.push_back("--end-group");
9394 }
9395
9396 if (!Args.hasArg(options::OPT_nostartfiles)) {
9397 const char *crtend;
9398 if (Args.hasArg(options::OPT_shared))
9399 crtend = "crtendS.o";
9400 else
9401 crtend = "crtend.o";
9402
9403 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9404 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9405 }
9406 }
9407
Peter Collingbourne39719a72015-11-20 20:49:39 +00009408 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9409 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009410}
9411
Douglas Katzman95354292015-06-23 20:42:09 +00009412void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9413 const InputInfo &Output,
9414 const InputInfoList &Inputs,
9415 const ArgList &Args,
9416 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009417 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009418 ArgStringList CmdArgs;
9419
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009420 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009421
9422 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009423 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009424
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009425 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009426 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009427
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009428 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009429 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009430}
9431
Douglas Katzman95354292015-06-23 20:42:09 +00009432void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9433 const InputInfo &Output,
9434 const InputInfoList &Inputs,
9435 const ArgList &Args,
9436 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009437 const Driver &D = getToolChain().getDriver();
9438 ArgStringList CmdArgs;
9439
Daniel Dunbarb440f562010-08-02 02:38:21 +00009440 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009441 CmdArgs.push_back("-o");
9442 CmdArgs.push_back(Output.getFilename());
9443 } else {
9444 assert(Output.isNothing() && "Invalid output.");
9445 }
9446
Douglas Katzman78b37b02015-11-17 20:28:07 +00009447 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009448 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9449 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9450 CmdArgs.push_back(
9451 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9452 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009453 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009454
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009455 Args.AddAllArgs(CmdArgs,
9456 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009457
Daniel Dunbar54423b22010-09-17 00:24:54 +00009458 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009459
Xinliang David Li69306c02015-10-22 06:15:31 +00009460 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009461
Douglas Katzman78b37b02015-11-17 20:28:07 +00009462 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009463 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009464 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009465 CmdArgs.push_back("-lm");
9466 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009467 }
9468
Douglas Katzman78b37b02015-11-17 20:28:07 +00009469 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009470 if (Args.hasArg(options::OPT_pthread))
9471 CmdArgs.push_back("-lpthread");
9472 CmdArgs.push_back("-lc");
9473 CmdArgs.push_back("-lCompilerRT-Generic");
9474 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9475 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009476 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009477 }
9478
Logan Chieneb9162f2014-06-26 14:23:45 +00009479 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009480 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009481}
9482
Daniel Dunbarcc912342009-05-02 18:28:39 +00009483/// DragonFly Tools
9484
9485// For now, DragonFly Assemble does just about the same as for
9486// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009487void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9488 const InputInfo &Output,
9489 const InputInfoList &Inputs,
9490 const ArgList &Args,
9491 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009492 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009493 ArgStringList CmdArgs;
9494
9495 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9496 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009497 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009498 CmdArgs.push_back("--32");
9499
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009500 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009501
9502 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009503 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009504
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009505 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009506 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009507
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009508 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009509 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009510}
9511
Douglas Katzman95354292015-06-23 20:42:09 +00009512void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9513 const InputInfo &Output,
9514 const InputInfoList &Inputs,
9515 const ArgList &Args,
9516 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009517 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009518 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009519
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009520 if (!D.SysRoot.empty())
9521 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9522
John McCall65b8da02013-04-11 22:55:55 +00009523 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009524 if (Args.hasArg(options::OPT_static)) {
9525 CmdArgs.push_back("-Bstatic");
9526 } else {
John McCall65b8da02013-04-11 22:55:55 +00009527 if (Args.hasArg(options::OPT_rdynamic))
9528 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009529 if (Args.hasArg(options::OPT_shared))
9530 CmdArgs.push_back("-Bshareable");
9531 else {
9532 CmdArgs.push_back("-dynamic-linker");
9533 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9534 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009535 CmdArgs.push_back("--hash-style=gnu");
9536 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009537 }
9538
9539 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9540 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009541 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009542 CmdArgs.push_back("-m");
9543 CmdArgs.push_back("elf_i386");
9544 }
9545
Daniel Dunbarb440f562010-08-02 02:38:21 +00009546 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009547 CmdArgs.push_back("-o");
9548 CmdArgs.push_back(Output.getFilename());
9549 } else {
9550 assert(Output.isNothing() && "Invalid output.");
9551 }
9552
Douglas Katzman78b37b02015-11-17 20:28:07 +00009553 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009554 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009555 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009556 CmdArgs.push_back(
9557 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009558 else {
9559 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009560 CmdArgs.push_back(
9561 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009562 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009563 CmdArgs.push_back(
9564 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009565 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009566 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009567 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009568 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009569 CmdArgs.push_back(
9570 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009571 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009572 CmdArgs.push_back(
9573 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009574 }
9575
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009576 Args.AddAllArgs(CmdArgs,
9577 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009578
Daniel Dunbar54423b22010-09-17 00:24:54 +00009579 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009580
Douglas Katzman78b37b02015-11-17 20:28:07 +00009581 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009582 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009583
9584 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009585 CmdArgs.push_back("-rpath");
9586 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009587 }
9588
Hans Wennborg70850d82013-07-18 20:29:38 +00009589 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009590 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009591 CmdArgs.push_back("-lm");
9592 }
9593
Daniel Dunbarcc912342009-05-02 18:28:39 +00009594 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009595 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009596
9597 if (!Args.hasArg(options::OPT_nolibc)) {
9598 CmdArgs.push_back("-lc");
9599 }
9600
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009601 if (Args.hasArg(options::OPT_static) ||
9602 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009603 CmdArgs.push_back("-lgcc");
9604 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009605 } else {
9606 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009607 CmdArgs.push_back("-lgcc_pic");
9608 if (!Args.hasArg(options::OPT_shared))
9609 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009610 } else {
John McCall65b8da02013-04-11 22:55:55 +00009611 CmdArgs.push_back("-lgcc");
9612 CmdArgs.push_back("--as-needed");
9613 CmdArgs.push_back("-lgcc_pic");
9614 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009615 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009616 }
9617 }
9618
Douglas Katzman78b37b02015-11-17 20:28:07 +00009619 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009620 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009621 CmdArgs.push_back(
9622 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009623 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009624 CmdArgs.push_back(
9625 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9626 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009627 }
9628
Xinliang David Li69306c02015-10-22 06:15:31 +00009629 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009630
Logan Chieneb9162f2014-06-26 14:23:45 +00009631 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009632 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009633}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009634
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009635// Try to find Exe from a Visual Studio distribution. This first tries to find
9636// an installed copy of Visual Studio and, failing that, looks in the PATH,
9637// making sure that whatever executable that's found is not a same-named exe
9638// from clang itself to prevent clang from falling back to itself.
9639static std::string FindVisualStudioExecutable(const ToolChain &TC,
9640 const char *Exe,
9641 const char *ClangProgramPath) {
9642 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9643 std::string visualStudioBinDir;
9644 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9645 visualStudioBinDir)) {
9646 SmallString<128> FilePath(visualStudioBinDir);
9647 llvm::sys::path::append(FilePath, Exe);
9648 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9649 return FilePath.str();
9650 }
9651
9652 return Exe;
9653}
9654
Douglas Katzman95354292015-06-23 20:42:09 +00009655void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9656 const InputInfo &Output,
9657 const InputInfoList &Inputs,
9658 const ArgList &Args,
9659 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009660 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009661 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009662
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009663 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9664 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009665 CmdArgs.push_back(
9666 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009667
Douglas Katzman78b37b02015-11-17 20:28:07 +00009668 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9669 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009670 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009671
Zachary Turner10d75b22014-10-22 20:40:43 +00009672 if (!llvm::sys::Process::GetEnv("LIB")) {
9673 // If the VC environment hasn't been configured (perhaps because the user
9674 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009675 // the environment variable is set however, assume the user knows what
9676 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009677 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009678 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009679 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9680 SmallString<128> LibDir(VisualStudioDir);
9681 llvm::sys::path::append(LibDir, "VC", "lib");
9682 switch (MSVC.getArch()) {
9683 case llvm::Triple::x86:
9684 // x86 just puts the libraries directly in lib
9685 break;
9686 case llvm::Triple::x86_64:
9687 llvm::sys::path::append(LibDir, "amd64");
9688 break;
9689 case llvm::Triple::arm:
9690 llvm::sys::path::append(LibDir, "arm");
9691 break;
9692 default:
9693 break;
9694 }
9695 CmdArgs.push_back(
9696 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009697
9698 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9699 std::string UniversalCRTLibPath;
9700 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9701 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9702 UniversalCRTLibPath.c_str()));
9703 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009704 }
9705
9706 std::string WindowsSdkLibPath;
9707 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9708 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9709 WindowsSdkLibPath.c_str()));
9710 }
9711
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009712 CmdArgs.push_back("-nologo");
9713
Reid Kleckner124955a2015-08-05 18:51:13 +00009714 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009715 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009716
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009717 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009718 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009719 if (DLL) {
9720 CmdArgs.push_back(Args.MakeArgString("-dll"));
9721
9722 SmallString<128> ImplibName(Output.getFilename());
9723 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009724 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009725 }
9726
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009727 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009728 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009729 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009730 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009731 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9732 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009733 // Make sure the dynamic runtime thunk is not optimized out at link time
9734 // to ensure proper SEH handling.
9735 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009736 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009737 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009738 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009739 for (const auto &Lib : {"asan", "asan_cxx"})
9740 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009741 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009742 }
9743
Hans Wennborg2e274592013-08-13 23:38:57 +00009744 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009745
Alexey Bataevc7e84352015-08-19 04:49:01 +00009746 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9747 options::OPT_fno_openmp, false)) {
9748 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9749 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9750 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9751 TC.getDriver().Dir + "/../lib"));
9752 switch (getOpenMPRuntime(getToolChain(), Args)) {
9753 case OMPRT_OMP:
9754 CmdArgs.push_back("-defaultlib:libomp.lib");
9755 break;
9756 case OMPRT_IOMP5:
9757 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9758 break;
9759 case OMPRT_GOMP:
9760 break;
9761 case OMPRT_Unknown:
9762 // Already diagnosed.
9763 break;
9764 }
9765 }
9766
Andrey Turetskiya4868572016-03-14 11:19:43 +00009767 // Add compiler-rt lib in case if it was explicitly
9768 // specified as an argument for --rtlib option.
9769 if (!Args.hasArg(options::OPT_nostdlib)) {
9770 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9771 }
9772
Reid Kleckner337188f2014-09-16 19:22:00 +00009773 // Add filenames, libraries, and other linker inputs.
9774 for (const auto &Input : Inputs) {
9775 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009776 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009777 continue;
9778 }
9779
9780 const Arg &A = Input.getInputArg();
9781
9782 // Render -l options differently for the MSVC linker.
9783 if (A.getOption().matches(options::OPT_l)) {
9784 StringRef Lib = A.getValue();
9785 const char *LinkLibArg;
9786 if (Lib.endswith(".lib"))
9787 LinkLibArg = Args.MakeArgString(Lib);
9788 else
9789 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9790 CmdArgs.push_back(LinkLibArg);
9791 continue;
9792 }
9793
9794 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9795 // or -L. Render it, even if MSVC doesn't understand it.
9796 A.renderAsInput(Args, CmdArgs);
9797 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009798
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009799 TC.addProfileRTLibs(Args, CmdArgs);
9800
Zachary Turner719f58c2014-12-01 23:06:47 +00009801 // We need to special case some linker paths. In the case of lld, we need to
9802 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9803 // linker, we need to use a special search algorithm.
9804 llvm::SmallString<128> linkPath;
9805 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9806 if (Linker.equals_lower("lld"))
9807 Linker = "lld-link";
9808
9809 if (Linker.equals_lower("link")) {
9810 // If we're using the MSVC linker, it's not sufficient to just use link
9811 // from the program PATH, because other environments like GnuWin32 install
9812 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009813 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009814 C.getDriver().getClangProgramPath());
9815 } else {
9816 linkPath = Linker;
9817 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009818 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009819 }
9820
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009821 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009822 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009823}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009824
Douglas Katzman95354292015-06-23 20:42:09 +00009825void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9826 const InputInfo &Output,
9827 const InputInfoList &Inputs,
9828 const ArgList &Args,
9829 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009830 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9831}
9832
Douglas Katzman95354292015-06-23 20:42:09 +00009833std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009834 Compilation &C, const JobAction &JA, const InputInfo &Output,
9835 const InputInfoList &Inputs, const ArgList &Args,
9836 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009837 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009838 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009839 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009840 CmdArgs.push_back("/W0"); // No warnings.
9841
9842 // The goal is to be able to invoke this tool correctly based on
9843 // any flag accepted by clang-cl.
9844
9845 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009846 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009847
9848 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009849 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9850 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9851 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009852 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9853 if (A->getOption().getID() == options::OPT_O0) {
9854 CmdArgs.push_back("/Od");
9855 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009856 CmdArgs.push_back("/Og");
9857
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009858 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009859 if (OptLevel == "s" || OptLevel == "z")
9860 CmdArgs.push_back("/Os");
9861 else
9862 CmdArgs.push_back("/Ot");
9863
9864 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009865 }
9866 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009867 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9868 options::OPT_fno_omit_frame_pointer))
9869 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9870 ? "/Oy"
9871 : "/Oy-");
9872 if (!Args.hasArg(options::OPT_fwritable_strings))
9873 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009874
Nico Weber3f8dafb2015-03-12 19:37:10 +00009875 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009876 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9877
David Majnemerf6072342014-07-01 22:24:56 +00009878 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9879 /*default=*/false))
9880 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009881 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9882 options::OPT_fno_function_sections))
9883 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9884 ? "/Gy"
9885 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009886 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9887 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009888 CmdArgs.push_back(
9889 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009890 if (Args.hasArg(options::OPT_fsyntax_only))
9891 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009892 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9893 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009894 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009895
Nico Weber3f8dafb2015-03-12 19:37:10 +00009896 std::vector<std::string> Includes =
9897 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009898 for (const auto &Include : Includes)
9899 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009900
Hans Wennborg87cfa712013-09-19 20:32:16 +00009901 // Flags that can simply be passed through.
9902 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9903 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009904 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9905 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009906 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009907 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009908
9909 // The order of these flags is relevant, so pick the last one.
9910 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9911 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9912 A->render(Args, CmdArgs);
9913
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009914 // Pass through all unknown arguments so that the fallback command can see
9915 // them too.
9916 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9917
Hans Wennborg87cfa712013-09-19 20:32:16 +00009918 // Input filename.
9919 assert(Inputs.size() == 1);
9920 const InputInfo &II = Inputs[0];
9921 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9922 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9923 if (II.isFilename())
9924 CmdArgs.push_back(II.getFilename());
9925 else
9926 II.getInputArg().renderAsInput(Args, CmdArgs);
9927
9928 // Output filename.
9929 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009930 const char *Fo =
9931 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009932 CmdArgs.push_back(Fo);
9933
Hans Wennborg188382e2013-09-20 18:16:35 +00009934 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009935 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9936 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009937 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009938 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009939}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009940
Yaron Keren1c0070c2015-07-02 04:45:27 +00009941/// MinGW Tools
9942void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9943 const InputInfo &Output,
9944 const InputInfoList &Inputs,
9945 const ArgList &Args,
9946 const char *LinkingOutput) const {
9947 claimNoWarnArgs(Args);
9948 ArgStringList CmdArgs;
9949
9950 if (getToolChain().getArch() == llvm::Triple::x86) {
9951 CmdArgs.push_back("--32");
9952 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9953 CmdArgs.push_back("--64");
9954 }
9955
9956 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9957
9958 CmdArgs.push_back("-o");
9959 CmdArgs.push_back(Output.getFilename());
9960
9961 for (const auto &II : Inputs)
9962 CmdArgs.push_back(II.getFilename());
9963
9964 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009965 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009966
9967 if (Args.hasArg(options::OPT_gsplit_dwarf))
9968 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9969 SplitDebugName(Args, Inputs[0]));
9970}
9971
9972void MinGW::Linker::AddLibGCC(const ArgList &Args,
9973 ArgStringList &CmdArgs) const {
9974 if (Args.hasArg(options::OPT_mthreads))
9975 CmdArgs.push_back("-lmingwthrd");
9976 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009977
Yaron Kerenaa281332015-08-09 00:24:07 +00009978 // Make use of compiler-rt if --rtlib option is used
9979 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9980 if (RLT == ToolChain::RLT_Libgcc) {
9981 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9982 Args.hasArg(options::OPT_static);
9983 bool Shared = Args.hasArg(options::OPT_shared);
9984 bool CXX = getToolChain().getDriver().CCCIsCXX();
9985
9986 if (Static || (!CXX && !Shared)) {
9987 CmdArgs.push_back("-lgcc");
9988 CmdArgs.push_back("-lgcc_eh");
9989 } else {
9990 CmdArgs.push_back("-lgcc_s");
9991 CmdArgs.push_back("-lgcc");
9992 }
9993 } else {
9994 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9995 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009996
Yaron Keren1c0070c2015-07-02 04:45:27 +00009997 CmdArgs.push_back("-lmoldname");
9998 CmdArgs.push_back("-lmingwex");
9999 CmdArgs.push_back("-lmsvcrt");
10000}
10001
10002void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10003 const InputInfo &Output,
10004 const InputInfoList &Inputs,
10005 const ArgList &Args,
10006 const char *LinkingOutput) const {
10007 const ToolChain &TC = getToolChain();
10008 const Driver &D = TC.getDriver();
10009 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10010
10011 ArgStringList CmdArgs;
10012
10013 // Silence warning for "clang -g foo.o -o foo"
10014 Args.ClaimAllArgs(options::OPT_g_Group);
10015 // and "clang -emit-llvm foo.o -o foo"
10016 Args.ClaimAllArgs(options::OPT_emit_llvm);
10017 // and for "clang -w foo.o -o foo". Other warning options are already
10018 // handled somewhere else.
10019 Args.ClaimAllArgs(options::OPT_w);
10020
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010021 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10022 if (LinkerName.equals_lower("lld")) {
10023 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010024 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010025 } else if (!LinkerName.equals_lower("ld")) {
10026 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010027 }
10028
Yaron Keren1c0070c2015-07-02 04:45:27 +000010029 if (!D.SysRoot.empty())
10030 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10031
10032 if (Args.hasArg(options::OPT_s))
10033 CmdArgs.push_back("-s");
10034
10035 CmdArgs.push_back("-m");
10036 if (TC.getArch() == llvm::Triple::x86)
10037 CmdArgs.push_back("i386pe");
10038 if (TC.getArch() == llvm::Triple::x86_64)
10039 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010040 if (TC.getArch() == llvm::Triple::arm)
10041 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010042
10043 if (Args.hasArg(options::OPT_mwindows)) {
10044 CmdArgs.push_back("--subsystem");
10045 CmdArgs.push_back("windows");
10046 } else if (Args.hasArg(options::OPT_mconsole)) {
10047 CmdArgs.push_back("--subsystem");
10048 CmdArgs.push_back("console");
10049 }
10050
10051 if (Args.hasArg(options::OPT_static))
10052 CmdArgs.push_back("-Bstatic");
10053 else {
10054 if (Args.hasArg(options::OPT_mdll))
10055 CmdArgs.push_back("--dll");
10056 else if (Args.hasArg(options::OPT_shared))
10057 CmdArgs.push_back("--shared");
10058 CmdArgs.push_back("-Bdynamic");
10059 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10060 CmdArgs.push_back("-e");
10061 if (TC.getArch() == llvm::Triple::x86)
10062 CmdArgs.push_back("_DllMainCRTStartup@12");
10063 else
10064 CmdArgs.push_back("DllMainCRTStartup");
10065 CmdArgs.push_back("--enable-auto-image-base");
10066 }
10067 }
10068
10069 CmdArgs.push_back("-o");
10070 CmdArgs.push_back(Output.getFilename());
10071
10072 Args.AddAllArgs(CmdArgs, options::OPT_e);
10073 // FIXME: add -N, -n flags
10074 Args.AddLastArg(CmdArgs, options::OPT_r);
10075 Args.AddLastArg(CmdArgs, options::OPT_s);
10076 Args.AddLastArg(CmdArgs, options::OPT_t);
10077 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10078 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10079
Douglas Katzman78b37b02015-11-17 20:28:07 +000010080 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010081 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10082 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10083 } else {
10084 if (Args.hasArg(options::OPT_municode))
10085 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10086 else
10087 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10088 }
10089 if (Args.hasArg(options::OPT_pg))
10090 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10091 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10092 }
10093
10094 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010095 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010096 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10097
10098 // TODO: Add ASan stuff here
10099
10100 // TODO: Add profile stuff here
10101
Douglas Katzman78b37b02015-11-17 20:28:07 +000010102 if (D.CCCIsCXX() &&
10103 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010104 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10105 !Args.hasArg(options::OPT_static);
10106 if (OnlyLibstdcxxStatic)
10107 CmdArgs.push_back("-Bstatic");
10108 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10109 if (OnlyLibstdcxxStatic)
10110 CmdArgs.push_back("-Bdynamic");
10111 }
10112
10113 if (!Args.hasArg(options::OPT_nostdlib)) {
10114 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10115 if (Args.hasArg(options::OPT_static))
10116 CmdArgs.push_back("--start-group");
10117
10118 if (Args.hasArg(options::OPT_fstack_protector) ||
10119 Args.hasArg(options::OPT_fstack_protector_strong) ||
10120 Args.hasArg(options::OPT_fstack_protector_all)) {
10121 CmdArgs.push_back("-lssp_nonshared");
10122 CmdArgs.push_back("-lssp");
10123 }
10124 if (Args.hasArg(options::OPT_fopenmp))
10125 CmdArgs.push_back("-lgomp");
10126
10127 AddLibGCC(Args, CmdArgs);
10128
10129 if (Args.hasArg(options::OPT_pg))
10130 CmdArgs.push_back("-lgmon");
10131
Yaron Kerenadce68e2015-07-06 18:52:19 +000010132 if (Args.hasArg(options::OPT_pthread))
10133 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010134
10135 // add system libraries
10136 if (Args.hasArg(options::OPT_mwindows)) {
10137 CmdArgs.push_back("-lgdi32");
10138 CmdArgs.push_back("-lcomdlg32");
10139 }
10140 CmdArgs.push_back("-ladvapi32");
10141 CmdArgs.push_back("-lshell32");
10142 CmdArgs.push_back("-luser32");
10143 CmdArgs.push_back("-lkernel32");
10144
10145 if (Args.hasArg(options::OPT_static))
10146 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010147 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010148 AddLibGCC(Args, CmdArgs);
10149 }
10150
10151 if (!Args.hasArg(options::OPT_nostartfiles)) {
10152 // Add crtfastmath.o if available and fast math is enabled.
10153 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10154
10155 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10156 }
10157 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010158 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010159 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010160}
10161
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010162/// XCore Tools
10163// We pass assemble and link construction to the xcc tool.
10164
Douglas Katzman95354292015-06-23 20:42:09 +000010165void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10166 const InputInfo &Output,
10167 const InputInfoList &Inputs,
10168 const ArgList &Args,
10169 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010170 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010171 ArgStringList CmdArgs;
10172
10173 CmdArgs.push_back("-o");
10174 CmdArgs.push_back(Output.getFilename());
10175
10176 CmdArgs.push_back("-c");
10177
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010178 if (Args.hasArg(options::OPT_v))
10179 CmdArgs.push_back("-v");
10180
Robert Lytton894d25c2014-05-02 09:33:25 +000010181 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10182 if (!A->getOption().matches(options::OPT_g0))
10183 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010184
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010185 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10186 false))
10187 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010188
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010189 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010190
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010191 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010192 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010193
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010194 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010195 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010196}
10197
Douglas Katzman95354292015-06-23 20:42:09 +000010198void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10199 const InputInfo &Output,
10200 const InputInfoList &Inputs,
10201 const ArgList &Args,
10202 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010203 ArgStringList CmdArgs;
10204
10205 if (Output.isFilename()) {
10206 CmdArgs.push_back("-o");
10207 CmdArgs.push_back(Output.getFilename());
10208 } else {
10209 assert(Output.isNothing() && "Invalid output.");
10210 }
10211
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010212 if (Args.hasArg(options::OPT_v))
10213 CmdArgs.push_back("-v");
10214
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010215 // Pass -fexceptions through to the linker if it was present.
10216 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10217 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010218 CmdArgs.push_back("-fexceptions");
10219
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010220 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10221
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010222 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010223 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010224}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010225
Douglas Katzman95354292015-06-23 20:42:09 +000010226void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10227 const InputInfo &Output,
10228 const InputInfoList &Inputs,
10229 const ArgList &Args,
10230 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010231 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010232 const auto &TC =
10233 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10234 ArgStringList CmdArgs;
10235 const char *Exec;
10236
10237 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010238 default:
10239 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010240 case llvm::Triple::arm:
10241 case llvm::Triple::thumb:
10242 break;
10243 case llvm::Triple::x86:
10244 CmdArgs.push_back("--32");
10245 break;
10246 case llvm::Triple::x86_64:
10247 CmdArgs.push_back("--64");
10248 break;
10249 }
10250
10251 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10252
10253 CmdArgs.push_back("-o");
10254 CmdArgs.push_back(Output.getFilename());
10255
10256 for (const auto &Input : Inputs)
10257 CmdArgs.push_back(Input.getFilename());
10258
10259 const std::string Assembler = TC.GetProgramPath("as");
10260 Exec = Args.MakeArgString(Assembler);
10261
Justin Bognerd3371d82015-07-17 03:35:54 +000010262 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010263}
10264
Douglas Katzman95354292015-06-23 20:42:09 +000010265void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10266 const InputInfo &Output,
10267 const InputInfoList &Inputs,
10268 const ArgList &Args,
10269 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010270 const auto &TC =
10271 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10272 const llvm::Triple &T = TC.getTriple();
10273 const Driver &D = TC.getDriver();
10274 SmallString<128> EntryPoint;
10275 ArgStringList CmdArgs;
10276 const char *Exec;
10277
10278 // Silence warning for "clang -g foo.o -o foo"
10279 Args.ClaimAllArgs(options::OPT_g_Group);
10280 // and "clang -emit-llvm foo.o -o foo"
10281 Args.ClaimAllArgs(options::OPT_emit_llvm);
10282 // and for "clang -w foo.o -o foo"
10283 Args.ClaimAllArgs(options::OPT_w);
10284 // Other warning options are already handled somewhere else.
10285
10286 if (!D.SysRoot.empty())
10287 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10288
10289 if (Args.hasArg(options::OPT_pie))
10290 CmdArgs.push_back("-pie");
10291 if (Args.hasArg(options::OPT_rdynamic))
10292 CmdArgs.push_back("-export-dynamic");
10293 if (Args.hasArg(options::OPT_s))
10294 CmdArgs.push_back("--strip-all");
10295
10296 CmdArgs.push_back("-m");
10297 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010298 default:
10299 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010300 case llvm::Triple::arm:
10301 case llvm::Triple::thumb:
10302 // FIXME: this is incorrect for WinCE
10303 CmdArgs.push_back("thumb2pe");
10304 break;
10305 case llvm::Triple::x86:
10306 CmdArgs.push_back("i386pe");
10307 EntryPoint.append("_");
10308 break;
10309 case llvm::Triple::x86_64:
10310 CmdArgs.push_back("i386pep");
10311 break;
10312 }
10313
10314 if (Args.hasArg(options::OPT_shared)) {
10315 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010316 default:
10317 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010318 case llvm::Triple::arm:
10319 case llvm::Triple::thumb:
10320 case llvm::Triple::x86_64:
10321 EntryPoint.append("_DllMainCRTStartup");
10322 break;
10323 case llvm::Triple::x86:
10324 EntryPoint.append("_DllMainCRTStartup@12");
10325 break;
10326 }
10327
10328 CmdArgs.push_back("-shared");
10329 CmdArgs.push_back("-Bdynamic");
10330
10331 CmdArgs.push_back("--enable-auto-image-base");
10332
10333 CmdArgs.push_back("--entry");
10334 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10335 } else {
10336 EntryPoint.append("mainCRTStartup");
10337
10338 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10339 : "-Bdynamic");
10340
Douglas Katzman78b37b02015-11-17 20:28:07 +000010341 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010342 CmdArgs.push_back("--entry");
10343 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10344 }
10345
10346 // FIXME: handle subsystem
10347 }
10348
10349 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010350 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010351
10352 CmdArgs.push_back("-o");
10353 CmdArgs.push_back(Output.getFilename());
10354
10355 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10356 SmallString<261> ImpLib(Output.getFilename());
10357 llvm::sys::path::replace_extension(ImpLib, ".lib");
10358
10359 CmdArgs.push_back("--out-implib");
10360 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10361 }
10362
Douglas Katzman78b37b02015-11-17 20:28:07 +000010363 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010364 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10365 const char *CRTBegin;
10366
10367 CRTBegin =
10368 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10369 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10370 }
10371
10372 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010373 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010374 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10375
10376 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10377 !Args.hasArg(options::OPT_nodefaultlibs)) {
10378 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10379 !Args.hasArg(options::OPT_static);
10380 if (StaticCXX)
10381 CmdArgs.push_back("-Bstatic");
10382 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10383 if (StaticCXX)
10384 CmdArgs.push_back("-Bdynamic");
10385 }
10386
10387 if (!Args.hasArg(options::OPT_nostdlib)) {
10388 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10389 // TODO handle /MT[d] /MD[d]
10390 CmdArgs.push_back("-lmsvcrt");
10391 AddRunTimeLibs(TC, D, CmdArgs, Args);
10392 }
10393 }
10394
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010395 if (TC.getSanitizerArgs().needsAsanRt()) {
10396 // TODO handle /MT[d] /MD[d]
10397 if (Args.hasArg(options::OPT_shared)) {
10398 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10399 } else {
10400 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10401 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10402 // Make sure the dynamic runtime thunk is not optimized out at link time
10403 // to ensure proper SEH handling.
10404 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10405 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10406 ? "___asan_seh_interceptor"
10407 : "__asan_seh_interceptor"));
10408 }
10409 }
10410
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010411 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010412
Justin Bognerd3371d82015-07-17 03:35:54 +000010413 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010414}
Douglas Katzman84a75642015-06-19 14:55:19 +000010415
Douglas Katzman95354292015-06-23 20:42:09 +000010416void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10417 const InputInfo &Output,
10418 const InputInfoList &Inputs,
10419 const ArgList &Args,
10420 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010421 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010422 assert(Inputs.size() == 1);
10423 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010424 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10425 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010426
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010427 if (JA.getKind() == Action::PreprocessJobClass) {
10428 Args.ClaimAllArgs();
10429 CmdArgs.push_back("-E");
10430 } else {
10431 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10432 CmdArgs.push_back("-S");
10433 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10434 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010435 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010436
Douglas Katzmanf6071112015-08-03 14:34:22 +000010437 // Append all -I, -iquote, -isystem paths, defines/undefines,
10438 // 'f' flags, optimize flags, and warning options.
10439 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010440 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010441 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010442 options::OPT_f_Group, options::OPT_f_clang_Group,
10443 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010444 options::OPT_O_Group, options::OPT_W_Group,
10445 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010446
10447 // If we're producing a dependency file, and assembly is the final action,
10448 // then the name of the target in the dependency file should be the '.o'
10449 // file, not the '.s' file produced by this step. For example, instead of
10450 // /tmp/mumble.s: mumble.c .../someheader.h
10451 // the filename on the lefthand side should be "mumble.o"
10452 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10453 C.getActions().size() == 1 &&
10454 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10455 Arg *A = Args.getLastArg(options::OPT_o);
10456 if (A) {
10457 CmdArgs.push_back("-MT");
10458 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10459 }
10460 }
10461
Douglas Katzman84a75642015-06-19 14:55:19 +000010462 CmdArgs.push_back(II.getFilename());
10463 CmdArgs.push_back("-o");
10464 CmdArgs.push_back(Output.getFilename());
10465
10466 std::string Exec =
10467 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010468 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10469 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010470}
10471
Douglas Katzman95354292015-06-23 20:42:09 +000010472void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10473 const InputInfo &Output,
10474 const InputInfoList &Inputs,
10475 const ArgList &Args,
10476 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010477 ArgStringList CmdArgs;
10478
10479 assert(Inputs.size() == 1);
10480 const InputInfo &II = Inputs[0];
10481 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10482 assert(Output.getType() == types::TY_Object);
10483
10484 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010485 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10486 if (CPUArg)
10487 CmdArgs.push_back(
10488 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010489 CmdArgs.push_back("-noSPrefixing");
10490 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010491 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10492 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10493 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010494 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010495 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010496 }
10497 CmdArgs.push_back("-elf"); // Output format.
10498 CmdArgs.push_back(II.getFilename());
10499 CmdArgs.push_back(
10500 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10501
10502 std::string Exec =
10503 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010504 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10505 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010506}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010507
10508void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10509 const InputInfo &Output,
10510 const InputInfoList &Inputs,
10511 const ArgList &Args,
10512 const char *LinkingOutput) const {
10513 const auto &TC =
10514 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10515 const llvm::Triple &T = TC.getTriple();
10516 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010517 bool UseStartfiles =
10518 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010519 bool UseDefaultLibs =
10520 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010521
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010522 if (T.getArch() == llvm::Triple::sparc)
10523 CmdArgs.push_back("-EB");
10524 else // SHAVE assumes little-endian, and sparcel is expressly so.
10525 CmdArgs.push_back("-EL");
10526
10527 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10528 // but we never pass through a --sysroot option and various other bits.
10529 // For example, there are no sanitizers (yet) nor gold linker.
10530
10531 // Eat some arguments that may be present but have no effect.
10532 Args.ClaimAllArgs(options::OPT_g_Group);
10533 Args.ClaimAllArgs(options::OPT_w);
10534 Args.ClaimAllArgs(options::OPT_static_libgcc);
10535
10536 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10537 CmdArgs.push_back("-s");
10538
10539 CmdArgs.push_back("-o");
10540 CmdArgs.push_back(Output.getFilename());
10541
10542 if (UseStartfiles) {
10543 // If you want startfiles, it means you want the builtin crti and crtbegin,
10544 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010545 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10546 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010547 }
10548
10549 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10550 options::OPT_e, options::OPT_s, options::OPT_t,
10551 options::OPT_Z_Flag, options::OPT_r});
10552
Douglas Katzman674a3122015-11-18 16:24:46 +000010553 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010554
10555 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10556
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010557 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010558 if (C.getDriver().CCCIsCXX())
10559 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010560 if (T.getOS() == llvm::Triple::RTEMS) {
10561 CmdArgs.push_back("--start-group");
10562 CmdArgs.push_back("-lc");
10563 // You must provide your own "-L" option to enable finding these.
10564 CmdArgs.push_back("-lrtemscpu");
10565 CmdArgs.push_back("-lrtemsbsp");
10566 CmdArgs.push_back("--end-group");
10567 } else {
10568 CmdArgs.push_back("-lc");
10569 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010570 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010571 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010572 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010573 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10574 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010575 }
10576
10577 std::string Exec =
10578 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10579 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10580 CmdArgs, Inputs));
10581}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010582
10583void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10584 const InputInfo &Output,
10585 const InputInfoList &Inputs,
10586 const ArgList &Args,
10587 const char *LinkingOutput) const {
10588 claimNoWarnArgs(Args);
10589 ArgStringList CmdArgs;
10590
10591 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10592
10593 CmdArgs.push_back("-o");
10594 CmdArgs.push_back(Output.getFilename());
10595
10596 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10597 const InputInfo &Input = Inputs[0];
10598 assert(Input.isFilename() && "Invalid input.");
10599 CmdArgs.push_back(Input.getFilename());
10600
10601 const char *Exec =
10602 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10603 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10604}
10605
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010606static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10607 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10608 if (SanArgs.needsUbsanRt()) {
10609 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10610 }
10611 if (SanArgs.needsAsanRt()) {
10612 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10613 }
10614}
10615
10616static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10617 const JobAction &JA, const InputInfo &Output,
10618 const InputInfoList &Inputs,
10619 const ArgList &Args,
10620 const char *LinkingOutput) {
10621 const toolchains::FreeBSD &ToolChain =
10622 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10623 const Driver &D = ToolChain.getDriver();
10624 ArgStringList CmdArgs;
10625
10626 // Silence warning for "clang -g foo.o -o foo"
10627 Args.ClaimAllArgs(options::OPT_g_Group);
10628 // and "clang -emit-llvm foo.o -o foo"
10629 Args.ClaimAllArgs(options::OPT_emit_llvm);
10630 // and for "clang -w foo.o -o foo". Other warning options are already
10631 // handled somewhere else.
10632 Args.ClaimAllArgs(options::OPT_w);
10633
10634 if (!D.SysRoot.empty())
10635 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10636
10637 if (Args.hasArg(options::OPT_pie))
10638 CmdArgs.push_back("-pie");
10639
10640 if (Args.hasArg(options::OPT_rdynamic))
10641 CmdArgs.push_back("-export-dynamic");
10642 if (Args.hasArg(options::OPT_shared))
10643 CmdArgs.push_back("--oformat=so");
10644
10645 if (Output.isFilename()) {
10646 CmdArgs.push_back("-o");
10647 CmdArgs.push_back(Output.getFilename());
10648 } else {
10649 assert(Output.isNothing() && "Invalid output.");
10650 }
10651
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010652 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10653
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010654 Args.AddAllArgs(CmdArgs, options::OPT_L);
10655 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10656 Args.AddAllArgs(CmdArgs, options::OPT_e);
10657 Args.AddAllArgs(CmdArgs, options::OPT_s);
10658 Args.AddAllArgs(CmdArgs, options::OPT_t);
10659 Args.AddAllArgs(CmdArgs, options::OPT_r);
10660
10661 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10662 CmdArgs.push_back("--no-demangle");
10663
10664 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10665
10666 if (Args.hasArg(options::OPT_pthread)) {
10667 CmdArgs.push_back("-lpthread");
10668 }
10669
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010670 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10671
10672 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10673}
10674
10675static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10676 const JobAction &JA, const InputInfo &Output,
10677 const InputInfoList &Inputs,
10678 const ArgList &Args,
10679 const char *LinkingOutput) {
10680 const toolchains::FreeBSD &ToolChain =
10681 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10682 const Driver &D = ToolChain.getDriver();
10683 ArgStringList CmdArgs;
10684
10685 // Silence warning for "clang -g foo.o -o foo"
10686 Args.ClaimAllArgs(options::OPT_g_Group);
10687 // and "clang -emit-llvm foo.o -o foo"
10688 Args.ClaimAllArgs(options::OPT_emit_llvm);
10689 // and for "clang -w foo.o -o foo". Other warning options are already
10690 // handled somewhere else.
10691 Args.ClaimAllArgs(options::OPT_w);
10692
10693 if (!D.SysRoot.empty())
10694 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10695
10696 if (Args.hasArg(options::OPT_pie))
10697 CmdArgs.push_back("-pie");
10698
10699 if (Args.hasArg(options::OPT_static)) {
10700 CmdArgs.push_back("-Bstatic");
10701 } else {
10702 if (Args.hasArg(options::OPT_rdynamic))
10703 CmdArgs.push_back("-export-dynamic");
10704 CmdArgs.push_back("--eh-frame-hdr");
10705 if (Args.hasArg(options::OPT_shared)) {
10706 CmdArgs.push_back("-Bshareable");
10707 } else {
10708 CmdArgs.push_back("-dynamic-linker");
10709 CmdArgs.push_back("/libexec/ld-elf.so.1");
10710 }
10711 CmdArgs.push_back("--enable-new-dtags");
10712 }
10713
10714 if (Output.isFilename()) {
10715 CmdArgs.push_back("-o");
10716 CmdArgs.push_back(Output.getFilename());
10717 } else {
10718 assert(Output.isNothing() && "Invalid output.");
10719 }
10720
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010721 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10722
Douglas Katzman78b37b02015-11-17 20:28:07 +000010723 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010724 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010725 if (!Args.hasArg(options::OPT_shared)) {
10726 if (Args.hasArg(options::OPT_pg))
10727 crt1 = "gcrt1.o";
10728 else if (Args.hasArg(options::OPT_pie))
10729 crt1 = "Scrt1.o";
10730 else
10731 crt1 = "crt1.o";
10732 }
10733 if (crt1)
10734 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10735
10736 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10737
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010738 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010739 if (Args.hasArg(options::OPT_static))
10740 crtbegin = "crtbeginT.o";
10741 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10742 crtbegin = "crtbeginS.o";
10743 else
10744 crtbegin = "crtbegin.o";
10745
10746 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10747 }
10748
10749 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010750 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010751 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10752 Args.AddAllArgs(CmdArgs, options::OPT_e);
10753 Args.AddAllArgs(CmdArgs, options::OPT_s);
10754 Args.AddAllArgs(CmdArgs, options::OPT_t);
10755 Args.AddAllArgs(CmdArgs, options::OPT_r);
10756
10757 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10758 CmdArgs.push_back("--no-demangle");
10759
10760 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10761
Douglas Katzman78b37b02015-11-17 20:28:07 +000010762 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010763 // For PS4, we always want to pass libm, libstdc++ and libkernel
10764 // libraries for both C and C++ compilations.
10765 CmdArgs.push_back("-lkernel");
10766 if (D.CCCIsCXX()) {
10767 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10768 if (Args.hasArg(options::OPT_pg))
10769 CmdArgs.push_back("-lm_p");
10770 else
10771 CmdArgs.push_back("-lm");
10772 }
10773 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10774 // the default system libraries. Just mimic this for now.
10775 if (Args.hasArg(options::OPT_pg))
10776 CmdArgs.push_back("-lgcc_p");
10777 else
10778 CmdArgs.push_back("-lcompiler_rt");
10779 if (Args.hasArg(options::OPT_static)) {
10780 CmdArgs.push_back("-lstdc++");
10781 } else if (Args.hasArg(options::OPT_pg)) {
10782 CmdArgs.push_back("-lgcc_eh_p");
10783 } else {
10784 CmdArgs.push_back("--as-needed");
10785 CmdArgs.push_back("-lstdc++");
10786 CmdArgs.push_back("--no-as-needed");
10787 }
10788
10789 if (Args.hasArg(options::OPT_pthread)) {
10790 if (Args.hasArg(options::OPT_pg))
10791 CmdArgs.push_back("-lpthread_p");
10792 else
10793 CmdArgs.push_back("-lpthread");
10794 }
10795
10796 if (Args.hasArg(options::OPT_pg)) {
10797 if (Args.hasArg(options::OPT_shared))
10798 CmdArgs.push_back("-lc");
10799 else {
10800 if (Args.hasArg(options::OPT_static)) {
10801 CmdArgs.push_back("--start-group");
10802 CmdArgs.push_back("-lc_p");
10803 CmdArgs.push_back("-lpthread_p");
10804 CmdArgs.push_back("--end-group");
10805 } else {
10806 CmdArgs.push_back("-lc_p");
10807 }
10808 }
10809 CmdArgs.push_back("-lgcc_p");
10810 } else {
10811 if (Args.hasArg(options::OPT_static)) {
10812 CmdArgs.push_back("--start-group");
10813 CmdArgs.push_back("-lc");
10814 CmdArgs.push_back("-lpthread");
10815 CmdArgs.push_back("--end-group");
10816 } else {
10817 CmdArgs.push_back("-lc");
10818 }
10819 CmdArgs.push_back("-lcompiler_rt");
10820 }
10821
10822 if (Args.hasArg(options::OPT_static)) {
10823 CmdArgs.push_back("-lstdc++");
10824 } else if (Args.hasArg(options::OPT_pg)) {
10825 CmdArgs.push_back("-lgcc_eh_p");
10826 } else {
10827 CmdArgs.push_back("--as-needed");
10828 CmdArgs.push_back("-lstdc++");
10829 CmdArgs.push_back("--no-as-needed");
10830 }
10831 }
10832
Douglas Katzman78b37b02015-11-17 20:28:07 +000010833 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010834 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10835 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10836 else
10837 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10838 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10839 }
10840
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010841 const char *Exec =
10842#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010843 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010844#else
10845 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10846#endif
10847
10848 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10849}
10850
10851void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10852 const InputInfo &Output,
10853 const InputInfoList &Inputs,
10854 const ArgList &Args,
10855 const char *LinkingOutput) const {
10856 const toolchains::FreeBSD &ToolChain =
10857 static_cast<const toolchains::FreeBSD &>(getToolChain());
10858 const Driver &D = ToolChain.getDriver();
10859 bool PS4Linker;
10860 StringRef LinkerOptName;
10861 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10862 LinkerOptName = A->getValue();
10863 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10864 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10865 }
10866
10867 if (LinkerOptName == "gold")
10868 PS4Linker = false;
10869 else if (LinkerOptName == "ps4")
10870 PS4Linker = true;
10871 else
10872 PS4Linker = !Args.hasArg(options::OPT_shared);
10873
10874 if (PS4Linker)
10875 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10876 else
10877 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10878}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010879
10880void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10881 const InputInfo &Output,
10882 const InputInfoList &Inputs,
10883 const ArgList &Args,
10884 const char *LinkingOutput) const {
10885 const auto &TC =
10886 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010887 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010888
10889 std::vector<std::string> gpu_archs =
10890 Args.getAllArgValues(options::OPT_march_EQ);
10891 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10892 const std::string& gpu_arch = gpu_archs[0];
10893
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010894 ArgStringList CmdArgs;
10895 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010896 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10897 // ptxas does not accept -g option if optimization is enabled, so
10898 // we ignore the compiler's -O* options if we want debug info.
10899 CmdArgs.push_back("-g");
10900 CmdArgs.push_back("--dont-merge-basicblocks");
10901 CmdArgs.push_back("--return-at-end");
10902 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10903 // Map the -O we received to -O{0,1,2,3}.
10904 //
10905 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10906 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010907
Justin Lebar2836dcd2016-01-19 19:52:21 +000010908 // -O3 seems like the least-bad option when -Osomething is specified to
10909 // clang but it isn't handled below.
10910 StringRef OOpt = "3";
10911 if (A->getOption().matches(options::OPT_O4) ||
10912 A->getOption().matches(options::OPT_Ofast))
10913 OOpt = "3";
10914 else if (A->getOption().matches(options::OPT_O0))
10915 OOpt = "0";
10916 else if (A->getOption().matches(options::OPT_O)) {
10917 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10918 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10919 .Case("1", "1")
10920 .Case("2", "2")
10921 .Case("3", "3")
10922 .Case("s", "2")
10923 .Case("z", "2")
10924 .Default("2");
10925 }
10926 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10927 } else {
10928 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10929 // to no optimizations, but ptxas's default is -O3.
10930 CmdArgs.push_back("-O0");
10931 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010932
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010933 CmdArgs.push_back("--gpu-name");
10934 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10935 CmdArgs.push_back("--output-file");
10936 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10937 for (const auto& II : Inputs)
10938 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10939
10940 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10941 CmdArgs.push_back(Args.MakeArgString(A));
10942
10943 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10944 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10945}
10946
10947// All inputs to this linker must be from CudaDeviceActions, as we need to look
10948// at the Inputs' Actions in order to figure out which GPU architecture they
10949// correspond to.
10950void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10951 const InputInfo &Output,
10952 const InputInfoList &Inputs,
10953 const ArgList &Args,
10954 const char *LinkingOutput) const {
10955 const auto &TC =
10956 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010957 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010958
10959 ArgStringList CmdArgs;
10960 CmdArgs.push_back("--cuda");
10961 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10962 CmdArgs.push_back(Args.MakeArgString("--create"));
10963 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10964
10965 for (const auto& II : Inputs) {
10966 auto* A = cast<const CudaDeviceAction>(II.getAction());
10967 // We need to pass an Arch of the form "sm_XX" for cubin files and
10968 // "compute_XX" for ptx.
10969 const char *Arch = (II.getType() == types::TY_PP_Asm)
10970 ? A->getComputeArchName()
10971 : A->getGpuArchName();
10972 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10973 Arch + ",file=" + II.getFilename()));
10974 }
10975
10976 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10977 CmdArgs.push_back(Args.MakeArgString(A));
10978
10979 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10980 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10981}