blob: de9e4003d03d4e868c8c7b537bb0e6311ac60895 [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
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000055static const char *getSparcAsmModeForCPU(StringRef Name,
56 const llvm::Triple &Triple) {
57 if (Triple.getArch() == llvm::Triple::sparcv9) {
58 return llvm::StringSwitch<const char *>(Name)
59 .Case("niagara", "-Av9b")
60 .Case("niagara2", "-Av9b")
61 .Case("niagara3", "-Av9d")
62 .Case("niagara4", "-Av9d")
63 .Default("-Av9");
64 } else {
65 return llvm::StringSwitch<const char *>(Name)
66 .Case("v8", "-Av8")
67 .Case("supersparc", "-Av8")
68 .Case("sparclite", "-Asparclite")
69 .Case("f934", "-Asparclite")
70 .Case("hypersparc", "-Av8")
71 .Case("sparclite86x", "-Asparclite")
72 .Case("sparclet", "-Asparclet")
73 .Case("tsc701", "-Asparclet")
74 .Case("v9", "-Av8plus")
75 .Case("ultrasparc", "-Av8plus")
76 .Case("ultrasparc3", "-Av8plus")
77 .Case("niagara", "-Av8plusb")
78 .Case("niagara2", "-Av8plusb")
79 .Case("niagara3", "-Av8plusd")
80 .Case("niagara4", "-Av8plusd")
81 .Default("-Av8");
82 }
83}
84
Daniel Dunbar64198ef2009-09-10 01:21:05 +000085/// CheckPreprocessingOptions - Perform some validation of preprocessing
86/// arguments that is shared with gcc.
87static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000088 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
89 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
90 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000091 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000092 << A->getBaseArg().getAsString(Args)
93 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
94 }
95 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000096}
97
Daniel Dunbar4eadb602009-09-10 01:21:12 +000098/// CheckCodeGenerationOptions - Perform some validation of code generation
99/// arguments that is shared with gcc.
100static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
101 // In gcc, only ARM checks this, but it seems reasonable to check universally.
102 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000103 if (const Arg *A =
104 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
105 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
106 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000107}
108
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000109// Add backslashes to escape spaces and other backslashes.
110// This is used for the space-separated argument list specified with
111// the -dwarf-debug-flags option.
112static void EscapeSpacesAndBackslashes(const char *Arg,
113 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000114 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000115 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000116 default:
117 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000118 case ' ':
119 case '\\':
120 Res.push_back('\\');
121 break;
122 }
123 Res.push_back(*Arg);
124 }
125}
126
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000127// Quote target names for inclusion in GNU Make dependency files.
128// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000129static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000130 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
131 switch (Target[i]) {
132 case ' ':
133 case '\t':
134 // Escape the preceding backslashes
135 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
136 Res.push_back('\\');
137
138 // Escape the space/tab
139 Res.push_back('\\');
140 break;
141 case '$':
142 Res.push_back('$');
143 break;
144 case '#':
145 Res.push_back('\\');
146 break;
147 default:
148 break;
149 }
150
151 Res.push_back(Target[i]);
152 }
153}
154
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000155static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
156 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000157 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000158 bool CombinedArg = false;
159
Bill Wendling281ca292012-03-12 21:22:35 +0000160 if (!DirList)
161 return; // Nothing to do.
162
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 StringRef Name(ArgName);
164 if (Name.equals("-I") || Name.equals("-L"))
165 CombinedArg = true;
166
Bill Wendling281ca292012-03-12 21:22:35 +0000167 StringRef Dirs(DirList);
168 if (Dirs.empty()) // Empty string should not add '.'.
169 return;
170
171 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000172 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000173 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000174 if (CombinedArg) {
175 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
176 } else {
177 CmdArgs.push_back(ArgName);
178 CmdArgs.push_back(".");
179 }
Bill Wendling281ca292012-03-12 21:22:35 +0000180 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000182 CmdArgs.push_back(
183 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 } else {
185 CmdArgs.push_back(ArgName);
186 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
187 }
Bill Wendling281ca292012-03-12 21:22:35 +0000188 }
Nico Weber89355782012-03-19 15:00:03 +0000189 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191
192 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000193 if (CombinedArg) {
194 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
195 } else {
196 CmdArgs.push_back(ArgName);
197 CmdArgs.push_back(".");
198 }
Bill Wendling281ca292012-03-12 21:22:35 +0000199 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000200 if (CombinedArg) {
201 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
207}
208
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000209static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
210 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 const Driver &D = TC.getDriver();
212
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000213 // Add extra linker input arguments which are not treated as inputs
214 // (constructed via -Xarch_).
215 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
216
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000217 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000218 if (!TC.HasNativeLLVMSupport()) {
219 // Don't try to pass LLVM inputs unless we have native support.
220 if (II.getType() == types::TY_LLVM_IR ||
221 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000222 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
223 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000224 }
225
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000226 // Add filenames immediately.
227 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000228 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000229 continue;
230 }
231
232 // Otherwise, this is a linker input argument.
233 const Arg &A = II.getInputArg();
234
235 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000236 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000237 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000238 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000239 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000240 else if (A.getOption().matches(options::OPT_z)) {
241 // Pass -z prefix for gcc linker compatibility.
242 A.claim();
243 A.render(Args, CmdArgs);
244 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000245 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000246 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000247 }
Bill Wendling281ca292012-03-12 21:22:35 +0000248
249 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000250 // and only supported on native toolchains.
251 if (!TC.isCrossCompiling())
252 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000253}
254
John McCall31168b02011-06-15 23:02:42 +0000255/// \brief Determine whether Objective-C automated reference counting is
256/// enabled.
257static bool isObjCAutoRefCount(const ArgList &Args) {
258 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
259}
260
Ted Kremeneke65b0862012-03-06 20:05:56 +0000261/// \brief Determine whether we are linking the ObjC runtime.
262static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000263 if (isObjCAutoRefCount(Args)) {
264 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000265 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000266 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000267 return Args.hasArg(options::OPT_fobjc_link_runtime);
268}
269
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000270static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000271 // Don't forward inputs from the original command line. They are added from
272 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000273 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000274 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000275}
276
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000277void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
278 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000279 ArgStringList &CmdArgs,
280 const InputInfo &Output,
281 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000282 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000283
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000284 CheckPreprocessingOptions(D, Args);
285
286 Args.AddLastArg(CmdArgs, options::OPT_C);
287 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000288
289 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000290 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000291 (A = Args.getLastArg(options::OPT_MD)) ||
292 (A = Args.getLastArg(options::OPT_MMD))) {
293 // Determine the output location.
294 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000295 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000296 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000297 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000298 } else if (Output.getType() == types::TY_Dependencies) {
299 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000300 } else if (A->getOption().matches(options::OPT_M) ||
301 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 DepFile = "-";
303 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000304 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000305 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 }
307 CmdArgs.push_back("-dependency-file");
308 CmdArgs.push_back(DepFile);
309
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000310 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
312 const char *DepTarget;
313
314 // If user provided -o, that is the dependency target, except
315 // when we are only generating a dependency file.
316 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
317 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000318 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000319 } else {
320 // Otherwise derive from the base input.
321 //
322 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000323 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000324 llvm::sys::path::replace_extension(P, "o");
325 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 }
327
328 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000329 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000330 QuoteTarget(DepTarget, Quoted);
331 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000332 }
333
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000334 if (A->getOption().matches(options::OPT_M) ||
335 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000336 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000337 if ((isa<PrecompileJobAction>(JA) &&
338 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
339 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000340 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000343 if (Args.hasArg(options::OPT_MG)) {
344 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000345 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000346 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000347 CmdArgs.push_back("-MG");
348 }
349
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000350 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000351 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000352
353 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000354 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000355 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000356
Daniel Dunbara442fd52010-06-11 22:00:13 +0000357 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000358 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000359 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000360 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000361 CmdArgs.push_back(Args.MakeArgString(Quoted));
362
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000363 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000364 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000365 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000366 }
367 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000368
Douglas Gregor111af7d2009-04-18 00:34:01 +0000369 // Add -i* options, and automatically translate to
370 // -include-pch/-include-pth for transparent PCH support. It's
371 // wonky, but we include looking for .gch so we can support seamless
372 // replacement into a build system already set up to be generating
373 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000374 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000375 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000376 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000377 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
378 RenderedImplicitInclude = true;
379
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000380 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000381 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000382
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000385 SmallString<128> P(A->getValue());
386 // We want the files to have a name like foo.h.pch. Add a dummy extension
387 // so that replace_extension does the right thing.
388 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000389 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000390 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000391 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000393 }
394
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000396 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000397 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000398 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000399 }
400
Douglas Gregor111af7d2009-04-18 00:34:01 +0000401 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000402 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000403 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000404 FoundPCH = UsePCH;
405 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000406 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000407 }
408
409 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000410 if (IsFirstImplicitInclude) {
411 A->claim();
412 if (UsePCH)
413 CmdArgs.push_back("-include-pch");
414 else
415 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000416 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000417 continue;
418 } else {
419 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000420 D.Diag(diag::warn_drv_pch_not_first_include) << P
421 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000422 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000423 }
424 }
425
426 // Not translated, render as usual.
427 A->claim();
428 A->render(Args, CmdArgs);
429 }
430
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000431 Args.AddAllArgs(CmdArgs,
432 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
433 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000434
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000435 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000436
437 // FIXME: There is a very unfortunate problem here, some troubled
438 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
439 // really support that we would have to parse and then translate
440 // those options. :(
441 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
442 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000443
444 // -I- is a deprecated GCC feature, reject it.
445 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000446 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000447
448 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
449 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000450 StringRef sysroot = C.getSysRoot();
451 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000452 if (!Args.hasArg(options::OPT_isysroot)) {
453 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000454 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000455 }
456 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000457
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000459 // FIXME: We should probably sink the logic for handling these from the
460 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // CPATH - included following the user specified includes (but prior to
462 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000463 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000464 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000465 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000466 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000467 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000468 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000469 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000470 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000471 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000472
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000473 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000474 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000475 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000476
477 // Add system include arguments.
478 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000479}
480
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000481// FIXME: Move to target hook.
482static bool isSignedCharDefault(const llvm::Triple &Triple) {
483 switch (Triple.getArch()) {
484 default:
485 return true;
486
Tim Northover9bb857a2013-01-31 12:13:10 +0000487 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000488 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000489 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000490 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000491 case llvm::Triple::thumb:
492 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000493 if (Triple.isOSDarwin() || Triple.isOSWindows())
494 return true;
495 return false;
496
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000497 case llvm::Triple::ppc:
498 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000499 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000500 return true;
501 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000502
David Majnemerdcecd932015-05-23 19:23:55 +0000503 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000504 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000505 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000506 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000507 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000508 }
509}
510
Robert Lytton0e076492013-08-13 09:43:10 +0000511static bool isNoCommonDefault(const llvm::Triple &Triple) {
512 switch (Triple.getArch()) {
513 default:
514 return false;
515
516 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000517 case llvm::Triple::wasm32:
518 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000519 return true;
520 }
521}
522
Renato Goline17c5802015-07-27 23:44:42 +0000523// ARM tools start.
524
525// Get SubArch (vN).
526static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
527 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000528 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000529}
530
531// True if M-profile.
532static bool isARMMProfile(const llvm::Triple &Triple) {
533 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000534 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000535 return Profile == llvm::ARM::PK_M;
536}
537
538// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000539static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
540 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000541 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
542 CPU = A->getValue();
543 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
544 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000545 if (!FromAs)
546 return;
547
548 for (const Arg *A :
549 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
550 StringRef Value = A->getValue();
551 if (Value.startswith("-mcpu="))
552 CPU = Value.substr(6);
553 if (Value.startswith("-march="))
554 Arch = Value.substr(7);
555 }
Renato Goline17c5802015-07-27 23:44:42 +0000556}
557
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000558// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000559// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000560static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000561 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000562 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000563 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
564 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000565 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
566}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000567
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000568// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000569static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000570 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000571 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000572 unsigned FPUID = llvm::ARM::parseFPU(FPU);
573 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000574 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
575}
576
Renato Golin7c542b42015-07-27 23:44:45 +0000577// Check if -march is valid by checking if it can be canonicalised and parsed.
578// getARMArch is used here instead of just checking the -march value in order
579// to handle -march=native correctly.
580static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000581 llvm::StringRef ArchName,
582 const llvm::Triple &Triple) {
583 std::string MArch = arm::getARMArch(ArchName, Triple);
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000584 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID)
Renato Goline17c5802015-07-27 23:44:42 +0000585 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000586}
587
Renato Golin7c542b42015-07-27 23:44:45 +0000588// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
589static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
590 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000591 const llvm::Triple &Triple) {
592 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Vladimir Sukharev64f68242015-09-23 09:29:32 +0000593 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty())
Renato Goline17c5802015-07-27 23:44:42 +0000594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000595}
596
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000597static bool useAAPCSForMachO(const llvm::Triple &T) {
598 // The backend is hardwired to assume AAPCS for M-class processors, ensure
599 // the frontend matches that.
600 return T.getEnvironment() == llvm::Triple::EABI ||
601 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
602}
603
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000604// Select the float ABI as determined by -msoft-float, -mhard-float, and
605// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000606arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
607 const Driver &D = TC.getDriver();
608 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000609 auto SubArch = getARMSubArchVersionNumber(Triple);
610 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000611 if (Arg *A =
612 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
613 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000614 if (A->getOption().matches(options::OPT_msoft_float)) {
615 ABI = FloatABI::Soft;
616 } else if (A->getOption().matches(options::OPT_mhard_float)) {
617 ABI = FloatABI::Hard;
618 } else {
619 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
620 .Case("soft", FloatABI::Soft)
621 .Case("softfp", FloatABI::SoftFP)
622 .Case("hard", FloatABI::Hard)
623 .Default(FloatABI::Invalid);
624 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000625 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000626 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000627 }
628 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000629
630 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
631 // "apcs-gnu".
632 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000633 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000634 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
635 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000636 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000637 }
638
639 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000640 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000641 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000642 case llvm::Triple::Darwin:
643 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000644 case llvm::Triple::IOS:
645 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000646 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000647 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000648 break;
649 }
Tim Northover756447a2015-10-30 16:30:36 +0000650 case llvm::Triple::WatchOS:
651 ABI = FloatABI::Hard;
652 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000653
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000654 // FIXME: this is invalid for WindowsCE
655 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000656 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000657 break;
658
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000659 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000660 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000661 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000663 break;
664 default:
665 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000666 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000667 break;
668 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000669 break;
670
Daniel Dunbar78485922009-09-10 23:00:09 +0000671 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000672 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000673 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000674 case llvm::Triple::EABIHF:
675 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000676 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000677 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000678 case llvm::Triple::EABI:
679 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000680 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000681 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000682 case llvm::Triple::Android:
683 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000684 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000685 default:
686 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000687 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000688 if (Triple.getOS() != llvm::Triple::UnknownOS ||
689 !Triple.isOSBinFormatMachO())
690 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000691 break;
692 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000693 }
694 }
695
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000696 assert(ABI != FloatABI::Invalid && "must select an ABI");
697 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000698}
699
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000700static void getARMTargetFeatures(const ToolChain &TC,
701 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000702 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000703 std::vector<const char *> &Features,
704 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000705 const Driver &D = TC.getDriver();
706
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000707 bool KernelOrKext =
708 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000709 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000710 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
711 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
712
Nico Weber6e0ebae2015-04-29 21:16:40 +0000713 if (!ForAS) {
714 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
715 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
716 // stripped out by the ARM target. We should probably pass this a new
717 // -target-option, which is handled by the -cc1/-cc1as invocation.
718 //
719 // FIXME2: For consistency, it would be ideal if we set up the target
720 // machine state the same when using the frontend or the assembler. We don't
721 // currently do that for the assembler, we pass the options directly to the
722 // backend and never even instantiate the frontend TargetInfo. If we did,
723 // and used its handleTargetFeatures hook, then we could ensure the
724 // assembler and the frontend behave the same.
725
726 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000728 Features.push_back("+soft-float");
729
730 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000731 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000732 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000733 } else {
734 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
735 // to the assembler correctly.
736 for (const Arg *A :
737 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
738 StringRef Value = A->getValue();
739 if (Value.startswith("-mfpu=")) {
740 WaFPU = A;
741 } else if (Value.startswith("-mcpu=")) {
742 WaCPU = A;
743 } else if (Value.startswith("-mhwdiv=")) {
744 WaHDiv = A;
745 } else if (Value.startswith("-march=")) {
746 WaArch = A;
747 }
748 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000749 }
750
Renato Golin7c542b42015-07-27 23:44:45 +0000751 // Check -march. ClangAs gives preference to -Wa,-march=.
752 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000753 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000754 if (WaArch) {
755 if (ArchArg)
756 D.Diag(clang::diag::warn_drv_unused_argument)
757 << ArchArg->getAsString(Args);
758 ArchName = StringRef(WaArch->getValue()).substr(7);
759 checkARMArchName(D, WaArch, Args, ArchName, Triple);
760 // FIXME: Set Arch.
761 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
762 } else if (ArchArg) {
763 ArchName = ArchArg->getValue();
764 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000765 }
766
Renato Golin7c542b42015-07-27 23:44:45 +0000767 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
768 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000769 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000770 if (WaCPU) {
771 if (CPUArg)
772 D.Diag(clang::diag::warn_drv_unused_argument)
773 << CPUArg->getAsString(Args);
774 CPUName = StringRef(WaCPU->getValue()).substr(6);
775 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
776 } else if (CPUArg) {
777 CPUName = CPUArg->getValue();
778 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000779 }
John Brawna95c1a82015-05-08 12:52:18 +0000780
Renato Golin23459c62015-07-30 16:40:17 +0000781 // Add CPU features for generic CPUs
782 if (CPUName == "native") {
783 llvm::StringMap<bool> HostFeatures;
784 if (llvm::sys::getHostCPUFeatures(HostFeatures))
785 for (auto &F : HostFeatures)
786 Features.push_back(
787 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
788 }
789
790 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
791 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
792 if (WaFPU) {
793 if (FPUArg)
794 D.Diag(clang::diag::warn_drv_unused_argument)
795 << FPUArg->getAsString(Args);
796 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
797 Features);
798 } else if (FPUArg) {
799 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
800 }
801
802 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
803 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
804 if (WaHDiv) {
805 if (HDivArg)
806 D.Diag(clang::diag::warn_drv_unused_argument)
807 << HDivArg->getAsString(Args);
808 getARMHWDivFeatures(D, WaHDiv, Args,
809 StringRef(WaHDiv->getValue()).substr(8), Features);
810 } else if (HDivArg)
811 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
812
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000813 // Setting -msoft-float effectively disables NEON because of the GCC
814 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000815 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000816 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000817 // Also need to explicitly disable features which imply NEON.
818 Features.push_back("-crypto");
819 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000820
Eric Christopher269c2a22015-04-04 03:34:43 +0000821 // En/disable crc code generation.
822 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000823 if (A->getOption().matches(options::OPT_mcrc))
824 Features.push_back("+crc");
825 else
826 Features.push_back("-crc");
827 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000828
829 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
830 Features.insert(Features.begin(), "+v8.1a");
831 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000832
Akira Hatanakac2694822015-07-07 08:28:42 +0000833 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
834 // neither options are specified, see if we are compiling for kernel/kext and
835 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000836 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
837 options::OPT_mno_long_calls)) {
838 if (A->getOption().matches(options::OPT_mlong_calls))
839 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000840 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
841 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000842 Features.push_back("+long-calls");
843 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000844
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000845 // Kernel code has more strict alignment requirements.
846 if (KernelOrKext)
847 Features.push_back("+strict-align");
848 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
849 options::OPT_munaligned_access)) {
850 if (A->getOption().matches(options::OPT_munaligned_access)) {
851 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
852 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
853 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
854 } else
855 Features.push_back("+strict-align");
856 } else {
857 // Assume pre-ARMv6 doesn't support unaligned accesses.
858 //
859 // ARMv6 may or may not support unaligned accesses depending on the
860 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
861 // Darwin and NetBSD targets support unaligned accesses, and others don't.
862 //
863 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
864 // which raises an alignment fault on unaligned accesses. Linux
865 // defaults this bit to 0 and handles it as a system-wide (not
866 // per-process) setting. It is therefore safe to assume that ARMv7+
867 // Linux targets support unaligned accesses. The same goes for NaCl.
868 //
869 // The above behavior is consistent with GCC.
870 int VersionNum = getARMSubArchVersionNumber(Triple);
871 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000872 if (VersionNum < 6 ||
873 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000874 Features.push_back("+strict-align");
875 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
876 if (VersionNum < 7)
877 Features.push_back("+strict-align");
878 } else
879 Features.push_back("+strict-align");
880 }
881
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000882 // llvm does not support reserving registers in general. There is support
883 // for reserving r9 on ARM though (defined as a platform-specific register
884 // in ARM EABI).
885 if (Args.hasArg(options::OPT_ffixed_r9))
886 Features.push_back("+reserve-r9");
887
Akira Hatanaka580efb22015-07-16 00:43:00 +0000888 // The kext linker doesn't know how to deal with movw/movt.
889 if (KernelOrKext)
890 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000891}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000892
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000893void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
894 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000895 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000896 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000897 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000898 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000899 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000900 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000901 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000902 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000903 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000904 } else if (Triple.isWatchOS()) {
905 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000906 } else {
907 ABIName = "apcs-gnu";
908 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000909 } else if (Triple.isOSWindows()) {
910 // FIXME: this is invalid for WindowsCE
911 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000912 } else {
913 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000914 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000915 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000916 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000917 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000918 ABIName = "aapcs-linux";
919 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000920 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000921 case llvm::Triple::EABI:
922 ABIName = "aapcs";
923 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000924 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000925 if (Triple.getOS() == llvm::Triple::NetBSD)
926 ABIName = "apcs-gnu";
927 else
928 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000929 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000930 }
931 }
932 CmdArgs.push_back("-target-abi");
933 CmdArgs.push_back(ABIName);
934
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000935 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000936 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000937 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000938 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000939 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000940 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000941 CmdArgs.push_back("-mfloat-abi");
942 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000943 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000944 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000945 CmdArgs.push_back("-mfloat-abi");
946 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000947 } else {
948 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000949 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000950 CmdArgs.push_back("-mfloat-abi");
951 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000952 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000953
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000954 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000955 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
956 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000957 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000958 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000959 CmdArgs.push_back("-arm-global-merge=false");
960 else
961 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000962 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000963
Bob Wilson9c8af452013-04-11 18:53:25 +0000964 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000965 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000966 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000967}
Renato Goline17c5802015-07-27 23:44:42 +0000968// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000969
Tim Northover573cbee2014-05-24 12:52:07 +0000970/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
971/// targeting.
972static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000973 Arg *A;
974 std::string CPU;
975 // If we have -mtune or -mcpu, use that.
976 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000977 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000978 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000979 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000980 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000981 }
982
Kevin Qin110db6f2014-07-18 07:03:22 +0000983 // Handle CPU name is 'native'.
984 if (CPU == "native")
985 return llvm::sys::getHostCPUName();
986 else if (CPU.size())
987 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000988
James Molloy9b1586b2014-04-17 12:51:17 +0000989 // Make sure we pick "cyclone" if -arch is used.
990 // FIXME: Should this be picked by checking the target triple instead?
991 if (Args.getLastArg(options::OPT_arch))
992 return "cyclone";
993
994 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000995}
996
Tim Northover573cbee2014-05-24 12:52:07 +0000997void Clang::AddAArch64TargetArgs(const ArgList &Args,
998 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000999 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1000 llvm::Triple Triple(TripleStr);
1001
1002 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1003 Args.hasArg(options::OPT_mkernel) ||
1004 Args.hasArg(options::OPT_fapple_kext))
1005 CmdArgs.push_back("-disable-red-zone");
1006
1007 if (!Args.hasFlag(options::OPT_mimplicit_float,
1008 options::OPT_mno_implicit_float, true))
1009 CmdArgs.push_back("-no-implicit-float");
1010
Craig Topper92fc2df2014-05-17 16:56:41 +00001011 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001012 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1013 ABIName = A->getValue();
1014 else if (Triple.isOSDarwin())
1015 ABIName = "darwinpcs";
1016 else
1017 ABIName = "aapcs";
1018
1019 CmdArgs.push_back("-target-abi");
1020 CmdArgs.push_back(ABIName);
1021
Bradley Smith9ff64332014-10-13 10:16:06 +00001022 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1023 options::OPT_mno_fix_cortex_a53_835769)) {
1024 CmdArgs.push_back("-backend-option");
1025 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1026 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1027 else
1028 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001029 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001030 // Enabled A53 errata (835769) workaround by default on android
1031 CmdArgs.push_back("-backend-option");
1032 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001033 }
1034
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001035 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001036 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1037 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001038 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001039 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001040 CmdArgs.push_back("-aarch64-global-merge=false");
1041 else
1042 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001043 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001044}
1045
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001046// Get CPU and ABI names. They are not independent
1047// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001048void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1049 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001050 const char *DefMips32CPU = "mips32r2";
1051 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001052
Daniel Sanders2bf13662014-07-10 14:40:57 +00001053 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1054 // default for mips64(el)?-img-linux-gnu.
1055 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1056 Triple.getEnvironment() == llvm::Triple::GNU) {
1057 DefMips32CPU = "mips32r6";
1058 DefMips64CPU = "mips64r6";
1059 }
Renato Golin7c542b42015-07-27 23:44:45 +00001060
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001061 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001062 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001063 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001064
Brad Smithba26f582015-01-06 02:53:17 +00001065 // MIPS3 is the default for mips64*-unknown-openbsd.
1066 if (Triple.getOS() == llvm::Triple::OpenBSD)
1067 DefMips64CPU = "mips3";
1068
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001069 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001070 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001071
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001072 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001073 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001074 // Convert a GNU style Mips ABI name to the name
1075 // accepted by LLVM Mips backend.
1076 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001077 .Case("32", "o32")
1078 .Case("64", "n64")
1079 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001080 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001081
1082 // Setup default CPU and ABI names.
1083 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001084 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001085 default:
1086 llvm_unreachable("Unexpected triple arch name");
1087 case llvm::Triple::mips:
1088 case llvm::Triple::mipsel:
1089 CPUName = DefMips32CPU;
1090 break;
1091 case llvm::Triple::mips64:
1092 case llvm::Triple::mips64el:
1093 CPUName = DefMips64CPU;
1094 break;
1095 }
1096 }
1097
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001098 if (ABIName.empty()) {
1099 // Deduce ABI name from the target triple.
1100 if (Triple.getArch() == llvm::Triple::mips ||
1101 Triple.getArch() == llvm::Triple::mipsel)
1102 ABIName = "o32";
1103 else
1104 ABIName = "n64";
1105 }
1106
1107 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001108 // Deduce CPU name from ABI name.
1109 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001110 .Cases("o32", "eabi", DefMips32CPU)
1111 .Cases("n32", "n64", DefMips64CPU)
1112 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001113 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001114
1115 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001116}
1117
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001118// Convert ABI name to the GNU tools acceptable variant.
1119static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1120 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001121 .Case("o32", "32")
1122 .Case("n64", "64")
1123 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001124}
1125
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001126// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1127// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001128static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1129 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001130 if (Arg *A =
1131 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1132 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001133 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001134 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001135 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001136 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001137 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001138 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1139 .Case("soft", mips::FloatABI::Soft)
1140 .Case("hard", mips::FloatABI::Hard)
1141 .Default(mips::FloatABI::Invalid);
1142 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001143 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001144 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001145 }
1146 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001147 }
1148
1149 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001150 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001151 // Assume "hard", because it's a default value used by gcc.
1152 // When we start to recognize specific target MIPS processors,
1153 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001154 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001155 }
1156
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001157 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1158 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001159}
1160
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001161static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001162 std::vector<const char *> &Features,
1163 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001164 StringRef FeatureName) {
1165 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001166 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001167 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001168 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001169 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001170 }
1171}
1172
Daniel Sanders379d44b2014-07-16 11:52:23 +00001173static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1174 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001175 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001176 StringRef CPUName;
1177 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001178 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001179 ABIName = getGnuCompatibleMipsABIName(ABIName);
1180
Daniel Sandersfeb61302014-08-08 15:47:17 +00001181 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1182 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001183
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001184 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1185 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001186 // FIXME: Note, this is a hack. We need to pass the selected float
1187 // mode to the MipsTargetInfoBase to define appropriate macros there.
1188 // Now it is the only method.
1189 Features.push_back("+soft-float");
1190 }
1191
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001192 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001193 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001194 if (Val == "2008") {
1195 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1196 Features.push_back("+nan2008");
1197 else {
1198 Features.push_back("-nan2008");
1199 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1200 }
1201 } else if (Val == "legacy") {
1202 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1203 Features.push_back("-nan2008");
1204 else {
1205 Features.push_back("+nan2008");
1206 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1207 }
1208 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001209 D.Diag(diag::err_drv_unsupported_option_argument)
1210 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001211 }
1212
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001213 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1214 options::OPT_mdouble_float, "single-float");
1215 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1216 "mips16");
1217 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1218 options::OPT_mno_micromips, "micromips");
1219 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1220 "dsp");
1221 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1222 "dspr2");
1223 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1224 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001225
1226 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1227 // pass -mfpxx
1228 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1229 options::OPT_mfp64)) {
1230 if (A->getOption().matches(options::OPT_mfp32))
1231 Features.push_back(Args.MakeArgString("-fp64"));
1232 else if (A->getOption().matches(options::OPT_mfpxx)) {
1233 Features.push_back(Args.MakeArgString("+fpxx"));
1234 Features.push_back(Args.MakeArgString("+nooddspreg"));
1235 } else
1236 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001237 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001238 Features.push_back(Args.MakeArgString("+fpxx"));
1239 Features.push_back(Args.MakeArgString("+nooddspreg"));
1240 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001241
Daniel Sanders28e5d392014-07-10 10:39:51 +00001242 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1243 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001244}
1245
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001246void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001247 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001248 const Driver &D = getToolChain().getDriver();
1249 StringRef CPUName;
1250 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001251 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001252 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001253
1254 CmdArgs.push_back("-target-abi");
1255 CmdArgs.push_back(ABIName.data());
1256
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001257 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1258 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001259 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001260 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001261 CmdArgs.push_back("-mfloat-abi");
1262 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001263 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001264 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001265 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001266 CmdArgs.push_back("-mfloat-abi");
1267 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001268 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001269
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001270 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1271 if (A->getOption().matches(options::OPT_mxgot)) {
1272 CmdArgs.push_back("-mllvm");
1273 CmdArgs.push_back("-mxgot");
1274 }
1275 }
1276
Simon Atanasyanc580b322013-05-11 06:33:44 +00001277 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1278 options::OPT_mno_ldc1_sdc1)) {
1279 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1280 CmdArgs.push_back("-mllvm");
1281 CmdArgs.push_back("-mno-ldc1-sdc1");
1282 }
1283 }
1284
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001285 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1286 options::OPT_mno_check_zero_division)) {
1287 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1288 CmdArgs.push_back("-mllvm");
1289 CmdArgs.push_back("-mno-check-zero-division");
1290 }
1291 }
1292
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001293 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001294 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001295 CmdArgs.push_back("-mllvm");
1296 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1297 A->claim();
1298 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001299}
1300
Hal Finkel8eb59282012-06-11 22:35:19 +00001301/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1302static std::string getPPCTargetCPU(const ArgList &Args) {
1303 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001304 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001305
1306 if (CPUName == "native") {
1307 std::string CPU = llvm::sys::getHostCPUName();
1308 if (!CPU.empty() && CPU != "generic")
1309 return CPU;
1310 else
1311 return "";
1312 }
1313
1314 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001315 .Case("common", "generic")
1316 .Case("440", "440")
1317 .Case("440fp", "440")
1318 .Case("450", "450")
1319 .Case("601", "601")
1320 .Case("602", "602")
1321 .Case("603", "603")
1322 .Case("603e", "603e")
1323 .Case("603ev", "603ev")
1324 .Case("604", "604")
1325 .Case("604e", "604e")
1326 .Case("620", "620")
1327 .Case("630", "pwr3")
1328 .Case("G3", "g3")
1329 .Case("7400", "7400")
1330 .Case("G4", "g4")
1331 .Case("7450", "7450")
1332 .Case("G4+", "g4+")
1333 .Case("750", "750")
1334 .Case("970", "970")
1335 .Case("G5", "g5")
1336 .Case("a2", "a2")
1337 .Case("a2q", "a2q")
1338 .Case("e500mc", "e500mc")
1339 .Case("e5500", "e5500")
1340 .Case("power3", "pwr3")
1341 .Case("power4", "pwr4")
1342 .Case("power5", "pwr5")
1343 .Case("power5x", "pwr5x")
1344 .Case("power6", "pwr6")
1345 .Case("power6x", "pwr6x")
1346 .Case("power7", "pwr7")
1347 .Case("power8", "pwr8")
1348 .Case("pwr3", "pwr3")
1349 .Case("pwr4", "pwr4")
1350 .Case("pwr5", "pwr5")
1351 .Case("pwr5x", "pwr5x")
1352 .Case("pwr6", "pwr6")
1353 .Case("pwr6x", "pwr6x")
1354 .Case("pwr7", "pwr7")
1355 .Case("pwr8", "pwr8")
1356 .Case("powerpc", "ppc")
1357 .Case("powerpc64", "ppc64")
1358 .Case("powerpc64le", "ppc64le")
1359 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001360 }
1361
1362 return "";
1363}
1364
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001365static void getPPCTargetFeatures(const ArgList &Args,
1366 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001367 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1368 StringRef Name = A->getOption().getName();
1369 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001370
1371 // Skip over "-m".
1372 assert(Name.startswith("m") && "Invalid feature name.");
1373 Name = Name.substr(1);
1374
1375 bool IsNegative = Name.startswith("no-");
1376 if (IsNegative)
1377 Name = Name.substr(3);
1378
1379 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1380 // pass the correct option to the backend while calling the frontend
1381 // option the same.
1382 // TODO: Change the LLVM backend option maybe?
1383 if (Name == "mfcrf")
1384 Name = "mfocrf";
1385
1386 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1387 }
1388
1389 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001390 AddTargetFeature(Args, Features, options::OPT_faltivec,
1391 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001392}
1393
Ulrich Weigand8afad612014-07-28 13:17:52 +00001394void Clang::AddPPCTargetArgs(const ArgList &Args,
1395 ArgStringList &CmdArgs) const {
1396 // Select the ABI to use.
1397 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001398 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001399 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001400 case llvm::Triple::ppc64: {
1401 // When targeting a processor that supports QPX, or if QPX is
1402 // specifically enabled, default to using the ABI that supports QPX (so
1403 // long as it is not specifically disabled).
1404 bool HasQPX = false;
1405 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1406 HasQPX = A->getValue() == StringRef("a2q");
1407 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1408 if (HasQPX) {
1409 ABIName = "elfv1-qpx";
1410 break;
1411 }
1412
Ulrich Weigand8afad612014-07-28 13:17:52 +00001413 ABIName = "elfv1";
1414 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001415 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001416 case llvm::Triple::ppc64le:
1417 ABIName = "elfv2";
1418 break;
1419 default:
1420 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001421 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001422
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001423 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1424 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1425 // the option if given as we don't have backend support for any targets
1426 // that don't use the altivec abi.
1427 if (StringRef(A->getValue()) != "altivec")
1428 ABIName = A->getValue();
1429
Ulrich Weigand8afad612014-07-28 13:17:52 +00001430 if (ABIName) {
1431 CmdArgs.push_back("-target-abi");
1432 CmdArgs.push_back(ABIName);
1433 }
1434}
1435
1436bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1437 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1438 return A && (A->getValue() == StringRef(Value));
1439}
1440
Tom Stellard6674c702013-04-01 20:56:53 +00001441/// Get the (LLVM) name of the R600 gpu we are targeting.
1442static std::string getR600TargetGPU(const ArgList &Args) {
1443 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001444 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001445 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001446 .Cases("rv630", "rv635", "r600")
1447 .Cases("rv610", "rv620", "rs780", "rs880")
1448 .Case("rv740", "rv770")
1449 .Case("palm", "cedar")
1450 .Cases("sumo", "sumo2", "sumo")
1451 .Case("hemlock", "cypress")
1452 .Case("aruba", "cayman")
1453 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001454 }
1455 return "";
1456}
1457
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001458void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001459 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001460 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001461 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001462
James Y Knightb2406522015-06-15 20:51:24 +00001463 bool SoftFloatABI = false;
1464 if (Arg *A =
1465 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001466 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001467 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001468 }
1469
James Y Knightb2406522015-06-15 20:51:24 +00001470 // Only the hard-float ABI on Sparc is standardized, and it is the
1471 // default. GCC also supports a nonstandard soft-float ABI mode, and
1472 // perhaps LLVM should implement that, too. However, since llvm
1473 // currently does not support Sparc soft-float, at all, display an
1474 // error if it's requested.
1475 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001476 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1477 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001478 }
1479}
1480
Richard Sandiford4652d892013-07-19 16:51:51 +00001481static const char *getSystemZTargetCPU(const ArgList &Args) {
1482 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1483 return A->getValue();
1484 return "z10";
1485}
1486
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001487static void getSystemZTargetFeatures(const ArgList &Args,
1488 std::vector<const char *> &Features) {
1489 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001490 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001491 if (A->getOption().matches(options::OPT_mhtm))
1492 Features.push_back("+transactional-execution");
1493 else
1494 Features.push_back("-transactional-execution");
1495 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001496 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001497 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001498 if (A->getOption().matches(options::OPT_mvx))
1499 Features.push_back("+vector");
1500 else
1501 Features.push_back("-vector");
1502 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001503}
1504
Chandler Carruth953fb082013-01-13 11:46:33 +00001505static const char *getX86TargetCPU(const ArgList &Args,
1506 const llvm::Triple &Triple) {
1507 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001508 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001509 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001510 return "core-avx2";
1511
Chandler Carruth953fb082013-01-13 11:46:33 +00001512 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001513 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001514
1515 // FIXME: Reject attempts to use -march=native unless the target matches
1516 // the host.
1517 //
1518 // FIXME: We should also incorporate the detected target features for use
1519 // with -native.
1520 std::string CPU = llvm::sys::getHostCPUName();
1521 if (!CPU.empty() && CPU != "generic")
1522 return Args.MakeArgString(CPU);
1523 }
1524
Reid Kleckner3123eff2015-06-30 16:32:04 +00001525 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1526 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1527 StringRef Arch = A->getValue();
1528 const char *CPU;
1529 if (Triple.getArch() == llvm::Triple::x86) {
1530 CPU = llvm::StringSwitch<const char *>(Arch)
1531 .Case("IA32", "i386")
1532 .Case("SSE", "pentium3")
1533 .Case("SSE2", "pentium4")
1534 .Case("AVX", "sandybridge")
1535 .Case("AVX2", "haswell")
1536 .Default(nullptr);
1537 } else {
1538 CPU = llvm::StringSwitch<const char *>(Arch)
1539 .Case("AVX", "sandybridge")
1540 .Case("AVX2", "haswell")
1541 .Default(nullptr);
1542 }
1543 if (CPU)
1544 return CPU;
1545 }
1546
Chandler Carruth953fb082013-01-13 11:46:33 +00001547 // Select the default CPU if none was given (or detection failed).
1548
1549 if (Triple.getArch() != llvm::Triple::x86_64 &&
1550 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001551 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001552
1553 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1554
1555 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001556 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001557 if (Triple.getArchName() == "x86_64h")
1558 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001559 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001560 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001561
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001562 // Set up default CPU name for PS4 compilers.
1563 if (Triple.isPS4CPU())
1564 return "btver2";
1565
Alexey Bataev286d1b92014-01-31 04:07:13 +00001566 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001567 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001568 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001569
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001570 // Everything else goes to x86-64 in 64-bit mode.
1571 if (Is64Bit)
1572 return "x86-64";
1573
1574 switch (Triple.getOS()) {
1575 case llvm::Triple::FreeBSD:
1576 case llvm::Triple::NetBSD:
1577 case llvm::Triple::OpenBSD:
1578 return "i486";
1579 case llvm::Triple::Haiku:
1580 return "i586";
1581 case llvm::Triple::Bitrig:
1582 return "i686";
1583 default:
1584 // Fallback to p4.
1585 return "pentium4";
1586 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001587}
1588
Dan Gohmanc2853072015-09-03 22:51:53 +00001589/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1590static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1591 // If we have -mcpu=, use that.
1592 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1593 StringRef CPU = A->getValue();
1594
1595#ifdef __wasm__
1596 // Handle "native" by examining the host. "native" isn't meaningful when
1597 // cross compiling, so only support this when the host is also WebAssembly.
1598 if (CPU == "native")
1599 return llvm::sys::getHostCPUName();
1600#endif
1601
1602 return CPU;
1603 }
1604
1605 return "generic";
1606}
1607
Renato Golin7c542b42015-07-27 23:44:45 +00001608static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1609 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001610 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001611 default:
1612 return "";
1613
Amara Emerson703da2e2013-10-31 09:32:33 +00001614 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001615 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001616 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001617
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001618 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001619 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001620 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001621 case llvm::Triple::thumbeb: {
1622 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001623 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001624 return arm::getARMTargetCPU(MCPU, MArch, T);
1625 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001626 case llvm::Triple::mips:
1627 case llvm::Triple::mipsel:
1628 case llvm::Triple::mips64:
1629 case llvm::Triple::mips64el: {
1630 StringRef CPUName;
1631 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001632 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001633 return CPUName;
1634 }
1635
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001636 case llvm::Triple::nvptx:
1637 case llvm::Triple::nvptx64:
1638 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1639 return A->getValue();
1640 return "";
1641
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001642 case llvm::Triple::ppc:
1643 case llvm::Triple::ppc64:
1644 case llvm::Triple::ppc64le: {
1645 std::string TargetCPUName = getPPCTargetCPU(Args);
1646 // LLVM may default to generating code for the native CPU,
1647 // but, like gcc, we default to a more generic option for
1648 // each architecture. (except on Darwin)
1649 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1650 if (T.getArch() == llvm::Triple::ppc64)
1651 TargetCPUName = "ppc64";
1652 else if (T.getArch() == llvm::Triple::ppc64le)
1653 TargetCPUName = "ppc64le";
1654 else
1655 TargetCPUName = "ppc";
1656 }
1657 return TargetCPUName;
1658 }
1659
1660 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001661 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001662 case llvm::Triple::sparcv9:
1663 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001664 return A->getValue();
1665 return "";
1666
1667 case llvm::Triple::x86:
1668 case llvm::Triple::x86_64:
1669 return getX86TargetCPU(Args, T);
1670
1671 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001672 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001673
1674 case llvm::Triple::systemz:
1675 return getSystemZTargetCPU(Args);
1676
1677 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001678 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001679 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001680
1681 case llvm::Triple::wasm32:
1682 case llvm::Triple::wasm64:
1683 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001684 }
1685}
1686
Alp Tokerce365ca2013-12-02 12:43:03 +00001687static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001688 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001689 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1690 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1691 // forward.
1692 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001693 std::string Plugin =
1694 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001695 CmdArgs.push_back(Args.MakeArgString(Plugin));
1696
1697 // Try to pass driver level flags relevant to LTO code generation down to
1698 // the plugin.
1699
1700 // Handle flags for selecting CPU variants.
1701 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1702 if (!CPU.empty())
1703 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001704
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001705 if (IsThinLTO)
1706 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001707}
1708
Sanjay Patel2987c292015-06-11 14:53:41 +00001709/// This is a helper function for validating the optional refinement step
1710/// parameter in reciprocal argument strings. Return false if there is an error
1711/// parsing the refinement step. Otherwise, return true and set the Position
1712/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001713static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001714 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001715 const char RefinementStepToken = ':';
1716 Position = In.find(RefinementStepToken);
1717 if (Position != StringRef::npos) {
1718 StringRef Option = A.getOption().getName();
1719 StringRef RefStep = In.substr(Position + 1);
1720 // Allow exactly one numeric character for the additional refinement
1721 // step parameter. This is reasonable for all currently-supported
1722 // operations and architectures because we would expect that a larger value
1723 // of refinement steps would cause the estimate "optimization" to
1724 // under-perform the native operation. Also, if the estimate does not
1725 // converge quickly, it probably will not ever converge, so further
1726 // refinement steps will not produce a better answer.
1727 if (RefStep.size() != 1) {
1728 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1729 return false;
1730 }
1731 char RefStepChar = RefStep[0];
1732 if (RefStepChar < '0' || RefStepChar > '9') {
1733 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1734 return false;
1735 }
1736 }
1737 return true;
1738}
1739
1740/// The -mrecip flag requires processing of many optional parameters.
1741static void ParseMRecip(const Driver &D, const ArgList &Args,
1742 ArgStringList &OutStrings) {
1743 StringRef DisabledPrefixIn = "!";
1744 StringRef DisabledPrefixOut = "!";
1745 StringRef EnabledPrefixOut = "";
1746 StringRef Out = "-mrecip=";
1747
1748 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1749 if (!A)
1750 return;
1751
1752 unsigned NumOptions = A->getNumValues();
1753 if (NumOptions == 0) {
1754 // No option is the same as "all".
1755 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1756 return;
1757 }
1758
1759 // Pass through "all", "none", or "default" with an optional refinement step.
1760 if (NumOptions == 1) {
1761 StringRef Val = A->getValue(0);
1762 size_t RefStepLoc;
1763 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1764 return;
1765 StringRef ValBase = Val.slice(0, RefStepLoc);
1766 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1767 OutStrings.push_back(Args.MakeArgString(Out + Val));
1768 return;
1769 }
1770 }
1771
1772 // Each reciprocal type may be enabled or disabled individually.
1773 // Check each input value for validity, concatenate them all back together,
1774 // and pass through.
1775
1776 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001777 OptionStrings.insert(std::make_pair("divd", false));
1778 OptionStrings.insert(std::make_pair("divf", false));
1779 OptionStrings.insert(std::make_pair("vec-divd", false));
1780 OptionStrings.insert(std::make_pair("vec-divf", false));
1781 OptionStrings.insert(std::make_pair("sqrtd", false));
1782 OptionStrings.insert(std::make_pair("sqrtf", false));
1783 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1784 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001785
1786 for (unsigned i = 0; i != NumOptions; ++i) {
1787 StringRef Val = A->getValue(i);
1788
1789 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1790 // Ignore the disablement token for string matching.
1791 if (IsDisabled)
1792 Val = Val.substr(1);
1793
1794 size_t RefStep;
1795 if (!getRefinementStep(Val, D, *A, RefStep))
1796 return;
1797
1798 StringRef ValBase = Val.slice(0, RefStep);
1799 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1800 if (OptionIter == OptionStrings.end()) {
1801 // Try again specifying float suffix.
1802 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1803 if (OptionIter == OptionStrings.end()) {
1804 // The input name did not match any known option string.
1805 D.Diag(diag::err_drv_unknown_argument) << Val;
1806 return;
1807 }
1808 // The option was specified without a float or double suffix.
1809 // Make sure that the double entry was not already specified.
1810 // The float entry will be checked below.
1811 if (OptionStrings[ValBase.str() + 'd']) {
1812 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1813 return;
1814 }
1815 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001816
Sanjay Patel2987c292015-06-11 14:53:41 +00001817 if (OptionIter->second == true) {
1818 // Duplicate option specified.
1819 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1820 return;
1821 }
1822
1823 // Mark the matched option as found. Do not allow duplicate specifiers.
1824 OptionIter->second = true;
1825
1826 // If the precision was not specified, also mark the double entry as found.
1827 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1828 OptionStrings[ValBase.str() + 'd'] = true;
1829
1830 // Build the output string.
1831 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1832 Out = Args.MakeArgString(Out + Prefix + Val);
1833 if (i != NumOptions - 1)
1834 Out = Args.MakeArgString(Out + ",");
1835 }
1836
1837 OutStrings.push_back(Args.MakeArgString(Out));
1838}
1839
Eric Christopherc54920a2015-03-23 19:26:05 +00001840static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001841 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001842 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001843 // If -march=native, autodetect the feature list.
1844 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1845 if (StringRef(A->getValue()) == "native") {
1846 llvm::StringMap<bool> HostFeatures;
1847 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1848 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001849 Features.push_back(
1850 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001851 }
1852 }
1853
Jim Grosbach82eee262013-11-16 00:53:35 +00001854 if (Triple.getArchName() == "x86_64h") {
1855 // x86_64h implies quite a few of the more modern subtarget features
1856 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1857 Features.push_back("-rdrnd");
1858 Features.push_back("-aes");
1859 Features.push_back("-pclmul");
1860 Features.push_back("-rtm");
1861 Features.push_back("-hle");
1862 Features.push_back("-fsgsbase");
1863 }
1864
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001865 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001866 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001867 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001868 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001869 Features.push_back("+sse4.2");
1870 Features.push_back("+popcnt");
1871 } else
1872 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001873 }
1874
Eric Christopherc54920a2015-03-23 19:26:05 +00001875 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001876 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1877 StringRef Arch = A->getValue();
1878 bool ArchUsed = false;
1879 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001880 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001881 if (Arch == "AVX" || Arch == "AVX2") {
1882 ArchUsed = true;
1883 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1884 }
1885 }
1886 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001887 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001888 if (Arch == "IA32") {
1889 ArchUsed = true;
1890 } else if (Arch == "SSE" || Arch == "SSE2") {
1891 ArchUsed = true;
1892 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1893 }
1894 }
1895 if (!ArchUsed)
1896 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1897 }
1898
Jim Grosbach82eee262013-11-16 00:53:35 +00001899 // Now add any that the user explicitly requested on the command line,
1900 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001901 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1902 StringRef Name = A->getOption().getName();
1903 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001904
1905 // Skip over "-m".
1906 assert(Name.startswith("m") && "Invalid feature name.");
1907 Name = Name.substr(1);
1908
1909 bool IsNegative = Name.startswith("no-");
1910 if (IsNegative)
1911 Name = Name.substr(3);
1912
1913 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1914 }
1915}
1916
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001917void Clang::AddX86TargetArgs(const ArgList &Args,
1918 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001920 Args.hasArg(options::OPT_mkernel) ||
1921 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001922 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001923
Bob Wilson2616e2e2013-02-10 16:01:41 +00001924 // Default to avoid implicit floating-point for kernel/kext code, but allow
1925 // that to be overridden with -mno-soft-float.
1926 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1927 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001928 if (Arg *A = Args.getLastArg(
1929 options::OPT_msoft_float, options::OPT_mno_soft_float,
1930 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001931 const Option &O = A->getOption();
1932 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1933 O.matches(options::OPT_msoft_float));
1934 }
1935 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001936 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001937
1938 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1939 StringRef Value = A->getValue();
1940 if (Value == "intel" || Value == "att") {
1941 CmdArgs.push_back("-mllvm");
1942 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1943 } else {
1944 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1945 << A->getOption().getName() << Value;
1946 }
1947 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001948}
1949
Tony Linthicum76329bf2011-12-12 21:14:55 +00001950void Clang::AddHexagonTargetArgs(const ArgList &Args,
1951 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001952 CmdArgs.push_back("-mqdsp6-compat");
1953 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001954
Douglas Katzman54366072015-07-27 16:53:08 +00001955 if (const char *v =
1956 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001957 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001958 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001959 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001960 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001961 }
1962
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001963 if (!Args.hasArg(options::OPT_fno_short_enums))
1964 CmdArgs.push_back("-fshort-enums");
1965 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001966 CmdArgs.push_back("-mllvm");
1967 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001968 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001969 CmdArgs.push_back("-mllvm");
1970 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001971}
1972
Kevin Qin110db6f2014-07-18 07:03:22 +00001973// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001974static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001975 std::vector<const char *> &Features) {
1976 SmallVector<StringRef, 8> Split;
1977 text.split(Split, StringRef("+"), -1, false);
1978
Benjamin Kramer72e64312015-09-24 14:48:49 +00001979 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00001980 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001981 .Case("fp", "+fp-armv8")
1982 .Case("simd", "+neon")
1983 .Case("crc", "+crc")
1984 .Case("crypto", "+crypto")
1985 .Case("nofp", "-fp-armv8")
1986 .Case("nosimd", "-neon")
1987 .Case("nocrc", "-crc")
1988 .Case("nocrypto", "-crypto")
1989 .Default(nullptr);
1990 if (result)
1991 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001992 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001993 D.Diag(diag::err_drv_no_neon_modifier);
1994 else
1995 return false;
1996 }
1997 return true;
1998}
1999
2000// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2001// decode CPU and feature.
2002static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2003 std::vector<const char *> &Features) {
2004 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2005 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002006 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
2007 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002008 Features.push_back("+neon");
2009 Features.push_back("+crc");
2010 Features.push_back("+crypto");
2011 } else if (CPU == "generic") {
2012 Features.push_back("+neon");
2013 } else {
2014 return false;
2015 }
2016
2017 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2018 return false;
2019
2020 return true;
2021}
2022
2023static bool
2024getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2025 const ArgList &Args,
2026 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002027 std::string MarchLowerCase = March.lower();
2028 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002029
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002030 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002031 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002032 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002033 Features.push_back("+v8.1a");
2034 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002035 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002036 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002037
2038 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2039 return false;
2040
2041 return true;
2042}
2043
2044static bool
2045getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2046 const ArgList &Args,
2047 std::vector<const char *> &Features) {
2048 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002049 std::string McpuLowerCase = Mcpu.lower();
2050 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002051 return false;
2052
2053 return true;
2054}
2055
2056static bool
2057getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2058 const ArgList &Args,
2059 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002060 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002061 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002062 if (MtuneLowerCase == "native")
2063 MtuneLowerCase = llvm::sys::getHostCPUName();
2064 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002065 Features.push_back("+zcm");
2066 Features.push_back("+zcz");
2067 }
2068 return true;
2069}
2070
2071static bool
2072getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2073 const ArgList &Args,
2074 std::vector<const char *> &Features) {
2075 StringRef CPU;
2076 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002077 std::string McpuLowerCase = Mcpu.lower();
2078 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002079 return false;
2080
2081 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2082}
2083
Akira Hatanaka92500472015-07-27 19:29:04 +00002084static void getAArch64TargetFeatures(const Driver &D,
2085 const llvm::Triple &Triple,
2086 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002087 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002088 Arg *A;
2089 bool success = true;
2090 // Enable NEON by default.
2091 Features.push_back("+neon");
2092 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2093 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2094 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2095 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002096 else if (Args.hasArg(options::OPT_arch))
2097 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2098 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002099
2100 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2101 success =
2102 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2103 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2104 success =
2105 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002106 else if (Args.hasArg(options::OPT_arch))
2107 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2108 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002109
2110 if (!success)
2111 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002112
2113 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2114 Features.push_back("-fp-armv8");
2115 Features.push_back("-crypto");
2116 Features.push_back("-neon");
2117 }
Bradley Smith418c5932014-05-02 15:17:51 +00002118
2119 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002120 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002121 if (A->getOption().matches(options::OPT_mcrc))
2122 Features.push_back("+crc");
2123 else
2124 Features.push_back("-crc");
2125 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002126
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002127 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2128 options::OPT_munaligned_access))
2129 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2130 Features.push_back("+strict-align");
2131
Akira Hatanaka92500472015-07-27 19:29:04 +00002132 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002133 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002134}
2135
Dan Gohmanc2853072015-09-03 22:51:53 +00002136static void getWebAssemblyTargetFeatures(const ArgList &Args,
2137 std::vector<const char *> &Features) {
2138 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2139 StringRef Name = A->getOption().getName();
2140 A->claim();
2141
2142 // Skip over "-m".
2143 assert(Name.startswith("m") && "Invalid feature name.");
2144 Name = Name.substr(1);
2145
2146 bool IsNegative = Name.startswith("no-");
2147 if (IsNegative)
2148 Name = Name.substr(3);
2149
2150 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2151 }
2152}
2153
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002154static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002155 const ArgList &Args, ArgStringList &CmdArgs,
2156 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002157 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002158 std::vector<const char *> Features;
2159 switch (Triple.getArch()) {
2160 default:
2161 break;
2162 case llvm::Triple::mips:
2163 case llvm::Triple::mipsel:
2164 case llvm::Triple::mips64:
2165 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002166 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002167 break;
2168
2169 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002170 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002171 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002172 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002173 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002174 break;
2175
2176 case llvm::Triple::ppc:
2177 case llvm::Triple::ppc64:
2178 case llvm::Triple::ppc64le:
2179 getPPCTargetFeatures(Args, Features);
2180 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002181 case llvm::Triple::systemz:
2182 getSystemZTargetFeatures(Args, Features);
2183 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002184 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002185 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002186 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002187 break;
2188 case llvm::Triple::x86:
2189 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002190 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002191 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002192 case llvm::Triple::wasm32:
2193 case llvm::Triple::wasm64:
2194 getWebAssemblyTargetFeatures(Args, Features);
2195 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002196 }
Rafael Espindola43964802013-08-21 17:34:32 +00002197
2198 // Find the last of each feature.
2199 llvm::StringMap<unsigned> LastOpt;
2200 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2201 const char *Name = Features[I];
2202 assert(Name[0] == '-' || Name[0] == '+');
2203 LastOpt[Name + 1] = I;
2204 }
2205
2206 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2207 // If this feature was overridden, ignore it.
2208 const char *Name = Features[I];
2209 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2210 assert(LastI != LastOpt.end());
2211 unsigned Last = LastI->second;
2212 if (Last != I)
2213 continue;
2214
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002215 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002216 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002217 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002218}
2219
David Majnemerae394812014-12-09 00:12:30 +00002220static bool
2221shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2222 const llvm::Triple &Triple) {
2223 // We use the zero-cost exception tables for Objective-C if the non-fragile
2224 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2225 // later.
2226 if (runtime.isNonFragile())
2227 return true;
2228
2229 if (!Triple.isMacOSX())
2230 return false;
2231
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002232 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002233 (Triple.getArch() == llvm::Triple::x86_64 ||
2234 Triple.getArch() == llvm::Triple::arm));
2235}
2236
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002237/// Adds exception related arguments to the driver command arguments. There's a
2238/// master flag, -fexceptions and also language specific flags to enable/disable
2239/// C++ and Objective-C exceptions. This makes it possible to for example
2240/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002241static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002242 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002243 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002244 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002245 const Driver &D = TC.getDriver();
2246 const llvm::Triple &Triple = TC.getTriple();
2247
Chad Rosier4fab82c2012-03-26 22:04:46 +00002248 if (KernelOrKext) {
2249 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2250 // arguments now to avoid warnings about unused arguments.
2251 Args.ClaimAllArgs(options::OPT_fexceptions);
2252 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2253 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2254 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2255 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2256 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002257 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002258 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002259
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002260 // See if the user explicitly enabled exceptions.
2261 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2262 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002263
David Majnemerae394812014-12-09 00:12:30 +00002264 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2265 // is not necessarily sensible, but follows GCC.
2266 if (types::isObjC(InputType) &&
2267 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002268 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002269 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002270
David Majnemerae394812014-12-09 00:12:30 +00002271 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002272 }
2273
2274 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002275 // Disable C++ EH by default on XCore, PS4, and MSVC.
2276 // FIXME: Remove MSVC from this list once things work.
2277 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2278 !Triple.isPS4CPU() &&
2279 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002280 Arg *ExceptionArg = Args.getLastArg(
2281 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2282 options::OPT_fexceptions, options::OPT_fno_exceptions);
2283 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002284 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002285 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2286 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002287
2288 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002289 if (Triple.isPS4CPU()) {
2290 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2291 assert(ExceptionArg &&
2292 "On the PS4 exceptions should only be enabled if passing "
2293 "an argument");
2294 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2295 const Arg *RTTIArg = TC.getRTTIArg();
2296 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2297 D.Diag(diag::err_drv_argument_not_allowed_with)
2298 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2299 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2300 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2301 } else
2302 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2303
Anders Carlssone96ab552011-02-28 02:27:16 +00002304 CmdArgs.push_back("-fcxx-exceptions");
2305
David Majnemer8de68642014-12-05 08:11:58 +00002306 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002307 }
2308 }
2309
David Majnemer8de68642014-12-05 08:11:58 +00002310 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002311 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002312}
2313
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002314static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002315 bool Default = true;
2316 if (TC.getTriple().isOSDarwin()) {
2317 // The native darwin assembler doesn't support the linker_option directives,
2318 // so we disable them if we think the .s file will be passed to it.
2319 Default = TC.useIntegratedAs();
2320 }
2321 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2322 Default);
2323}
2324
Ted Kremenek62093662013-03-12 17:02:12 +00002325static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2326 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002327 bool UseDwarfDirectory =
2328 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2329 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002330 return !UseDwarfDirectory;
2331}
2332
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002333/// \brief Check whether the given input tree contains any compilation actions.
2334static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002335 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002336 return true;
2337
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002338 for (const auto &Act : *A)
2339 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002340 return true;
2341
2342 return false;
2343}
2344
2345/// \brief Check if -relax-all should be passed to the internal assembler.
2346/// This is done by default when compiling non-assembler source with -O0.
2347static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2348 bool RelaxDefault = true;
2349
2350 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2351 RelaxDefault = A->getOption().matches(options::OPT_O0);
2352
2353 if (RelaxDefault) {
2354 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002355 for (const auto &Act : C.getActions()) {
2356 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002357 RelaxDefault = true;
2358 break;
2359 }
2360 }
2361 }
2362
2363 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002364 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002365}
2366
Douglas Katzman3459ce22015-10-08 04:24:12 +00002367// Extract the integer N from a string spelled "-dwarf-N", returning 0
2368// on mismatch. The StringRef input (rather than an Arg) allows
2369// for use by the "-Xassembler" option parser.
2370static unsigned DwarfVersionNum(StringRef ArgValue) {
2371 return llvm::StringSwitch<unsigned>(ArgValue)
2372 .Case("-gdwarf-2", 2)
2373 .Case("-gdwarf-3", 3)
2374 .Case("-gdwarf-4", 4)
2375 .Default(0);
2376}
2377
2378static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2379 CodeGenOptions::DebugInfoKind DebugInfoKind,
2380 unsigned DwarfVersion) {
2381 switch (DebugInfoKind) {
2382 case CodeGenOptions::DebugLineTablesOnly:
2383 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2384 break;
2385 case CodeGenOptions::LimitedDebugInfo:
2386 CmdArgs.push_back("-debug-info-kind=limited");
2387 break;
2388 case CodeGenOptions::FullDebugInfo:
2389 CmdArgs.push_back("-debug-info-kind=standalone");
2390 break;
2391 default:
2392 break;
2393 }
2394 if (DwarfVersion > 0)
2395 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002396 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002397}
2398
David Blaikie9260ed62013-07-25 21:19:01 +00002399static void CollectArgsForIntegratedAssembler(Compilation &C,
2400 const ArgList &Args,
2401 ArgStringList &CmdArgs,
2402 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002403 if (UseRelaxAll(C, Args))
2404 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002405
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002406 // When passing -I arguments to the assembler we sometimes need to
2407 // unconditionally take the next argument. For example, when parsing
2408 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2409 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2410 // arg after parsing the '-I' arg.
2411 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002412
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002413 // When using an integrated assembler, translate -Wa, and -Xassembler
2414 // options.
2415 bool CompressDebugSections = false;
2416 for (const Arg *A :
2417 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2418 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002419
Benjamin Kramer72e64312015-09-24 14:48:49 +00002420 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002421 if (TakeNextArg) {
2422 CmdArgs.push_back(Value.data());
2423 TakeNextArg = false;
2424 continue;
2425 }
David Blaikie9260ed62013-07-25 21:19:01 +00002426
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002427 switch (C.getDefaultToolChain().getArch()) {
2428 default:
2429 break;
2430 case llvm::Triple::mips:
2431 case llvm::Triple::mipsel:
2432 case llvm::Triple::mips64:
2433 case llvm::Triple::mips64el:
2434 if (Value == "--trap") {
2435 CmdArgs.push_back("-target-feature");
2436 CmdArgs.push_back("+use-tcc-in-div");
2437 continue;
2438 }
2439 if (Value == "--break") {
2440 CmdArgs.push_back("-target-feature");
2441 CmdArgs.push_back("-use-tcc-in-div");
2442 continue;
2443 }
2444 if (Value.startswith("-msoft-float")) {
2445 CmdArgs.push_back("-target-feature");
2446 CmdArgs.push_back("+soft-float");
2447 continue;
2448 }
2449 if (Value.startswith("-mhard-float")) {
2450 CmdArgs.push_back("-target-feature");
2451 CmdArgs.push_back("-soft-float");
2452 continue;
2453 }
2454 break;
2455 }
2456
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002457 if (Value == "-force_cpusubtype_ALL") {
2458 // Do nothing, this is the default and we don't support anything else.
2459 } else if (Value == "-L") {
2460 CmdArgs.push_back("-msave-temp-labels");
2461 } else if (Value == "--fatal-warnings") {
2462 CmdArgs.push_back("-massembler-fatal-warnings");
2463 } else if (Value == "--noexecstack") {
2464 CmdArgs.push_back("-mnoexecstack");
2465 } else if (Value == "-compress-debug-sections" ||
2466 Value == "--compress-debug-sections") {
2467 CompressDebugSections = true;
2468 } else if (Value == "-nocompress-debug-sections" ||
2469 Value == "--nocompress-debug-sections") {
2470 CompressDebugSections = false;
2471 } else if (Value.startswith("-I")) {
2472 CmdArgs.push_back(Value.data());
2473 // We need to consume the next argument if the current arg is a plain
2474 // -I. The next arg will be the include directory.
2475 if (Value == "-I")
2476 TakeNextArg = true;
2477 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002478 // "-gdwarf-N" options are not cc1as options.
2479 unsigned DwarfVersion = DwarfVersionNum(Value);
2480 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2481 CmdArgs.push_back(Value.data());
2482 } else {
2483 RenderDebugEnablingArgs(
2484 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2485 }
Renato Golin7c542b42015-07-27 23:44:45 +00002486 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2487 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2488 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002489 } else {
2490 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002491 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002492 }
2493 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002494 }
2495 if (CompressDebugSections) {
2496 if (llvm::zlib::isAvailable())
2497 CmdArgs.push_back("-compress-debug-sections");
2498 else
2499 D.Diag(diag::warn_debug_compression_unavailable);
2500 }
David Blaikie9260ed62013-07-25 21:19:01 +00002501}
2502
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002503// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002504// FIXME: Make sure we can also emit shared objects if they're requested
2505// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002506static void addClangRT(const ToolChain &TC, const ArgList &Args,
2507 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002508 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002509}
2510
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002511namespace {
2512enum OpenMPRuntimeKind {
2513 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2514 /// without knowing what runtime to target.
2515 OMPRT_Unknown,
2516
2517 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2518 /// the default for Clang.
2519 OMPRT_OMP,
2520
2521 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2522 /// this runtime but can swallow the pragmas, and find and link against the
2523 /// runtime library itself.
2524 OMPRT_GOMP,
2525
Chandler Carruthc6625c62015-05-28 21:10:31 +00002526 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002527 /// OpenMP runtime. We support this mode for users with existing dependencies
2528 /// on this runtime library name.
2529 OMPRT_IOMP5
2530};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002531}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002532
2533/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002534static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2535 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002536 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2537
2538 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2539 if (A)
2540 RuntimeName = A->getValue();
2541
2542 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002543 .Case("libomp", OMPRT_OMP)
2544 .Case("libgomp", OMPRT_GOMP)
2545 .Case("libiomp5", OMPRT_IOMP5)
2546 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002547
2548 if (RT == OMPRT_Unknown) {
2549 if (A)
2550 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002551 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002552 else
2553 // FIXME: We could use a nicer diagnostic here.
2554 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2555 }
2556
2557 return RT;
2558}
2559
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002560static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2561 const ArgList &Args) {
2562 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2563 options::OPT_fno_openmp, false))
2564 return;
2565
2566 switch (getOpenMPRuntime(TC, Args)) {
2567 case OMPRT_OMP:
2568 CmdArgs.push_back("-lomp");
2569 break;
2570 case OMPRT_GOMP:
2571 CmdArgs.push_back("-lgomp");
2572 break;
2573 case OMPRT_IOMP5:
2574 CmdArgs.push_back("-liomp5");
2575 break;
2576 case OMPRT_Unknown:
2577 // Already diagnosed.
2578 break;
2579 }
2580}
2581
Alexey Samsonov52550342014-09-15 19:58:40 +00002582static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2583 ArgStringList &CmdArgs, StringRef Sanitizer,
2584 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002585 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002586 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002587 if (!IsShared) CmdArgs.push_back("-whole-archive");
2588 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2589 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002590}
2591
Alexey Samsonov52550342014-09-15 19:58:40 +00002592// Tries to use a file with the list of dynamic symbols that need to be exported
2593// from the runtime library. Returns true if the file was found.
2594static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2595 ArgStringList &CmdArgs,
2596 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002597 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002598 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2599 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002600 return true;
2601 }
2602 return false;
2603}
2604
2605static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2606 ArgStringList &CmdArgs) {
2607 // Force linking against the system libraries sanitizers depends on
2608 // (see PR15823 why this is necessary).
2609 CmdArgs.push_back("--no-as-needed");
2610 CmdArgs.push_back("-lpthread");
2611 CmdArgs.push_back("-lrt");
2612 CmdArgs.push_back("-lm");
2613 // There's no libdl on FreeBSD.
2614 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2615 CmdArgs.push_back("-ldl");
2616}
2617
2618static void
2619collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2620 SmallVectorImpl<StringRef> &SharedRuntimes,
2621 SmallVectorImpl<StringRef> &StaticRuntimes,
2622 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2623 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2624 // Collect shared runtimes.
2625 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2626 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002627 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002628
Alexey Samsonov52550342014-09-15 19:58:40 +00002629 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002630 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002631 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002632 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002633 }
2634 if (SanArgs.needsAsanRt()) {
2635 if (SanArgs.needsSharedAsanRt()) {
2636 HelperStaticRuntimes.push_back("asan-preinit");
2637 } else {
2638 StaticRuntimes.push_back("asan");
2639 if (SanArgs.linkCXXRuntimes())
2640 StaticRuntimes.push_back("asan_cxx");
2641 }
2642 }
2643 if (SanArgs.needsDfsanRt())
2644 StaticRuntimes.push_back("dfsan");
2645 if (SanArgs.needsLsanRt())
2646 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002647 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002648 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002649 if (SanArgs.linkCXXRuntimes())
2650 StaticRuntimes.push_back("msan_cxx");
2651 }
2652 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002653 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002654 if (SanArgs.linkCXXRuntimes())
2655 StaticRuntimes.push_back("tsan_cxx");
2656 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002657 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002658 StaticRuntimes.push_back("ubsan_standalone");
2659 if (SanArgs.linkCXXRuntimes())
2660 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002661 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002662 if (SanArgs.needsSafeStackRt())
2663 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002664}
2665
Alexey Samsonov52550342014-09-15 19:58:40 +00002666// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2667// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2668static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002669 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002670 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2671 HelperStaticRuntimes;
2672 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2673 HelperStaticRuntimes);
2674 for (auto RT : SharedRuntimes)
2675 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2676 for (auto RT : HelperStaticRuntimes)
2677 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2678 bool AddExportDynamic = false;
2679 for (auto RT : StaticRuntimes) {
2680 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2681 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2682 }
2683 // If there is a static runtime with no dynamic list, force all the symbols
2684 // to be dynamic to be sure we export sanitizer interface functions.
2685 if (AddExportDynamic)
2686 CmdArgs.push_back("-export-dynamic");
2687 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002688}
2689
Reid Kleckner86ea7702015-02-04 23:45:07 +00002690static bool areOptimizationsEnabled(const ArgList &Args) {
2691 // Find the last -O arg and see if it is non-zero.
2692 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2693 return !A->getOption().matches(options::OPT_O0);
2694 // Defaults to -O0.
2695 return false;
2696}
2697
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002698static bool shouldUseFramePointerForTarget(const ArgList &Args,
2699 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002700 switch (Triple.getArch()) {
2701 case llvm::Triple::xcore:
2702 case llvm::Triple::wasm32:
2703 case llvm::Triple::wasm64:
2704 // XCore never wants frame pointers, regardless of OS.
2705 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002706 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002707 default:
2708 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002709 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002710
2711 if (Triple.isOSLinux()) {
2712 switch (Triple.getArch()) {
2713 // Don't use a frame pointer on linux if optimizing for certain targets.
2714 case llvm::Triple::mips64:
2715 case llvm::Triple::mips64el:
2716 case llvm::Triple::mips:
2717 case llvm::Triple::mipsel:
2718 case llvm::Triple::systemz:
2719 case llvm::Triple::x86:
2720 case llvm::Triple::x86_64:
2721 return !areOptimizationsEnabled(Args);
2722 default:
2723 return true;
2724 }
2725 }
2726
2727 if (Triple.isOSWindows()) {
2728 switch (Triple.getArch()) {
2729 case llvm::Triple::x86:
2730 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002731 case llvm::Triple::arm:
2732 case llvm::Triple::thumb:
2733 // Windows on ARM builds with FPO disabled to aid fast stack walking
2734 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002735 default:
2736 // All other supported Windows ISAs use xdata unwind information, so frame
2737 // pointers are not generally useful.
2738 return false;
2739 }
2740 }
2741
2742 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002743}
2744
Rafael Espindola224dd632011-12-14 21:02:23 +00002745static bool shouldUseFramePointer(const ArgList &Args,
2746 const llvm::Triple &Triple) {
2747 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2748 options::OPT_fomit_frame_pointer))
2749 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2750
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002751 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002752}
2753
Eric Christopherb7d97e92013-04-03 01:58:53 +00002754static bool shouldUseLeafFramePointer(const ArgList &Args,
2755 const llvm::Triple &Triple) {
2756 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2757 options::OPT_momit_leaf_frame_pointer))
2758 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2759
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002760 if (Triple.isPS4CPU())
2761 return false;
2762
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002763 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002764}
2765
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002766/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002767static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002768 SmallString<128> cwd;
2769 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002770 CmdArgs.push_back("-fdebug-compilation-dir");
2771 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002772 }
2773}
2774
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002775static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002776 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2777 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2778 SmallString<128> T(FinalOutput->getValue());
2779 llvm::sys::path::replace_extension(T, "dwo");
2780 return Args.MakeArgString(T);
2781 } else {
2782 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002783 SmallString<128> T(
2784 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002785 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002786 llvm::sys::path::replace_extension(F, "dwo");
2787 T += F;
2788 return Args.MakeArgString(F);
2789 }
2790}
2791
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002792static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2793 const JobAction &JA, const ArgList &Args,
2794 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002795 ArgStringList ExtractArgs;
2796 ExtractArgs.push_back("--extract-dwo");
2797
2798 ArgStringList StripArgs;
2799 StripArgs.push_back("--strip-dwo");
2800
2801 // Grabbing the output of the earlier compile step.
2802 StripArgs.push_back(Output.getFilename());
2803 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002804 ExtractArgs.push_back(OutFile);
2805
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002806 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002807 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002808
2809 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002810 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002811
2812 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002813 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002814}
2815
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002816/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002817/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2818static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002819 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002820 if (A->getOption().matches(options::OPT_O4) ||
2821 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002822 return true;
2823
2824 if (A->getOption().matches(options::OPT_O0))
2825 return false;
2826
2827 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2828
Rafael Espindola91780de2013-08-26 14:05:41 +00002829 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002830 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002831 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002832 return true;
2833
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002834 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002835 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002836 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002837
2838 unsigned OptLevel = 0;
2839 if (S.getAsInteger(10, OptLevel))
2840 return false;
2841
2842 return OptLevel > 1;
2843 }
2844
2845 return false;
2846}
2847
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002848/// Add -x lang to \p CmdArgs for \p Input.
2849static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2850 ArgStringList &CmdArgs) {
2851 // When using -verify-pch, we don't want to provide the type
2852 // 'precompiled-header' if it was inferred from the file extension
2853 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2854 return;
2855
2856 CmdArgs.push_back("-x");
2857 if (Args.hasArg(options::OPT_rewrite_objc))
2858 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2859 else
2860 CmdArgs.push_back(types::getTypeName(Input.getType()));
2861}
2862
David Majnemerc371ff02015-03-22 08:39:22 +00002863static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002864 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002865 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002866
2867 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002868 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002869
2870 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002871 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002872 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002873 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002874}
2875
Rafael Espindola577637a2015-01-03 00:06:04 +00002876// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002877// options that build systems might add but are unused when assembling or only
2878// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002879static void claimNoWarnArgs(const ArgList &Args) {
2880 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002881 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00002882 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00002883 Args.ClaimAllArgs(options::OPT_flto);
2884 Args.ClaimAllArgs(options::OPT_fno_lto);
2885}
2886
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002887static void appendUserToPath(SmallVectorImpl<char> &Result) {
2888#ifdef LLVM_ON_UNIX
2889 const char *Username = getenv("LOGNAME");
2890#else
2891 const char *Username = getenv("USERNAME");
2892#endif
2893 if (Username) {
2894 // Validate that LoginName can be used in a path, and get its length.
2895 size_t Len = 0;
2896 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002897 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002898 Username = nullptr;
2899 break;
2900 }
2901 }
2902
2903 if (Username && Len > 0) {
2904 Result.append(Username, Username + Len);
2905 return;
2906 }
2907 }
2908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002909// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002910#ifdef LLVM_ON_UNIX
2911 std::string UID = llvm::utostr(getuid());
2912#else
2913 // FIXME: Windows seems to have an 'SID' that might work.
2914 std::string UID = "9999";
2915#endif
2916 Result.append(UID.begin(), UID.end());
2917}
2918
David Majnemere11d3732015-06-08 00:22:46 +00002919VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2920 const llvm::Triple &Triple,
2921 const llvm::opt::ArgList &Args,
2922 bool IsWindowsMSVC) {
2923 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2924 IsWindowsMSVC) ||
2925 Args.hasArg(options::OPT_fmsc_version) ||
2926 Args.hasArg(options::OPT_fms_compatibility_version)) {
2927 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2928 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002929 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002930
2931 if (MSCVersion && MSCompatibilityVersion) {
2932 if (D)
2933 D->Diag(diag::err_drv_argument_not_allowed_with)
2934 << MSCVersion->getAsString(Args)
2935 << MSCompatibilityVersion->getAsString(Args);
2936 return VersionTuple();
2937 }
2938
2939 if (MSCompatibilityVersion) {
2940 VersionTuple MSVT;
2941 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2942 D->Diag(diag::err_drv_invalid_value)
2943 << MSCompatibilityVersion->getAsString(Args)
2944 << MSCompatibilityVersion->getValue();
2945 return MSVT;
2946 }
2947
2948 if (MSCVersion) {
2949 unsigned Version = 0;
2950 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2951 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2952 << MSCVersion->getValue();
2953 return getMSCompatibilityVersion(Version);
2954 }
2955
2956 unsigned Major, Minor, Micro;
2957 Triple.getEnvironmentVersion(Major, Minor, Micro);
2958 if (Major || Minor || Micro)
2959 return VersionTuple(Major, Minor, Micro);
2960
2961 return VersionTuple(18);
2962 }
2963 return VersionTuple();
2964}
2965
Diego Novilloa0545962015-07-10 18:00:07 +00002966static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2967 const InputInfo &Output, const ArgList &Args,
2968 ArgStringList &CmdArgs) {
2969 auto *ProfileGenerateArg = Args.getLastArg(
2970 options::OPT_fprofile_instr_generate,
2971 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002972 options::OPT_fprofile_generate_EQ,
2973 options::OPT_fno_profile_instr_generate);
2974 if (ProfileGenerateArg &&
2975 ProfileGenerateArg->getOption().matches(
2976 options::OPT_fno_profile_instr_generate))
2977 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002978
2979 auto *ProfileUseArg = Args.getLastArg(
2980 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002981 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2982 options::OPT_fno_profile_instr_use);
2983 if (ProfileUseArg &&
2984 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2985 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002986
2987 if (ProfileGenerateArg && ProfileUseArg)
2988 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002989 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002990
Diego Novillo758f3f52015-08-05 21:49:51 +00002991 if (ProfileGenerateArg) {
2992 if (ProfileGenerateArg->getOption().matches(
2993 options::OPT_fprofile_instr_generate_EQ))
2994 ProfileGenerateArg->render(Args, CmdArgs);
2995 else if (ProfileGenerateArg->getOption().matches(
2996 options::OPT_fprofile_generate_EQ)) {
2997 SmallString<128> Path(ProfileGenerateArg->getValue());
2998 llvm::sys::path::append(Path, "default.profraw");
2999 CmdArgs.push_back(
3000 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3001 } else
3002 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3003 }
Diego Novilloa0545962015-07-10 18:00:07 +00003004
Diego Novillo758f3f52015-08-05 21:49:51 +00003005 if (ProfileUseArg) {
3006 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3007 ProfileUseArg->render(Args, CmdArgs);
3008 else if ((ProfileUseArg->getOption().matches(
3009 options::OPT_fprofile_use_EQ) ||
3010 ProfileUseArg->getOption().matches(
3011 options::OPT_fprofile_instr_use))) {
3012 SmallString<128> Path(
3013 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3014 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3015 llvm::sys::path::append(Path, "default.profdata");
3016 CmdArgs.push_back(
3017 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3018 }
Diego Novilloa0545962015-07-10 18:00:07 +00003019 }
3020
3021 if (Args.hasArg(options::OPT_ftest_coverage) ||
3022 Args.hasArg(options::OPT_coverage))
3023 CmdArgs.push_back("-femit-coverage-notes");
3024 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3025 false) ||
3026 Args.hasArg(options::OPT_coverage))
3027 CmdArgs.push_back("-femit-coverage-data");
3028
Diego Novilloc4b94da2015-08-05 23:27:40 +00003029 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3030 options::OPT_fno_coverage_mapping, false) &&
3031 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003032 D.Diag(diag::err_drv_argument_only_allowed_with)
3033 << "-fcoverage-mapping"
3034 << "-fprofile-instr-generate";
3035
Diego Novilloc4b94da2015-08-05 23:27:40 +00003036 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3037 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003038 CmdArgs.push_back("-fcoverage-mapping");
3039
3040 if (C.getArgs().hasArg(options::OPT_c) ||
3041 C.getArgs().hasArg(options::OPT_S)) {
3042 if (Output.isFilename()) {
3043 CmdArgs.push_back("-coverage-file");
3044 SmallString<128> CoverageFilename;
3045 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3046 CoverageFilename = FinalOutput->getValue();
3047 } else {
3048 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3049 }
3050 if (llvm::sys::path::is_relative(CoverageFilename)) {
3051 SmallString<128> Pwd;
3052 if (!llvm::sys::fs::current_path(Pwd)) {
3053 llvm::sys::path::append(Pwd, CoverageFilename);
3054 CoverageFilename.swap(Pwd);
3055 }
3056 }
3057 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3058 }
3059 }
3060}
3061
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003062/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3063/// smooshes them together with platform defaults, to decide whether
3064/// this compile should be using PIC mode or not. Returns a tuple of
3065/// (RelocationModel, PICLevel, IsPIE).
3066static std::tuple<llvm::Reloc::Model, unsigned, bool>
3067ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3068 const ArgList &Args) {
3069 // FIXME: why does this code...and so much everywhere else, use both
3070 // ToolChain.getTriple() and Triple?
3071 bool PIE = ToolChain.isPIEDefault();
3072 bool PIC = PIE || ToolChain.isPICDefault();
3073 bool IsPICLevelTwo = PIC;
3074
3075 bool KernelOrKext =
3076 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3077
3078 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003079 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003080 switch (ToolChain.getArch()) {
3081 case llvm::Triple::arm:
3082 case llvm::Triple::armeb:
3083 case llvm::Triple::thumb:
3084 case llvm::Triple::thumbeb:
3085 case llvm::Triple::aarch64:
3086 case llvm::Triple::mips:
3087 case llvm::Triple::mipsel:
3088 case llvm::Triple::mips64:
3089 case llvm::Triple::mips64el:
3090 PIC = true; // "-fpic"
3091 break;
3092
3093 case llvm::Triple::x86:
3094 case llvm::Triple::x86_64:
3095 PIC = true; // "-fPIC"
3096 IsPICLevelTwo = true;
3097 break;
3098
3099 default:
3100 break;
3101 }
3102 }
3103
3104 // OpenBSD-specific defaults for PIE
3105 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3106 switch (ToolChain.getArch()) {
3107 case llvm::Triple::mips64:
3108 case llvm::Triple::mips64el:
3109 case llvm::Triple::sparcel:
3110 case llvm::Triple::x86:
3111 case llvm::Triple::x86_64:
3112 IsPICLevelTwo = false; // "-fpie"
3113 break;
3114
3115 case llvm::Triple::ppc:
3116 case llvm::Triple::sparc:
3117 case llvm::Triple::sparcv9:
3118 IsPICLevelTwo = true; // "-fPIE"
3119 break;
3120
3121 default:
3122 break;
3123 }
3124 }
3125
3126 // The last argument relating to either PIC or PIE wins, and no
3127 // other argument is used. If the last argument is any flavor of the
3128 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3129 // option implicitly enables PIC at the same level.
3130 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3131 options::OPT_fpic, options::OPT_fno_pic,
3132 options::OPT_fPIE, options::OPT_fno_PIE,
3133 options::OPT_fpie, options::OPT_fno_pie);
3134 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3135 // is forced, then neither PIC nor PIE flags will have no effect.
3136 if (!ToolChain.isPICDefaultForced()) {
3137 if (LastPICArg) {
3138 Option O = LastPICArg->getOption();
3139 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3140 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3141 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3142 PIC =
3143 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3144 IsPICLevelTwo =
3145 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3146 } else {
3147 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003148 if (Triple.isPS4CPU()) {
3149 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3150 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3151 if (Model != "kernel") {
3152 PIC = true;
3153 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3154 << LastPICArg->getSpelling();
3155 }
3156 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003157 }
3158 }
3159 }
3160
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003161 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3162 // PIC level would've been set to level 1, force it back to level 2 PIC
3163 // instead.
3164 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003165 IsPICLevelTwo |= ToolChain.isPICDefault();
3166
James Y Knightc4015d32015-08-21 04:14:55 +00003167 // This kernel flags are a trump-card: they will disable PIC/PIE
3168 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003169 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3170 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003171 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003172
3173 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3174 // This is a very special mode. It trumps the other modes, almost no one
3175 // uses it, and it isn't even valid on any OS but Darwin.
3176 if (!ToolChain.getTriple().isOSDarwin())
3177 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3178 << A->getSpelling() << ToolChain.getTriple().str();
3179
3180 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3181
3182 // Only a forced PIC mode can cause the actual compile to have PIC defines
3183 // etc., no flags are sufficient. This behavior was selected to closely
3184 // match that of llvm-gcc and Apple GCC before that.
3185 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3186
3187 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3188 }
3189
3190 if (PIC)
3191 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3192
3193 return std::make_tuple(llvm::Reloc::Static, 0, false);
3194}
3195
3196static const char *RelocationModelName(llvm::Reloc::Model Model) {
3197 switch (Model) {
3198 case llvm::Reloc::Default:
3199 return nullptr;
3200 case llvm::Reloc::Static:
3201 return "static";
3202 case llvm::Reloc::PIC_:
3203 return "pic";
3204 case llvm::Reloc::DynamicNoPIC:
3205 return "dynamic-no-pic";
3206 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003207 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003208}
3209
3210static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3211 ArgStringList &CmdArgs) {
3212 llvm::Reloc::Model RelocationModel;
3213 unsigned PICLevel;
3214 bool IsPIE;
3215 std::tie(RelocationModel, PICLevel, IsPIE) =
3216 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3217
3218 if (RelocationModel != llvm::Reloc::Static)
3219 CmdArgs.push_back("-KPIC");
3220}
3221
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003222void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003223 const InputInfo &Output, const InputInfoList &Inputs,
3224 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003225 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3226 const llvm::Triple Triple(TripleStr);
3227
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003228 bool KernelOrKext =
3229 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003230 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003231 ArgStringList CmdArgs;
3232
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003233 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003234 bool IsWindowsCygnus =
3235 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003236 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003237 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003238
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003239 // Check number of inputs for sanity. We need at least one input.
3240 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003241 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003242 // CUDA compilation may have multiple inputs (source file + results of
3243 // device-side compilations). All other jobs are expected to have exactly one
3244 // input.
3245 bool IsCuda = types::isCuda(Input.getType());
3246 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003247
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003248 // Invoke ourselves in -cc1 mode.
3249 //
3250 // FIXME: Implement custom jobs for internal actions.
3251 CmdArgs.push_back("-cc1");
3252
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003253 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003254 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003255 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003256
James Y Knight2db38f32015-08-15 03:45:25 +00003257 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3258 Triple.getArch() == llvm::Triple::thumb)) {
3259 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003260 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003261 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003262 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003263 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003264 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003265 }
3266
Tim Northover336f1892014-03-29 13:16:12 +00003267 // Push all default warning arguments that are specific to
3268 // the given target. These come before user provided warning options
3269 // are provided.
3270 getToolChain().addClangWarningOptions(CmdArgs);
3271
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003272 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003273 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003274
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003275 if (isa<AnalyzeJobAction>(JA)) {
3276 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3277 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003278 } else if (isa<MigrateJobAction>(JA)) {
3279 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003280 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003281 if (Output.getType() == types::TY_Dependencies)
3282 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003283 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003284 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003285 if (Args.hasArg(options::OPT_rewrite_objc) &&
3286 !Args.hasArg(options::OPT_g_Group))
3287 CmdArgs.push_back("-P");
3288 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003289 } else if (isa<AssembleJobAction>(JA)) {
3290 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003291
David Blaikie9260ed62013-07-25 21:19:01 +00003292 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003293
3294 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003295 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003296 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003297 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003298 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003299
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003300 if (JA.getType() == types::TY_Nothing)
3301 CmdArgs.push_back("-fsyntax-only");
3302 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003303 CmdArgs.push_back("-emit-pch");
3304 else
3305 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003306 } else if (isa<VerifyPCHJobAction>(JA)) {
3307 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003308 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003309 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3310 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003311 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003312 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003313 } else if (JA.getType() == types::TY_LLVM_IR ||
3314 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003315 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003316 } else if (JA.getType() == types::TY_LLVM_BC ||
3317 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003318 CmdArgs.push_back("-emit-llvm-bc");
3319 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003320 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003321 } else if (JA.getType() == types::TY_AST) {
3322 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003323 } else if (JA.getType() == types::TY_ModuleFile) {
3324 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003325 } else if (JA.getType() == types::TY_RewrittenObjC) {
3326 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003327 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003328 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3329 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003330 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003331 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003332 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003333 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003334
3335 // Preserve use-list order by default when emitting bitcode, so that
3336 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3337 // same result as running passes here. For LTO, we don't need to preserve
3338 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003339 if (JA.getType() == types::TY_LLVM_BC)
3340 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003341
3342 if (D.isUsingLTO())
3343 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003344 }
3345
Justin Bognera88f0122014-06-20 22:59:50 +00003346 // We normally speed up the clang process a bit by skipping destructors at
3347 // exit, but when we're generating diagnostics we can rely on some of the
3348 // cleanup.
3349 if (!C.isForDiagnostics())
3350 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003351
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003352// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003353#ifdef NDEBUG
3354 CmdArgs.push_back("-disable-llvm-verifier");
3355#endif
3356
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003357 // Set the main file name, so that debug info works even with
3358 // -save-temps.
3359 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003360 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003361
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003362 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003363 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003364 if (Args.hasArg(options::OPT_static))
3365 CmdArgs.push_back("-static-define");
3366
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003367 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003368 // Enable region store model by default.
3369 CmdArgs.push_back("-analyzer-store=region");
3370
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003371 // Treat blocks as analysis entry points.
3372 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3373
Ted Kremenek49c79792011-03-24 00:28:47 +00003374 CmdArgs.push_back("-analyzer-eagerly-assume");
3375
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003376 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003377 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003378 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003379
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003380 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003381 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003382
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003383 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003384 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003385
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003386 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003387
Artem Belevichba558952015-05-06 18:20:23 +00003388 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003389 CmdArgs.push_back("-analyzer-checker=cplusplus");
3390
Nico Webere8e53112014-05-11 01:04:02 +00003391 // Enable the following experimental checkers for testing.
3392 CmdArgs.push_back(
3393 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003394 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3395 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003396 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003397 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3398 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003399
3400 // Default nullability checks.
3401 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3402 CmdArgs.push_back(
3403 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003404 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003405
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003406 // Set the output format. The default is plist, for (lame) historical
3407 // reasons.
3408 CmdArgs.push_back("-analyzer-output");
3409 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003410 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003411 else
3412 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003413
Ted Kremenekfe449a22010-03-22 22:32:05 +00003414 // Disable the presentation of standard compiler warnings when
3415 // using --analyze. We only want to show static analyzer diagnostics
3416 // or frontend errors.
3417 CmdArgs.push_back("-w");
3418
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003419 // Add -Xanalyzer arguments when running as analyzer.
3420 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003421 }
3422
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003423 CheckCodeGenerationOptions(D, Args);
3424
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003425 llvm::Reloc::Model RelocationModel;
3426 unsigned PICLevel;
3427 bool IsPIE;
3428 std::tie(RelocationModel, PICLevel, IsPIE) =
3429 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003430
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003431 const char *RMName = RelocationModelName(RelocationModel);
3432 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003433 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003434 CmdArgs.push_back(RMName);
3435 }
3436 if (PICLevel > 0) {
3437 CmdArgs.push_back("-pic-level");
3438 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3439 if (IsPIE) {
3440 CmdArgs.push_back("-pie-level");
3441 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003442 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003443 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003444
Renato Golin4854d802015-11-09 12:40:41 +00003445 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3446 CmdArgs.push_back("-meabi");
3447 CmdArgs.push_back(A->getValue());
3448 }
3449
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003450 CmdArgs.push_back("-mthread-model");
3451 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3452 CmdArgs.push_back(A->getValue());
3453 else
3454 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3455
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003456 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3457
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003458 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3459 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003460 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003461
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003462 // LLVM Code Generator Options.
3463
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003464 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3465 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003466 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3467 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003468 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003469 CmdArgs.push_back(A->getValue());
3470 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003471 }
3472 }
3473
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003474 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3475 StringRef v = A->getValue();
3476 CmdArgs.push_back("-mllvm");
3477 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3478 A->claim();
3479 }
3480
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003481 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3482 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003483 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003484 }
3485
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003486 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3487 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003488 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003489 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003490 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003491 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3492 CmdArgs.push_back("-fpcc-struct-return");
3493 } else {
3494 assert(A->getOption().matches(options::OPT_freg_struct_return));
3495 CmdArgs.push_back("-freg-struct-return");
3496 }
3497 }
3498
Roman Divacky65b88cd2011-03-01 17:40:53 +00003499 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3500 CmdArgs.push_back("-mrtd");
3501
Rafael Espindola224dd632011-12-14 21:02:23 +00003502 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003503 CmdArgs.push_back("-mdisable-fp-elim");
3504 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3505 options::OPT_fno_zero_initialized_in_bss))
3506 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003507
3508 bool OFastEnabled = isOptimizationLevelFast(Args);
3509 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3510 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003511 OptSpecifier StrictAliasingAliasOption =
3512 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003513 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3514 // doesn't do any TBAA.
3515 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003516 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003517 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003518 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003519 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3520 options::OPT_fno_struct_path_tbaa))
3521 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003522 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3523 false))
3524 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003525 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3526 options::OPT_fno_strict_vtable_pointers,
3527 false))
3528 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003529 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3530 options::OPT_fno_optimize_sibling_calls))
3531 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003532
Eric Christopher006208c2013-04-04 06:29:47 +00003533 // Handle segmented stacks.
3534 if (Args.hasArg(options::OPT_fsplit_stack))
3535 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003536
3537 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3538 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003539 OptSpecifier FastMathAliasOption =
3540 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3541
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003542 // Handle various floating point optimization flags, mapping them to the
3543 // appropriate LLVM code generation flags. The pattern for all of these is to
3544 // default off the codegen optimizations, and if any flag enables them and no
3545 // flag disables them after the flag enabling them, enable the codegen
3546 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547 if (Arg *A = Args.getLastArg(
3548 options::OPT_ffast_math, FastMathAliasOption,
3549 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3550 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3551 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003552 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3553 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003554 A->getOption().getID() != options::OPT_fhonor_infinities)
3555 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003556 if (Arg *A = Args.getLastArg(
3557 options::OPT_ffast_math, FastMathAliasOption,
3558 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3559 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3560 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003561 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3562 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003563 A->getOption().getID() != options::OPT_fhonor_nans)
3564 CmdArgs.push_back("-menable-no-nans");
3565
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003566 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3567 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003568 if (Arg *A =
3569 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3570 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3571 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003572 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3573 // However, turning *off* -ffast_math merely restores the toolchain default
3574 // (which may be false).
3575 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3576 A->getOption().getID() == options::OPT_ffast_math ||
3577 A->getOption().getID() == options::OPT_Ofast)
3578 MathErrno = false;
3579 else if (A->getOption().getID() == options::OPT_fmath_errno)
3580 MathErrno = true;
3581 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003582 if (MathErrno)
3583 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003584
3585 // There are several flags which require disabling very specific
3586 // optimizations. Any of these being disabled forces us to turn off the
3587 // entire set of LLVM optimizations, so collect them through all the flag
3588 // madness.
3589 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003590 if (Arg *A = Args.getLastArg(
3591 options::OPT_ffast_math, FastMathAliasOption,
3592 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3593 options::OPT_fno_unsafe_math_optimizations,
3594 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003595 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3596 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003597 A->getOption().getID() != options::OPT_fno_associative_math)
3598 AssociativeMath = true;
3599 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003600 if (Arg *A = Args.getLastArg(
3601 options::OPT_ffast_math, FastMathAliasOption,
3602 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3603 options::OPT_fno_unsafe_math_optimizations,
3604 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003605 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3606 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003607 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3608 ReciprocalMath = true;
3609 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003610 if (Arg *A = Args.getLastArg(
3611 options::OPT_ffast_math, FastMathAliasOption,
3612 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3613 options::OPT_fno_unsafe_math_optimizations,
3614 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003615 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3616 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003617 A->getOption().getID() != options::OPT_fsigned_zeros)
3618 SignedZeros = false;
3619 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003620 if (Arg *A = Args.getLastArg(
3621 options::OPT_ffast_math, FastMathAliasOption,
3622 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3623 options::OPT_fno_unsafe_math_optimizations,
3624 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003625 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3626 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003627 A->getOption().getID() != options::OPT_ftrapping_math)
3628 TrappingMath = false;
3629 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3630 !TrappingMath)
3631 CmdArgs.push_back("-menable-unsafe-fp-math");
3632
Sanjay Patel76c9e092015-01-23 16:40:50 +00003633 if (!SignedZeros)
3634 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003635
Sanjay Patel359b1052015-04-09 15:03:23 +00003636 if (ReciprocalMath)
3637 CmdArgs.push_back("-freciprocal-math");
3638
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003639 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003640 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003641 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003642 options::OPT_ffp_contract)) {
3643 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003644 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003645 if (Val == "fast" || Val == "on" || Val == "off") {
3646 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3647 } else {
3648 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003649 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003650 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003651 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3652 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003653 // If fast-math is set then set the fp-contract mode to fast.
3654 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3655 }
3656 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003657
Sanjay Patel2987c292015-06-11 14:53:41 +00003658 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003659
Bob Wilson6a039162012-07-19 03:52:53 +00003660 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3661 // and if we find them, tell the frontend to provide the appropriate
3662 // preprocessor macros. This is distinct from enabling any optimizations as
3663 // these options induce language changes which must survive serialization
3664 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003665 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3666 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003667 if (!A->getOption().matches(options::OPT_fno_fast_math))
3668 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003669 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3670 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003671 if (A->getOption().matches(options::OPT_ffinite_math_only))
3672 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003673
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003674 // Decide whether to use verbose asm. Verbose assembly is the default on
3675 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003676 bool IsIntegratedAssemblerDefault =
3677 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003678 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003679 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003680 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003681 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003682
Rafael Espindolab8a12932015-05-22 20:44:03 +00003683 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3684 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003685 CmdArgs.push_back("-no-integrated-as");
3686
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003687 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3688 CmdArgs.push_back("-mdebug-pass");
3689 CmdArgs.push_back("Structure");
3690 }
3691 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3692 CmdArgs.push_back("-mdebug-pass");
3693 CmdArgs.push_back("Arguments");
3694 }
3695
John McCall8517abc2010-02-19 02:45:38 +00003696 // Enable -mconstructor-aliases except on darwin, where we have to
3697 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003698 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003699 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003700
John McCall7ef5cb32011-03-18 02:56:14 +00003701 // Darwin's kernel doesn't support guard variables; just die if we
3702 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003703 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003704 CmdArgs.push_back("-fforbid-guard-variables");
3705
Douglas Gregordbe39272011-02-01 15:15:22 +00003706 if (Args.hasArg(options::OPT_mms_bitfields)) {
3707 CmdArgs.push_back("-mms-bitfields");
3708 }
John McCall8517abc2010-02-19 02:45:38 +00003709
Daniel Dunbar306945d2009-09-16 06:17:29 +00003710 // This is a coarse approximation of what llvm-gcc actually does, both
3711 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3712 // complicated ways.
3713 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003714 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3715 options::OPT_fno_asynchronous_unwind_tables,
3716 (getToolChain().IsUnwindTablesDefault() ||
3717 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3718 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003719 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3720 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003721 CmdArgs.push_back("-munwind-tables");
3722
Chandler Carruth05fb5852012-11-21 23:40:23 +00003723 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003724
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003725 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3726 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003727 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003728 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003729
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003730 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003731 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003732
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003733 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003734 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003735 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003736 }
3737
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003738 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003739 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003740 if (!CPU.empty()) {
3741 CmdArgs.push_back("-target-cpu");
3742 CmdArgs.push_back(Args.MakeArgString(CPU));
3743 }
3744
Rafael Espindolaeb265472013-08-21 21:59:03 +00003745 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3746 CmdArgs.push_back("-mfpmath");
3747 CmdArgs.push_back(A->getValue());
3748 }
3749
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003750 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003751 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003752
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003753 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003754 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003755 default:
3756 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003757
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003758 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003759 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003760 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003761 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003762 // Use the effective triple, which takes into account the deployment target.
3763 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003764 break;
3765
Tim Northover573cbee2014-05-24 12:52:07 +00003766 case llvm::Triple::aarch64:
3767 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003768 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003769 break;
3770
Eric Christopher0b26a612010-03-02 02:41:08 +00003771 case llvm::Triple::mips:
3772 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003773 case llvm::Triple::mips64:
3774 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003775 AddMIPSTargetArgs(Args, CmdArgs);
3776 break;
3777
Ulrich Weigand8afad612014-07-28 13:17:52 +00003778 case llvm::Triple::ppc:
3779 case llvm::Triple::ppc64:
3780 case llvm::Triple::ppc64le:
3781 AddPPCTargetArgs(Args, CmdArgs);
3782 break;
3783
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003784 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003785 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003786 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003787 AddSparcTargetArgs(Args, CmdArgs);
3788 break;
3789
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003790 case llvm::Triple::x86:
3791 case llvm::Triple::x86_64:
3792 AddX86TargetArgs(Args, CmdArgs);
3793 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003794
3795 case llvm::Triple::hexagon:
3796 AddHexagonTargetArgs(Args, CmdArgs);
3797 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003798 }
3799
Douglas Katzman3459ce22015-10-08 04:24:12 +00003800 // The 'g' groups options involve a somewhat intricate sequence of decisions
3801 // about what to pass from the driver to the frontend, but by the time they
3802 // reach cc1 they've been factored into two well-defined orthogonal choices:
3803 // * what level of debug info to generate
3804 // * what dwarf version to write
3805 // This avoids having to monkey around further in cc1 other than to disable
3806 // codeview if not running in a Windows environment. Perhaps even that
3807 // decision should be made in the driver as well though.
3808 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3809 CodeGenOptions::NoDebugInfo;
3810 // These two are potentially updated by AddClangCLArgs.
3811 unsigned DwarfVersion = 0;
3812 bool EmitCodeView = false;
3813
Hans Wennborg75958c42013-08-08 00:17:41 +00003814 // Add clang-cl arguments.
3815 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003816 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003817
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003818 // Pass the linker version in use.
3819 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3820 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003821 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003822 }
3823
Eric Christopherb7d97e92013-04-03 01:58:53 +00003824 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003825 CmdArgs.push_back("-momit-leaf-frame-pointer");
3826
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003827 // Explicitly error on some things we know we don't support and can't just
3828 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003829 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003830 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3831 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003832 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003833 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003834 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3835 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003836 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003837 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003838 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003839 }
3840
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003841 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003842 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003843 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003844 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003845 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3846 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003847 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003848 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003849 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003850
Chad Rosierbe10f982011-08-02 17:58:04 +00003851 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003852 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003853 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3854 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003855 }
3856
Rafael Espindola08a692a2010-03-07 04:46:18 +00003857 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003858 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003859 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003860 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
3861 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
3862 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003863 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003864 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003865 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00003866 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003867 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003868 // Some 'g' group option other than one expressly disabling debug info
3869 // must have been the final (winning) one. They're all equivalent.
3870 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00003871 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003872 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003873
Douglas Katzman3459ce22015-10-08 04:24:12 +00003874 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
3875 // (because that would mean that "-g0" was the rightmost 'g' group option).
3876 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
3877 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
3878 // exists of removing the gdwarf options from the g_group.
3879 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
3880 options::OPT_gdwarf_4))
3881 DwarfVersion = DwarfVersionNum(A->getSpelling());
3882
Reid Kleckner124955a2015-08-05 18:51:13 +00003883 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00003884 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
3885 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
3886 // DwarfVersion remains at 0 if no explicit choice was made.
3887 CmdArgs.push_back("-gcodeview");
3888 } else if (DwarfVersion == 0 &&
3889 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
3890 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
3891 }
Reid Kleckner124955a2015-08-05 18:51:13 +00003892
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003893 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3894 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003895
3896 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00003897 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003898 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003899 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003900
Eric Christopher138c32b2013-09-13 22:37:55 +00003901 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003902 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003903 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003904 CmdArgs.push_back("-dwarf-ext-refs");
3905 CmdArgs.push_back("-fmodule-format=obj");
3906 }
3907
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003908 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3909 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003910 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003911 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003912 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003913 CmdArgs.push_back("-backend-option");
3914 CmdArgs.push_back("-split-dwarf=Enable");
3915 }
3916
Douglas Katzman3459ce22015-10-08 04:24:12 +00003917 // After we've dealt with all combinations of things that could
3918 // make DebugInfoKind be other than None or DebugLineTablesOnly,
3919 // figure out if we need to "upgrade" it to standalone debug info.
3920 // We parse these two '-f' options whether or not they will be used,
3921 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
3922 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
3923 options::OPT_fno_standalone_debug,
3924 getToolChain().GetDefaultStandaloneDebug());
3925 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
3926 DebugInfoKind = CodeGenOptions::FullDebugInfo;
3927 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
3928
Eric Christopher138c32b2013-09-13 22:37:55 +00003929 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3930 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3931 CmdArgs.push_back("-backend-option");
3932 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3933 }
Eric Christophereec89c22013-06-18 00:03:50 +00003934
Eric Christopher0d403d22014-02-14 01:27:03 +00003935 // -gdwarf-aranges turns on the emission of the aranges section in the
3936 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003937 // Always enabled on the PS4.
3938 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00003939 CmdArgs.push_back("-backend-option");
3940 CmdArgs.push_back("-generate-arange-section");
3941 }
3942
David Blaikief36d9ba2014-01-27 18:52:43 +00003943 if (Args.hasFlag(options::OPT_fdebug_types_section,
3944 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003945 CmdArgs.push_back("-backend-option");
3946 CmdArgs.push_back("-generate-type-units");
3947 }
Eric Christophereec89c22013-06-18 00:03:50 +00003948
Ed Schouten6e576152015-03-26 17:50:28 +00003949 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3950 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3951
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003952 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003953 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003954 CmdArgs.push_back("-ffunction-sections");
3955 }
3956
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003957 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3958 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003959 CmdArgs.push_back("-fdata-sections");
3960 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003961
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003962 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003963 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003964 CmdArgs.push_back("-fno-unique-section-names");
3965
Chris Lattner3c77a352010-06-22 00:03:40 +00003966 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3967
Diego Novilloa0545962015-07-10 18:00:07 +00003968 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003969
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003970 // Pass options for controlling the default header search paths.
3971 if (Args.hasArg(options::OPT_nostdinc)) {
3972 CmdArgs.push_back("-nostdsysteminc");
3973 CmdArgs.push_back("-nobuiltininc");
3974 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003975 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003976 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003977 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3978 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3979 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003980
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003981 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003982 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003983 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003984
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003985 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3986
Ted Kremenekf7639e12012-03-06 20:06:33 +00003987 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003988 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003989 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003990 options::OPT_ccc_arcmt_modify,
3991 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003992 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003993 switch (A->getOption().getID()) {
3994 default:
3995 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003996 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003997 CmdArgs.push_back("-arcmt-check");
3998 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003999 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004000 CmdArgs.push_back("-arcmt-modify");
4001 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004002 case options::OPT_ccc_arcmt_migrate:
4003 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004004 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004005 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004006
4007 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4008 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004009 break;
John McCalld70fb982011-06-15 23:25:17 +00004010 }
4011 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004012 } else {
4013 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4014 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4015 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004016 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004017
Ted Kremenekf7639e12012-03-06 20:06:33 +00004018 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4019 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004020 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4021 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004022 }
4023 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004024 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004025
4026 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004027 options::OPT_objcmt_migrate_subscripting,
4028 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004029 // None specified, means enable them all.
4030 CmdArgs.push_back("-objcmt-migrate-literals");
4031 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004032 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004033 } else {
4034 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4035 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004036 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004037 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004038 } else {
4039 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4040 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4041 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4042 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4043 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4044 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004045 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004046 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4047 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4048 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4049 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4050 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4051 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4052 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004053 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004054 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004055 }
4056
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004057 // Add preprocessing options like -I, -D, etc. if we are using the
4058 // preprocessor.
4059 //
4060 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004061 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00004062 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004063
Rafael Espindolaa7431922011-07-21 23:40:37 +00004064 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4065 // that "The compiler can only warn and ignore the option if not recognized".
4066 // When building with ccache, it will pass -D options to clang even on
4067 // preprocessed inputs and configure concludes that -fPIC is not supported.
4068 Args.ClaimAllArgs(options::OPT_D);
4069
Alp Toker7874bdc2013-11-15 20:40:58 +00004070 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004071 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4072 if (A->getOption().matches(options::OPT_O4)) {
4073 CmdArgs.push_back("-O3");
4074 D.Diag(diag::warn_O4_is_O3);
4075 } else {
4076 A->render(Args, CmdArgs);
4077 }
4078 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004079
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004080 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004081 for (const Arg *A :
4082 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4083 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004084 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004085 }
4086
Rafael Espindola577637a2015-01-03 00:06:04 +00004087 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004088
Richard Smith3be1cb22014-08-07 00:24:21 +00004089 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004090 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004091 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4092 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004093 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004094 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004095
4096 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004097 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004098 //
4099 // If a std is supplied, only add -trigraphs if it follows the
4100 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004101 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004102 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4103 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004104 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004105 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004106 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004107 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004108 else
4109 Std->render(Args, CmdArgs);
4110
Nico Weber00721502014-12-23 22:32:37 +00004111 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004112 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004113 options::OPT_ftrigraphs,
4114 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004115 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004116 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004117 } else {
4118 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004119 //
4120 // FIXME: Clang doesn't correctly handle -std= when the input language
4121 // doesn't match. For the time being just ignore this for C++ inputs;
4122 // eventually we want to do all the standard defaulting here instead of
4123 // splitting it between the driver and clang -cc1.
4124 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004125 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4126 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004127 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004128 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004129
Nico Weber00721502014-12-23 22:32:37 +00004130 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4131 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004132 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004133
Richard Smith282b4492013-09-04 22:50:31 +00004134 // GCC's behavior for -Wwrite-strings is a bit strange:
4135 // * In C, this "warning flag" changes the types of string literals from
4136 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4137 // for the discarded qualifier.
4138 // * In C++, this is just a normal warning flag.
4139 //
4140 // Implementing this warning correctly in C is hard, so we follow GCC's
4141 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4142 // a non-const char* in C, rather than using this crude hack.
4143 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004144 // FIXME: This should behave just like a warning flag, and thus should also
4145 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4146 Arg *WriteStrings =
4147 Args.getLastArg(options::OPT_Wwrite_strings,
4148 options::OPT_Wno_write_strings, options::OPT_w);
4149 if (WriteStrings &&
4150 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004151 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004152 }
4153
Chandler Carruth61fbf622011-04-23 09:27:53 +00004154 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004155 // during C++ compilation, which it is by default. GCC keeps this define even
4156 // in the presence of '-w', match this behavior bug-for-bug.
4157 if (types::isCXX(InputType) &&
4158 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4159 true)) {
4160 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004161 }
4162
Chandler Carruthe0391482010-05-22 02:21:53 +00004163 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4164 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4165 if (Asm->getOption().matches(options::OPT_fasm))
4166 CmdArgs.push_back("-fgnu-keywords");
4167 else
4168 CmdArgs.push_back("-fno-gnu-keywords");
4169 }
4170
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004171 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4172 CmdArgs.push_back("-fno-dwarf-directory-asm");
4173
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004174 if (ShouldDisableAutolink(Args, getToolChain()))
4175 CmdArgs.push_back("-fno-autolink");
4176
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004177 // Add in -fdebug-compilation-dir if necessary.
4178 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004179
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004180 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4181 StringRef Map = A->getValue();
4182 if (Map.find('=') == StringRef::npos)
4183 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4184 else
4185 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4186 A->claim();
4187 }
4188
Richard Smith9a568822011-11-21 19:36:32 +00004189 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4190 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004191 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004192 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004193 }
4194
Richard Smith79c927b2013-11-06 19:31:51 +00004195 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4196 CmdArgs.push_back("-foperator-arrow-depth");
4197 CmdArgs.push_back(A->getValue());
4198 }
4199
Richard Smith9a568822011-11-21 19:36:32 +00004200 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4201 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004202 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004203 }
4204
Richard Smitha3d3bd22013-05-08 02:12:03 +00004205 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4206 CmdArgs.push_back("-fconstexpr-steps");
4207 CmdArgs.push_back(A->getValue());
4208 }
4209
Richard Smithb3a14522013-02-22 01:59:51 +00004210 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4211 CmdArgs.push_back("-fbracket-depth");
4212 CmdArgs.push_back(A->getValue());
4213 }
4214
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004215 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4216 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004217 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004218 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004219 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4220 } else
4221 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004222 }
4223
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004224 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004225 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004226
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004227 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4228 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004229 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004230 }
David Chisnall5778fce2009-08-31 16:41:57 +00004231
Chris Lattnere23003d2010-01-09 21:54:33 +00004232 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4233 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004234 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004235 }
4236
Chris Lattnerb35583d2010-04-07 20:49:23 +00004237 CmdArgs.push_back("-ferror-limit");
4238 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004239 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004240 else
4241 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004242
Chandler Carrutha77a7272010-05-06 04:55:18 +00004243 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4244 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004245 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004246 }
4247
4248 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4249 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004250 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004251 }
4252
Richard Smithf6f003a2011-12-16 19:06:07 +00004253 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4254 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004255 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004256 }
4257
Nick Lewycky24653262014-12-16 21:39:02 +00004258 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4259 CmdArgs.push_back("-fspell-checking-limit");
4260 CmdArgs.push_back(A->getValue());
4261 }
4262
Daniel Dunbar2c978472009-11-04 06:24:47 +00004263 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004264 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004265 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004266 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004267 } else {
4268 // If -fmessage-length=N was not specified, determine whether this is a
4269 // terminal and, if so, implicitly define -fmessage-length appropriately.
4270 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004271 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004272 }
4273
John McCallb4a99d32013-02-19 01:57:35 +00004274 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4275 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4276 options::OPT_fvisibility_ms_compat)) {
4277 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4278 CmdArgs.push_back("-fvisibility");
4279 CmdArgs.push_back(A->getValue());
4280 } else {
4281 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4282 CmdArgs.push_back("-fvisibility");
4283 CmdArgs.push_back("hidden");
4284 CmdArgs.push_back("-ftype-visibility");
4285 CmdArgs.push_back("default");
4286 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004287 }
4288
Douglas Gregor08329632010-06-15 17:05:35 +00004289 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004290
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004291 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4292
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004293 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004294 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4295 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004296 CmdArgs.push_back("-ffreestanding");
4297
Daniel Dunbare357d562009-12-03 18:42:11 +00004298 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004299 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004300 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004301 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004302 // Emulated TLS is enabled by default on Android, and can be enabled manually
4303 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004304 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004305 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4306 EmulatedTLSDefault))
4307 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004308 // AltiVec-like language extensions aren't relevant for assembling.
4309 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004310 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004311 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4312 }
Richard Trieu91844232012-06-26 18:18:47 +00004313 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4314 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004315
Alexey Bataevdb390212015-05-20 04:24:19 +00004316 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004317 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4318 options::OPT_fno_openmp, false))
4319 switch (getOpenMPRuntime(getToolChain(), Args)) {
4320 case OMPRT_OMP:
4321 case OMPRT_IOMP5:
4322 // Clang can generate useful OpenMP code for these two runtime libraries.
4323 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004324
4325 // If no option regarding the use of TLS in OpenMP codegeneration is
4326 // given, decide a default based on the target. Otherwise rely on the
4327 // options and pass the right information to the frontend.
4328 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004329 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004330 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004331 break;
4332 default:
4333 // By default, if Clang doesn't know how to generate useful OpenMP code
4334 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4335 // down to the actual compilation.
4336 // FIXME: It would be better to have a mode which *only* omits IR
4337 // generation based on the OpenMP support so that we get consistent
4338 // semantic analysis, etc.
4339 break;
4340 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004341
Peter Collingbourne32701642013-11-01 18:16:25 +00004342 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004343 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004344
Eric Christopher459d2712013-02-19 06:16:53 +00004345 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004346 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4347 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4348 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4349 Arch == llvm::Triple::ppc64le))
4350 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4351 << "ppc/ppc64/ppc64le";
4352 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004353
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004354 // -fzvector is incompatible with -faltivec.
4355 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4356 if (Args.hasArg(options::OPT_faltivec))
4357 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4358 << "-faltivec";
4359
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004360 if (getToolChain().SupportsProfiling())
4361 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004362
4363 // -flax-vector-conversions is default.
4364 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4365 options::OPT_fno_lax_vector_conversions))
4366 CmdArgs.push_back("-fno-lax-vector-conversions");
4367
John Brawna7b4ec02015-08-10 11:11:28 +00004368 if (Args.getLastArg(options::OPT_fapple_kext) ||
4369 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004370 CmdArgs.push_back("-fapple-kext");
4371
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004372 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004373 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004374 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004375 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4376 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004377
4378 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4379 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004380 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004381 }
4382
Bob Wilson14adb362012-02-03 06:27:22 +00004383 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004384
Chandler Carruth6e501032011-03-27 00:04:55 +00004385 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4386 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004387 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004388 if (A->getOption().matches(options::OPT_fwrapv))
4389 CmdArgs.push_back("-fwrapv");
4390 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4391 options::OPT_fno_strict_overflow)) {
4392 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4393 CmdArgs.push_back("-fwrapv");
4394 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004395
4396 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4397 options::OPT_fno_reroll_loops))
4398 if (A->getOption().matches(options::OPT_freroll_loops))
4399 CmdArgs.push_back("-freroll-loops");
4400
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004401 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004402 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4403 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004404
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004405 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4406
Daniel Dunbar4930e332009-11-17 08:07:36 +00004407 // -stack-protector=0 is default.
4408 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004409 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4410 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4411 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4412 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4413 Args.ClaimAllArgs(options::OPT_fstack_protector);
4414 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004415 options::OPT_fstack_protector_all,
4416 options::OPT_fstack_protector_strong,
4417 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004418 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004419 StackProtectorLevel = std::max<unsigned>(
4420 LangOptions::SSPOn,
4421 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004422 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004423 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004424 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004425 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004426 } else {
4427 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004428 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004429 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004430 if (StackProtectorLevel) {
4431 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004432 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004433 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004434
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004435 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004436 for (const Arg *A : Args.filtered(options::OPT__param)) {
4437 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004438 if (Str.startswith("ssp-buffer-size=")) {
4439 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004440 CmdArgs.push_back("-stack-protector-buffer-size");
4441 // FIXME: Verify the argument is a valid integer.
4442 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004443 }
Sean Silva14facf32015-06-09 01:57:17 +00004444 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004445 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004446 }
4447
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004448 // Translate -mstackrealign
4449 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004450 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004451 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004452
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004453 if (Args.hasArg(options::OPT_mstack_alignment)) {
4454 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4455 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004456 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004457
Hans Wennborg77dc2362015-01-20 19:45:50 +00004458 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4459 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4460
4461 if (!Size.empty())
4462 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4463 else
4464 CmdArgs.push_back("-mstack-probe-size=0");
4465 }
4466
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004467 switch (getToolChain().getArch()) {
4468 case llvm::Triple::aarch64:
4469 case llvm::Triple::aarch64_be:
4470 case llvm::Triple::arm:
4471 case llvm::Triple::armeb:
4472 case llvm::Triple::thumb:
4473 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004474 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004475 break;
4476
4477 default:
4478 break;
4479 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004480
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004481 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4482 options::OPT_mno_restrict_it)) {
4483 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4484 CmdArgs.push_back("-backend-option");
4485 CmdArgs.push_back("-arm-restrict-it");
4486 } else {
4487 CmdArgs.push_back("-backend-option");
4488 CmdArgs.push_back("-arm-no-restrict-it");
4489 }
James Y Knight2db38f32015-08-15 03:45:25 +00004490 } else if (Triple.isOSWindows() &&
4491 (Triple.getArch() == llvm::Triple::arm ||
4492 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004493 // Windows on ARM expects restricted IT blocks
4494 CmdArgs.push_back("-backend-option");
4495 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004496 }
4497
Daniel Dunbard18049a2009-04-07 21:16:11 +00004498 // Forward -f options with positive and negative forms; we translate
4499 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004500 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4501 StringRef fname = A->getValue();
4502 if (!llvm::sys::fs::exists(fname))
4503 D.Diag(diag::err_drv_no_such_file) << fname;
4504 else
4505 A->render(Args, CmdArgs);
4506 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004507
John Brawna7b4ec02015-08-10 11:11:28 +00004508 // -fbuiltin is default unless -mkernel is used
4509 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4510 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004511 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004512
Nuno Lopes13c88c72009-12-16 16:59:22 +00004513 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4514 options::OPT_fno_assume_sane_operator_new))
4515 CmdArgs.push_back("-fno-assume-sane-operator-new");
4516
Daniel Dunbar4930e332009-11-17 08:07:36 +00004517 // -fblocks=0 is default.
4518 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004519 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004520 (Args.hasArg(options::OPT_fgnu_runtime) &&
4521 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4522 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004523 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004524
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004525 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004526 !getToolChain().hasBlocksRuntime())
4527 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004528 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004529
Richard Smith47972af2015-06-16 00:08:24 +00004530 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004531 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004532 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004533 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004534 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004535 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4536 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004537 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004538 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004539 HaveModules = true;
4540 }
4541 }
4542
Richard Smith47972af2015-06-16 00:08:24 +00004543 // -fmodule-maps enables implicit reading of module map files. By default,
4544 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004545 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4546 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004547 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004548 }
4549
Daniel Jasperac42b752013-10-21 06:34:34 +00004550 // -fmodules-decluse checks that modules used are declared so (off by
4551 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004552 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004553 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004554 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004555 }
4556
Daniel Jasper962b38e2014-04-11 11:47:45 +00004557 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4558 // all #included headers are part of modules.
4559 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004560 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004561 CmdArgs.push_back("-fmodules-strict-decluse");
4562 }
4563
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004564 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4565 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4566 options::OPT_fno_implicit_modules)) {
4567 CmdArgs.push_back("-fno-implicit-modules");
4568 }
4569
Daniel Jasperac42b752013-10-21 06:34:34 +00004570 // -fmodule-name specifies the module that is currently being built (or
4571 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004572 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004573
Richard Smith9887d792014-10-17 01:42:53 +00004574 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004575 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004576 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004577
Richard Smithe842a472014-10-22 02:05:46 +00004578 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004579 if (HaveModules)
4580 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4581 else
4582 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004583
4584 // -fmodule-cache-path specifies where our implicitly-built module files
4585 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004586 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004587 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004588 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004589 if (HaveModules) {
4590 if (C.isForDiagnostics()) {
4591 // When generating crash reports, we want to emit the modules along with
4592 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004593 Path = Output.getFilename();
4594 llvm::sys::path::replace_extension(Path, ".cache");
4595 llvm::sys::path::append(Path, "modules");
4596 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004597 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004598 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004599 llvm::sys::path::append(Path, "org.llvm.clang.");
4600 appendUserToPath(Path);
4601 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004602 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004603 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004604 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4605 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004606 }
4607
4608 // When building modules and generating crashdumps, we need to dump a module
4609 // dependency VFS alongside the output.
4610 if (HaveModules && C.isForDiagnostics()) {
4611 SmallString<128> VFSDir(Output.getFilename());
4612 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004613 // Add the cache directory as a temp so the crash diagnostics pick it up.
4614 C.addTempFile(Args.MakeArgString(VFSDir));
4615
Justin Bognera88f0122014-06-20 22:59:50 +00004616 llvm::sys::path::append(VFSDir, "vfs");
4617 CmdArgs.push_back("-module-dependency-dir");
4618 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004619 }
4620
Richard Smith9887d792014-10-17 01:42:53 +00004621 if (HaveModules)
4622 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004623
Douglas Gregor35b04d62013-02-07 19:01:24 +00004624 // Pass through all -fmodules-ignore-macro arguments.
4625 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004626 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4627 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004628
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004629 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4630
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004631 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4632 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4633 D.Diag(diag::err_drv_argument_not_allowed_with)
4634 << A->getAsString(Args) << "-fbuild-session-timestamp";
4635
4636 llvm::sys::fs::file_status Status;
4637 if (llvm::sys::fs::status(A->getValue(), Status))
4638 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004639 CmdArgs.push_back(Args.MakeArgString(
4640 "-fbuild-session-timestamp=" +
4641 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004642 }
4643
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004644 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004645 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4646 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004647 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4648
4649 Args.AddLastArg(CmdArgs,
4650 options::OPT_fmodules_validate_once_per_build_session);
4651 }
4652
Ben Langmuirdcf73862014-03-12 00:06:17 +00004653 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4654
John McCalldfea9982010-04-09 19:12:06 +00004655 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004656 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004657 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004658 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004659
Anders Carlssond470fef2010-11-21 00:09:52 +00004660 // -felide-constructors is the default.
4661 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004662 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004663 CmdArgs.push_back("-fno-elide-constructors");
4664
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004665 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004666
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004667 if (KernelOrKext || (types::isCXX(InputType) &&
4668 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4669 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004670 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004671
Tony Linthicum76329bf2011-12-12 21:14:55 +00004672 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004673 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4674 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004675 CmdArgs.push_back("-fshort-enums");
4676
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004677 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004678 if (Arg *A = Args.getLastArg(
4679 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4680 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4681 if (A->getOption().matches(options::OPT_funsigned_char) ||
4682 A->getOption().matches(options::OPT_fno_signed_char)) {
4683 CmdArgs.push_back("-fno-signed-char");
4684 }
4685 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004686 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004687 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004688
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004689 // -fuse-cxa-atexit is default.
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00004690 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4691 options::OPT_fno_use_cxa_atexit,
4692 !IsWindowsCygnus && !IsWindowsGNU &&
4693 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4694 getToolChain().getArch() != llvm::Triple::hexagon &&
4695 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004696 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004697 CmdArgs.push_back("-fno-use-cxa-atexit");
4698
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004699 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004700 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004701 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004702 CmdArgs.push_back("-fms-extensions");
4703
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004704 // -fno-use-line-directives is default.
4705 if (Args.hasFlag(options::OPT_fuse_line_directives,
4706 options::OPT_fno_use_line_directives, false))
4707 CmdArgs.push_back("-fuse-line-directives");
4708
Francois Pichet1b4f1632011-09-17 04:32:15 +00004709 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004710 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004711 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004712 (IsWindowsMSVC &&
4713 Args.hasFlag(options::OPT_fms_extensions,
4714 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004715 CmdArgs.push_back("-fms-compatibility");
4716
David Majnemerc371ff02015-03-22 08:39:22 +00004717 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004718 VersionTuple MSVT = visualstudio::getMSVCVersion(
4719 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4720 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004721 CmdArgs.push_back(
4722 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004723
David Majnemer8db91762015-05-18 04:49:30 +00004724 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4725 if (ImplyVCPPCXXVer) {
4726 if (IsMSVC2015Compatible)
4727 CmdArgs.push_back("-std=c++14");
4728 else
4729 CmdArgs.push_back("-std=c++11");
4730 }
4731
Eric Christopher5ecce122013-02-18 00:38:31 +00004732 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004733 if (Args.hasFlag(options::OPT_fborland_extensions,
4734 options::OPT_fno_borland_extensions, false))
4735 CmdArgs.push_back("-fborland-extensions");
4736
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004737 // -fno-declspec is default, except for PS4.
4738 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4739 getToolChain().getTriple().isPS4()))
4740 CmdArgs.push_back("-fdeclspec");
4741 else if (Args.hasArg(options::OPT_fno_declspec))
4742 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4743
David Majnemerc371ff02015-03-22 08:39:22 +00004744 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4745 // than 19.
4746 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4747 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004748 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004749 CmdArgs.push_back("-fno-threadsafe-statics");
4750
Francois Pichet02744872011-09-01 16:38:08 +00004751 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4752 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004753 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004754 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004755 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004756
Chandler Carruthe03aa552010-04-17 20:17:31 +00004757 // -fgnu-keywords default varies depending on language; only pass if
4758 // specified.
4759 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004760 options::OPT_fno_gnu_keywords))
4761 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004762
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004763 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004764 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004765 CmdArgs.push_back("-fgnu89-inline");
4766
Chad Rosier9c76d242012-03-15 22:31:42 +00004767 if (Args.hasArg(options::OPT_fno_inline))
4768 CmdArgs.push_back("-fno-inline");
4769
Chad Rosier64d6be92012-03-06 21:17:19 +00004770 if (Args.hasArg(options::OPT_fno_inline_functions))
4771 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004772
John McCall5fb5df92012-06-20 06:18:46 +00004773 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004774
John McCall5fb5df92012-06-20 06:18:46 +00004775 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004776 // legacy is the default. Except for deployment taget of 10.5,
4777 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4778 // gets ignored silently.
4779 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004780 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4781 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004782 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004783 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004784 if (getToolChain().UseObjCMixedDispatch())
4785 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4786 else
4787 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4788 }
4789 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004790
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004791 // When ObjectiveC legacy runtime is in effect on MacOSX,
4792 // turn on the option to do Array/Dictionary subscripting
4793 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004794 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004795 getToolChain().getTriple().isMacOSX() &&
4796 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4797 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004798 objcRuntime.isNeXTFamily())
4799 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004800
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004801 // -fencode-extended-block-signature=1 is default.
4802 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4803 CmdArgs.push_back("-fencode-extended-block-signature");
4804 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004805
John McCall24fc0de2011-07-06 00:26:06 +00004806 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4807 // NOTE: This logic is duplicated in ToolChains.cpp.
4808 bool ARC = isObjCAutoRefCount(Args);
4809 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004810 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004811
John McCall24fc0de2011-07-06 00:26:06 +00004812 CmdArgs.push_back("-fobjc-arc");
4813
Chandler Carruth491db322011-11-04 07:34:47 +00004814 // FIXME: It seems like this entire block, and several around it should be
4815 // wrapped in isObjC, but for now we just use it here as this is where it
4816 // was being used previously.
4817 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4818 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4819 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4820 else
4821 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4822 }
4823
John McCall24fc0de2011-07-06 00:26:06 +00004824 // Allow the user to enable full exceptions code emission.
4825 // We define off for Objective-CC, on for Objective-C++.
4826 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4827 options::OPT_fno_objc_arc_exceptions,
4828 /*default*/ types::isCXX(InputType)))
4829 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00004830
John McCall24fc0de2011-07-06 00:26:06 +00004831 }
4832
4833 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4834 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004835 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004836 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004837
John McCall24fc0de2011-07-06 00:26:06 +00004838 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4839 // takes precedence.
4840 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4841 if (!GCArg)
4842 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4843 if (GCArg) {
4844 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004845 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004846 } else if (getToolChain().SupportsObjCGC()) {
4847 GCArg->render(Args, CmdArgs);
4848 } else {
4849 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004850 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004851 }
4852 }
4853
John McCallfbe5ed72015-11-05 19:19:56 +00004854 // Pass down -fobjc-weak or -fno-objc-weak if present.
4855 if (types::isObjC(InputType)) {
4856 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
4857 options::OPT_fno_objc_weak);
4858 if (!WeakArg) {
4859 // nothing to do
4860 } else if (GCArg) {
4861 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4862 D.Diag(diag::err_objc_weak_with_gc);
4863 } else if (!objcRuntime.allowsWeak()) {
4864 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4865 D.Diag(diag::err_objc_weak_unsupported);
4866 } else {
4867 WeakArg->render(Args, CmdArgs);
4868 }
4869 }
4870
Bob Wilsonb111ec92015-03-02 19:01:14 +00004871 if (Args.hasFlag(options::OPT_fapplication_extension,
4872 options::OPT_fno_application_extension, false))
4873 CmdArgs.push_back("-fapplication-extension");
4874
Reid Klecknerc542d372014-06-27 17:02:02 +00004875 // Handle GCC-style exception args.
4876 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004877 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4878 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004879
Tim Northovere931f9f2015-10-30 16:30:41 +00004880 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00004881 CmdArgs.push_back("-fsjlj-exceptions");
4882
4883 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004884 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4885 options::OPT_fno_assume_sane_operator_new))
4886 CmdArgs.push_back("-fno-assume-sane-operator-new");
4887
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004888 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4889 // most platforms.
4890 if (Args.hasFlag(options::OPT_fsized_deallocation,
4891 options::OPT_fno_sized_deallocation, false))
4892 CmdArgs.push_back("-fsized-deallocation");
4893
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004894 // -fconstant-cfstrings is default, and may be subject to argument translation
4895 // on Darwin.
4896 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4897 options::OPT_fno_constant_cfstrings) ||
4898 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4899 options::OPT_mno_constant_cfstrings))
4900 CmdArgs.push_back("-fno-constant-cfstrings");
4901
John Thompsoned4e2952009-11-05 20:14:16 +00004902 // -fshort-wchar default varies depending on platform; only
4903 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004904 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4905 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004906 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004907
Hans Wennborg28c96312013-07-31 23:39:13 +00004908 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004909 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004910 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004911 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004912
Daniel Dunbar096ed292011-10-05 21:04:55 +00004913 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4914 // -fno-pack-struct doesn't apply to -fpack-struct=.
4915 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004916 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004917 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004918 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004919 } else if (Args.hasFlag(options::OPT_fpack_struct,
4920 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004921 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004922 }
4923
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004924 // Handle -fmax-type-align=N and -fno-type-align
4925 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4926 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4927 if (!SkipMaxTypeAlign) {
4928 std::string MaxTypeAlignStr = "-fmax-type-align=";
4929 MaxTypeAlignStr += A->getValue();
4930 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4931 }
4932 } else if (getToolChain().getTriple().isOSDarwin()) {
4933 if (!SkipMaxTypeAlign) {
4934 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4935 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4936 }
4937 }
4938
John Brawna7b4ec02015-08-10 11:11:28 +00004939 // -fcommon is the default unless compiling kernel code or the target says so
4940 bool NoCommonDefault =
4941 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4942 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4943 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004944 CmdArgs.push_back("-fno-common");
4945
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004946 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004947 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004948 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004949 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004950 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004951 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004952
Daniel Dunbar6358d682010-10-15 22:30:42 +00004953 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004954 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004955 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004956 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004957
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004958 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004959 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4960 StringRef value = inputCharset->getValue();
4961 if (value != "UTF-8")
4962 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4963 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004964 }
4965
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004966 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004967 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4968 StringRef value = execCharset->getValue();
4969 if (value != "UTF-8")
4970 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4971 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004972 }
4973
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004974 // -fcaret-diagnostics is default.
4975 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4976 options::OPT_fno_caret_diagnostics, true))
4977 CmdArgs.push_back("-fno-caret-diagnostics");
4978
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004979 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004980 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004981 options::OPT_fno_diagnostics_fixit_info))
4982 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004983
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004984 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004985 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004986 options::OPT_fno_diagnostics_show_option))
4987 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004988
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004989 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004990 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004991 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004992 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004993 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004994
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004995 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004996 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004997 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004998 }
4999
Chandler Carruthb6766f02011-03-27 01:50:55 +00005000 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005001 options::OPT_fdiagnostics_show_note_include_stack,
5002 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005003 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005004 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005005 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5006 else
5007 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5008 }
5009
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005010 // Color diagnostics are the default, unless the terminal doesn't support
5011 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005012 // Support both clang's -f[no-]color-diagnostics and gcc's
5013 // -f[no-]diagnostics-colors[=never|always|auto].
5014 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005015 for (const auto &Arg : Args) {
5016 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005017 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5018 !O.matches(options::OPT_fdiagnostics_color) &&
5019 !O.matches(options::OPT_fno_color_diagnostics) &&
5020 !O.matches(options::OPT_fno_diagnostics_color) &&
5021 !O.matches(options::OPT_fdiagnostics_color_EQ))
5022 continue;
5023
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005024 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005025 if (O.matches(options::OPT_fcolor_diagnostics) ||
5026 O.matches(options::OPT_fdiagnostics_color)) {
5027 ShowColors = Colors_On;
5028 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5029 O.matches(options::OPT_fno_diagnostics_color)) {
5030 ShowColors = Colors_Off;
5031 } else {
5032 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005033 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005034 if (value == "always")
5035 ShowColors = Colors_On;
5036 else if (value == "never")
5037 ShowColors = Colors_Off;
5038 else if (value == "auto")
5039 ShowColors = Colors_Auto;
5040 else
5041 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005042 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005043 }
5044 }
5045 if (ShowColors == Colors_On ||
5046 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005047 CmdArgs.push_back("-fcolor-diagnostics");
5048
Nico Rieck7857d462013-09-11 00:38:02 +00005049 if (Args.hasArg(options::OPT_fansi_escape_codes))
5050 CmdArgs.push_back("-fansi-escape-codes");
5051
Daniel Dunbardb097022009-06-08 21:13:54 +00005052 if (!Args.hasFlag(options::OPT_fshow_source_location,
5053 options::OPT_fno_show_source_location))
5054 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005055
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005056 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005057 true))
5058 CmdArgs.push_back("-fno-show-column");
5059
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005060 if (!Args.hasFlag(options::OPT_fspell_checking,
5061 options::OPT_fno_spell_checking))
5062 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005063
Chad Rosierc8e56e82012-12-05 21:08:21 +00005064 // -fno-asm-blocks is default.
5065 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5066 false))
5067 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005068
Steven Wucb0d13f2015-01-16 23:05:28 +00005069 // -fgnu-inline-asm is default.
5070 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5071 options::OPT_fno_gnu_inline_asm, true))
5072 CmdArgs.push_back("-fno-gnu-inline-asm");
5073
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005074 // Enable vectorization per default according to the optimization level
5075 // selected. For optimization levels that want vectorization we use the alias
5076 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005077 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005078 OptSpecifier VectorizeAliasOption =
5079 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005080 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005081 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005082 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005083
Chad Rosier136d67d2014-04-28 19:30:57 +00005084 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005085 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005086 OptSpecifier SLPVectAliasOption =
5087 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005088 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005089 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005090 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005091
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005092 // -fno-slp-vectorize-aggressive is default.
5093 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005094 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005095 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005096
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005097 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5098 A->render(Args, CmdArgs);
5099
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005100 // -fdollars-in-identifiers default varies depending on platform and
5101 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005102 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005103 options::OPT_fno_dollars_in_identifiers)) {
5104 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005105 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005106 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005107 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005108 }
5109
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005110 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5111 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005112 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005113 options::OPT_fno_unit_at_a_time)) {
5114 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005115 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005116 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005117
Eli Friedman055c9702011-11-02 01:53:16 +00005118 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5119 options::OPT_fno_apple_pragma_pack, false))
5120 CmdArgs.push_back("-fapple-pragma-pack");
5121
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005122 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005123 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5124 // by default.
5125 if (getToolChain().getArch() == llvm::Triple::le32) {
5126 CmdArgs.push_back("-fno-math-builtin");
5127 }
5128
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005129// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5130//
5131// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005132#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005133 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005134 (getToolChain().getArch() == llvm::Triple::arm ||
5135 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005136 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5137 CmdArgs.push_back("-fno-builtin-strcat");
5138 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5139 CmdArgs.push_back("-fno-builtin-strcpy");
5140 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005141#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005142
Justin Bognera88f0122014-06-20 22:59:50 +00005143 // Enable rewrite includes if the user's asked for it or if we're generating
5144 // diagnostics.
5145 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5146 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005147 if (Args.hasFlag(options::OPT_frewrite_includes,
5148 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005149 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005150 CmdArgs.push_back("-frewrite-includes");
5151
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005152 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005153 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005154 options::OPT_traditional_cpp)) {
5155 if (isa<PreprocessJobAction>(JA))
5156 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005157 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005158 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005159 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005160
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005161 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005162 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005163
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005164 // Handle serialized diagnostics.
5165 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5166 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005167 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005168 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005169
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005170 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5171 CmdArgs.push_back("-fretain-comments-from-system-headers");
5172
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005173 // Forward -fcomment-block-commands to -cc1.
5174 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005175 // Forward -fparse-all-comments to -cc1.
5176 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005177
John Brawnad31ace2015-09-23 13:55:40 +00005178 // Turn -fplugin=name.so into -load name.so
5179 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5180 CmdArgs.push_back("-load");
5181 CmdArgs.push_back(A->getValue());
5182 A->claim();
5183 }
5184
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005185 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5186 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005187 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005188 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5189 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005190
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005191 // We translate this by hand to the -cc1 argument, since nightly test uses
5192 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005193 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005194 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005195 } else
Sean Silva14facf32015-06-09 01:57:17 +00005196 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005197 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005198
Bob Wilson23a55f12014-12-21 07:00:00 +00005199 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005200 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5201 // by the frontend.
5202 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5203 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005204
Daniel Dunbard67a3222009-03-30 06:36:42 +00005205 if (Output.getType() == types::TY_Dependencies) {
5206 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005207 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005208 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005209 CmdArgs.push_back(Output.getFilename());
5210 } else {
5211 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005212 }
5213
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005214 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005215
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005216 if (Input.isFilename())
5217 CmdArgs.push_back(Input.getFilename());
5218 else
5219 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005220
Chris Lattnere9d7d782009-11-03 19:50:27 +00005221 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5222
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005223 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005224
5225 // Optionally embed the -cc1 level arguments into the debug info, for build
5226 // analysis.
5227 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005228 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005229 for (const auto &Arg : Args)
5230 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005231
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005232 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005233 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005234 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005235 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005236 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005237 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005238 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005239 }
5240 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005241 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005242 }
5243
Eric Christopherd3804002013-02-22 20:12:52 +00005244 // Add the split debug info name to the command lines here so we
5245 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005246 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005247 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5248 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005249 const char *SplitDwarfOut;
5250 if (SplitDwarf) {
5251 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005252 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005253 CmdArgs.push_back(SplitDwarfOut);
5254 }
5255
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005256 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5257 // Include them with -fcuda-include-gpubinary.
5258 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005259 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005260 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005261 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005262 }
5263
Eric Christopherd3804002013-02-22 20:12:52 +00005264 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005265 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005266 Output.getType() == types::TY_Object &&
5267 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005268 auto CLCommand =
5269 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005270 C.addCommand(llvm::make_unique<FallbackCommand>(
5271 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005272 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005273 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005274 }
5275
Eric Christopherf1545832013-02-22 23:50:16 +00005276 // Handle the debug info splitting at object creation time if we're
5277 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005278 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005279 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005280 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005281
Roman Divacky178e01602011-02-10 16:52:03 +00005282 if (Arg *A = Args.getLastArg(options::OPT_pg))
5283 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005284 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5285 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005286
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005287 // Claim some arguments which clang supports automatically.
5288
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005289 // -fpch-preprocess is used with gcc to add a special marker in the output to
5290 // include the PCH file. Clang's PTH solution is completely transparent, so we
5291 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005292 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005293
Daniel Dunbar17731772009-03-23 19:03:36 +00005294 // Claim some arguments which clang doesn't support, but we don't
5295 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005296 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5297 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005298
Rafael Espindolab0092d72013-09-04 19:37:35 +00005299 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005300 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005301}
5302
John McCall5fb5df92012-06-20 06:18:46 +00005303/// Add options related to the Objective-C runtime/ABI.
5304///
5305/// Returns true if the runtime is non-fragile.
5306ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5307 ArgStringList &cmdArgs,
5308 RewriteKind rewriteKind) const {
5309 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005310 Arg *runtimeArg =
5311 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5312 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005313
5314 // Just forward -fobjc-runtime= to the frontend. This supercedes
5315 // options about fragility.
5316 if (runtimeArg &&
5317 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5318 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005319 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005320 if (runtime.tryParse(value)) {
5321 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005322 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005323 }
5324
5325 runtimeArg->render(args, cmdArgs);
5326 return runtime;
5327 }
5328
5329 // Otherwise, we'll need the ABI "version". Version numbers are
5330 // slightly confusing for historical reasons:
5331 // 1 - Traditional "fragile" ABI
5332 // 2 - Non-fragile ABI, version 1
5333 // 3 - Non-fragile ABI, version 2
5334 unsigned objcABIVersion = 1;
5335 // If -fobjc-abi-version= is present, use that to set the version.
5336 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005337 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005338 if (value == "1")
5339 objcABIVersion = 1;
5340 else if (value == "2")
5341 objcABIVersion = 2;
5342 else if (value == "3")
5343 objcABIVersion = 3;
5344 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005345 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005346 } else {
5347 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005348 bool nonFragileABIIsDefault =
5349 (rewriteKind == RK_NonFragile ||
5350 (rewriteKind == RK_None &&
5351 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005352 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5353 options::OPT_fno_objc_nonfragile_abi,
5354 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005355// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005356#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5357 unsigned nonFragileABIVersion = 1;
5358#else
5359 unsigned nonFragileABIVersion = 2;
5360#endif
5361
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005362 if (Arg *abiArg =
5363 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005364 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005365 if (value == "1")
5366 nonFragileABIVersion = 1;
5367 else if (value == "2")
5368 nonFragileABIVersion = 2;
5369 else
5370 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005371 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005372 }
5373
5374 objcABIVersion = 1 + nonFragileABIVersion;
5375 } else {
5376 objcABIVersion = 1;
5377 }
5378 }
5379
5380 // We don't actually care about the ABI version other than whether
5381 // it's non-fragile.
5382 bool isNonFragile = objcABIVersion != 1;
5383
5384 // If we have no runtime argument, ask the toolchain for its default runtime.
5385 // However, the rewriter only really supports the Mac runtime, so assume that.
5386 ObjCRuntime runtime;
5387 if (!runtimeArg) {
5388 switch (rewriteKind) {
5389 case RK_None:
5390 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5391 break;
5392 case RK_Fragile:
5393 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5394 break;
5395 case RK_NonFragile:
5396 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5397 break;
5398 }
5399
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005400 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005401 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5402 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005403 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005404 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5405
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005406 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005407 } else {
5408 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5409 }
5410
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005411 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005412 } else {
5413 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005414 // Legacy behaviour is to target the gnustep runtime if we are i
5415 // non-fragile mode or the GCC runtime in fragile mode.
5416 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005417 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005418 else
5419 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005420 }
5421
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005422 cmdArgs.push_back(
5423 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005424 return runtime;
5425}
5426
Reid Klecknerc542d372014-06-27 17:02:02 +00005427static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5428 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5429 I += HaveDash;
5430 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005431}
Reid Klecknerc542d372014-06-27 17:02:02 +00005432
Benjamin Kramere003ca22015-10-28 13:54:16 +00005433namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005434struct EHFlags {
5435 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5436 bool Synch;
5437 bool Asynch;
5438 bool NoExceptC;
5439};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005440} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005441
5442/// /EH controls whether to run destructor cleanups when exceptions are
5443/// thrown. There are three modifiers:
5444/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5445/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5446/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5447/// - c: Assume that extern "C" functions are implicitly noexcept. This
5448/// modifier is an optimization, so we ignore it for now.
5449/// The default is /EHs-c-, meaning cleanups are disabled.
5450static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5451 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005452
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005453 std::vector<std::string> EHArgs =
5454 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005455 for (auto EHVal : EHArgs) {
5456 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5457 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005458 case 'a':
5459 EH.Asynch = maybeConsumeDash(EHVal, I);
5460 continue;
5461 case 'c':
5462 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5463 continue;
5464 case 's':
5465 EH.Synch = maybeConsumeDash(EHVal, I);
5466 continue;
5467 default:
5468 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005469 }
5470 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5471 break;
5472 }
5473 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005474
Reid Klecknerc542d372014-06-27 17:02:02 +00005475 return EH;
5476}
5477
Douglas Katzman3459ce22015-10-08 04:24:12 +00005478void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5479 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5480 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005481 unsigned RTOptionID = options::OPT__SLASH_MT;
5482
Hans Wennborgf1a74252013-09-10 20:18:04 +00005483 if (Args.hasArg(options::OPT__SLASH_LDd))
5484 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5485 // but defining _DEBUG is sticky.
5486 RTOptionID = options::OPT__SLASH_MTd;
5487
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005488 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005489 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005490
David Majnemere2afb472015-07-24 06:49:13 +00005491 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005492 switch (RTOptionID) {
5493 case options::OPT__SLASH_MD:
5494 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005495 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005496 CmdArgs.push_back("-D_MT");
5497 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005498 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005499 break;
5500 case options::OPT__SLASH_MDd:
5501 CmdArgs.push_back("-D_DEBUG");
5502 CmdArgs.push_back("-D_MT");
5503 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005504 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005505 break;
5506 case options::OPT__SLASH_MT:
5507 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005508 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005509 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005510 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005511 break;
5512 case options::OPT__SLASH_MTd:
5513 CmdArgs.push_back("-D_DEBUG");
5514 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005515 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005516 break;
5517 default:
5518 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005519 }
5520
David Majnemere2afb472015-07-24 06:49:13 +00005521 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5522 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5523 } else {
5524 CmdArgs.push_back(FlagForCRT.data());
5525
5526 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5527 // users want. The /Za flag to cl.exe turns this off, but it's not
5528 // implemented in clang.
5529 CmdArgs.push_back("--dependent-lib=oldnames");
5530 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005531
Hans Wennborg8858a032014-07-21 23:42:07 +00005532 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5533 // would produce interleaved output, so ignore /showIncludes in such cases.
5534 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5535 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5536 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005537
David Majnemerf6072342014-07-01 22:24:56 +00005538 // This controls whether or not we emit RTTI data for polymorphic types.
5539 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5540 /*default=*/false))
5541 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005542
Reid Kleckner124955a2015-08-05 18:51:13 +00005543 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005544 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005545 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5546 // If we are emitting CV but not DWARF, don't build information that LLVM
5547 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005548 if (*EmitCodeView && !EmitDwarf)
5549 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5550 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005551 CmdArgs.push_back("-gcodeview");
5552
Reid Klecknerc542d372014-06-27 17:02:02 +00005553 const Driver &D = getToolChain().getDriver();
5554 EHFlags EH = parseClangCLEHFlags(D, Args);
5555 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005556 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005557 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005558 CmdArgs.push_back("-fexceptions");
5559 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005560
Hans Wennborge50cec32014-06-13 20:59:54 +00005561 // /EP should expand to -E -P.
5562 if (Args.hasArg(options::OPT__SLASH_EP)) {
5563 CmdArgs.push_back("-E");
5564 CmdArgs.push_back("-P");
5565 }
5566
David Majnemera5b195a2015-02-14 01:35:12 +00005567 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005568 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5569 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005570 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5571 else
5572 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5573
5574 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5575 VolatileOptionID = A->getOption().getID();
5576
5577 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5578 CmdArgs.push_back("-fms-volatile");
5579
David Majnemer86c318f2014-02-11 21:05:00 +00005580 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5581 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5582 if (MostGeneralArg && BestCaseArg)
5583 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5584 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5585
5586 if (MostGeneralArg) {
5587 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5588 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5589 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5590
5591 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5592 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5593 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5594 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5595 << FirstConflict->getAsString(Args)
5596 << SecondConflict->getAsString(Args);
5597
5598 if (SingleArg)
5599 CmdArgs.push_back("-fms-memptr-rep=single");
5600 else if (MultipleArg)
5601 CmdArgs.push_back("-fms-memptr-rep=multiple");
5602 else
5603 CmdArgs.push_back("-fms-memptr-rep=virtual");
5604 }
5605
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005606 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5607 A->render(Args, CmdArgs);
5608
Hans Wennborg81f74482013-09-10 01:07:07 +00005609 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5610 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005611 if (Args.hasArg(options::OPT__SLASH_fallback))
5612 CmdArgs.push_back("msvc-fallback");
5613 else
5614 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005615 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005616}
5617
Douglas Katzman95354292015-06-23 20:42:09 +00005618visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005619 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005620 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005621 return CLFallback.get();
5622}
5623
Daniel Sanders7f933f42015-01-30 17:35:23 +00005624void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5625 ArgStringList &CmdArgs) const {
5626 StringRef CPUName;
5627 StringRef ABIName;
5628 const llvm::Triple &Triple = getToolChain().getTriple();
5629 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5630
5631 CmdArgs.push_back("-target-abi");
5632 CmdArgs.push_back(ABIName.data());
5633}
5634
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005635void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005636 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005637 const ArgList &Args,
5638 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005639 ArgStringList CmdArgs;
5640
5641 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5642 const InputInfo &Input = Inputs[0];
5643
James Y Knight2db38f32015-08-15 03:45:25 +00005644 std::string TripleStr =
5645 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5646 const llvm::Triple Triple(TripleStr);
5647
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005648 // Don't warn about "clang -w -c foo.s"
5649 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005650 // and "clang -emit-llvm -c foo.s"
5651 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005652
Rafael Espindola577637a2015-01-03 00:06:04 +00005653 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005654
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005655 // Invoke ourselves in -cc1as mode.
5656 //
5657 // FIXME: Implement custom jobs for internal actions.
5658 CmdArgs.push_back("-cc1as");
5659
5660 // Add the "effective" target triple.
5661 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005662 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5663
5664 // Set the output mode, we currently only expect to be used as a real
5665 // assembler.
5666 CmdArgs.push_back("-filetype");
5667 CmdArgs.push_back("obj");
5668
Eric Christopher45f2e712012-12-18 00:31:10 +00005669 // Set the main file name, so that debug info works even with
5670 // -save-temps or preprocessed assembly.
5671 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005672 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005673
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005674 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005675 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005676 if (!CPU.empty()) {
5677 CmdArgs.push_back("-target-cpu");
5678 CmdArgs.push_back(Args.MakeArgString(CPU));
5679 }
5680
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005681 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005682 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005683
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005684 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005685 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005686
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005687 // Pass along any -I options so we get proper .include search paths.
5688 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5689
Eric Christopherfc3ee562012-01-10 00:38:01 +00005690 // Determine the original source input.
5691 const Action *SourceAction = &JA;
5692 while (SourceAction->getKind() != Action::InputClass) {
5693 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5694 SourceAction = SourceAction->getInputs()[0];
5695 }
5696
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005697 // Forward -g and handle debug info related flags, assuming we are dealing
5698 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005699 if (SourceAction->getType() == types::TY_Asm ||
5700 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005701 bool WantDebug = false;
5702 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005703 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005704 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5705 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005706 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005707 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005708 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005709 if (DwarfVersion == 0)
5710 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005711 RenderDebugEnablingArgs(Args, CmdArgs,
5712 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5713 : CodeGenOptions::NoDebugInfo),
5714 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005715
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005716 // Add the -fdebug-compilation-dir flag if needed.
5717 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005718
5719 // Set the AT_producer to the clang version when using the integrated
5720 // assembler on assembly source files.
5721 CmdArgs.push_back("-dwarf-debug-producer");
5722 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005723
5724 // And pass along -I options
5725 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005726 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005727
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005728 // Handle -fPIC et al -- the relocation-model affects the assembler
5729 // for some targets.
5730 llvm::Reloc::Model RelocationModel;
5731 unsigned PICLevel;
5732 bool IsPIE;
5733 std::tie(RelocationModel, PICLevel, IsPIE) =
5734 ParsePICArgs(getToolChain(), Triple, Args);
5735
5736 const char *RMName = RelocationModelName(RelocationModel);
5737 if (RMName) {
5738 CmdArgs.push_back("-mrelocation-model");
5739 CmdArgs.push_back(RMName);
5740 }
5741
Kevin Enderby292dc082011-12-22 19:31:58 +00005742 // Optionally embed the -cc1as level arguments into the debug info, for build
5743 // analysis.
5744 if (getToolChain().UseDwarfDebugFlags()) {
5745 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005746 for (const auto &Arg : Args)
5747 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005748
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005749 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005750 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5751 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005752 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005753 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005754 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005755 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005756 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005757 }
5758 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005759 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005760 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005761
5762 // FIXME: Add -static support, once we have it.
5763
Daniel Sanders7f933f42015-01-30 17:35:23 +00005764 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005765 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005766 default:
5767 break;
5768
5769 case llvm::Triple::mips:
5770 case llvm::Triple::mipsel:
5771 case llvm::Triple::mips64:
5772 case llvm::Triple::mips64el:
5773 AddMIPSTargetArgs(Args, CmdArgs);
5774 break;
5775 }
5776
David Blaikie372d9502014-01-17 03:17:40 +00005777 // Consume all the warning flags. Usually this would be handled more
5778 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5779 // doesn't handle that so rather than warning about unused flags that are
5780 // actually used, we'll lie by omission instead.
5781 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005782 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5783 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005784
David Blaikie9260ed62013-07-25 21:19:01 +00005785 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5786 getToolChain().getDriver());
5787
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005788 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005789
5790 assert(Output.isFilename() && "Unexpected lipo output.");
5791 CmdArgs.push_back("-o");
5792 CmdArgs.push_back(Output.getFilename());
5793
Daniel Dunbarb440f562010-08-02 02:38:21 +00005794 assert(Input.isFilename() && "Invalid input.");
5795 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005796
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005797 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005798 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005799
5800 // Handle the debug info splitting at object creation time if we're
5801 // creating an object.
5802 // TODO: Currently only works on linux with newer objcopy.
5803 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005804 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005805 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005806 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005807}
5808
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005809void GnuTool::anchor() {}
5810
Daniel Dunbara3246a02009-03-18 08:07:30 +00005811void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005812 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005813 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005814 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005815 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005816 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005817
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005818 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005819 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005820 // Don't forward any -g arguments to assembly steps.
5821 if (isa<AssembleJobAction>(JA) &&
5822 A->getOption().matches(options::OPT_g_Group))
5823 continue;
5824
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005825 // Don't forward any -W arguments to assembly and link steps.
5826 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5827 A->getOption().matches(options::OPT_W_Group))
5828 continue;
5829
Daniel Dunbar2da02722009-03-19 07:55:12 +00005830 // It is unfortunate that we have to claim here, as this means
5831 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005832 // platforms using a generic gcc, even if we are just using gcc
5833 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005834 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005835 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005836 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005837 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005838
Daniel Dunbar4e295052010-01-25 22:35:08 +00005839 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005840
5841 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005842 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005843 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005844 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005845 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005846 }
5847
Daniel Dunbar5716d872009-05-02 21:41:52 +00005848 // Try to force gcc to match the tool chain we want, if we recognize
5849 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005850 //
5851 // FIXME: The triple class should directly provide the information we want
5852 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005853 switch (getToolChain().getArch()) {
5854 default:
5855 break;
5856 case llvm::Triple::x86:
5857 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005858 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005859 break;
5860 case llvm::Triple::x86_64:
5861 case llvm::Triple::ppc64:
5862 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005863 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005864 break;
5865 case llvm::Triple::sparcel:
5866 CmdArgs.push_back("-EL");
5867 break;
5868 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005869
Daniel Dunbarb440f562010-08-02 02:38:21 +00005870 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005871 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005872 CmdArgs.push_back(Output.getFilename());
5873 } else {
5874 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005875 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005876 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005877
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005878 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005879
5880 // Only pass -x if gcc will understand it; otherwise hope gcc
5881 // understands the suffix correctly. The main use case this would go
5882 // wrong in is for linker inputs if they happened to have an odd
5883 // suffix; really the only way to get this to happen is a command
5884 // like '-x foobar a.c' which will treat a.c like a linker input.
5885 //
5886 // FIXME: For the linker case specifically, can we safely convert
5887 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005888 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005889 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005890 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5891 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005892 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005893 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005894 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005895 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005896 else if (II.getType() == types::TY_ModuleFile)
5897 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005898 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005899
Daniel Dunbara3246a02009-03-18 08:07:30 +00005900 if (types::canTypeBeUserSpecified(II.getType())) {
5901 CmdArgs.push_back("-x");
5902 CmdArgs.push_back(types::getTypeName(II.getType()));
5903 }
5904
Daniel Dunbarb440f562010-08-02 02:38:21 +00005905 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005906 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005907 else {
5908 const Arg &A = II.getInputArg();
5909
5910 // Reverse translate some rewritten options.
5911 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5912 CmdArgs.push_back("-lstdc++");
5913 continue;
5914 }
5915
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005916 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005917 A.render(Args, CmdArgs);
5918 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005919 }
5920
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005921 const std::string customGCCName = D.getCCCGenericGCCName();
5922 const char *GCCName;
5923 if (!customGCCName.empty())
5924 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005925 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005926 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005927 } else
5928 GCCName = "gcc";
5929
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005930 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005931 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005932}
5933
Douglas Katzman95354292015-06-23 20:42:09 +00005934void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5935 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005936 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005937}
5938
Douglas Katzman95354292015-06-23 20:42:09 +00005939void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5940 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005941 const Driver &D = getToolChain().getDriver();
5942
Eric Christophercc7ff502015-01-29 00:56:17 +00005943 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005944 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005945 case types::TY_LLVM_IR:
5946 case types::TY_LTO_IR:
5947 case types::TY_LLVM_BC:
5948 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005949 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005950 break;
5951 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005952 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005953 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005954 case types::TY_Nothing:
5955 CmdArgs.push_back("-fsyntax-only");
5956 break;
5957 default:
5958 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005959 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005960}
5961
Douglas Katzman95354292015-06-23 20:42:09 +00005962void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5963 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005964 // The types are (hopefully) good enough.
5965}
5966
Tony Linthicum76329bf2011-12-12 21:14:55 +00005967// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005968void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5969 ArgStringList &CmdArgs) const {}
5970void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5971 const InputInfo &Output,
5972 const InputInfoList &Inputs,
5973 const ArgList &Args,
5974 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005975 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005976
5977 const Driver &D = getToolChain().getDriver();
5978 ArgStringList CmdArgs;
5979
5980 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005981 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005982 CmdArgs.push_back(Args.MakeArgString(MarchString));
5983
5984 RenderExtraToolArgs(JA, CmdArgs);
5985
5986 if (Output.isFilename()) {
5987 CmdArgs.push_back("-o");
5988 CmdArgs.push_back(Output.getFilename());
5989 } else {
5990 assert(Output.isNothing() && "Unexpected output");
5991 CmdArgs.push_back("-fsyntax-only");
5992 }
5993
Douglas Katzman54366072015-07-27 16:53:08 +00005994 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005995 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005996
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005997 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005998
Tony Linthicum76329bf2011-12-12 21:14:55 +00005999 // Only pass -x if gcc will understand it; otherwise hope gcc
6000 // understands the suffix correctly. The main use case this would go
6001 // wrong in is for linker inputs if they happened to have an odd
6002 // suffix; really the only way to get this to happen is a command
6003 // like '-x foobar a.c' which will treat a.c like a linker input.
6004 //
6005 // FIXME: For the linker case specifically, can we safely convert
6006 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006007 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006008 // Don't try to pass LLVM or AST inputs to a generic gcc.
6009 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
6010 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
6011 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006012 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006013 else if (II.getType() == types::TY_AST)
6014 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006015 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006016 else if (II.getType() == types::TY_ModuleFile)
6017 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006018 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006019
6020 if (II.isFilename())
6021 CmdArgs.push_back(II.getFilename());
6022 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006023 // Don't render as input, we need gcc to do the translations.
6024 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006025 II.getInputArg().render(Args, CmdArgs);
6026 }
6027
6028 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006029 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006030 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006031}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006032
Douglas Katzman95354292015-06-23 20:42:09 +00006033void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6034 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006035 // The types are (hopefully) good enough.
6036}
6037
Douglas Katzman54366072015-07-27 16:53:08 +00006038static void
6039constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
6040 const toolchains::HexagonToolChain &ToolChain,
6041 const InputInfo &Output, const InputInfoList &Inputs,
6042 const ArgList &Args, ArgStringList &CmdArgs,
6043 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006044
Matthew Curtise689b052012-12-06 15:46:07 +00006045 const Driver &D = ToolChain.getDriver();
6046
Matthew Curtise689b052012-12-06 15:46:07 +00006047 //----------------------------------------------------------------------------
6048 //
6049 //----------------------------------------------------------------------------
6050 bool hasStaticArg = Args.hasArg(options::OPT_static);
6051 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006052 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00006053 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
6054 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6055 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006056 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006057 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006058
Matthew Curtise689b052012-12-06 15:46:07 +00006059 //----------------------------------------------------------------------------
6060 // Silence warnings for various options
6061 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00006062
Matthew Curtise689b052012-12-06 15:46:07 +00006063 Args.ClaimAllArgs(options::OPT_g_Group);
6064 Args.ClaimAllArgs(options::OPT_emit_llvm);
6065 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6066 // handled somewhere else.
6067 Args.ClaimAllArgs(options::OPT_static_libgcc);
6068
6069 //----------------------------------------------------------------------------
6070 //
6071 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006072 for (const auto &Opt : ToolChain.ExtraOpts)
6073 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006074
Douglas Katzman54366072015-07-27 16:53:08 +00006075 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00006076 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00006077
Matthew Curtise689b052012-12-06 15:46:07 +00006078 if (buildingLib) {
6079 CmdArgs.push_back("-shared");
6080 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
6081 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00006082 }
6083
Matthew Curtise689b052012-12-06 15:46:07 +00006084 if (hasStaticArg)
6085 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006086
Matthew Curtise8f80a12012-12-06 17:49:03 +00006087 if (buildPIE && !buildingLib)
6088 CmdArgs.push_back("-pie");
6089
Douglas Katzman54366072015-07-27 16:53:08 +00006090 if (const char *v =
6091 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006092 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00006093 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006094 }
6095
Matthew Curtise689b052012-12-06 15:46:07 +00006096 //----------------------------------------------------------------------------
6097 //
6098 //----------------------------------------------------------------------------
6099 CmdArgs.push_back("-o");
6100 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006101
Matthew Curtise689b052012-12-06 15:46:07 +00006102 const std::string MarchSuffix = "/" + MarchString;
6103 const std::string G0Suffix = "/G0";
6104 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00006105 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006106 const std::string StartFilesDir =
6107 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006108
6109 //----------------------------------------------------------------------------
6110 // moslib
6111 //----------------------------------------------------------------------------
6112 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006113 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006114
Sean Silva14facf32015-06-09 01:57:17 +00006115 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6116 A->claim();
6117 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00006118 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006119 }
Matthew Curtise689b052012-12-06 15:46:07 +00006120 if (oslibs.empty()) {
6121 oslibs.push_back("standalone");
6122 hasStandalone = true;
6123 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006124
Matthew Curtise689b052012-12-06 15:46:07 +00006125 //----------------------------------------------------------------------------
6126 // Start Files
6127 //----------------------------------------------------------------------------
6128 if (incStdLib && incStartFiles) {
6129
6130 if (!buildingLib) {
6131 if (hasStandalone) {
6132 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006133 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00006134 }
6135 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
6136 }
6137 std::string initObj = useShared ? "/initS.o" : "/init.o";
6138 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
6139 }
6140
6141 //----------------------------------------------------------------------------
6142 // Library Search Paths
6143 //----------------------------------------------------------------------------
6144 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006145 for (const auto &LibPath : LibPaths)
6146 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006147
6148 //----------------------------------------------------------------------------
6149 //
6150 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006151 Args.AddAllArgs(CmdArgs,
6152 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6153 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006154
6155 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6156
6157 //----------------------------------------------------------------------------
6158 // Libraries
6159 //----------------------------------------------------------------------------
6160 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006161 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006162 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6163 CmdArgs.push_back("-lm");
6164 }
6165
6166 CmdArgs.push_back("--start-group");
6167
6168 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006169 for (const std::string &Lib : oslibs)
6170 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006171 CmdArgs.push_back("-lc");
6172 }
6173 CmdArgs.push_back("-lgcc");
6174
6175 CmdArgs.push_back("--end-group");
6176 }
6177
6178 //----------------------------------------------------------------------------
6179 // End files
6180 //----------------------------------------------------------------------------
6181 if (incStdLib && incStartFiles) {
6182 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6183 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6184 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006185}
6186
Douglas Katzman95354292015-06-23 20:42:09 +00006187void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6188 const InputInfo &Output,
6189 const InputInfoList &Inputs,
6190 const ArgList &Args,
6191 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006192
Douglas Katzman54366072015-07-27 16:53:08 +00006193 const toolchains::HexagonToolChain &ToolChain =
6194 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006195
6196 ArgStringList CmdArgs;
6197 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6198 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006199
6200 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006201 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006202 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006203}
6204// Hexagon tools end.
6205
Tom Stellard8fa33092015-07-18 01:49:05 +00006206void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6207 const InputInfo &Output,
6208 const InputInfoList &Inputs,
6209 const ArgList &Args,
6210 const char *LinkingOutput) const {
6211
6212 std::string Linker = getToolChain().GetProgramPath(getShortName());
6213 ArgStringList CmdArgs;
6214 CmdArgs.push_back("-flavor");
6215 CmdArgs.push_back("gnu");
6216 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006217 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006218 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6219 CmdArgs.push_back("-o");
6220 CmdArgs.push_back(Output.getFilename());
6221 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6222 CmdArgs, Inputs));
6223}
6224// AMDGPU tools end.
6225
Renato Golin7c542b42015-07-27 23:44:45 +00006226const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006227 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006228 if (!Arch.empty())
6229 MArch = Arch;
6230 else
Bernard Ogden31561762013-12-12 13:27:11 +00006231 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006232 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006233
6234 // Handle -march=native.
6235 if (MArch == "native") {
6236 std::string CPU = llvm::sys::getHostCPUName();
6237 if (CPU != "generic") {
6238 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006239 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006240 // If there is no valid architecture suffix for this CPU we don't know how
6241 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006242 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006243 MArch = "";
6244 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006245 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006246 }
6247 }
6248
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006249 return MArch;
6250}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006251
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006252/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006253StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006254 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006255 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6256 // here means an -march=native that we can't handle, so instead return no CPU.
6257 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006258 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006259
John Brawna95c1a82015-05-08 12:52:18 +00006260 // We need to return an empty string here on invalid MArch values as the
6261 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006262 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006263}
6264
6265/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006266std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006267 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006268 // FIXME: Warn on inconsistent use of -mcpu and -march.
6269 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006270 if (!CPU.empty()) {
6271 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006272 // Handle -mcpu=native.
6273 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006274 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006275 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006276 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006277 }
6278
Renato Goline17c5802015-07-27 23:44:42 +00006279 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006280}
6281
6282/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006283/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006284// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006285StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6286 const llvm::Triple &Triple) {
6287 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006288 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006289 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006290 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006291 if (ArchKind == llvm::ARM::AK_INVALID)
6292 // In case of generic Arch, i.e. "arm",
6293 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006294 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006295 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006296 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6297 // armv7k triple if it's actually been specified via "-arch armv7k".
6298 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006299 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006300 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006301 }
Renato Golin3c007252015-05-28 15:05:53 +00006302 if (ArchKind == llvm::ARM::AK_INVALID)
6303 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006304 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006305}
6306
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006307void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006308 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006309 if (Args.hasArg(options::OPT_r))
6310 return;
6311
John Brawn94fd9632015-05-21 12:19:49 +00006312 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6313 // to generate BE-8 executables.
6314 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6315 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006316}
6317
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006318mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006319 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6320 // was first introduced in Release 3. However, other compilers have
6321 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006322 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6323 .Case("mips1", NanLegacy)
6324 .Case("mips2", NanLegacy)
6325 .Case("mips3", NanLegacy)
6326 .Case("mips4", NanLegacy)
6327 .Case("mips5", NanLegacy)
6328 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006329 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006330 .Case("mips32r3", NanLegacy | Nan2008)
6331 .Case("mips32r5", NanLegacy | Nan2008)
6332 .Case("mips32r6", Nan2008)
6333 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006334 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006335 .Case("mips64r3", NanLegacy | Nan2008)
6336 .Case("mips64r5", NanLegacy | Nan2008)
6337 .Case("mips64r6", Nan2008)
6338 .Default(NanLegacy);
6339}
6340
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006341bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6342 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6343 return A && (A->getValue() == StringRef(Value));
6344}
6345
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006346bool mips::isUCLibc(const ArgList &Args) {
6347 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006348 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006349}
6350
Daniel Sanders2bf13662014-07-10 14:40:57 +00006351bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006352 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6353 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006354 .Case("2008", true)
6355 .Case("legacy", false)
6356 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006357
6358 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006359 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006360 .Cases("mips32r6", "mips64r6", true)
6361 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006362
6363 return false;
6364}
6365
Daniel Sanders379d44b2014-07-16 11:52:23 +00006366bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006367 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006368 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006369 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006370 return false;
6371
6372 if (ABIName != "32")
6373 return false;
6374
Toma Tabacu94ea6862015-06-16 13:54:13 +00006375 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6376 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006377 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006378 return false;
6379
Daniel Sanders379d44b2014-07-16 11:52:23 +00006380 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006381 .Cases("mips2", "mips3", "mips4", "mips5", true)
6382 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6383 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6384 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006385}
6386
Toma Tabacu94ea6862015-06-16 13:54:13 +00006387bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6388 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006389 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006390 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6391
6392 // FPXX shouldn't be used if -msingle-float is present.
6393 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6394 options::OPT_mdouble_float))
6395 if (A->getOption().matches(options::OPT_msingle_float))
6396 UseFPXX = false;
6397
6398 return UseFPXX;
6399}
6400
Tim Northover157d9112014-01-16 08:48:16 +00006401llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006402 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6403 // archs which Darwin doesn't use.
6404
6405 // The matching this routine does is fairly pointless, since it is neither the
6406 // complete architecture list, nor a reasonable subset. The problem is that
6407 // historically the driver driver accepts this and also ties its -march=
6408 // handling to the architecture name, so we need to be careful before removing
6409 // support for it.
6410
6411 // This code must be kept in sync with Clang's Darwin specific argument
6412 // translation.
6413
6414 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006415 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6416 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6417 .Case("ppc64", llvm::Triple::ppc64)
6418 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6419 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6420 llvm::Triple::x86)
6421 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6422 // This is derived from the driver driver.
6423 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6424 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6425 .Cases("armv7s", "xscale", llvm::Triple::arm)
6426 .Case("arm64", llvm::Triple::aarch64)
6427 .Case("r600", llvm::Triple::r600)
6428 .Case("amdgcn", llvm::Triple::amdgcn)
6429 .Case("nvptx", llvm::Triple::nvptx)
6430 .Case("nvptx64", llvm::Triple::nvptx64)
6431 .Case("amdil", llvm::Triple::amdil)
6432 .Case("spir", llvm::Triple::spir)
6433 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006434}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006435
Tim Northover157d9112014-01-16 08:48:16 +00006436void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006437 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006438 T.setArch(Arch);
6439
6440 if (Str == "x86_64h")
6441 T.setArchName(Str);
6442 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6443 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006444 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006445 }
6446}
6447
Bob Wilsondecc03e2012-11-23 06:14:39 +00006448const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006449 const InputInfo &Input) {
6450 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006451}
6452
Bob Wilsondecc03e2012-11-23 06:14:39 +00006453const char *Clang::getBaseInputStem(const ArgList &Args,
6454 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006455 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006456
Chris Lattner906bb902011-01-16 08:14:11 +00006457 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006458 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006459
6460 return Str;
6461}
6462
Bob Wilsondecc03e2012-11-23 06:14:39 +00006463const char *Clang::getDependencyFileName(const ArgList &Args,
6464 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006465 // FIXME: Think about this more.
6466 std::string Res;
6467
6468 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006469 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006470 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006471 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006472 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006473 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006474 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006475}
6476
Douglas Katzman95354292015-06-23 20:42:09 +00006477void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6478 const InputInfo &Output,
6479 const InputInfoList &Inputs,
6480 const ArgList &Args,
6481 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006482 const ToolChain &ToolChain = getToolChain();
6483 const Driver &D = ToolChain.getDriver();
6484 ArgStringList CmdArgs;
6485
6486 // Silence warning for "clang -g foo.o -o foo"
6487 Args.ClaimAllArgs(options::OPT_g_Group);
6488 // and "clang -emit-llvm foo.o -o foo"
6489 Args.ClaimAllArgs(options::OPT_emit_llvm);
6490 // and for "clang -w foo.o -o foo". Other warning options are already
6491 // handled somewhere else.
6492 Args.ClaimAllArgs(options::OPT_w);
6493
6494 if (!D.SysRoot.empty())
6495 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6496
6497 // CloudABI only supports static linkage.
6498 CmdArgs.push_back("-Bstatic");
6499 CmdArgs.push_back("--eh-frame-hdr");
6500 CmdArgs.push_back("--gc-sections");
6501
6502 if (Output.isFilename()) {
6503 CmdArgs.push_back("-o");
6504 CmdArgs.push_back(Output.getFilename());
6505 } else {
6506 assert(Output.isNothing() && "Invalid output.");
6507 }
6508
6509 if (!Args.hasArg(options::OPT_nostdlib) &&
6510 !Args.hasArg(options::OPT_nostartfiles)) {
6511 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6512 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6513 }
6514
6515 Args.AddAllArgs(CmdArgs, options::OPT_L);
6516 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6517 for (const auto &Path : Paths)
6518 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006519 Args.AddAllArgs(CmdArgs,
6520 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6521 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006522
Teresa Johnson945bc502015-10-15 20:35:53 +00006523 if (D.isUsingLTO())
6524 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006525
6526 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6527
6528 if (!Args.hasArg(options::OPT_nostdlib) &&
6529 !Args.hasArg(options::OPT_nodefaultlibs)) {
6530 if (D.CCCIsCXX())
6531 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6532 CmdArgs.push_back("-lc");
6533 CmdArgs.push_back("-lcompiler_rt");
6534 }
6535
6536 if (!Args.hasArg(options::OPT_nostdlib) &&
6537 !Args.hasArg(options::OPT_nostartfiles))
6538 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6539
6540 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006541 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006542}
6543
Douglas Katzman95354292015-06-23 20:42:09 +00006544void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6545 const InputInfo &Output,
6546 const InputInfoList &Inputs,
6547 const ArgList &Args,
6548 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006549 ArgStringList CmdArgs;
6550
6551 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6552 const InputInfo &Input = Inputs[0];
6553
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006554 // Determine the original source input.
6555 const Action *SourceAction = &JA;
6556 while (SourceAction->getKind() != Action::InputClass) {
6557 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6558 SourceAction = SourceAction->getInputs()[0];
6559 }
6560
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006561 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006562 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006563 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6564 // FIXME: at run-time detect assembler capabilities or rely on version
6565 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006566 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006567 const llvm::Triple &T(getToolChain().getTriple());
6568 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006569 CmdArgs.push_back("-Q");
6570 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006571
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006572 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006573 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006574 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006575 if (Args.hasArg(options::OPT_gstabs))
6576 CmdArgs.push_back("--gstabs");
6577 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006578 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006579 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006580
Daniel Dunbarbe220842009-03-20 16:06:39 +00006581 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006582 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006583
Daniel Dunbar6d484762010-07-22 01:47:22 +00006584 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006585 if (getToolChain().getArch() == llvm::Triple::x86 ||
6586 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006587 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6588 CmdArgs.push_back("-force_cpusubtype_ALL");
6589
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006590 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006591 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006592 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006593 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006594 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006595 CmdArgs.push_back("-static");
6596
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006597 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006598
6599 assert(Output.isFilename() && "Unexpected lipo output.");
6600 CmdArgs.push_back("-o");
6601 CmdArgs.push_back(Output.getFilename());
6602
Daniel Dunbarb440f562010-08-02 02:38:21 +00006603 assert(Input.isFilename() && "Invalid input.");
6604 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006605
6606 // asm_final spec is empty.
6607
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006608 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006609 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006610}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006611
Tim Northover157d9112014-01-16 08:48:16 +00006612void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006613
Tim Northover157d9112014-01-16 08:48:16 +00006614void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6615 ArgStringList &CmdArgs) const {
6616 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006617
Daniel Dunbarc1964212009-03-26 16:23:12 +00006618 // Derived from darwin_arch spec.
6619 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006620 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006621
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006622 // FIXME: Is this needed anymore?
6623 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006624 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006625}
6626
Douglas Katzman95354292015-06-23 20:42:09 +00006627bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006628 // We only need to generate a temp path for LTO if we aren't compiling object
6629 // files. When compiling source files, we run 'dsymutil' after linking. We
6630 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006631 for (const auto &Input : Inputs)
6632 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006633 return true;
6634
6635 return false;
6636}
6637
Douglas Katzman95354292015-06-23 20:42:09 +00006638void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6639 ArgStringList &CmdArgs,
6640 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006641 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006642 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006644 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006645 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6646 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006647 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6648 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006649 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006650 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006651 }
6652
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006653 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006654 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006655 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6656 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006657
Bob Wilson3d27dad2013-08-02 22:25:34 +00006658 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6659 CmdArgs.push_back("-export_dynamic");
6660
Bob Wilsonb111ec92015-03-02 19:01:14 +00006661 // If we are using App Extension restrictions, pass a flag to the linker
6662 // telling it that the compiled code has been audited.
6663 if (Args.hasFlag(options::OPT_fapplication_extension,
6664 options::OPT_fno_application_extension, false))
6665 CmdArgs.push_back("-application_extension");
6666
Teresa Johnson945bc502015-10-15 20:35:53 +00006667 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006668 // If we are using LTO, then automatically create a temporary file path for
6669 // the linker to use, so that it's lifetime will extend past a possible
6670 // dsymutil step.
6671 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6672 const char *TmpPath = C.getArgs().MakeArgString(
6673 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6674 C.addTempFile(TmpPath);
6675 CmdArgs.push_back("-object_path_lto");
6676 CmdArgs.push_back(TmpPath);
6677 }
6678
6679 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6680 // it in clang installed libraries. If not found, the option is not used
6681 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6682 if (Version[0] >= 133) {
6683 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6684 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6685 SmallString<128> LibLTOPath(P);
6686 llvm::sys::path::append(LibLTOPath, "lib");
6687 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6688 if (llvm::sys::fs::exists(LibLTOPath)) {
6689 CmdArgs.push_back("-lto_library");
6690 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6691 } else {
6692 D.Diag(diag::warn_drv_lto_libpath);
6693 }
6694 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006695 }
6696
Daniel Dunbarc1964212009-03-26 16:23:12 +00006697 // Derived from the "link" spec.
6698 Args.AddAllArgs(CmdArgs, options::OPT_static);
6699 if (!Args.hasArg(options::OPT_static))
6700 CmdArgs.push_back("-dynamic");
6701 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6702 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6703 // here. How do we wish to handle such things?
6704 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006705
Daniel Dunbarc1964212009-03-26 16:23:12 +00006706 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006707 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006708 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006709 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006710
6711 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6712 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6713 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6714
6715 Arg *A;
6716 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6717 (A = Args.getLastArg(options::OPT_current__version)) ||
6718 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006719 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6720 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006721
6722 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6723 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6724 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6725 } else {
6726 CmdArgs.push_back("-dylib");
6727
6728 Arg *A;
6729 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6730 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6731 (A = Args.getLastArg(options::OPT_client__name)) ||
6732 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6733 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6734 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006735 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6736 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006737
Daniel Dunbarc1964212009-03-26 16:23:12 +00006738 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6739 "-dylib_compatibility_version");
6740 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6741 "-dylib_current_version");
6742
Tim Northover157d9112014-01-16 08:48:16 +00006743 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006744
6745 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6746 "-dylib_install_name");
6747 }
6748
6749 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6750 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6751 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006752 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006753 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006754 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6755 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6756 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6757 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6758 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6759 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006760 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006761 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6762 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6763 Args.AddAllArgs(CmdArgs, options::OPT_init);
6764
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006765 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006766 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006767
Daniel Dunbarc1964212009-03-26 16:23:12 +00006768 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6769 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6770 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6771 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6772 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006773
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006774 if (const Arg *A =
6775 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6776 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006777 if (A->getOption().matches(options::OPT_fpie) ||
6778 A->getOption().matches(options::OPT_fPIE))
6779 CmdArgs.push_back("-pie");
6780 else
6781 CmdArgs.push_back("-no_pie");
6782 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006783
6784 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6785 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6786 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6787 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6788 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6789 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6790 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6791 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6792 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6793 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6794 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6795 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6796 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6797 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6798 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6799 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006800
Daniel Dunbar84384642011-05-02 21:03:47 +00006801 // Give --sysroot= preference, over the Apple specific behavior to also use
6802 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006803 StringRef sysroot = C.getSysRoot();
6804 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006805 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006806 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006807 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6808 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006809 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006810 }
6811
Daniel Dunbarc1964212009-03-26 16:23:12 +00006812 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6813 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6814 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6815 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6816 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006817 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006818 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6819 Args.AddAllArgs(CmdArgs, options::OPT_y);
6820 Args.AddLastArg(CmdArgs, options::OPT_w);
6821 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6822 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6823 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6824 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6825 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6826 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6827 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6828 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6829 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6830 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6831 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6832 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6833}
6834
Douglas Katzman95354292015-06-23 20:42:09 +00006835void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6836 const InputInfo &Output,
6837 const InputInfoList &Inputs,
6838 const ArgList &Args,
6839 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006840 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006841
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006842 // If the number of arguments surpasses the system limits, we will encode the
6843 // input files in a separate file, shortening the command line. To this end,
6844 // build a list of input file names that can be passed via a file with the
6845 // -filelist linker option.
6846 llvm::opt::ArgStringList InputFileList;
6847
Daniel Dunbarc1964212009-03-26 16:23:12 +00006848 // The logic here is derived from gcc's behavior; most of which
6849 // comes from specs (starting with link_command). Consult gcc for
6850 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006851 ArgStringList CmdArgs;
6852
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006853 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6854 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6855 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006856 for (const auto &Arg : Args)
6857 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006858 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006859 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006860 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006861 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006862 return;
6863 }
6864
Daniel Dunbarc1964212009-03-26 16:23:12 +00006865 // I'm not sure why this particular decomposition exists in gcc, but
6866 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006867 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006868
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006869 // It seems that the 'e' option is completely ignored for dynamic executables
6870 // (the default), and with static executables, the last one wins, as expected.
6871 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6872 options::OPT_Z_Flag, options::OPT_u_Group,
6873 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006874
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006875 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6876 // members of static archive libraries which implement Objective-C classes or
6877 // categories.
6878 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6879 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006880
Daniel Dunbarc1964212009-03-26 16:23:12 +00006881 CmdArgs.push_back("-o");
6882 CmdArgs.push_back(Output.getFilename());
6883
Chad Rosier06fd3c62012-05-16 23:45:12 +00006884 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006885 !Args.hasArg(options::OPT_nostartfiles))
6886 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006887
Peter Collingbournec4122c12015-06-15 21:08:13 +00006888 // SafeStack requires its own runtime libraries
6889 // These libraries should be linked first, to make sure the
6890 // __safestack_init constructor executes before everything else
6891 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6892 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6893 "libclang_rt.safestack_osx.a",
6894 /*AlwaysLink=*/true);
6895 }
6896
Daniel Dunbarc1964212009-03-26 16:23:12 +00006897 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006898
Douglas Gregor9295df02012-05-15 21:00:27 +00006899 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006900 // Build the input file for -filelist (list of linker input files) in case we
6901 // need it later
6902 for (const auto &II : Inputs) {
6903 if (!II.isFilename()) {
6904 // This is a linker input argument.
6905 // We cannot mix input arguments and file names in a -filelist input, thus
6906 // we prematurely stop our list (remaining files shall be passed as
6907 // arguments).
6908 if (InputFileList.size() > 0)
6909 break;
6910
6911 continue;
6912 }
6913
6914 InputFileList.push_back(II.getFilename());
6915 }
6916
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006917 if (!Args.hasArg(options::OPT_nostdlib) &&
6918 !Args.hasArg(options::OPT_nodefaultlibs))
6919 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6920
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006921 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006922 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006923 // We use arclite library for both ARC and subscripting support.
6924 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6925
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006926 CmdArgs.push_back("-framework");
6927 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006928 // Link libobj.
6929 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006930 }
John McCall31168b02011-06-15 23:02:42 +00006931
Daniel Dunbarc1964212009-03-26 16:23:12 +00006932 if (LinkingOutput) {
6933 CmdArgs.push_back("-arch_multiple");
6934 CmdArgs.push_back("-final_output");
6935 CmdArgs.push_back(LinkingOutput);
6936 }
6937
Daniel Dunbarc1964212009-03-26 16:23:12 +00006938 if (Args.hasArg(options::OPT_fnested_functions))
6939 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006940
Justin Bognerc7701242015-05-12 05:44:36 +00006941 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6942
Daniel Dunbarc1964212009-03-26 16:23:12 +00006943 if (!Args.hasArg(options::OPT_nostdlib) &&
6944 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006945 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006946 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006947
Daniel Dunbarc1964212009-03-26 16:23:12 +00006948 // link_ssp spec is empty.
6949
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006950 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006951 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006952 }
6953
Chad Rosier06fd3c62012-05-16 23:45:12 +00006954 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006955 !Args.hasArg(options::OPT_nostartfiles)) {
6956 // endfile_spec is empty.
6957 }
6958
6959 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6960 Args.AddAllArgs(CmdArgs, options::OPT_F);
6961
Steven Wu3ffb61b2015-02-06 18:08:29 +00006962 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006963 for (const Arg *A : Args.filtered(options::OPT_iframework))
6964 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006965
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006966 if (!Args.hasArg(options::OPT_nostdlib) &&
6967 !Args.hasArg(options::OPT_nodefaultlibs)) {
6968 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6969 if (A->getValue() == StringRef("Accelerate")) {
6970 CmdArgs.push_back("-framework");
6971 CmdArgs.push_back("Accelerate");
6972 }
6973 }
6974 }
6975
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006976 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006977 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006978 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006979 Cmd->setInputFileList(std::move(InputFileList));
6980 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006981}
6982
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006983void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006984 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006985 const InputInfoList &Inputs,
6986 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006987 const char *LinkingOutput) const {
6988 ArgStringList CmdArgs;
6989
6990 CmdArgs.push_back("-create");
6991 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006992
6993 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006994 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006995
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006996 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006997 assert(II.isFilename() && "Unexpected lipo input.");
6998 CmdArgs.push_back(II.getFilename());
6999 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007000
7001 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007002 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007003}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007004
Daniel Dunbar88299622010-06-04 18:28:36 +00007005void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007006 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007007 const InputInfoList &Inputs,
7008 const ArgList &Args,
7009 const char *LinkingOutput) const {
7010 ArgStringList CmdArgs;
7011
Daniel Dunbareb86b042011-05-09 17:23:16 +00007012 CmdArgs.push_back("-o");
7013 CmdArgs.push_back(Output.getFilename());
7014
Daniel Dunbar88299622010-06-04 18:28:36 +00007015 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7016 const InputInfo &Input = Inputs[0];
7017 assert(Input.isFilename() && "Unexpected dsymutil input.");
7018 CmdArgs.push_back(Input.getFilename());
7019
Daniel Dunbar88299622010-06-04 18:28:36 +00007020 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007021 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007022 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007023}
7024
Eric Christopher551ef452011-08-23 17:56:55 +00007025void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007026 const InputInfo &Output,
7027 const InputInfoList &Inputs,
7028 const ArgList &Args,
7029 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007030 ArgStringList CmdArgs;
7031 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007032 CmdArgs.push_back("--debug-info");
7033 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007034 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007035
7036 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7037 const InputInfo &Input = Inputs[0];
7038 assert(Input.isFilename() && "Unexpected verify input");
7039
7040 // Grabbing the output of the earlier dsymutil run.
7041 CmdArgs.push_back(Input.getFilename());
7042
7043 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007044 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007045 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007046}
7047
Douglas Katzman95354292015-06-23 20:42:09 +00007048void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007049 const InputInfo &Output,
7050 const InputInfoList &Inputs,
7051 const ArgList &Args,
7052 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007053 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007054 ArgStringList CmdArgs;
7055
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007056 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007057
7058 CmdArgs.push_back("-o");
7059 CmdArgs.push_back(Output.getFilename());
7060
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007061 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007062 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007063
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007064 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007065 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007066}
7067
Douglas Katzman95354292015-06-23 20:42:09 +00007068void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7069 const InputInfo &Output,
7070 const InputInfoList &Inputs,
7071 const ArgList &Args,
7072 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007073 ArgStringList CmdArgs;
7074
David Chisnall272a0712012-02-29 15:06:12 +00007075 // Demangle C++ names in errors
7076 CmdArgs.push_back("-C");
7077
David Chisnallf571cde2012-02-15 13:39:01 +00007078 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7079 (!Args.hasArg(options::OPT_shared))) {
7080 CmdArgs.push_back("-e");
7081 CmdArgs.push_back("_start");
7082 }
7083
7084 if (Args.hasArg(options::OPT_static)) {
7085 CmdArgs.push_back("-Bstatic");
7086 CmdArgs.push_back("-dn");
7087 } else {
7088 CmdArgs.push_back("-Bdynamic");
7089 if (Args.hasArg(options::OPT_shared)) {
7090 CmdArgs.push_back("-shared");
7091 } else {
7092 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007093 CmdArgs.push_back(
7094 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007095 }
7096 }
7097
7098 if (Output.isFilename()) {
7099 CmdArgs.push_back("-o");
7100 CmdArgs.push_back(Output.getFilename());
7101 } else {
7102 assert(Output.isNothing() && "Invalid output.");
7103 }
7104
7105 if (!Args.hasArg(options::OPT_nostdlib) &&
7106 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007107 if (!Args.hasArg(options::OPT_shared))
7108 CmdArgs.push_back(
7109 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7110
7111 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7112 CmdArgs.push_back(
7113 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7114 CmdArgs.push_back(
7115 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007116 }
7117
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007118 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
7119 for (const auto &Path : Paths)
7120 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00007121
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007122 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7123 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007124
7125 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7126
7127 if (!Args.hasArg(options::OPT_nostdlib) &&
7128 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007129 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007130 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007131 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007132 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007133 if (!Args.hasArg(options::OPT_shared)) {
7134 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007135 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007136 }
David Chisnallf571cde2012-02-15 13:39:01 +00007137 }
7138
7139 if (!Args.hasArg(options::OPT_nostdlib) &&
7140 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007141 CmdArgs.push_back(
7142 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007143 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007144 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007145
Xinliang David Li69306c02015-10-22 06:15:31 +00007146 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007147
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007148 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007149 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007150}
7151
Douglas Katzman95354292015-06-23 20:42:09 +00007152void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7153 const InputInfo &Output,
7154 const InputInfoList &Inputs,
7155 const ArgList &Args,
7156 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007157 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007158 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00007159 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007160
Rafael Espindolacc126272014-02-28 01:55:21 +00007161 switch (getToolChain().getArch()) {
7162 case llvm::Triple::x86:
7163 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7164 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007165 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007166 break;
7167
7168 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007169 CmdArgs.push_back("-mppc");
7170 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007171 break;
7172
7173 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007174 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007175 CmdArgs.push_back("-32");
7176 NeedsKPIC = true;
7177 break;
7178
7179 case llvm::Triple::sparcv9:
7180 CmdArgs.push_back("-64");
7181 CmdArgs.push_back("-Av9a");
7182 NeedsKPIC = true;
7183 break;
7184
7185 case llvm::Triple::mips64:
7186 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007187 StringRef CPUName;
7188 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007189 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007190
7191 CmdArgs.push_back("-mabi");
7192 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7193
7194 if (getToolChain().getArch() == llvm::Triple::mips64)
7195 CmdArgs.push_back("-EB");
7196 else
7197 CmdArgs.push_back("-EL");
7198
Rafael Espindolacc126272014-02-28 01:55:21 +00007199 NeedsKPIC = true;
7200 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007201 }
7202
Rafael Espindolacc126272014-02-28 01:55:21 +00007203 default:
7204 break;
7205 }
7206
7207 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007208 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007210 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007211
7212 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007213 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007214
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007215 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007216 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007217
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007218 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007219 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007220}
7221
Douglas Katzman95354292015-06-23 20:42:09 +00007222void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7223 const InputInfo &Output,
7224 const InputInfoList &Inputs,
7225 const ArgList &Args,
7226 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007227 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007228 ArgStringList CmdArgs;
7229
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007230 // Silence warning for "clang -g foo.o -o foo"
7231 Args.ClaimAllArgs(options::OPT_g_Group);
7232 // and "clang -emit-llvm foo.o -o foo"
7233 Args.ClaimAllArgs(options::OPT_emit_llvm);
7234 // and for "clang -w foo.o -o foo". Other warning options are already
7235 // handled somewhere else.
7236 Args.ClaimAllArgs(options::OPT_w);
7237
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007238 if (getToolChain().getArch() == llvm::Triple::mips64)
7239 CmdArgs.push_back("-EB");
7240 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7241 CmdArgs.push_back("-EL");
7242
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007243 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007244 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007245 CmdArgs.push_back("-e");
7246 CmdArgs.push_back("__start");
7247 }
7248
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007249 if (Args.hasArg(options::OPT_static)) {
7250 CmdArgs.push_back("-Bstatic");
7251 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007252 if (Args.hasArg(options::OPT_rdynamic))
7253 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007254 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007255 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007256 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007257 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007258 } else {
7259 CmdArgs.push_back("-dynamic-linker");
7260 CmdArgs.push_back("/usr/libexec/ld.so");
7261 }
7262 }
7263
Rafael Espindola044f7832013-06-05 04:28:55 +00007264 if (Args.hasArg(options::OPT_nopie))
7265 CmdArgs.push_back("-nopie");
7266
Daniel Dunbarb440f562010-08-02 02:38:21 +00007267 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007268 CmdArgs.push_back("-o");
7269 CmdArgs.push_back(Output.getFilename());
7270 } else {
7271 assert(Output.isNothing() && "Invalid output.");
7272 }
7273
7274 if (!Args.hasArg(options::OPT_nostdlib) &&
7275 !Args.hasArg(options::OPT_nostartfiles)) {
7276 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007277 if (Args.hasArg(options::OPT_pg))
7278 CmdArgs.push_back(
7279 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007280 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007281 CmdArgs.push_back(
7282 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7283 CmdArgs.push_back(
7284 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007285 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007286 CmdArgs.push_back(
7287 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007288 }
7289 }
7290
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007291 std::string Triple = getToolChain().getTripleString();
7292 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007293 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007294 CmdArgs.push_back(
7295 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007296
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007297 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7298 options::OPT_e, options::OPT_s, options::OPT_t,
7299 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007300
Daniel Dunbar54423b22010-09-17 00:24:54 +00007301 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007302
7303 if (!Args.hasArg(options::OPT_nostdlib) &&
7304 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007305 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007306 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007307 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007308 CmdArgs.push_back("-lm_p");
7309 else
7310 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007311 }
7312
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007313 // FIXME: For some reason GCC passes -lgcc before adding
7314 // the default system libraries. Just mimic this for now.
7315 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007316
Eric Christopher17674ec2012-09-13 06:32:34 +00007317 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007318 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7319 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007320 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007321 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007322 }
7323
Chandler Carruth45661652011-12-17 22:32:42 +00007324 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007325 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007326 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007327 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007328 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007329 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007330
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007331 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007332 }
7333
7334 if (!Args.hasArg(options::OPT_nostdlib) &&
7335 !Args.hasArg(options::OPT_nostartfiles)) {
7336 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007337 CmdArgs.push_back(
7338 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007339 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007340 CmdArgs.push_back(
7341 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007342 }
7343
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007344 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007345 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007346}
Ed Schoutene33194b2009-04-02 19:13:12 +00007347
Douglas Katzman95354292015-06-23 20:42:09 +00007348void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7349 const InputInfo &Output,
7350 const InputInfoList &Inputs,
7351 const ArgList &Args,
7352 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007353 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007354 ArgStringList CmdArgs;
7355
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007356 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007357
7358 CmdArgs.push_back("-o");
7359 CmdArgs.push_back(Output.getFilename());
7360
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007361 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007362 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007363
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007364 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007365 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007366}
7367
Douglas Katzman95354292015-06-23 20:42:09 +00007368void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7369 const InputInfo &Output,
7370 const InputInfoList &Inputs,
7371 const ArgList &Args,
7372 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007373 const Driver &D = getToolChain().getDriver();
7374 ArgStringList CmdArgs;
7375
7376 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7377 (!Args.hasArg(options::OPT_shared))) {
7378 CmdArgs.push_back("-e");
7379 CmdArgs.push_back("__start");
7380 }
7381
7382 if (Args.hasArg(options::OPT_static)) {
7383 CmdArgs.push_back("-Bstatic");
7384 } else {
7385 if (Args.hasArg(options::OPT_rdynamic))
7386 CmdArgs.push_back("-export-dynamic");
7387 CmdArgs.push_back("--eh-frame-hdr");
7388 CmdArgs.push_back("-Bdynamic");
7389 if (Args.hasArg(options::OPT_shared)) {
7390 CmdArgs.push_back("-shared");
7391 } else {
7392 CmdArgs.push_back("-dynamic-linker");
7393 CmdArgs.push_back("/usr/libexec/ld.so");
7394 }
7395 }
7396
7397 if (Output.isFilename()) {
7398 CmdArgs.push_back("-o");
7399 CmdArgs.push_back(Output.getFilename());
7400 } else {
7401 assert(Output.isNothing() && "Invalid output.");
7402 }
7403
7404 if (!Args.hasArg(options::OPT_nostdlib) &&
7405 !Args.hasArg(options::OPT_nostartfiles)) {
7406 if (!Args.hasArg(options::OPT_shared)) {
7407 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007408 CmdArgs.push_back(
7409 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007410 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007411 CmdArgs.push_back(
7412 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7413 CmdArgs.push_back(
7414 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007415 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007416 CmdArgs.push_back(
7417 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007418 }
7419 }
7420
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007421 Args.AddAllArgs(CmdArgs,
7422 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007423
7424 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7425
7426 if (!Args.hasArg(options::OPT_nostdlib) &&
7427 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007428 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007429 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7430 if (Args.hasArg(options::OPT_pg))
7431 CmdArgs.push_back("-lm_p");
7432 else
7433 CmdArgs.push_back("-lm");
7434 }
7435
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007436 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007437 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007438 CmdArgs.push_back("-lpthread_p");
7439 else
7440 CmdArgs.push_back("-lpthread");
7441 }
7442
Eli Friedman9fa28852012-08-08 23:57:20 +00007443 if (!Args.hasArg(options::OPT_shared)) {
7444 if (Args.hasArg(options::OPT_pg))
7445 CmdArgs.push_back("-lc_p");
7446 else
7447 CmdArgs.push_back("-lc");
7448 }
7449
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007450 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007451 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007452 case llvm::Triple::arm:
7453 MyArch = "arm";
7454 break;
7455 case llvm::Triple::x86:
7456 MyArch = "i386";
7457 break;
7458 case llvm::Triple::x86_64:
7459 MyArch = "amd64";
7460 break;
7461 default:
7462 llvm_unreachable("Unsupported architecture");
7463 }
7464 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007465 }
7466
7467 if (!Args.hasArg(options::OPT_nostdlib) &&
7468 !Args.hasArg(options::OPT_nostartfiles)) {
7469 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007470 CmdArgs.push_back(
7471 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007472 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007473 CmdArgs.push_back(
7474 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007475 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007476
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007477 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007478 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007479}
7480
Douglas Katzman95354292015-06-23 20:42:09 +00007481void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7482 const InputInfo &Output,
7483 const InputInfoList &Inputs,
7484 const ArgList &Args,
7485 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007486 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007487 ArgStringList CmdArgs;
7488
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007489 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7490 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007491 switch (getToolChain().getArch()) {
7492 default:
7493 break;
7494 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007495 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007496 break;
7497 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007498 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007499 break;
7500 case llvm::Triple::mips:
7501 case llvm::Triple::mipsel:
7502 case llvm::Triple::mips64:
7503 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007504 StringRef CPUName;
7505 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007506 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007507
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007508 CmdArgs.push_back("-march");
7509 CmdArgs.push_back(CPUName.data());
7510
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007511 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007512 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007513
7514 if (getToolChain().getArch() == llvm::Triple::mips ||
7515 getToolChain().getArch() == llvm::Triple::mips64)
7516 CmdArgs.push_back("-EB");
7517 else
7518 CmdArgs.push_back("-EL");
7519
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007520 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007521 break;
7522 }
7523 case llvm::Triple::arm:
7524 case llvm::Triple::armeb:
7525 case llvm::Triple::thumb:
7526 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007527 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007528
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007529 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007530 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007531 else
Renato Golinf4421f72014-02-19 10:44:07 +00007532 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007533
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007534 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007535 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007536 case llvm::Triple::GNUEABI:
7537 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007538 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007539 break;
7540
7541 default:
7542 CmdArgs.push_back("-matpcs");
7543 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007544 break;
7545 }
7546 case llvm::Triple::sparc:
7547 case llvm::Triple::sparcel:
7548 case llvm::Triple::sparcv9:
Roman Divacky9f779402014-02-25 18:45:49 +00007549 if (getToolChain().getArch() == llvm::Triple::sparc)
7550 CmdArgs.push_back("-Av8plusa");
7551 else
7552 CmdArgs.push_back("-Av9a");
7553
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007554 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007555 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007556 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007557
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007558 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007559
7560 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007561 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007562
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007563 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007564 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007565
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007566 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007567 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007568}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007569
Douglas Katzman95354292015-06-23 20:42:09 +00007570void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7571 const InputInfo &Output,
7572 const InputInfoList &Inputs,
7573 const ArgList &Args,
7574 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007575 const toolchains::FreeBSD &ToolChain =
7576 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007577 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007578 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007579 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007580 !Args.hasArg(options::OPT_shared) &&
7581 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007582 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007583
7584 // Silence warning for "clang -g foo.o -o foo"
7585 Args.ClaimAllArgs(options::OPT_g_Group);
7586 // and "clang -emit-llvm foo.o -o foo"
7587 Args.ClaimAllArgs(options::OPT_emit_llvm);
7588 // and for "clang -w foo.o -o foo". Other warning options are already
7589 // handled somewhere else.
7590 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007591
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007592 if (!D.SysRoot.empty())
7593 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7594
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007595 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007596 CmdArgs.push_back("-pie");
7597
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007598 if (Args.hasArg(options::OPT_static)) {
7599 CmdArgs.push_back("-Bstatic");
7600 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007601 if (Args.hasArg(options::OPT_rdynamic))
7602 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007603 CmdArgs.push_back("--eh-frame-hdr");
7604 if (Args.hasArg(options::OPT_shared)) {
7605 CmdArgs.push_back("-Bshareable");
7606 } else {
7607 CmdArgs.push_back("-dynamic-linker");
7608 CmdArgs.push_back("/libexec/ld-elf.so.1");
7609 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007610 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007611 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7612 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7613 CmdArgs.push_back("--hash-style=both");
7614 }
7615 }
7616 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007617 }
7618
7619 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7620 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007621 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007622 CmdArgs.push_back("-m");
7623 CmdArgs.push_back("elf_i386_fbsd");
7624 }
7625
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007626 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007627 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007628 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007629 }
7630
Daniel Dunbarb440f562010-08-02 02:38:21 +00007631 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007632 CmdArgs.push_back("-o");
7633 CmdArgs.push_back(Output.getFilename());
7634 } else {
7635 assert(Output.isNothing() && "Invalid output.");
7636 }
7637
7638 if (!Args.hasArg(options::OPT_nostdlib) &&
7639 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007640 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007641 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007642 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007643 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007644 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007645 crt1 = "Scrt1.o";
7646 else
7647 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007648 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007649 if (crt1)
7650 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7651
7652 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7653
Craig Topper92fc2df2014-05-17 16:56:41 +00007654 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007655 if (Args.hasArg(options::OPT_static))
7656 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007657 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007658 crtbegin = "crtbeginS.o";
7659 else
7660 crtbegin = "crtbegin.o";
7661
7662 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007663 }
7664
7665 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007666 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007667 for (const auto &Path : Paths)
7668 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007669 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7670 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007671 Args.AddAllArgs(CmdArgs, options::OPT_s);
7672 Args.AddAllArgs(CmdArgs, options::OPT_t);
7673 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7674 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007675
Teresa Johnson945bc502015-10-15 20:35:53 +00007676 if (D.isUsingLTO())
7677 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007678
Alexey Samsonov52550342014-09-15 19:58:40 +00007679 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007680 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007681
7682 if (!Args.hasArg(options::OPT_nostdlib) &&
7683 !Args.hasArg(options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007684 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007685 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007686 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007687 if (Args.hasArg(options::OPT_pg))
7688 CmdArgs.push_back("-lm_p");
7689 else
7690 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007691 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007692 if (NeedsSanitizerDeps)
7693 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007694 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7695 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007696 if (Args.hasArg(options::OPT_pg))
7697 CmdArgs.push_back("-lgcc_p");
7698 else
7699 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007700 if (Args.hasArg(options::OPT_static)) {
7701 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007702 } else if (Args.hasArg(options::OPT_pg)) {
7703 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007704 } else {
7705 CmdArgs.push_back("--as-needed");
7706 CmdArgs.push_back("-lgcc_s");
7707 CmdArgs.push_back("--no-as-needed");
7708 }
7709
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007710 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007711 if (Args.hasArg(options::OPT_pg))
7712 CmdArgs.push_back("-lpthread_p");
7713 else
7714 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007715 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007716
Roman Divacky66f22762011-02-10 16:59:40 +00007717 if (Args.hasArg(options::OPT_pg)) {
7718 if (Args.hasArg(options::OPT_shared))
7719 CmdArgs.push_back("-lc");
7720 else
7721 CmdArgs.push_back("-lc_p");
7722 CmdArgs.push_back("-lgcc_p");
7723 } else {
7724 CmdArgs.push_back("-lc");
7725 CmdArgs.push_back("-lgcc");
7726 }
7727
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007728 if (Args.hasArg(options::OPT_static)) {
7729 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007730 } else if (Args.hasArg(options::OPT_pg)) {
7731 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007732 } else {
7733 CmdArgs.push_back("--as-needed");
7734 CmdArgs.push_back("-lgcc_s");
7735 CmdArgs.push_back("--no-as-needed");
7736 }
7737 }
7738
7739 if (!Args.hasArg(options::OPT_nostdlib) &&
7740 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007741 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007742 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007743 else
7744 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007745 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007746 }
7747
Xinliang David Li69306c02015-10-22 06:15:31 +00007748 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007749
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007750 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007751 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007752}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007753
Douglas Katzman95354292015-06-23 20:42:09 +00007754void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007755 const InputInfo &Output,
7756 const InputInfoList &Inputs,
7757 const ArgList &Args,
7758 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007759 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007760 ArgStringList CmdArgs;
7761
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007762 // GNU as needs different flags for creating the correct output format
7763 // on architectures with different ABIs or optional feature sets.
7764 switch (getToolChain().getArch()) {
7765 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007766 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007767 break;
7768 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007769 case llvm::Triple::armeb:
7770 case llvm::Triple::thumb:
7771 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007772 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007773 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7774 std::string Arch =
7775 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007776 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007777 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007778 }
7779
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007780 case llvm::Triple::mips:
7781 case llvm::Triple::mipsel:
7782 case llvm::Triple::mips64:
7783 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007784 StringRef CPUName;
7785 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007786 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007787
7788 CmdArgs.push_back("-march");
7789 CmdArgs.push_back(CPUName.data());
7790
7791 CmdArgs.push_back("-mabi");
7792 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7793
7794 if (getToolChain().getArch() == llvm::Triple::mips ||
7795 getToolChain().getArch() == llvm::Triple::mips64)
7796 CmdArgs.push_back("-EB");
7797 else
7798 CmdArgs.push_back("-EL");
7799
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007800 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007801 break;
7802 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007803
7804 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007805 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007806 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007807 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7808 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007809 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007810 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007811 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007812
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007813 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007814 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007815 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7816 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007817 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007818 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007819 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007820
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007821 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007822 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007823 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007824
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007825 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007826
7827 CmdArgs.push_back("-o");
7828 CmdArgs.push_back(Output.getFilename());
7829
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007830 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007831 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007832
David Chisnallddbd68f2011-09-27 22:03:18 +00007833 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007834 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007835}
7836
Douglas Katzman95354292015-06-23 20:42:09 +00007837void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7838 const InputInfo &Output,
7839 const InputInfoList &Inputs,
7840 const ArgList &Args,
7841 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007842 const Driver &D = getToolChain().getDriver();
7843 ArgStringList CmdArgs;
7844
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007845 if (!D.SysRoot.empty())
7846 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7847
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007848 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007849 if (Args.hasArg(options::OPT_static)) {
7850 CmdArgs.push_back("-Bstatic");
7851 } else {
7852 if (Args.hasArg(options::OPT_rdynamic))
7853 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007854 if (Args.hasArg(options::OPT_shared)) {
7855 CmdArgs.push_back("-Bshareable");
7856 } else {
7857 CmdArgs.push_back("-dynamic-linker");
7858 CmdArgs.push_back("/libexec/ld.elf_so");
7859 }
7860 }
7861
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007862 // Many NetBSD architectures support more than one ABI.
7863 // Determine the correct emulation for ld.
7864 switch (getToolChain().getArch()) {
7865 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007866 CmdArgs.push_back("-m");
7867 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007868 break;
7869 case llvm::Triple::arm:
7870 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007871 CmdArgs.push_back("-m");
7872 switch (getToolChain().getTriple().getEnvironment()) {
7873 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007874 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007875 CmdArgs.push_back("armelf_nbsd_eabi");
7876 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007877 case llvm::Triple::EABIHF:
7878 case llvm::Triple::GNUEABIHF:
7879 CmdArgs.push_back("armelf_nbsd_eabihf");
7880 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007881 default:
7882 CmdArgs.push_back("armelf_nbsd");
7883 break;
7884 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007885 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007886 case llvm::Triple::armeb:
7887 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007888 arm::appendEBLinkFlags(
7889 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007890 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007891 CmdArgs.push_back("-m");
7892 switch (getToolChain().getTriple().getEnvironment()) {
7893 case llvm::Triple::EABI:
7894 case llvm::Triple::GNUEABI:
7895 CmdArgs.push_back("armelfb_nbsd_eabi");
7896 break;
7897 case llvm::Triple::EABIHF:
7898 case llvm::Triple::GNUEABIHF:
7899 CmdArgs.push_back("armelfb_nbsd_eabihf");
7900 break;
7901 default:
7902 CmdArgs.push_back("armelfb_nbsd");
7903 break;
7904 }
7905 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007906 case llvm::Triple::mips64:
7907 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007908 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007909 CmdArgs.push_back("-m");
7910 if (getToolChain().getArch() == llvm::Triple::mips64)
7911 CmdArgs.push_back("elf32btsmip");
7912 else
7913 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007914 } else if (mips::hasMipsAbiArg(Args, "64")) {
7915 CmdArgs.push_back("-m");
7916 if (getToolChain().getArch() == llvm::Triple::mips64)
7917 CmdArgs.push_back("elf64btsmip");
7918 else
7919 CmdArgs.push_back("elf64ltsmip");
7920 }
7921 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007922 case llvm::Triple::ppc:
7923 CmdArgs.push_back("-m");
7924 CmdArgs.push_back("elf32ppc_nbsd");
7925 break;
7926
7927 case llvm::Triple::ppc64:
7928 case llvm::Triple::ppc64le:
7929 CmdArgs.push_back("-m");
7930 CmdArgs.push_back("elf64ppc");
7931 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007932
7933 case llvm::Triple::sparc:
7934 CmdArgs.push_back("-m");
7935 CmdArgs.push_back("elf32_sparc");
7936 break;
7937
7938 case llvm::Triple::sparcv9:
7939 CmdArgs.push_back("-m");
7940 CmdArgs.push_back("elf64_sparc");
7941 break;
7942
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007943 default:
7944 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007945 }
7946
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007947 if (Output.isFilename()) {
7948 CmdArgs.push_back("-o");
7949 CmdArgs.push_back(Output.getFilename());
7950 } else {
7951 assert(Output.isNothing() && "Invalid output.");
7952 }
7953
7954 if (!Args.hasArg(options::OPT_nostdlib) &&
7955 !Args.hasArg(options::OPT_nostartfiles)) {
7956 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007957 CmdArgs.push_back(
7958 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7959 CmdArgs.push_back(
7960 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7961 CmdArgs.push_back(
7962 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007963 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007964 CmdArgs.push_back(
7965 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7966 CmdArgs.push_back(
7967 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007968 }
7969 }
7970
7971 Args.AddAllArgs(CmdArgs, options::OPT_L);
7972 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7973 Args.AddAllArgs(CmdArgs, options::OPT_e);
7974 Args.AddAllArgs(CmdArgs, options::OPT_s);
7975 Args.AddAllArgs(CmdArgs, options::OPT_t);
7976 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7977 Args.AddAllArgs(CmdArgs, options::OPT_r);
7978
7979 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7980
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007981 unsigned Major, Minor, Micro;
7982 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7983 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007984 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007985 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007986 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007987 case llvm::Triple::arm:
7988 case llvm::Triple::armeb:
7989 case llvm::Triple::thumb:
7990 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007991 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007992 case llvm::Triple::ppc64:
7993 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007994 case llvm::Triple::x86:
7995 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007996 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007997 break;
7998 default:
7999 break;
8000 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008001 }
8002
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008003 if (!Args.hasArg(options::OPT_nostdlib) &&
8004 !Args.hasArg(options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008005 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008006 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008007 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8008 CmdArgs.push_back("-lm");
8009 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008010 if (Args.hasArg(options::OPT_pthread))
8011 CmdArgs.push_back("-lpthread");
8012 CmdArgs.push_back("-lc");
8013
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008014 if (useLibgcc) {
8015 if (Args.hasArg(options::OPT_static)) {
8016 // libgcc_eh depends on libc, so resolve as much as possible,
8017 // pull in any new requirements from libc and then get the rest
8018 // of libgcc.
8019 CmdArgs.push_back("-lgcc_eh");
8020 CmdArgs.push_back("-lc");
8021 CmdArgs.push_back("-lgcc");
8022 } else {
8023 CmdArgs.push_back("-lgcc");
8024 CmdArgs.push_back("--as-needed");
8025 CmdArgs.push_back("-lgcc_s");
8026 CmdArgs.push_back("--no-as-needed");
8027 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008028 }
8029 }
8030
8031 if (!Args.hasArg(options::OPT_nostdlib) &&
8032 !Args.hasArg(options::OPT_nostartfiles)) {
8033 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008034 CmdArgs.push_back(
8035 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008036 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008037 CmdArgs.push_back(
8038 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8039 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008040 }
8041
Xinliang David Li69306c02015-10-22 06:15:31 +00008042 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008043
Logan Chieneb9162f2014-06-26 14:23:45 +00008044 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008045 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008046}
8047
Douglas Katzman95354292015-06-23 20:42:09 +00008048void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8049 const InputInfo &Output,
8050 const InputInfoList &Inputs,
8051 const ArgList &Args,
8052 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008053 claimNoWarnArgs(Args);
8054
James Y Knight2db38f32015-08-15 03:45:25 +00008055 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8056 llvm::Triple Triple = llvm::Triple(TripleStr);
8057
Rafael Espindola92b00932010-08-10 00:25:48 +00008058 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008059 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00008060
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008061 llvm::Reloc::Model RelocationModel;
8062 unsigned PICLevel;
8063 bool IsPIE;
8064 std::tie(RelocationModel, PICLevel, IsPIE) =
8065 ParsePICArgs(getToolChain(), Triple, Args);
8066
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008067 switch (getToolChain().getArch()) {
8068 default:
8069 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008070 // Add --32/--64 to make sure we get the format we want.
8071 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008072 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008073 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008074 break;
8075 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008076 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8077 CmdArgs.push_back("--x32");
8078 else
8079 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008080 break;
8081 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008082 CmdArgs.push_back("-a32");
8083 CmdArgs.push_back("-mppc");
8084 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008085 break;
8086 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008087 CmdArgs.push_back("-a64");
8088 CmdArgs.push_back("-mppc64");
8089 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008090 break;
8091 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008092 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008093 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008094 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008095 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008096 break;
8097 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008098 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008099 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00008100 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008101 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008102 break;
8103 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008104 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00008105 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008106 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008107 break;
8108 case llvm::Triple::arm:
8109 case llvm::Triple::armeb:
8110 case llvm::Triple::thumb:
8111 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008112 const llvm::Triple &Triple2 = getToolChain().getTriple();
8113 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008114 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008115 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008116 break;
8117 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008118 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008119 break;
8120 default:
8121 break;
8122 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008123
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008124 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008125 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8126 case arm::FloatABI::Soft:
8127 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8128 break;
8129 case arm::FloatABI::SoftFP:
8130 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8131 break;
8132 case arm::FloatABI::Hard:
8133 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8134 break;
8135 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008136
8137 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008138
8139 // FIXME: remove krait check when GNU tools support krait cpu
8140 // for now replace it with -march=armv7-a to avoid a lower
8141 // march from being picked in the absence of a cpu flag.
8142 Arg *A;
8143 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008144 StringRef(A->getValue()).lower() == "krait")
8145 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008146 else
8147 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008148 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008149 break;
8150 }
8151 case llvm::Triple::mips:
8152 case llvm::Triple::mipsel:
8153 case llvm::Triple::mips64:
8154 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008155 StringRef CPUName;
8156 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008157 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008158 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008159
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008160 CmdArgs.push_back("-march");
8161 CmdArgs.push_back(CPUName.data());
8162
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008163 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008164 CmdArgs.push_back(ABIName.data());
8165
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008166 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8167 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008168 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008169 CmdArgs.push_back("-mno-shared");
8170
Daniel Sanders379d44b2014-07-16 11:52:23 +00008171 // LLVM doesn't support -mplt yet and acts as if it is always given.
8172 // However, -mplt has no effect with the N64 ABI.
8173 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008174
8175 if (getToolChain().getArch() == llvm::Triple::mips ||
8176 getToolChain().getArch() == llvm::Triple::mips64)
8177 CmdArgs.push_back("-EB");
8178 else
8179 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008180
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008181 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8182 if (StringRef(A->getValue()) == "2008")
8183 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8184 }
8185
Daniel Sanders379d44b2014-07-16 11:52:23 +00008186 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8187 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8188 options::OPT_mfp64)) {
8189 A->claim();
8190 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008191 } else if (mips::shouldUseFPXX(
8192 Args, getToolChain().getTriple(), CPUName, ABIName,
8193 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008194 CmdArgs.push_back("-mfpxx");
8195
8196 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8197 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008198 if (Arg *A =
8199 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008200 if (A->getOption().matches(options::OPT_mips16)) {
8201 A->claim();
8202 A->render(Args, CmdArgs);
8203 } else {
8204 A->claim();
8205 CmdArgs.push_back("-no-mips16");
8206 }
8207 }
8208
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008209 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8210 options::OPT_mno_micromips);
8211 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8212 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8213
Simon Atanasyanbd986632013-11-26 11:58:04 +00008214 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8215 // Do not use AddLastArg because not all versions of MIPS assembler
8216 // support -mmsa / -mno-msa options.
8217 if (A->getOption().matches(options::OPT_mmsa))
8218 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8219 }
8220
Daniel Sanders379d44b2014-07-16 11:52:23 +00008221 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8222 options::OPT_msoft_float);
8223
Toma Tabacub36d6102015-06-11 12:13:18 +00008224 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8225 options::OPT_msingle_float);
8226
Daniel Sanders379d44b2014-07-16 11:52:23 +00008227 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8228 options::OPT_mno_odd_spreg);
8229
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008230 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008231 break;
8232 }
8233 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008234 // Always pass an -march option, since our default of z10 is later
8235 // than the GNU assembler's default.
8236 StringRef CPUName = getSystemZTargetCPU(Args);
8237 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008238 break;
8239 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008240 }
8241
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008242 if (NeedsKPIC) {
8243 if (RelocationModel != llvm::Reloc::Static)
8244 CmdArgs.push_back("-KPIC");
8245 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008246
Renato Golina74bbc72015-07-22 15:32:36 +00008247 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008248 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008249
8250 CmdArgs.push_back("-o");
8251 CmdArgs.push_back(Output.getFilename());
8252
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008253 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008254 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008255
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008256 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008257 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008258
8259 // Handle the debug info splitting at object creation time if we're
8260 // creating an object.
8261 // TODO: Currently only works on linux with newer objcopy.
8262 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008263 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008264 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008265 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008266}
8267
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008268static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008269 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008270 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008271 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008272 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8273 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008274 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008275 CmdArgs.push_back("-lgcc");
8276
Logan Chien3d3373c2012-11-19 12:04:11 +00008277 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008278 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008279 CmdArgs.push_back("-lgcc");
8280 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008281 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008282 CmdArgs.push_back("--as-needed");
8283 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008284 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008285 CmdArgs.push_back("--no-as-needed");
8286 }
8287
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008288 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008289 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008290 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008291 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008292
8293 // According to Android ABI, we have to link with libdl if we are
8294 // linking with non-static libgcc.
8295 //
8296 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8297 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8298 if (isAndroid && !StaticLibgcc)
8299 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008300}
8301
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008302static std::string getLinuxDynamicLinker(const ArgList &Args,
8303 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008304 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8305
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008306 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008307 if (ToolChain.getTriple().isArch64Bit())
8308 return "/system/bin/linker64";
8309 else
8310 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008311 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8312 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008313 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008314 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008315 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008316 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008317 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008318 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008319 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008320 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008321 return "/lib/ld-linux-armhf.so.3";
8322 else
8323 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008324 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8325 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008326 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008327 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008328 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008329 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008330 return "/lib/ld-linux.so.3";
8331 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8332 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008333 StringRef CPUName;
8334 StringRef ABIName;
8335 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
Vasileios Kalintiris45faf472015-10-29 15:33:53 +00008336 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008337
8338 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8339 .Case("o32", "/lib")
8340 .Case("n32", "/lib32")
8341 .Case("n64", "/lib64")
8342 .Default("/lib");
8343 StringRef LibName;
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008344 if (mips::isUCLibc(Args))
8345 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008346 else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008347 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008348
8349 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008350 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008351 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008352 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008353 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8354 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008355 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008356 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008357 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8358 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008359 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008360 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008361 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008362 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008363 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008364 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008365 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8366 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008367 else
8368 return "/lib64/ld-linux-x86-64.so.2";
8369}
8370
Renato Golinc4b49242014-02-13 10:01:16 +00008371static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008372 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008373 // Make use of compiler-rt if --rtlib option is used
8374 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8375
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008376 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008377 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008378 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008379 default:
8380 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008381 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008382 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008383 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008384 break;
8385 }
Renato Golinc4b49242014-02-13 10:01:16 +00008386 break;
8387 case ToolChain::RLT_Libgcc:
8388 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8389 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008390 }
8391}
8392
Rafael Espindola1e085772014-08-15 17:14:35 +00008393static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8394 switch (T.getArch()) {
8395 case llvm::Triple::x86:
8396 return "elf_i386";
8397 case llvm::Triple::aarch64:
8398 return "aarch64linux";
8399 case llvm::Triple::aarch64_be:
8400 return "aarch64_be_linux";
8401 case llvm::Triple::arm:
8402 case llvm::Triple::thumb:
8403 return "armelf_linux_eabi";
8404 case llvm::Triple::armeb:
8405 case llvm::Triple::thumbeb:
8406 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8407 case llvm::Triple::ppc:
8408 return "elf32ppclinux";
8409 case llvm::Triple::ppc64:
8410 return "elf64ppc";
8411 case llvm::Triple::ppc64le:
8412 return "elf64lppc";
8413 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008414 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008415 return "elf32_sparc";
8416 case llvm::Triple::sparcv9:
8417 return "elf64_sparc";
8418 case llvm::Triple::mips:
8419 return "elf32btsmip";
8420 case llvm::Triple::mipsel:
8421 return "elf32ltsmip";
8422 case llvm::Triple::mips64:
8423 if (mips::hasMipsAbiArg(Args, "n32"))
8424 return "elf32btsmipn32";
8425 return "elf64btsmip";
8426 case llvm::Triple::mips64el:
8427 if (mips::hasMipsAbiArg(Args, "n32"))
8428 return "elf32ltsmipn32";
8429 return "elf64ltsmip";
8430 case llvm::Triple::systemz:
8431 return "elf64_s390";
8432 case llvm::Triple::x86_64:
8433 if (T.getEnvironment() == llvm::Triple::GNUX32)
8434 return "elf32_x86_64";
8435 return "elf_x86_64";
8436 default:
8437 llvm_unreachable("Unexpected arch");
8438 }
8439}
8440
Douglas Katzman95354292015-06-23 20:42:09 +00008441void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8442 const InputInfo &Output,
8443 const InputInfoList &Inputs,
8444 const ArgList &Args,
8445 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008446 const toolchains::Linux &ToolChain =
8447 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008448 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008449
8450 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8451 llvm::Triple Triple = llvm::Triple(TripleStr);
8452
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008453 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008454 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008455 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008456 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8457 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008458
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008459 ArgStringList CmdArgs;
8460
Rafael Espindolad1002f62010-11-15 18:28:16 +00008461 // Silence warning for "clang -g foo.o -o foo"
8462 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008463 // and "clang -emit-llvm foo.o -o foo"
8464 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008465 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008466 // handled somewhere else.
8467 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008468
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008469 if (!D.SysRoot.empty())
8470 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008471
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008472 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008473 CmdArgs.push_back("-pie");
8474
Rafael Espindola1c76c592010-11-07 22:57:16 +00008475 if (Args.hasArg(options::OPT_rdynamic))
8476 CmdArgs.push_back("-export-dynamic");
8477
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008478 if (Args.hasArg(options::OPT_s))
8479 CmdArgs.push_back("-s");
8480
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008481 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008482 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008483
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008484 for (const auto &Opt : ToolChain.ExtraOpts)
8485 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008486
8487 if (!Args.hasArg(options::OPT_static)) {
8488 CmdArgs.push_back("--eh-frame-hdr");
8489 }
8490
8491 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008492 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008493
8494 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008495 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8496 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008497 CmdArgs.push_back("-Bstatic");
8498 else
8499 CmdArgs.push_back("-static");
8500 } else if (Args.hasArg(options::OPT_shared)) {
8501 CmdArgs.push_back("-shared");
8502 }
8503
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008504 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8505 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008506 (!Args.hasArg(options::OPT_static) &&
8507 !Args.hasArg(options::OPT_shared))) {
8508 CmdArgs.push_back("-dynamic-linker");
8509 CmdArgs.push_back(Args.MakeArgString(
8510 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8511 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008512
8513 CmdArgs.push_back("-o");
8514 CmdArgs.push_back(Output.getFilename());
8515
Rafael Espindola81937ec2010-12-01 01:52:43 +00008516 if (!Args.hasArg(options::OPT_nostdlib) &&
8517 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008518 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008519 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008520 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008521 if (Args.hasArg(options::OPT_pg))
8522 crt1 = "gcrt1.o";
8523 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008524 crt1 = "Scrt1.o";
8525 else
8526 crt1 = "crt1.o";
8527 }
8528 if (crt1)
8529 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008530
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008531 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8532 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008533
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008534 const char *crtbegin;
8535 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008536 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008537 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008538 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008539 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008540 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008541 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008542 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008543 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008544
8545 // Add crtfastmath.o if available and fast math is enabled.
8546 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008547 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008548
8549 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008550 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008551
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008552 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008553
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008554 for (const auto &Path : Paths)
8555 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008556
Teresa Johnson945bc502015-10-15 20:35:53 +00008557 if (D.isUsingLTO())
8558 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008559
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008560 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8561 CmdArgs.push_back("--no-demangle");
8562
Alexey Samsonov52550342014-09-15 19:58:40 +00008563 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008564 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008565 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008566 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008567
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008568 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008569 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008570 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008571 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008572 if (OnlyLibstdcxxStatic)
8573 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008574 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008575 if (OnlyLibstdcxxStatic)
8576 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008577 CmdArgs.push_back("-lm");
8578 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008579 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8580 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008581
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008582 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008583 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8584 if (Args.hasArg(options::OPT_static))
8585 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008586
Alexey Samsonov52550342014-09-15 19:58:40 +00008587 if (NeedsSanitizerDeps)
8588 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8589
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008590 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8591 Args.hasArg(options::OPT_pthreads);
8592
8593 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8594 options::OPT_fno_openmp, false)) {
8595 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8596 // FIXME: Does this really make sense for all GNU toolchains?
8597 WantPthread = true;
8598
8599 // Also link the particular OpenMP runtimes.
8600 switch (getOpenMPRuntime(ToolChain, Args)) {
8601 case OMPRT_OMP:
8602 CmdArgs.push_back("-lomp");
8603 break;
8604 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008605 CmdArgs.push_back("-lgomp");
8606
8607 // FIXME: Exclude this for platforms with libgomp that don't require
8608 // librt. Most modern Linux platforms require it, but some may not.
8609 CmdArgs.push_back("-lrt");
8610 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008611 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008612 CmdArgs.push_back("-liomp5");
8613 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008614 case OMPRT_Unknown:
8615 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008616 break;
8617 }
Chandler Carruth01538002013-01-17 13:19:29 +00008618 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008619
Renato Golinc4b49242014-02-13 10:01:16 +00008620 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008621
Richard Smith31d1de22015-05-20 22:48:44 +00008622 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008623 CmdArgs.push_back("-lpthread");
8624
8625 CmdArgs.push_back("-lc");
8626
8627 if (Args.hasArg(options::OPT_static))
8628 CmdArgs.push_back("--end-group");
8629 else
Renato Golinc4b49242014-02-13 10:01:16 +00008630 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008631 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008632
Rafael Espindola81937ec2010-12-01 01:52:43 +00008633 if (!Args.hasArg(options::OPT_nostartfiles)) {
8634 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008635 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008636 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008637 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008638 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008639 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008640 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008641
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008642 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008643 if (!isAndroid)
8644 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008645 }
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008646 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008647
Justin Bognerd3371d82015-07-17 03:35:54 +00008648 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8649 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008650}
8651
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008652// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8653// for the various SFI requirements like register masking. The assembly tool
8654// inserts the file containing the macros as an input into all the assembly
8655// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008656void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8657 const InputInfo &Output,
8658 const InputInfoList &Inputs,
8659 const ArgList &Args,
8660 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008661 const toolchains::NaClToolChain &ToolChain =
8662 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008663 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8664 "nacl-arm-macros.s");
8665 InputInfoList NewInputs;
8666 NewInputs.push_back(NaClMacros);
8667 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008668 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8669 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008670}
8671
Douglas Katzman750cfc52015-06-29 18:42:16 +00008672// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008673// we use static by default, do not yet support sanitizers or LTO, and a few
8674// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008675// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008676void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8677 const InputInfo &Output,
8678 const InputInfoList &Inputs,
8679 const ArgList &Args,
8680 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008681
Douglas Katzman54366072015-07-27 16:53:08 +00008682 const toolchains::NaClToolChain &ToolChain =
8683 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008684 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008685 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008686 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008687 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008688
8689 ArgStringList CmdArgs;
8690
8691 // Silence warning for "clang -g foo.o -o foo"
8692 Args.ClaimAllArgs(options::OPT_g_Group);
8693 // and "clang -emit-llvm foo.o -o foo"
8694 Args.ClaimAllArgs(options::OPT_emit_llvm);
8695 // and for "clang -w foo.o -o foo". Other warning options are already
8696 // handled somewhere else.
8697 Args.ClaimAllArgs(options::OPT_w);
8698
8699 if (!D.SysRoot.empty())
8700 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8701
8702 if (Args.hasArg(options::OPT_rdynamic))
8703 CmdArgs.push_back("-export-dynamic");
8704
8705 if (Args.hasArg(options::OPT_s))
8706 CmdArgs.push_back("-s");
8707
Douglas Katzman54366072015-07-27 16:53:08 +00008708 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8709 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008710 CmdArgs.push_back("--build-id");
8711
8712 if (!IsStatic)
8713 CmdArgs.push_back("--eh-frame-hdr");
8714
8715 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008716 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008717 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008718 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008719 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008720 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008721 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008722 else if (Arch == llvm::Triple::mipsel)
8723 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008724 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008725 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8726 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008727
8728 if (IsStatic)
8729 CmdArgs.push_back("-static");
8730 else if (Args.hasArg(options::OPT_shared))
8731 CmdArgs.push_back("-shared");
8732
8733 CmdArgs.push_back("-o");
8734 CmdArgs.push_back(Output.getFilename());
8735 if (!Args.hasArg(options::OPT_nostdlib) &&
8736 !Args.hasArg(options::OPT_nostartfiles)) {
8737 if (!Args.hasArg(options::OPT_shared))
8738 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8739 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8740
8741 const char *crtbegin;
8742 if (IsStatic)
8743 crtbegin = "crtbeginT.o";
8744 else if (Args.hasArg(options::OPT_shared))
8745 crtbegin = "crtbeginS.o";
8746 else
8747 crtbegin = "crtbegin.o";
8748 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8749 }
8750
8751 Args.AddAllArgs(CmdArgs, options::OPT_L);
8752 Args.AddAllArgs(CmdArgs, options::OPT_u);
8753
8754 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8755
8756 for (const auto &Path : Paths)
8757 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8758
8759 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8760 CmdArgs.push_back("--no-demangle");
8761
8762 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8763
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008764 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008765 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008766 bool OnlyLibstdcxxStatic =
8767 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008768 if (OnlyLibstdcxxStatic)
8769 CmdArgs.push_back("-Bstatic");
8770 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8771 if (OnlyLibstdcxxStatic)
8772 CmdArgs.push_back("-Bdynamic");
8773 CmdArgs.push_back("-lm");
8774 }
8775
8776 if (!Args.hasArg(options::OPT_nostdlib)) {
8777 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8778 // Always use groups, since it has no effect on dynamic libraries.
8779 CmdArgs.push_back("--start-group");
8780 CmdArgs.push_back("-lc");
8781 // NaCl's libc++ currently requires libpthread, so just always include it
8782 // in the group for C++.
8783 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008784 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008785 // Gold, used by Mips, handles nested groups differently than ld, and
8786 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8787 // which is not a desired behaviour here.
8788 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8789 if (getToolChain().getArch() == llvm::Triple::mipsel)
8790 CmdArgs.push_back("-lnacl");
8791
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008792 CmdArgs.push_back("-lpthread");
8793 }
8794
8795 CmdArgs.push_back("-lgcc");
8796 CmdArgs.push_back("--as-needed");
8797 if (IsStatic)
8798 CmdArgs.push_back("-lgcc_eh");
8799 else
8800 CmdArgs.push_back("-lgcc_s");
8801 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008802
8803 // Mips needs to create and use pnacl_legacy library that contains
8804 // definitions from bitcode/pnaclmm.c and definitions for
8805 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8806 if (getToolChain().getArch() == llvm::Triple::mipsel)
8807 CmdArgs.push_back("-lpnacl_legacy");
8808
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008809 CmdArgs.push_back("--end-group");
8810 }
8811
8812 if (!Args.hasArg(options::OPT_nostartfiles)) {
8813 const char *crtend;
8814 if (Args.hasArg(options::OPT_shared))
8815 crtend = "crtendS.o";
8816 else
8817 crtend = "crtend.o";
8818
8819 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8820 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8821 }
8822 }
8823
Justin Bognerd3371d82015-07-17 03:35:54 +00008824 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8825 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008826}
8827
Douglas Katzman95354292015-06-23 20:42:09 +00008828void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8829 const InputInfo &Output,
8830 const InputInfoList &Inputs,
8831 const ArgList &Args,
8832 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008833 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008834 ArgStringList CmdArgs;
8835
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008836 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008837
8838 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008839 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008840
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008841 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008842 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008843
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008844 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008845 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008846}
8847
Douglas Katzman95354292015-06-23 20:42:09 +00008848void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8849 const InputInfo &Output,
8850 const InputInfoList &Inputs,
8851 const ArgList &Args,
8852 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008853 const Driver &D = getToolChain().getDriver();
8854 ArgStringList CmdArgs;
8855
Daniel Dunbarb440f562010-08-02 02:38:21 +00008856 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008857 CmdArgs.push_back("-o");
8858 CmdArgs.push_back(Output.getFilename());
8859 } else {
8860 assert(Output.isNothing() && "Invalid output.");
8861 }
8862
8863 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008864 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008865 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8866 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8867 CmdArgs.push_back(
8868 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8869 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008870 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008871
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008872 Args.AddAllArgs(CmdArgs,
8873 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008874
Daniel Dunbar54423b22010-09-17 00:24:54 +00008875 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008876
Xinliang David Li69306c02015-10-22 06:15:31 +00008877 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008878
Chris Lattner3e2ee142010-07-07 16:01:42 +00008879 if (!Args.hasArg(options::OPT_nostdlib) &&
8880 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008881 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008882 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008883 CmdArgs.push_back("-lm");
8884 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008885 }
8886
8887 if (!Args.hasArg(options::OPT_nostdlib) &&
8888 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008889 if (Args.hasArg(options::OPT_pthread))
8890 CmdArgs.push_back("-lpthread");
8891 CmdArgs.push_back("-lc");
8892 CmdArgs.push_back("-lCompilerRT-Generic");
8893 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8894 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008895 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008896 }
8897
Logan Chieneb9162f2014-06-26 14:23:45 +00008898 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008899 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008900}
8901
Daniel Dunbarcc912342009-05-02 18:28:39 +00008902/// DragonFly Tools
8903
8904// For now, DragonFly Assemble does just about the same as for
8905// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008906void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8907 const InputInfo &Output,
8908 const InputInfoList &Inputs,
8909 const ArgList &Args,
8910 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008911 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008912 ArgStringList CmdArgs;
8913
8914 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8915 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008916 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008917 CmdArgs.push_back("--32");
8918
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008919 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008920
8921 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008922 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008923
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008924 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008925 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008926
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008927 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008928 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008929}
8930
Douglas Katzman95354292015-06-23 20:42:09 +00008931void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8932 const InputInfo &Output,
8933 const InputInfoList &Inputs,
8934 const ArgList &Args,
8935 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008936 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008937 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008938 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008939
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008940 if (!D.SysRoot.empty())
8941 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8942
John McCall65b8da02013-04-11 22:55:55 +00008943 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008944 if (Args.hasArg(options::OPT_static)) {
8945 CmdArgs.push_back("-Bstatic");
8946 } else {
John McCall65b8da02013-04-11 22:55:55 +00008947 if (Args.hasArg(options::OPT_rdynamic))
8948 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008949 if (Args.hasArg(options::OPT_shared))
8950 CmdArgs.push_back("-Bshareable");
8951 else {
8952 CmdArgs.push_back("-dynamic-linker");
8953 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8954 }
John McCall65b8da02013-04-11 22:55:55 +00008955 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008956 }
8957
8958 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8959 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008960 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008961 CmdArgs.push_back("-m");
8962 CmdArgs.push_back("elf_i386");
8963 }
8964
Daniel Dunbarb440f562010-08-02 02:38:21 +00008965 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008966 CmdArgs.push_back("-o");
8967 CmdArgs.push_back(Output.getFilename());
8968 } else {
8969 assert(Output.isNothing() && "Invalid output.");
8970 }
8971
8972 if (!Args.hasArg(options::OPT_nostdlib) &&
8973 !Args.hasArg(options::OPT_nostartfiles)) {
8974 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008975 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008976 CmdArgs.push_back(
8977 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008978 else {
8979 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008980 CmdArgs.push_back(
8981 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008982 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008983 CmdArgs.push_back(
8984 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008985 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008986 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008987 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008988 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008989 CmdArgs.push_back(
8990 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008991 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008992 CmdArgs.push_back(
8993 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008994 }
8995
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008996 Args.AddAllArgs(CmdArgs,
8997 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008998
Daniel Dunbar54423b22010-09-17 00:24:54 +00008999 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009000
9001 if (!Args.hasArg(options::OPT_nostdlib) &&
9002 !Args.hasArg(options::OPT_nodefaultlibs)) {
9003 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9004 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009005 if (UseGCC47)
9006 CmdArgs.push_back("-L/usr/lib/gcc47");
9007 else
9008 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009009
9010 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009011 if (UseGCC47) {
9012 CmdArgs.push_back("-rpath");
9013 CmdArgs.push_back("/usr/lib/gcc47");
9014 } else {
9015 CmdArgs.push_back("-rpath");
9016 CmdArgs.push_back("/usr/lib/gcc44");
9017 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009018 }
9019
Hans Wennborg70850d82013-07-18 20:29:38 +00009020 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009021 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009022 CmdArgs.push_back("-lm");
9023 }
9024
Daniel Dunbarcc912342009-05-02 18:28:39 +00009025 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009026 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009027
9028 if (!Args.hasArg(options::OPT_nolibc)) {
9029 CmdArgs.push_back("-lc");
9030 }
9031
John McCall65b8da02013-04-11 22:55:55 +00009032 if (UseGCC47) {
9033 if (Args.hasArg(options::OPT_static) ||
9034 Args.hasArg(options::OPT_static_libgcc)) {
9035 CmdArgs.push_back("-lgcc");
9036 CmdArgs.push_back("-lgcc_eh");
9037 } else {
9038 if (Args.hasArg(options::OPT_shared_libgcc)) {
9039 CmdArgs.push_back("-lgcc_pic");
9040 if (!Args.hasArg(options::OPT_shared))
9041 CmdArgs.push_back("-lgcc");
9042 } else {
9043 CmdArgs.push_back("-lgcc");
9044 CmdArgs.push_back("--as-needed");
9045 CmdArgs.push_back("-lgcc_pic");
9046 CmdArgs.push_back("--no-as-needed");
9047 }
9048 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009049 } else {
John McCall65b8da02013-04-11 22:55:55 +00009050 if (Args.hasArg(options::OPT_shared)) {
9051 CmdArgs.push_back("-lgcc_pic");
9052 } else {
9053 CmdArgs.push_back("-lgcc");
9054 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009055 }
9056 }
9057
9058 if (!Args.hasArg(options::OPT_nostdlib) &&
9059 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009060 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009061 CmdArgs.push_back(
9062 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009063 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009064 CmdArgs.push_back(
9065 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9066 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009067 }
9068
Xinliang David Li69306c02015-10-22 06:15:31 +00009069 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009070
Logan Chieneb9162f2014-06-26 14:23:45 +00009071 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009072 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009073}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009074
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009075// Try to find Exe from a Visual Studio distribution. This first tries to find
9076// an installed copy of Visual Studio and, failing that, looks in the PATH,
9077// making sure that whatever executable that's found is not a same-named exe
9078// from clang itself to prevent clang from falling back to itself.
9079static std::string FindVisualStudioExecutable(const ToolChain &TC,
9080 const char *Exe,
9081 const char *ClangProgramPath) {
9082 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9083 std::string visualStudioBinDir;
9084 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9085 visualStudioBinDir)) {
9086 SmallString<128> FilePath(visualStudioBinDir);
9087 llvm::sys::path::append(FilePath, Exe);
9088 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9089 return FilePath.str();
9090 }
9091
9092 return Exe;
9093}
9094
Douglas Katzman95354292015-06-23 20:42:09 +00009095void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9096 const InputInfo &Output,
9097 const InputInfoList &Inputs,
9098 const ArgList &Args,
9099 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009100 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009101 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009102
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009103 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9104 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009105 CmdArgs.push_back(
9106 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009107
9108 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009109 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009110 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009111
Zachary Turner10d75b22014-10-22 20:40:43 +00009112 if (!llvm::sys::Process::GetEnv("LIB")) {
9113 // If the VC environment hasn't been configured (perhaps because the user
9114 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009115 // the environment variable is set however, assume the user knows what
9116 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009117 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009118 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009119 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9120 SmallString<128> LibDir(VisualStudioDir);
9121 llvm::sys::path::append(LibDir, "VC", "lib");
9122 switch (MSVC.getArch()) {
9123 case llvm::Triple::x86:
9124 // x86 just puts the libraries directly in lib
9125 break;
9126 case llvm::Triple::x86_64:
9127 llvm::sys::path::append(LibDir, "amd64");
9128 break;
9129 case llvm::Triple::arm:
9130 llvm::sys::path::append(LibDir, "arm");
9131 break;
9132 default:
9133 break;
9134 }
9135 CmdArgs.push_back(
9136 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009137
9138 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9139 std::string UniversalCRTLibPath;
9140 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9141 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9142 UniversalCRTLibPath.c_str()));
9143 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009144 }
9145
9146 std::string WindowsSdkLibPath;
9147 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9148 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9149 WindowsSdkLibPath.c_str()));
9150 }
9151
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009152 CmdArgs.push_back("-nologo");
9153
Reid Kleckner124955a2015-08-05 18:51:13 +00009154 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009155 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009156
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009157 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009158 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009159 if (DLL) {
9160 CmdArgs.push_back(Args.MakeArgString("-dll"));
9161
9162 SmallString<128> ImplibName(Output.getFilename());
9163 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009164 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009165 }
9166
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009167 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009168 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009169 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009170 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009171 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9172 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009173 // Make sure the dynamic runtime thunk is not optimized out at link time
9174 // to ensure proper SEH handling.
9175 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009176 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009177 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009178 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009179 for (const auto &Lib : {"asan", "asan_cxx"})
9180 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009181 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009182 }
9183
Hans Wennborg2e274592013-08-13 23:38:57 +00009184 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009185
Alexey Bataevc7e84352015-08-19 04:49:01 +00009186 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9187 options::OPT_fno_openmp, false)) {
9188 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9189 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9190 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9191 TC.getDriver().Dir + "/../lib"));
9192 switch (getOpenMPRuntime(getToolChain(), Args)) {
9193 case OMPRT_OMP:
9194 CmdArgs.push_back("-defaultlib:libomp.lib");
9195 break;
9196 case OMPRT_IOMP5:
9197 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9198 break;
9199 case OMPRT_GOMP:
9200 break;
9201 case OMPRT_Unknown:
9202 // Already diagnosed.
9203 break;
9204 }
9205 }
9206
Reid Kleckner337188f2014-09-16 19:22:00 +00009207 // Add filenames, libraries, and other linker inputs.
9208 for (const auto &Input : Inputs) {
9209 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009210 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009211 continue;
9212 }
9213
9214 const Arg &A = Input.getInputArg();
9215
9216 // Render -l options differently for the MSVC linker.
9217 if (A.getOption().matches(options::OPT_l)) {
9218 StringRef Lib = A.getValue();
9219 const char *LinkLibArg;
9220 if (Lib.endswith(".lib"))
9221 LinkLibArg = Args.MakeArgString(Lib);
9222 else
9223 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9224 CmdArgs.push_back(LinkLibArg);
9225 continue;
9226 }
9227
9228 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9229 // or -L. Render it, even if MSVC doesn't understand it.
9230 A.renderAsInput(Args, CmdArgs);
9231 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009232
Zachary Turner719f58c2014-12-01 23:06:47 +00009233 // We need to special case some linker paths. In the case of lld, we need to
9234 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9235 // linker, we need to use a special search algorithm.
9236 llvm::SmallString<128> linkPath;
9237 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9238 if (Linker.equals_lower("lld"))
9239 Linker = "lld-link";
9240
9241 if (Linker.equals_lower("link")) {
9242 // If we're using the MSVC linker, it's not sufficient to just use link
9243 // from the program PATH, because other environments like GnuWin32 install
9244 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009245 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009246 C.getDriver().getClangProgramPath());
9247 } else {
9248 linkPath = Linker;
9249 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009250 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009251 }
9252
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009253 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009254 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009255}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009256
Douglas Katzman95354292015-06-23 20:42:09 +00009257void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9258 const InputInfo &Output,
9259 const InputInfoList &Inputs,
9260 const ArgList &Args,
9261 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009262 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9263}
9264
Douglas Katzman95354292015-06-23 20:42:09 +00009265std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009266 Compilation &C, const JobAction &JA, const InputInfo &Output,
9267 const InputInfoList &Inputs, const ArgList &Args,
9268 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009269 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009270 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009271 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009272 CmdArgs.push_back("/W0"); // No warnings.
9273
9274 // The goal is to be able to invoke this tool correctly based on
9275 // any flag accepted by clang-cl.
9276
9277 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009278 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009279
9280 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009281 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9282 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9283 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009284 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9285 if (A->getOption().getID() == options::OPT_O0) {
9286 CmdArgs.push_back("/Od");
9287 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009288 CmdArgs.push_back("/Og");
9289
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009290 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009291 if (OptLevel == "s" || OptLevel == "z")
9292 CmdArgs.push_back("/Os");
9293 else
9294 CmdArgs.push_back("/Ot");
9295
9296 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009297 }
9298 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009299 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9300 options::OPT_fno_omit_frame_pointer))
9301 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9302 ? "/Oy"
9303 : "/Oy-");
9304 if (!Args.hasArg(options::OPT_fwritable_strings))
9305 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009306
Nico Weber3f8dafb2015-03-12 19:37:10 +00009307 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009308 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9309
David Majnemerf6072342014-07-01 22:24:56 +00009310 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9311 /*default=*/false))
9312 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009313 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9314 options::OPT_fno_function_sections))
9315 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9316 ? "/Gy"
9317 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009318 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9319 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009320 CmdArgs.push_back(
9321 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009322 if (Args.hasArg(options::OPT_fsyntax_only))
9323 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009324 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9325 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009326 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009327
Nico Weber3f8dafb2015-03-12 19:37:10 +00009328 std::vector<std::string> Includes =
9329 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009330 for (const auto &Include : Includes)
9331 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009332
Hans Wennborg87cfa712013-09-19 20:32:16 +00009333 // Flags that can simply be passed through.
9334 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9335 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009336 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009337 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009338
9339 // The order of these flags is relevant, so pick the last one.
9340 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9341 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9342 A->render(Args, CmdArgs);
9343
Hans Wennborg87cfa712013-09-19 20:32:16 +00009344 // Input filename.
9345 assert(Inputs.size() == 1);
9346 const InputInfo &II = Inputs[0];
9347 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9348 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9349 if (II.isFilename())
9350 CmdArgs.push_back(II.getFilename());
9351 else
9352 II.getInputArg().renderAsInput(Args, CmdArgs);
9353
9354 // Output filename.
9355 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009356 const char *Fo =
9357 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009358 CmdArgs.push_back(Fo);
9359
Hans Wennborg188382e2013-09-20 18:16:35 +00009360 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009361 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9362 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009363 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009364 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009365}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009366
Yaron Keren1c0070c2015-07-02 04:45:27 +00009367/// MinGW Tools
9368void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9369 const InputInfo &Output,
9370 const InputInfoList &Inputs,
9371 const ArgList &Args,
9372 const char *LinkingOutput) const {
9373 claimNoWarnArgs(Args);
9374 ArgStringList CmdArgs;
9375
9376 if (getToolChain().getArch() == llvm::Triple::x86) {
9377 CmdArgs.push_back("--32");
9378 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9379 CmdArgs.push_back("--64");
9380 }
9381
9382 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9383
9384 CmdArgs.push_back("-o");
9385 CmdArgs.push_back(Output.getFilename());
9386
9387 for (const auto &II : Inputs)
9388 CmdArgs.push_back(II.getFilename());
9389
9390 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009391 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009392
9393 if (Args.hasArg(options::OPT_gsplit_dwarf))
9394 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9395 SplitDebugName(Args, Inputs[0]));
9396}
9397
9398void MinGW::Linker::AddLibGCC(const ArgList &Args,
9399 ArgStringList &CmdArgs) const {
9400 if (Args.hasArg(options::OPT_mthreads))
9401 CmdArgs.push_back("-lmingwthrd");
9402 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009403
Yaron Kerenaa281332015-08-09 00:24:07 +00009404 // Make use of compiler-rt if --rtlib option is used
9405 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9406 if (RLT == ToolChain::RLT_Libgcc) {
9407 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9408 Args.hasArg(options::OPT_static);
9409 bool Shared = Args.hasArg(options::OPT_shared);
9410 bool CXX = getToolChain().getDriver().CCCIsCXX();
9411
9412 if (Static || (!CXX && !Shared)) {
9413 CmdArgs.push_back("-lgcc");
9414 CmdArgs.push_back("-lgcc_eh");
9415 } else {
9416 CmdArgs.push_back("-lgcc_s");
9417 CmdArgs.push_back("-lgcc");
9418 }
9419 } else {
9420 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9421 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009422
Yaron Keren1c0070c2015-07-02 04:45:27 +00009423 CmdArgs.push_back("-lmoldname");
9424 CmdArgs.push_back("-lmingwex");
9425 CmdArgs.push_back("-lmsvcrt");
9426}
9427
9428void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9429 const InputInfo &Output,
9430 const InputInfoList &Inputs,
9431 const ArgList &Args,
9432 const char *LinkingOutput) const {
9433 const ToolChain &TC = getToolChain();
9434 const Driver &D = TC.getDriver();
9435 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9436
9437 ArgStringList CmdArgs;
9438
9439 // Silence warning for "clang -g foo.o -o foo"
9440 Args.ClaimAllArgs(options::OPT_g_Group);
9441 // and "clang -emit-llvm foo.o -o foo"
9442 Args.ClaimAllArgs(options::OPT_emit_llvm);
9443 // and for "clang -w foo.o -o foo". Other warning options are already
9444 // handled somewhere else.
9445 Args.ClaimAllArgs(options::OPT_w);
9446
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009447 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9448 if (LinkerName.equals_lower("lld")) {
9449 CmdArgs.push_back("-flavor");
9450 CmdArgs.push_back("gnu");
9451 }
9452
Yaron Keren1c0070c2015-07-02 04:45:27 +00009453 if (!D.SysRoot.empty())
9454 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9455
9456 if (Args.hasArg(options::OPT_s))
9457 CmdArgs.push_back("-s");
9458
9459 CmdArgs.push_back("-m");
9460 if (TC.getArch() == llvm::Triple::x86)
9461 CmdArgs.push_back("i386pe");
9462 if (TC.getArch() == llvm::Triple::x86_64)
9463 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009464 if (TC.getArch() == llvm::Triple::arm)
9465 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009466
9467 if (Args.hasArg(options::OPT_mwindows)) {
9468 CmdArgs.push_back("--subsystem");
9469 CmdArgs.push_back("windows");
9470 } else if (Args.hasArg(options::OPT_mconsole)) {
9471 CmdArgs.push_back("--subsystem");
9472 CmdArgs.push_back("console");
9473 }
9474
9475 if (Args.hasArg(options::OPT_static))
9476 CmdArgs.push_back("-Bstatic");
9477 else {
9478 if (Args.hasArg(options::OPT_mdll))
9479 CmdArgs.push_back("--dll");
9480 else if (Args.hasArg(options::OPT_shared))
9481 CmdArgs.push_back("--shared");
9482 CmdArgs.push_back("-Bdynamic");
9483 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9484 CmdArgs.push_back("-e");
9485 if (TC.getArch() == llvm::Triple::x86)
9486 CmdArgs.push_back("_DllMainCRTStartup@12");
9487 else
9488 CmdArgs.push_back("DllMainCRTStartup");
9489 CmdArgs.push_back("--enable-auto-image-base");
9490 }
9491 }
9492
9493 CmdArgs.push_back("-o");
9494 CmdArgs.push_back(Output.getFilename());
9495
9496 Args.AddAllArgs(CmdArgs, options::OPT_e);
9497 // FIXME: add -N, -n flags
9498 Args.AddLastArg(CmdArgs, options::OPT_r);
9499 Args.AddLastArg(CmdArgs, options::OPT_s);
9500 Args.AddLastArg(CmdArgs, options::OPT_t);
9501 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9502 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9503
9504 if (!Args.hasArg(options::OPT_nostdlib) &&
9505 !Args.hasArg(options::OPT_nostartfiles)) {
9506 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9507 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9508 } else {
9509 if (Args.hasArg(options::OPT_municode))
9510 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9511 else
9512 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9513 }
9514 if (Args.hasArg(options::OPT_pg))
9515 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9516 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9517 }
9518
9519 Args.AddAllArgs(CmdArgs, options::OPT_L);
9520 const ToolChain::path_list Paths = TC.getFilePaths();
9521 for (const auto &Path : Paths)
9522 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9523
9524 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9525
9526 // TODO: Add ASan stuff here
9527
9528 // TODO: Add profile stuff here
9529
9530 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9531 !Args.hasArg(options::OPT_nodefaultlibs)) {
9532 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9533 !Args.hasArg(options::OPT_static);
9534 if (OnlyLibstdcxxStatic)
9535 CmdArgs.push_back("-Bstatic");
9536 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9537 if (OnlyLibstdcxxStatic)
9538 CmdArgs.push_back("-Bdynamic");
9539 }
9540
9541 if (!Args.hasArg(options::OPT_nostdlib)) {
9542 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9543 if (Args.hasArg(options::OPT_static))
9544 CmdArgs.push_back("--start-group");
9545
9546 if (Args.hasArg(options::OPT_fstack_protector) ||
9547 Args.hasArg(options::OPT_fstack_protector_strong) ||
9548 Args.hasArg(options::OPT_fstack_protector_all)) {
9549 CmdArgs.push_back("-lssp_nonshared");
9550 CmdArgs.push_back("-lssp");
9551 }
9552 if (Args.hasArg(options::OPT_fopenmp))
9553 CmdArgs.push_back("-lgomp");
9554
9555 AddLibGCC(Args, CmdArgs);
9556
9557 if (Args.hasArg(options::OPT_pg))
9558 CmdArgs.push_back("-lgmon");
9559
Yaron Kerenadce68e2015-07-06 18:52:19 +00009560 if (Args.hasArg(options::OPT_pthread))
9561 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009562
9563 // add system libraries
9564 if (Args.hasArg(options::OPT_mwindows)) {
9565 CmdArgs.push_back("-lgdi32");
9566 CmdArgs.push_back("-lcomdlg32");
9567 }
9568 CmdArgs.push_back("-ladvapi32");
9569 CmdArgs.push_back("-lshell32");
9570 CmdArgs.push_back("-luser32");
9571 CmdArgs.push_back("-lkernel32");
9572
9573 if (Args.hasArg(options::OPT_static))
9574 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009575 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009576 AddLibGCC(Args, CmdArgs);
9577 }
9578
9579 if (!Args.hasArg(options::OPT_nostartfiles)) {
9580 // Add crtfastmath.o if available and fast math is enabled.
9581 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9582
9583 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9584 }
9585 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009586 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009587 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009588}
9589
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009590/// XCore Tools
9591// We pass assemble and link construction to the xcc tool.
9592
Douglas Katzman95354292015-06-23 20:42:09 +00009593void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9594 const InputInfo &Output,
9595 const InputInfoList &Inputs,
9596 const ArgList &Args,
9597 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009598 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009599 ArgStringList CmdArgs;
9600
9601 CmdArgs.push_back("-o");
9602 CmdArgs.push_back(Output.getFilename());
9603
9604 CmdArgs.push_back("-c");
9605
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009606 if (Args.hasArg(options::OPT_v))
9607 CmdArgs.push_back("-v");
9608
Robert Lytton894d25c2014-05-02 09:33:25 +00009609 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9610 if (!A->getOption().matches(options::OPT_g0))
9611 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009612
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009613 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9614 false))
9615 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009616
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009617 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009618
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009619 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009620 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009621
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009622 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009623 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009624}
9625
Douglas Katzman95354292015-06-23 20:42:09 +00009626void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9627 const InputInfo &Output,
9628 const InputInfoList &Inputs,
9629 const ArgList &Args,
9630 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009631 ArgStringList CmdArgs;
9632
9633 if (Output.isFilename()) {
9634 CmdArgs.push_back("-o");
9635 CmdArgs.push_back(Output.getFilename());
9636 } else {
9637 assert(Output.isNothing() && "Invalid output.");
9638 }
9639
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009640 if (Args.hasArg(options::OPT_v))
9641 CmdArgs.push_back("-v");
9642
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009643 // Pass -fexceptions through to the linker if it was present.
9644 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9645 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009646 CmdArgs.push_back("-fexceptions");
9647
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009648 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9649
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009650 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009651 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009652}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009653
Douglas Katzman95354292015-06-23 20:42:09 +00009654void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9655 const InputInfo &Output,
9656 const InputInfoList &Inputs,
9657 const ArgList &Args,
9658 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009659 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009660 const auto &TC =
9661 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9662 ArgStringList CmdArgs;
9663 const char *Exec;
9664
9665 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009666 default:
9667 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009668 case llvm::Triple::arm:
9669 case llvm::Triple::thumb:
9670 break;
9671 case llvm::Triple::x86:
9672 CmdArgs.push_back("--32");
9673 break;
9674 case llvm::Triple::x86_64:
9675 CmdArgs.push_back("--64");
9676 break;
9677 }
9678
9679 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9680
9681 CmdArgs.push_back("-o");
9682 CmdArgs.push_back(Output.getFilename());
9683
9684 for (const auto &Input : Inputs)
9685 CmdArgs.push_back(Input.getFilename());
9686
9687 const std::string Assembler = TC.GetProgramPath("as");
9688 Exec = Args.MakeArgString(Assembler);
9689
Justin Bognerd3371d82015-07-17 03:35:54 +00009690 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009691}
9692
Douglas Katzman95354292015-06-23 20:42:09 +00009693void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9694 const InputInfo &Output,
9695 const InputInfoList &Inputs,
9696 const ArgList &Args,
9697 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009698 const auto &TC =
9699 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9700 const llvm::Triple &T = TC.getTriple();
9701 const Driver &D = TC.getDriver();
9702 SmallString<128> EntryPoint;
9703 ArgStringList CmdArgs;
9704 const char *Exec;
9705
9706 // Silence warning for "clang -g foo.o -o foo"
9707 Args.ClaimAllArgs(options::OPT_g_Group);
9708 // and "clang -emit-llvm foo.o -o foo"
9709 Args.ClaimAllArgs(options::OPT_emit_llvm);
9710 // and for "clang -w foo.o -o foo"
9711 Args.ClaimAllArgs(options::OPT_w);
9712 // Other warning options are already handled somewhere else.
9713
9714 if (!D.SysRoot.empty())
9715 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9716
9717 if (Args.hasArg(options::OPT_pie))
9718 CmdArgs.push_back("-pie");
9719 if (Args.hasArg(options::OPT_rdynamic))
9720 CmdArgs.push_back("-export-dynamic");
9721 if (Args.hasArg(options::OPT_s))
9722 CmdArgs.push_back("--strip-all");
9723
9724 CmdArgs.push_back("-m");
9725 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009726 default:
9727 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009728 case llvm::Triple::arm:
9729 case llvm::Triple::thumb:
9730 // FIXME: this is incorrect for WinCE
9731 CmdArgs.push_back("thumb2pe");
9732 break;
9733 case llvm::Triple::x86:
9734 CmdArgs.push_back("i386pe");
9735 EntryPoint.append("_");
9736 break;
9737 case llvm::Triple::x86_64:
9738 CmdArgs.push_back("i386pep");
9739 break;
9740 }
9741
9742 if (Args.hasArg(options::OPT_shared)) {
9743 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009744 default:
9745 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009746 case llvm::Triple::arm:
9747 case llvm::Triple::thumb:
9748 case llvm::Triple::x86_64:
9749 EntryPoint.append("_DllMainCRTStartup");
9750 break;
9751 case llvm::Triple::x86:
9752 EntryPoint.append("_DllMainCRTStartup@12");
9753 break;
9754 }
9755
9756 CmdArgs.push_back("-shared");
9757 CmdArgs.push_back("-Bdynamic");
9758
9759 CmdArgs.push_back("--enable-auto-image-base");
9760
9761 CmdArgs.push_back("--entry");
9762 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9763 } else {
9764 EntryPoint.append("mainCRTStartup");
9765
9766 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9767 : "-Bdynamic");
9768
9769 if (!Args.hasArg(options::OPT_nostdlib) &&
9770 !Args.hasArg(options::OPT_nostartfiles)) {
9771 CmdArgs.push_back("--entry");
9772 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9773 }
9774
9775 // FIXME: handle subsystem
9776 }
9777
9778 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009779 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009780
9781 CmdArgs.push_back("-o");
9782 CmdArgs.push_back(Output.getFilename());
9783
9784 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9785 SmallString<261> ImpLib(Output.getFilename());
9786 llvm::sys::path::replace_extension(ImpLib, ".lib");
9787
9788 CmdArgs.push_back("--out-implib");
9789 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9790 }
9791
9792 if (!Args.hasArg(options::OPT_nostdlib) &&
9793 !Args.hasArg(options::OPT_nostartfiles)) {
9794 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9795 const char *CRTBegin;
9796
9797 CRTBegin =
9798 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9799 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9800 }
9801
9802 Args.AddAllArgs(CmdArgs, options::OPT_L);
9803
9804 const auto &Paths = TC.getFilePaths();
9805 for (const auto &Path : Paths)
9806 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9807
9808 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9809
9810 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9811 !Args.hasArg(options::OPT_nodefaultlibs)) {
9812 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9813 !Args.hasArg(options::OPT_static);
9814 if (StaticCXX)
9815 CmdArgs.push_back("-Bstatic");
9816 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9817 if (StaticCXX)
9818 CmdArgs.push_back("-Bdynamic");
9819 }
9820
9821 if (!Args.hasArg(options::OPT_nostdlib)) {
9822 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9823 // TODO handle /MT[d] /MD[d]
9824 CmdArgs.push_back("-lmsvcrt");
9825 AddRunTimeLibs(TC, D, CmdArgs, Args);
9826 }
9827 }
9828
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009829 if (TC.getSanitizerArgs().needsAsanRt()) {
9830 // TODO handle /MT[d] /MD[d]
9831 if (Args.hasArg(options::OPT_shared)) {
9832 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9833 } else {
9834 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9835 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9836 // Make sure the dynamic runtime thunk is not optimized out at link time
9837 // to ensure proper SEH handling.
9838 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9839 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9840 ? "___asan_seh_interceptor"
9841 : "__asan_seh_interceptor"));
9842 }
9843 }
9844
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009845 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009846
Justin Bognerd3371d82015-07-17 03:35:54 +00009847 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009848}
Douglas Katzman84a75642015-06-19 14:55:19 +00009849
Douglas Katzman95354292015-06-23 20:42:09 +00009850void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9851 const InputInfo &Output,
9852 const InputInfoList &Inputs,
9853 const ArgList &Args,
9854 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009855
9856 ArgStringList CmdArgs;
9857
9858 assert(Inputs.size() == 1);
9859 const InputInfo &II = Inputs[0];
9860 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9861 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9862
Douglas Katzman84a75642015-06-19 14:55:19 +00009863 CmdArgs.push_back("-DMYRIAD2");
9864 CmdArgs.push_back("-mcpu=myriad2");
9865 CmdArgs.push_back("-S");
9866
Douglas Katzmanf6071112015-08-03 14:34:22 +00009867 // Append all -I, -iquote, -isystem paths, defines/undefines,
9868 // 'f' flags, optimize flags, and warning options.
9869 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009870 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9871 options::OPT_D, options::OPT_U,
9872 options::OPT_f_Group, options::OPT_f_clang_Group,
9873 options::OPT_g_Group, options::OPT_M_Group,
9874 options::OPT_O_Group, options::OPT_W_Group});
9875
9876 // If we're producing a dependency file, and assembly is the final action,
9877 // then the name of the target in the dependency file should be the '.o'
9878 // file, not the '.s' file produced by this step. For example, instead of
9879 // /tmp/mumble.s: mumble.c .../someheader.h
9880 // the filename on the lefthand side should be "mumble.o"
9881 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9882 C.getActions().size() == 1 &&
9883 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9884 Arg *A = Args.getLastArg(options::OPT_o);
9885 if (A) {
9886 CmdArgs.push_back("-MT");
9887 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9888 }
9889 }
9890
Douglas Katzman84a75642015-06-19 14:55:19 +00009891 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9892
9893 CmdArgs.push_back(II.getFilename());
9894 CmdArgs.push_back("-o");
9895 CmdArgs.push_back(Output.getFilename());
9896
9897 std::string Exec =
9898 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009899 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9900 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009901}
9902
Douglas Katzman95354292015-06-23 20:42:09 +00009903void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9904 const InputInfo &Output,
9905 const InputInfoList &Inputs,
9906 const ArgList &Args,
9907 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009908 ArgStringList CmdArgs;
9909
9910 assert(Inputs.size() == 1);
9911 const InputInfo &II = Inputs[0];
9912 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9913 assert(Output.getType() == types::TY_Object);
9914
9915 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009916 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009917 CmdArgs.push_back("-noSPrefixing");
9918 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009919 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9920 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9921 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009922 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009923 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009924 }
9925 CmdArgs.push_back("-elf"); // Output format.
9926 CmdArgs.push_back(II.getFilename());
9927 CmdArgs.push_back(
9928 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9929
9930 std::string Exec =
9931 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009932 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9933 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009934}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009935
9936void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9937 const InputInfo &Output,
9938 const InputInfoList &Inputs,
9939 const ArgList &Args,
9940 const char *LinkingOutput) const {
9941 const auto &TC =
9942 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9943 const llvm::Triple &T = TC.getTriple();
9944 ArgStringList CmdArgs;
9945 bool UseStartfiles = !Args.hasArg(options::OPT_nostartfiles);
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009946 bool UseDefaultLibs = !Args.hasArg(options::OPT_nostdlib) &&
9947 !Args.hasArg(options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009948
9949 std::string StartFilesDir, BuiltinLibDir;
9950 TC.getCompilerSupportDir(StartFilesDir);
9951 TC.getBuiltinLibDir(BuiltinLibDir);
9952
9953 if (T.getArch() == llvm::Triple::sparc)
9954 CmdArgs.push_back("-EB");
9955 else // SHAVE assumes little-endian, and sparcel is expressly so.
9956 CmdArgs.push_back("-EL");
9957
9958 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9959 // but we never pass through a --sysroot option and various other bits.
9960 // For example, there are no sanitizers (yet) nor gold linker.
9961
9962 // Eat some arguments that may be present but have no effect.
9963 Args.ClaimAllArgs(options::OPT_g_Group);
9964 Args.ClaimAllArgs(options::OPT_w);
9965 Args.ClaimAllArgs(options::OPT_static_libgcc);
9966
9967 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9968 CmdArgs.push_back("-s");
9969
9970 CmdArgs.push_back("-o");
9971 CmdArgs.push_back(Output.getFilename());
9972
9973 if (UseStartfiles) {
9974 // If you want startfiles, it means you want the builtin crti and crtbegin,
9975 // but not crt0. Myriad link commands provide their own crt0.o as needed.
9976 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crti.o"));
9977 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtbegin.o"));
9978 }
9979
9980 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
9981 options::OPT_e, options::OPT_s, options::OPT_t,
9982 options::OPT_Z_Flag, options::OPT_r});
9983
Douglas Katzman526b5f92015-10-21 19:33:54 +00009984 // The linker doesn't use these builtin paths unless directed to,
9985 // because it was not compiled for support with sysroots, nor does
9986 // it have a default of little-endian with FPU.
9987 CmdArgs.push_back(Args.MakeArgString("-L" + BuiltinLibDir));
9988 CmdArgs.push_back(Args.MakeArgString("-L" + StartFilesDir));
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009989
9990 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9991
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009992 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +00009993 if (C.getDriver().CCCIsCXX())
9994 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009995 if (T.getOS() == llvm::Triple::RTEMS) {
9996 CmdArgs.push_back("--start-group");
9997 CmdArgs.push_back("-lc");
9998 // You must provide your own "-L" option to enable finding these.
9999 CmdArgs.push_back("-lrtemscpu");
10000 CmdArgs.push_back("-lrtemsbsp");
10001 CmdArgs.push_back("--end-group");
10002 } else {
10003 CmdArgs.push_back("-lc");
10004 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010005 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010006 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010007 if (UseStartfiles) {
10008 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtend.o"));
10009 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtn.o"));
10010 }
10011
10012 std::string Exec =
10013 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10014 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10015 CmdArgs, Inputs));
10016}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010017
10018void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10019 const InputInfo &Output,
10020 const InputInfoList &Inputs,
10021 const ArgList &Args,
10022 const char *LinkingOutput) const {
10023 claimNoWarnArgs(Args);
10024 ArgStringList CmdArgs;
10025
10026 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10027
10028 CmdArgs.push_back("-o");
10029 CmdArgs.push_back(Output.getFilename());
10030
10031 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10032 const InputInfo &Input = Inputs[0];
10033 assert(Input.isFilename() && "Invalid input.");
10034 CmdArgs.push_back(Input.getFilename());
10035
10036 const char *Exec =
10037 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10038 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10039}
10040
10041static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
10042 ArgStringList &CmdArgs) {
10043 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
10044 false) ||
10045 Args.hasArg(options::OPT_fprofile_generate) ||
10046 Args.hasArg(options::OPT_fprofile_instr_generate) ||
10047 Args.hasArg(options::OPT_fcreate_profile) ||
10048 Args.hasArg(options::OPT_coverage)))
10049 return;
10050
10051 assert(TC.getTriple().isPS4CPU() &&
10052 "Profiling libraries are only implemented for the PS4 CPU");
10053 CmdArgs.push_back("-lclang_rt.profile-x86_64");
10054}
10055
10056static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10057 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10058 if (SanArgs.needsUbsanRt()) {
10059 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10060 }
10061 if (SanArgs.needsAsanRt()) {
10062 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10063 }
10064}
10065
10066static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10067 const JobAction &JA, const InputInfo &Output,
10068 const InputInfoList &Inputs,
10069 const ArgList &Args,
10070 const char *LinkingOutput) {
10071 const toolchains::FreeBSD &ToolChain =
10072 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10073 const Driver &D = ToolChain.getDriver();
10074 ArgStringList CmdArgs;
10075
10076 // Silence warning for "clang -g foo.o -o foo"
10077 Args.ClaimAllArgs(options::OPT_g_Group);
10078 // and "clang -emit-llvm foo.o -o foo"
10079 Args.ClaimAllArgs(options::OPT_emit_llvm);
10080 // and for "clang -w foo.o -o foo". Other warning options are already
10081 // handled somewhere else.
10082 Args.ClaimAllArgs(options::OPT_w);
10083
10084 if (!D.SysRoot.empty())
10085 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10086
10087 if (Args.hasArg(options::OPT_pie))
10088 CmdArgs.push_back("-pie");
10089
10090 if (Args.hasArg(options::OPT_rdynamic))
10091 CmdArgs.push_back("-export-dynamic");
10092 if (Args.hasArg(options::OPT_shared))
10093 CmdArgs.push_back("--oformat=so");
10094
10095 if (Output.isFilename()) {
10096 CmdArgs.push_back("-o");
10097 CmdArgs.push_back(Output.getFilename());
10098 } else {
10099 assert(Output.isNothing() && "Invalid output.");
10100 }
10101
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010102 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10103
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010104 Args.AddAllArgs(CmdArgs, options::OPT_L);
10105 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10106 Args.AddAllArgs(CmdArgs, options::OPT_e);
10107 Args.AddAllArgs(CmdArgs, options::OPT_s);
10108 Args.AddAllArgs(CmdArgs, options::OPT_t);
10109 Args.AddAllArgs(CmdArgs, options::OPT_r);
10110
10111 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10112 CmdArgs.push_back("--no-demangle");
10113
10114 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10115
10116 if (Args.hasArg(options::OPT_pthread)) {
10117 CmdArgs.push_back("-lpthread");
10118 }
10119
10120 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010121
10122 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10123
10124 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10125}
10126
10127static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10128 const JobAction &JA, const InputInfo &Output,
10129 const InputInfoList &Inputs,
10130 const ArgList &Args,
10131 const char *LinkingOutput) {
10132 const toolchains::FreeBSD &ToolChain =
10133 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10134 const Driver &D = ToolChain.getDriver();
10135 ArgStringList CmdArgs;
10136
10137 // Silence warning for "clang -g foo.o -o foo"
10138 Args.ClaimAllArgs(options::OPT_g_Group);
10139 // and "clang -emit-llvm foo.o -o foo"
10140 Args.ClaimAllArgs(options::OPT_emit_llvm);
10141 // and for "clang -w foo.o -o foo". Other warning options are already
10142 // handled somewhere else.
10143 Args.ClaimAllArgs(options::OPT_w);
10144
10145 if (!D.SysRoot.empty())
10146 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10147
10148 if (Args.hasArg(options::OPT_pie))
10149 CmdArgs.push_back("-pie");
10150
10151 if (Args.hasArg(options::OPT_static)) {
10152 CmdArgs.push_back("-Bstatic");
10153 } else {
10154 if (Args.hasArg(options::OPT_rdynamic))
10155 CmdArgs.push_back("-export-dynamic");
10156 CmdArgs.push_back("--eh-frame-hdr");
10157 if (Args.hasArg(options::OPT_shared)) {
10158 CmdArgs.push_back("-Bshareable");
10159 } else {
10160 CmdArgs.push_back("-dynamic-linker");
10161 CmdArgs.push_back("/libexec/ld-elf.so.1");
10162 }
10163 CmdArgs.push_back("--enable-new-dtags");
10164 }
10165
10166 if (Output.isFilename()) {
10167 CmdArgs.push_back("-o");
10168 CmdArgs.push_back(Output.getFilename());
10169 } else {
10170 assert(Output.isNothing() && "Invalid output.");
10171 }
10172
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010173 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10174
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010175 if (!Args.hasArg(options::OPT_nostdlib) &&
10176 !Args.hasArg(options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010177 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010178 if (!Args.hasArg(options::OPT_shared)) {
10179 if (Args.hasArg(options::OPT_pg))
10180 crt1 = "gcrt1.o";
10181 else if (Args.hasArg(options::OPT_pie))
10182 crt1 = "Scrt1.o";
10183 else
10184 crt1 = "crt1.o";
10185 }
10186 if (crt1)
10187 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10188
10189 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10190
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010191 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010192 if (Args.hasArg(options::OPT_static))
10193 crtbegin = "crtbeginT.o";
10194 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10195 crtbegin = "crtbeginS.o";
10196 else
10197 crtbegin = "crtbegin.o";
10198
10199 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10200 }
10201
10202 Args.AddAllArgs(CmdArgs, options::OPT_L);
10203
10204 const ToolChain::path_list Paths = ToolChain.getFilePaths();
10205 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
10206 i != e; ++i)
10207 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
10208
10209 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10210 Args.AddAllArgs(CmdArgs, options::OPT_e);
10211 Args.AddAllArgs(CmdArgs, options::OPT_s);
10212 Args.AddAllArgs(CmdArgs, options::OPT_t);
10213 Args.AddAllArgs(CmdArgs, options::OPT_r);
10214
10215 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10216 CmdArgs.push_back("--no-demangle");
10217
10218 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10219
10220 if (!Args.hasArg(options::OPT_nostdlib) &&
10221 !Args.hasArg(options::OPT_nodefaultlibs)) {
10222 // For PS4, we always want to pass libm, libstdc++ and libkernel
10223 // libraries for both C and C++ compilations.
10224 CmdArgs.push_back("-lkernel");
10225 if (D.CCCIsCXX()) {
10226 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10227 if (Args.hasArg(options::OPT_pg))
10228 CmdArgs.push_back("-lm_p");
10229 else
10230 CmdArgs.push_back("-lm");
10231 }
10232 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10233 // the default system libraries. Just mimic this for now.
10234 if (Args.hasArg(options::OPT_pg))
10235 CmdArgs.push_back("-lgcc_p");
10236 else
10237 CmdArgs.push_back("-lcompiler_rt");
10238 if (Args.hasArg(options::OPT_static)) {
10239 CmdArgs.push_back("-lstdc++");
10240 } else if (Args.hasArg(options::OPT_pg)) {
10241 CmdArgs.push_back("-lgcc_eh_p");
10242 } else {
10243 CmdArgs.push_back("--as-needed");
10244 CmdArgs.push_back("-lstdc++");
10245 CmdArgs.push_back("--no-as-needed");
10246 }
10247
10248 if (Args.hasArg(options::OPT_pthread)) {
10249 if (Args.hasArg(options::OPT_pg))
10250 CmdArgs.push_back("-lpthread_p");
10251 else
10252 CmdArgs.push_back("-lpthread");
10253 }
10254
10255 if (Args.hasArg(options::OPT_pg)) {
10256 if (Args.hasArg(options::OPT_shared))
10257 CmdArgs.push_back("-lc");
10258 else {
10259 if (Args.hasArg(options::OPT_static)) {
10260 CmdArgs.push_back("--start-group");
10261 CmdArgs.push_back("-lc_p");
10262 CmdArgs.push_back("-lpthread_p");
10263 CmdArgs.push_back("--end-group");
10264 } else {
10265 CmdArgs.push_back("-lc_p");
10266 }
10267 }
10268 CmdArgs.push_back("-lgcc_p");
10269 } else {
10270 if (Args.hasArg(options::OPT_static)) {
10271 CmdArgs.push_back("--start-group");
10272 CmdArgs.push_back("-lc");
10273 CmdArgs.push_back("-lpthread");
10274 CmdArgs.push_back("--end-group");
10275 } else {
10276 CmdArgs.push_back("-lc");
10277 }
10278 CmdArgs.push_back("-lcompiler_rt");
10279 }
10280
10281 if (Args.hasArg(options::OPT_static)) {
10282 CmdArgs.push_back("-lstdc++");
10283 } else if (Args.hasArg(options::OPT_pg)) {
10284 CmdArgs.push_back("-lgcc_eh_p");
10285 } else {
10286 CmdArgs.push_back("--as-needed");
10287 CmdArgs.push_back("-lstdc++");
10288 CmdArgs.push_back("--no-as-needed");
10289 }
10290 }
10291
10292 if (!Args.hasArg(options::OPT_nostdlib) &&
10293 !Args.hasArg(options::OPT_nostartfiles)) {
10294 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10295 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10296 else
10297 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10298 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10299 }
10300
10301 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010302
10303 const char *Exec =
10304#ifdef LLVM_ON_WIN32
10305 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10306#else
10307 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10308#endif
10309
10310 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10311}
10312
10313void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10314 const InputInfo &Output,
10315 const InputInfoList &Inputs,
10316 const ArgList &Args,
10317 const char *LinkingOutput) const {
10318 const toolchains::FreeBSD &ToolChain =
10319 static_cast<const toolchains::FreeBSD &>(getToolChain());
10320 const Driver &D = ToolChain.getDriver();
10321 bool PS4Linker;
10322 StringRef LinkerOptName;
10323 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10324 LinkerOptName = A->getValue();
10325 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10326 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10327 }
10328
10329 if (LinkerOptName == "gold")
10330 PS4Linker = false;
10331 else if (LinkerOptName == "ps4")
10332 PS4Linker = true;
10333 else
10334 PS4Linker = !Args.hasArg(options::OPT_shared);
10335
10336 if (PS4Linker)
10337 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10338 else
10339 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10340}