blob: 0870df4a34a557389fade062796c3b60c6e09a25 [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
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001118std::string mips::getMipsABILibSuffix(const ArgList &Args,
1119 const llvm::Triple &Triple) {
1120 StringRef CPUName, ABIName;
1121 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1122 return llvm::StringSwitch<std::string>(ABIName)
1123 .Case("o32", "")
1124 .Case("n32", "32")
1125 .Case("n64", "64");
1126}
1127
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001128// Convert ABI name to the GNU tools acceptable variant.
1129static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1130 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001131 .Case("o32", "32")
1132 .Case("n64", "64")
1133 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001134}
1135
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001136// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1137// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001138static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1139 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001140 if (Arg *A =
1141 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1142 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001143 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001144 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001145 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001146 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001147 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001148 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1149 .Case("soft", mips::FloatABI::Soft)
1150 .Case("hard", mips::FloatABI::Hard)
1151 .Default(mips::FloatABI::Invalid);
1152 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001153 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001154 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001155 }
1156 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001157 }
1158
1159 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001160 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001161 // Assume "hard", because it's a default value used by gcc.
1162 // When we start to recognize specific target MIPS processors,
1163 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001164 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001165 }
1166
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001167 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1168 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001169}
1170
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001171static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001172 std::vector<const char *> &Features,
1173 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001174 StringRef FeatureName) {
1175 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001176 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001177 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001178 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001179 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001180 }
1181}
1182
Daniel Sanders379d44b2014-07-16 11:52:23 +00001183static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1184 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001185 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001186 StringRef CPUName;
1187 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001188 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001189 ABIName = getGnuCompatibleMipsABIName(ABIName);
1190
Daniel Sandersfeb61302014-08-08 15:47:17 +00001191 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1192 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001193
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001194 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1195 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001196 // FIXME: Note, this is a hack. We need to pass the selected float
1197 // mode to the MipsTargetInfoBase to define appropriate macros there.
1198 // Now it is the only method.
1199 Features.push_back("+soft-float");
1200 }
1201
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001202 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001203 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001204 if (Val == "2008") {
1205 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1206 Features.push_back("+nan2008");
1207 else {
1208 Features.push_back("-nan2008");
1209 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1210 }
1211 } else if (Val == "legacy") {
1212 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1213 Features.push_back("-nan2008");
1214 else {
1215 Features.push_back("+nan2008");
1216 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1217 }
1218 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001219 D.Diag(diag::err_drv_unsupported_option_argument)
1220 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001221 }
1222
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001223 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1224 options::OPT_mdouble_float, "single-float");
1225 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1226 "mips16");
1227 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1228 options::OPT_mno_micromips, "micromips");
1229 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1230 "dsp");
1231 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1232 "dspr2");
1233 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1234 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001235
1236 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1237 // pass -mfpxx
1238 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1239 options::OPT_mfp64)) {
1240 if (A->getOption().matches(options::OPT_mfp32))
1241 Features.push_back(Args.MakeArgString("-fp64"));
1242 else if (A->getOption().matches(options::OPT_mfpxx)) {
1243 Features.push_back(Args.MakeArgString("+fpxx"));
1244 Features.push_back(Args.MakeArgString("+nooddspreg"));
1245 } else
1246 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001247 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001248 Features.push_back(Args.MakeArgString("+fpxx"));
1249 Features.push_back(Args.MakeArgString("+nooddspreg"));
1250 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001251
Daniel Sanders28e5d392014-07-10 10:39:51 +00001252 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1253 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001254}
1255
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001256void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001257 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001258 const Driver &D = getToolChain().getDriver();
1259 StringRef CPUName;
1260 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001261 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001262 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001263
1264 CmdArgs.push_back("-target-abi");
1265 CmdArgs.push_back(ABIName.data());
1266
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001267 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1268 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001269 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001270 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001271 CmdArgs.push_back("-mfloat-abi");
1272 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001273 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001274 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001275 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001276 CmdArgs.push_back("-mfloat-abi");
1277 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001278 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001279
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001280 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1281 if (A->getOption().matches(options::OPT_mxgot)) {
1282 CmdArgs.push_back("-mllvm");
1283 CmdArgs.push_back("-mxgot");
1284 }
1285 }
1286
Simon Atanasyanc580b322013-05-11 06:33:44 +00001287 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1288 options::OPT_mno_ldc1_sdc1)) {
1289 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1290 CmdArgs.push_back("-mllvm");
1291 CmdArgs.push_back("-mno-ldc1-sdc1");
1292 }
1293 }
1294
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001295 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1296 options::OPT_mno_check_zero_division)) {
1297 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1298 CmdArgs.push_back("-mllvm");
1299 CmdArgs.push_back("-mno-check-zero-division");
1300 }
1301 }
1302
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001303 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001304 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001305 CmdArgs.push_back("-mllvm");
1306 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1307 A->claim();
1308 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001309}
1310
Hal Finkel8eb59282012-06-11 22:35:19 +00001311/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1312static std::string getPPCTargetCPU(const ArgList &Args) {
1313 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001314 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001315
1316 if (CPUName == "native") {
1317 std::string CPU = llvm::sys::getHostCPUName();
1318 if (!CPU.empty() && CPU != "generic")
1319 return CPU;
1320 else
1321 return "";
1322 }
1323
1324 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001325 .Case("common", "generic")
1326 .Case("440", "440")
1327 .Case("440fp", "440")
1328 .Case("450", "450")
1329 .Case("601", "601")
1330 .Case("602", "602")
1331 .Case("603", "603")
1332 .Case("603e", "603e")
1333 .Case("603ev", "603ev")
1334 .Case("604", "604")
1335 .Case("604e", "604e")
1336 .Case("620", "620")
1337 .Case("630", "pwr3")
1338 .Case("G3", "g3")
1339 .Case("7400", "7400")
1340 .Case("G4", "g4")
1341 .Case("7450", "7450")
1342 .Case("G4+", "g4+")
1343 .Case("750", "750")
1344 .Case("970", "970")
1345 .Case("G5", "g5")
1346 .Case("a2", "a2")
1347 .Case("a2q", "a2q")
1348 .Case("e500mc", "e500mc")
1349 .Case("e5500", "e5500")
1350 .Case("power3", "pwr3")
1351 .Case("power4", "pwr4")
1352 .Case("power5", "pwr5")
1353 .Case("power5x", "pwr5x")
1354 .Case("power6", "pwr6")
1355 .Case("power6x", "pwr6x")
1356 .Case("power7", "pwr7")
1357 .Case("power8", "pwr8")
1358 .Case("pwr3", "pwr3")
1359 .Case("pwr4", "pwr4")
1360 .Case("pwr5", "pwr5")
1361 .Case("pwr5x", "pwr5x")
1362 .Case("pwr6", "pwr6")
1363 .Case("pwr6x", "pwr6x")
1364 .Case("pwr7", "pwr7")
1365 .Case("pwr8", "pwr8")
1366 .Case("powerpc", "ppc")
1367 .Case("powerpc64", "ppc64")
1368 .Case("powerpc64le", "ppc64le")
1369 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001370 }
1371
1372 return "";
1373}
1374
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001375static void getPPCTargetFeatures(const ArgList &Args,
1376 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001377 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1378 StringRef Name = A->getOption().getName();
1379 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001380
1381 // Skip over "-m".
1382 assert(Name.startswith("m") && "Invalid feature name.");
1383 Name = Name.substr(1);
1384
1385 bool IsNegative = Name.startswith("no-");
1386 if (IsNegative)
1387 Name = Name.substr(3);
1388
1389 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1390 // pass the correct option to the backend while calling the frontend
1391 // option the same.
1392 // TODO: Change the LLVM backend option maybe?
1393 if (Name == "mfcrf")
1394 Name = "mfocrf";
1395
1396 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1397 }
1398
1399 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001400 AddTargetFeature(Args, Features, options::OPT_faltivec,
1401 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001402}
1403
Ulrich Weigand8afad612014-07-28 13:17:52 +00001404void Clang::AddPPCTargetArgs(const ArgList &Args,
1405 ArgStringList &CmdArgs) const {
1406 // Select the ABI to use.
1407 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001408 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001409 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001410 case llvm::Triple::ppc64: {
1411 // When targeting a processor that supports QPX, or if QPX is
1412 // specifically enabled, default to using the ABI that supports QPX (so
1413 // long as it is not specifically disabled).
1414 bool HasQPX = false;
1415 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1416 HasQPX = A->getValue() == StringRef("a2q");
1417 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1418 if (HasQPX) {
1419 ABIName = "elfv1-qpx";
1420 break;
1421 }
1422
Ulrich Weigand8afad612014-07-28 13:17:52 +00001423 ABIName = "elfv1";
1424 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001425 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001426 case llvm::Triple::ppc64le:
1427 ABIName = "elfv2";
1428 break;
1429 default:
1430 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001431 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001432
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001433 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1434 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1435 // the option if given as we don't have backend support for any targets
1436 // that don't use the altivec abi.
1437 if (StringRef(A->getValue()) != "altivec")
1438 ABIName = A->getValue();
1439
Ulrich Weigand8afad612014-07-28 13:17:52 +00001440 if (ABIName) {
1441 CmdArgs.push_back("-target-abi");
1442 CmdArgs.push_back(ABIName);
1443 }
1444}
1445
1446bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1447 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1448 return A && (A->getValue() == StringRef(Value));
1449}
1450
Tom Stellard6674c702013-04-01 20:56:53 +00001451/// Get the (LLVM) name of the R600 gpu we are targeting.
1452static std::string getR600TargetGPU(const ArgList &Args) {
1453 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001454 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001455 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001456 .Cases("rv630", "rv635", "r600")
1457 .Cases("rv610", "rv620", "rs780", "rs880")
1458 .Case("rv740", "rv770")
1459 .Case("palm", "cedar")
1460 .Cases("sumo", "sumo2", "sumo")
1461 .Case("hemlock", "cypress")
1462 .Case("aruba", "cayman")
1463 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001464 }
1465 return "";
1466}
1467
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001468void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001469 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001470 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001471 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001472
James Y Knightb2406522015-06-15 20:51:24 +00001473 bool SoftFloatABI = false;
1474 if (Arg *A =
1475 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001476 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001477 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001478 }
1479
James Y Knightb2406522015-06-15 20:51:24 +00001480 // Only the hard-float ABI on Sparc is standardized, and it is the
1481 // default. GCC also supports a nonstandard soft-float ABI mode, and
1482 // perhaps LLVM should implement that, too. However, since llvm
1483 // currently does not support Sparc soft-float, at all, display an
1484 // error if it's requested.
1485 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001486 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1487 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001488 }
1489}
1490
Richard Sandiford4652d892013-07-19 16:51:51 +00001491static const char *getSystemZTargetCPU(const ArgList &Args) {
1492 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1493 return A->getValue();
1494 return "z10";
1495}
1496
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001497static void getSystemZTargetFeatures(const ArgList &Args,
1498 std::vector<const char *> &Features) {
1499 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001500 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001501 if (A->getOption().matches(options::OPT_mhtm))
1502 Features.push_back("+transactional-execution");
1503 else
1504 Features.push_back("-transactional-execution");
1505 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001506 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001507 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001508 if (A->getOption().matches(options::OPT_mvx))
1509 Features.push_back("+vector");
1510 else
1511 Features.push_back("-vector");
1512 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001513}
1514
Chandler Carruth953fb082013-01-13 11:46:33 +00001515static const char *getX86TargetCPU(const ArgList &Args,
1516 const llvm::Triple &Triple) {
1517 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001518 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001519 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001520 return "core-avx2";
1521
Chandler Carruth953fb082013-01-13 11:46:33 +00001522 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001523 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001524
1525 // FIXME: Reject attempts to use -march=native unless the target matches
1526 // the host.
1527 //
1528 // FIXME: We should also incorporate the detected target features for use
1529 // with -native.
1530 std::string CPU = llvm::sys::getHostCPUName();
1531 if (!CPU.empty() && CPU != "generic")
1532 return Args.MakeArgString(CPU);
1533 }
1534
Reid Kleckner3123eff2015-06-30 16:32:04 +00001535 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1536 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1537 StringRef Arch = A->getValue();
1538 const char *CPU;
1539 if (Triple.getArch() == llvm::Triple::x86) {
1540 CPU = llvm::StringSwitch<const char *>(Arch)
1541 .Case("IA32", "i386")
1542 .Case("SSE", "pentium3")
1543 .Case("SSE2", "pentium4")
1544 .Case("AVX", "sandybridge")
1545 .Case("AVX2", "haswell")
1546 .Default(nullptr);
1547 } else {
1548 CPU = llvm::StringSwitch<const char *>(Arch)
1549 .Case("AVX", "sandybridge")
1550 .Case("AVX2", "haswell")
1551 .Default(nullptr);
1552 }
1553 if (CPU)
1554 return CPU;
1555 }
1556
Chandler Carruth953fb082013-01-13 11:46:33 +00001557 // Select the default CPU if none was given (or detection failed).
1558
1559 if (Triple.getArch() != llvm::Triple::x86_64 &&
1560 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001561 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001562
1563 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1564
1565 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001566 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001567 if (Triple.getArchName() == "x86_64h")
1568 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001569 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001570 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001571
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001572 // Set up default CPU name for PS4 compilers.
1573 if (Triple.isPS4CPU())
1574 return "btver2";
1575
Alexey Bataev286d1b92014-01-31 04:07:13 +00001576 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001577 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001578 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001579
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001580 // Everything else goes to x86-64 in 64-bit mode.
1581 if (Is64Bit)
1582 return "x86-64";
1583
1584 switch (Triple.getOS()) {
1585 case llvm::Triple::FreeBSD:
1586 case llvm::Triple::NetBSD:
1587 case llvm::Triple::OpenBSD:
1588 return "i486";
1589 case llvm::Triple::Haiku:
1590 return "i586";
1591 case llvm::Triple::Bitrig:
1592 return "i686";
1593 default:
1594 // Fallback to p4.
1595 return "pentium4";
1596 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001597}
1598
Dan Gohmanc2853072015-09-03 22:51:53 +00001599/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1600static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1601 // If we have -mcpu=, use that.
1602 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1603 StringRef CPU = A->getValue();
1604
1605#ifdef __wasm__
1606 // Handle "native" by examining the host. "native" isn't meaningful when
1607 // cross compiling, so only support this when the host is also WebAssembly.
1608 if (CPU == "native")
1609 return llvm::sys::getHostCPUName();
1610#endif
1611
1612 return CPU;
1613 }
1614
1615 return "generic";
1616}
1617
Renato Golin7c542b42015-07-27 23:44:45 +00001618static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1619 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001620 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001621 default:
1622 return "";
1623
Amara Emerson703da2e2013-10-31 09:32:33 +00001624 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001625 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001626 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001627
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001628 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001629 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001630 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001631 case llvm::Triple::thumbeb: {
1632 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001633 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001634 return arm::getARMTargetCPU(MCPU, MArch, T);
1635 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001636 case llvm::Triple::mips:
1637 case llvm::Triple::mipsel:
1638 case llvm::Triple::mips64:
1639 case llvm::Triple::mips64el: {
1640 StringRef CPUName;
1641 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001642 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001643 return CPUName;
1644 }
1645
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001646 case llvm::Triple::nvptx:
1647 case llvm::Triple::nvptx64:
1648 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1649 return A->getValue();
1650 return "";
1651
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001652 case llvm::Triple::ppc:
1653 case llvm::Triple::ppc64:
1654 case llvm::Triple::ppc64le: {
1655 std::string TargetCPUName = getPPCTargetCPU(Args);
1656 // LLVM may default to generating code for the native CPU,
1657 // but, like gcc, we default to a more generic option for
1658 // each architecture. (except on Darwin)
1659 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1660 if (T.getArch() == llvm::Triple::ppc64)
1661 TargetCPUName = "ppc64";
1662 else if (T.getArch() == llvm::Triple::ppc64le)
1663 TargetCPUName = "ppc64le";
1664 else
1665 TargetCPUName = "ppc";
1666 }
1667 return TargetCPUName;
1668 }
1669
1670 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001671 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001672 case llvm::Triple::sparcv9:
1673 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001674 return A->getValue();
1675 return "";
1676
1677 case llvm::Triple::x86:
1678 case llvm::Triple::x86_64:
1679 return getX86TargetCPU(Args, T);
1680
1681 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001682 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001683
1684 case llvm::Triple::systemz:
1685 return getSystemZTargetCPU(Args);
1686
1687 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001688 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001689 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001690
1691 case llvm::Triple::wasm32:
1692 case llvm::Triple::wasm64:
1693 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001694 }
1695}
1696
Alp Tokerce365ca2013-12-02 12:43:03 +00001697static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001698 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001699 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1700 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1701 // forward.
1702 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001703 std::string Plugin =
1704 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001705 CmdArgs.push_back(Args.MakeArgString(Plugin));
1706
1707 // Try to pass driver level flags relevant to LTO code generation down to
1708 // the plugin.
1709
1710 // Handle flags for selecting CPU variants.
1711 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1712 if (!CPU.empty())
1713 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001714
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001715 if (IsThinLTO)
1716 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001717}
1718
Sanjay Patel2987c292015-06-11 14:53:41 +00001719/// This is a helper function for validating the optional refinement step
1720/// parameter in reciprocal argument strings. Return false if there is an error
1721/// parsing the refinement step. Otherwise, return true and set the Position
1722/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001723static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001724 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001725 const char RefinementStepToken = ':';
1726 Position = In.find(RefinementStepToken);
1727 if (Position != StringRef::npos) {
1728 StringRef Option = A.getOption().getName();
1729 StringRef RefStep = In.substr(Position + 1);
1730 // Allow exactly one numeric character for the additional refinement
1731 // step parameter. This is reasonable for all currently-supported
1732 // operations and architectures because we would expect that a larger value
1733 // of refinement steps would cause the estimate "optimization" to
1734 // under-perform the native operation. Also, if the estimate does not
1735 // converge quickly, it probably will not ever converge, so further
1736 // refinement steps will not produce a better answer.
1737 if (RefStep.size() != 1) {
1738 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1739 return false;
1740 }
1741 char RefStepChar = RefStep[0];
1742 if (RefStepChar < '0' || RefStepChar > '9') {
1743 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1744 return false;
1745 }
1746 }
1747 return true;
1748}
1749
1750/// The -mrecip flag requires processing of many optional parameters.
1751static void ParseMRecip(const Driver &D, const ArgList &Args,
1752 ArgStringList &OutStrings) {
1753 StringRef DisabledPrefixIn = "!";
1754 StringRef DisabledPrefixOut = "!";
1755 StringRef EnabledPrefixOut = "";
1756 StringRef Out = "-mrecip=";
1757
1758 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1759 if (!A)
1760 return;
1761
1762 unsigned NumOptions = A->getNumValues();
1763 if (NumOptions == 0) {
1764 // No option is the same as "all".
1765 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1766 return;
1767 }
1768
1769 // Pass through "all", "none", or "default" with an optional refinement step.
1770 if (NumOptions == 1) {
1771 StringRef Val = A->getValue(0);
1772 size_t RefStepLoc;
1773 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1774 return;
1775 StringRef ValBase = Val.slice(0, RefStepLoc);
1776 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1777 OutStrings.push_back(Args.MakeArgString(Out + Val));
1778 return;
1779 }
1780 }
1781
1782 // Each reciprocal type may be enabled or disabled individually.
1783 // Check each input value for validity, concatenate them all back together,
1784 // and pass through.
1785
1786 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001787 OptionStrings.insert(std::make_pair("divd", false));
1788 OptionStrings.insert(std::make_pair("divf", false));
1789 OptionStrings.insert(std::make_pair("vec-divd", false));
1790 OptionStrings.insert(std::make_pair("vec-divf", false));
1791 OptionStrings.insert(std::make_pair("sqrtd", false));
1792 OptionStrings.insert(std::make_pair("sqrtf", false));
1793 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1794 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001795
1796 for (unsigned i = 0; i != NumOptions; ++i) {
1797 StringRef Val = A->getValue(i);
1798
1799 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1800 // Ignore the disablement token for string matching.
1801 if (IsDisabled)
1802 Val = Val.substr(1);
1803
1804 size_t RefStep;
1805 if (!getRefinementStep(Val, D, *A, RefStep))
1806 return;
1807
1808 StringRef ValBase = Val.slice(0, RefStep);
1809 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1810 if (OptionIter == OptionStrings.end()) {
1811 // Try again specifying float suffix.
1812 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1813 if (OptionIter == OptionStrings.end()) {
1814 // The input name did not match any known option string.
1815 D.Diag(diag::err_drv_unknown_argument) << Val;
1816 return;
1817 }
1818 // The option was specified without a float or double suffix.
1819 // Make sure that the double entry was not already specified.
1820 // The float entry will be checked below.
1821 if (OptionStrings[ValBase.str() + 'd']) {
1822 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1823 return;
1824 }
1825 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001826
Sanjay Patel2987c292015-06-11 14:53:41 +00001827 if (OptionIter->second == true) {
1828 // Duplicate option specified.
1829 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1830 return;
1831 }
1832
1833 // Mark the matched option as found. Do not allow duplicate specifiers.
1834 OptionIter->second = true;
1835
1836 // If the precision was not specified, also mark the double entry as found.
1837 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1838 OptionStrings[ValBase.str() + 'd'] = true;
1839
1840 // Build the output string.
1841 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1842 Out = Args.MakeArgString(Out + Prefix + Val);
1843 if (i != NumOptions - 1)
1844 Out = Args.MakeArgString(Out + ",");
1845 }
1846
1847 OutStrings.push_back(Args.MakeArgString(Out));
1848}
1849
Eric Christopherc54920a2015-03-23 19:26:05 +00001850static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001851 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001852 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001853 // If -march=native, autodetect the feature list.
1854 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1855 if (StringRef(A->getValue()) == "native") {
1856 llvm::StringMap<bool> HostFeatures;
1857 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1858 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001859 Features.push_back(
1860 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001861 }
1862 }
1863
Jim Grosbach82eee262013-11-16 00:53:35 +00001864 if (Triple.getArchName() == "x86_64h") {
1865 // x86_64h implies quite a few of the more modern subtarget features
1866 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1867 Features.push_back("-rdrnd");
1868 Features.push_back("-aes");
1869 Features.push_back("-pclmul");
1870 Features.push_back("-rtm");
1871 Features.push_back("-hle");
1872 Features.push_back("-fsgsbase");
1873 }
1874
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001875 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001876 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001877 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001878 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001879 Features.push_back("+sse4.2");
1880 Features.push_back("+popcnt");
1881 } else
1882 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001883 }
1884
Eric Christopherc54920a2015-03-23 19:26:05 +00001885 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001886 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1887 StringRef Arch = A->getValue();
1888 bool ArchUsed = false;
1889 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001890 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001891 if (Arch == "AVX" || Arch == "AVX2") {
1892 ArchUsed = true;
1893 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1894 }
1895 }
1896 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001897 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001898 if (Arch == "IA32") {
1899 ArchUsed = true;
1900 } else if (Arch == "SSE" || Arch == "SSE2") {
1901 ArchUsed = true;
1902 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1903 }
1904 }
1905 if (!ArchUsed)
1906 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1907 }
1908
Jim Grosbach82eee262013-11-16 00:53:35 +00001909 // Now add any that the user explicitly requested on the command line,
1910 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001911 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1912 StringRef Name = A->getOption().getName();
1913 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001914
1915 // Skip over "-m".
1916 assert(Name.startswith("m") && "Invalid feature name.");
1917 Name = Name.substr(1);
1918
1919 bool IsNegative = Name.startswith("no-");
1920 if (IsNegative)
1921 Name = Name.substr(3);
1922
1923 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1924 }
1925}
1926
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001927void Clang::AddX86TargetArgs(const ArgList &Args,
1928 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001930 Args.hasArg(options::OPT_mkernel) ||
1931 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001932 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001933
Bob Wilson2616e2e2013-02-10 16:01:41 +00001934 // Default to avoid implicit floating-point for kernel/kext code, but allow
1935 // that to be overridden with -mno-soft-float.
1936 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1937 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001938 if (Arg *A = Args.getLastArg(
1939 options::OPT_msoft_float, options::OPT_mno_soft_float,
1940 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001941 const Option &O = A->getOption();
1942 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1943 O.matches(options::OPT_msoft_float));
1944 }
1945 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001946 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001947
1948 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1949 StringRef Value = A->getValue();
1950 if (Value == "intel" || Value == "att") {
1951 CmdArgs.push_back("-mllvm");
1952 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1953 } else {
1954 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1955 << A->getOption().getName() << Value;
1956 }
1957 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001958}
1959
Tony Linthicum76329bf2011-12-12 21:14:55 +00001960void Clang::AddHexagonTargetArgs(const ArgList &Args,
1961 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001962 CmdArgs.push_back("-mqdsp6-compat");
1963 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001964
Douglas Katzman54366072015-07-27 16:53:08 +00001965 if (const char *v =
1966 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001967 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001968 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001969 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001970 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001971 }
1972
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001973 if (!Args.hasArg(options::OPT_fno_short_enums))
1974 CmdArgs.push_back("-fshort-enums");
1975 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001976 CmdArgs.push_back("-mllvm");
1977 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001978 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001979 CmdArgs.push_back("-mllvm");
1980 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001981}
1982
Kevin Qin110db6f2014-07-18 07:03:22 +00001983// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001984static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001985 std::vector<const char *> &Features) {
1986 SmallVector<StringRef, 8> Split;
1987 text.split(Split, StringRef("+"), -1, false);
1988
Benjamin Kramer72e64312015-09-24 14:48:49 +00001989 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00001990 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001991 .Case("fp", "+fp-armv8")
1992 .Case("simd", "+neon")
1993 .Case("crc", "+crc")
1994 .Case("crypto", "+crypto")
1995 .Case("nofp", "-fp-armv8")
1996 .Case("nosimd", "-neon")
1997 .Case("nocrc", "-crc")
1998 .Case("nocrypto", "-crypto")
1999 .Default(nullptr);
2000 if (result)
2001 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002002 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002003 D.Diag(diag::err_drv_no_neon_modifier);
2004 else
2005 return false;
2006 }
2007 return true;
2008}
2009
2010// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2011// decode CPU and feature.
2012static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2013 std::vector<const char *> &Features) {
2014 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2015 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002016 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
2017 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002018 Features.push_back("+neon");
2019 Features.push_back("+crc");
2020 Features.push_back("+crypto");
2021 } else if (CPU == "generic") {
2022 Features.push_back("+neon");
2023 } else {
2024 return false;
2025 }
2026
2027 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2028 return false;
2029
2030 return true;
2031}
2032
2033static bool
2034getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2035 const ArgList &Args,
2036 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002037 std::string MarchLowerCase = March.lower();
2038 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002039
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002040 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002041 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002042 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002043 Features.push_back("+v8.1a");
2044 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002045 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002046 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002047
2048 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2049 return false;
2050
2051 return true;
2052}
2053
2054static bool
2055getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2056 const ArgList &Args,
2057 std::vector<const char *> &Features) {
2058 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002059 std::string McpuLowerCase = Mcpu.lower();
2060 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002061 return false;
2062
2063 return true;
2064}
2065
2066static bool
2067getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2068 const ArgList &Args,
2069 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002070 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002071 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002072 if (MtuneLowerCase == "native")
2073 MtuneLowerCase = llvm::sys::getHostCPUName();
2074 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002075 Features.push_back("+zcm");
2076 Features.push_back("+zcz");
2077 }
2078 return true;
2079}
2080
2081static bool
2082getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2083 const ArgList &Args,
2084 std::vector<const char *> &Features) {
2085 StringRef CPU;
2086 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002087 std::string McpuLowerCase = Mcpu.lower();
2088 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002089 return false;
2090
2091 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2092}
2093
Justin Bognerf9052562015-11-13 23:07:31 +00002094static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002095 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002096 Arg *A;
2097 bool success = true;
2098 // Enable NEON by default.
2099 Features.push_back("+neon");
2100 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2101 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2102 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2103 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002104 else if (Args.hasArg(options::OPT_arch))
2105 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2106 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002107
2108 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2109 success =
2110 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2111 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2112 success =
2113 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002114 else if (Args.hasArg(options::OPT_arch))
2115 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2116 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002117
2118 if (!success)
2119 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002120
2121 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2122 Features.push_back("-fp-armv8");
2123 Features.push_back("-crypto");
2124 Features.push_back("-neon");
2125 }
Bradley Smith418c5932014-05-02 15:17:51 +00002126
2127 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002128 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002129 if (A->getOption().matches(options::OPT_mcrc))
2130 Features.push_back("+crc");
2131 else
2132 Features.push_back("-crc");
2133 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002134
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002135 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2136 options::OPT_munaligned_access))
2137 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2138 Features.push_back("+strict-align");
2139
Justin Bognerf9052562015-11-13 23:07:31 +00002140 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002141 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002142}
2143
Dan Gohmanc2853072015-09-03 22:51:53 +00002144static void getWebAssemblyTargetFeatures(const ArgList &Args,
2145 std::vector<const char *> &Features) {
2146 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2147 StringRef Name = A->getOption().getName();
2148 A->claim();
2149
2150 // Skip over "-m".
2151 assert(Name.startswith("m") && "Invalid feature name.");
2152 Name = Name.substr(1);
2153
2154 bool IsNegative = Name.startswith("no-");
2155 if (IsNegative)
2156 Name = Name.substr(3);
2157
2158 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2159 }
2160}
2161
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002162static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002163 const ArgList &Args, ArgStringList &CmdArgs,
2164 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002165 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002166 std::vector<const char *> Features;
2167 switch (Triple.getArch()) {
2168 default:
2169 break;
2170 case llvm::Triple::mips:
2171 case llvm::Triple::mipsel:
2172 case llvm::Triple::mips64:
2173 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002174 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002175 break;
2176
2177 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002178 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002179 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002180 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002181 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002182 break;
2183
2184 case llvm::Triple::ppc:
2185 case llvm::Triple::ppc64:
2186 case llvm::Triple::ppc64le:
2187 getPPCTargetFeatures(Args, Features);
2188 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002189 case llvm::Triple::systemz:
2190 getSystemZTargetFeatures(Args, Features);
2191 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002192 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002193 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002194 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002195 break;
2196 case llvm::Triple::x86:
2197 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002198 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002199 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002200 case llvm::Triple::wasm32:
2201 case llvm::Triple::wasm64:
2202 getWebAssemblyTargetFeatures(Args, Features);
2203 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002204 }
Rafael Espindola43964802013-08-21 17:34:32 +00002205
2206 // Find the last of each feature.
2207 llvm::StringMap<unsigned> LastOpt;
2208 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2209 const char *Name = Features[I];
2210 assert(Name[0] == '-' || Name[0] == '+');
2211 LastOpt[Name + 1] = I;
2212 }
2213
2214 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2215 // If this feature was overridden, ignore it.
2216 const char *Name = Features[I];
2217 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2218 assert(LastI != LastOpt.end());
2219 unsigned Last = LastI->second;
2220 if (Last != I)
2221 continue;
2222
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002223 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002224 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002225 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002226}
2227
David Majnemerae394812014-12-09 00:12:30 +00002228static bool
2229shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2230 const llvm::Triple &Triple) {
2231 // We use the zero-cost exception tables for Objective-C if the non-fragile
2232 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2233 // later.
2234 if (runtime.isNonFragile())
2235 return true;
2236
2237 if (!Triple.isMacOSX())
2238 return false;
2239
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002240 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002241 (Triple.getArch() == llvm::Triple::x86_64 ||
2242 Triple.getArch() == llvm::Triple::arm));
2243}
2244
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002245/// Adds exception related arguments to the driver command arguments. There's a
2246/// master flag, -fexceptions and also language specific flags to enable/disable
2247/// C++ and Objective-C exceptions. This makes it possible to for example
2248/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002249static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002250 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002251 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002252 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002253 const Driver &D = TC.getDriver();
2254 const llvm::Triple &Triple = TC.getTriple();
2255
Chad Rosier4fab82c2012-03-26 22:04:46 +00002256 if (KernelOrKext) {
2257 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2258 // arguments now to avoid warnings about unused arguments.
2259 Args.ClaimAllArgs(options::OPT_fexceptions);
2260 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2261 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2262 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2263 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2264 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002265 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002266 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002267
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002268 // See if the user explicitly enabled exceptions.
2269 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2270 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002271
David Majnemerae394812014-12-09 00:12:30 +00002272 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2273 // is not necessarily sensible, but follows GCC.
2274 if (types::isObjC(InputType) &&
2275 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002276 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002277 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002278
David Majnemerae394812014-12-09 00:12:30 +00002279 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002280 }
2281
2282 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002283 // Disable C++ EH by default on XCore, PS4, and MSVC.
2284 // FIXME: Remove MSVC from this list once things work.
2285 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2286 !Triple.isPS4CPU() &&
2287 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002288 Arg *ExceptionArg = Args.getLastArg(
2289 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2290 options::OPT_fexceptions, options::OPT_fno_exceptions);
2291 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002292 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002293 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2294 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002295
2296 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002297 if (Triple.isPS4CPU()) {
2298 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2299 assert(ExceptionArg &&
2300 "On the PS4 exceptions should only be enabled if passing "
2301 "an argument");
2302 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2303 const Arg *RTTIArg = TC.getRTTIArg();
2304 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2305 D.Diag(diag::err_drv_argument_not_allowed_with)
2306 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2307 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2308 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2309 } else
2310 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2311
Anders Carlssone96ab552011-02-28 02:27:16 +00002312 CmdArgs.push_back("-fcxx-exceptions");
2313
David Majnemer8de68642014-12-05 08:11:58 +00002314 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002315 }
2316 }
2317
David Majnemer8de68642014-12-05 08:11:58 +00002318 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002319 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002320}
2321
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002322static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002323 bool Default = true;
2324 if (TC.getTriple().isOSDarwin()) {
2325 // The native darwin assembler doesn't support the linker_option directives,
2326 // so we disable them if we think the .s file will be passed to it.
2327 Default = TC.useIntegratedAs();
2328 }
2329 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2330 Default);
2331}
2332
Ted Kremenek62093662013-03-12 17:02:12 +00002333static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2334 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002335 bool UseDwarfDirectory =
2336 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2337 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002338 return !UseDwarfDirectory;
2339}
2340
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002341/// \brief Check whether the given input tree contains any compilation actions.
2342static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002343 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002344 return true;
2345
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002346 for (const auto &Act : *A)
2347 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002348 return true;
2349
2350 return false;
2351}
2352
2353/// \brief Check if -relax-all should be passed to the internal assembler.
2354/// This is done by default when compiling non-assembler source with -O0.
2355static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2356 bool RelaxDefault = true;
2357
2358 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2359 RelaxDefault = A->getOption().matches(options::OPT_O0);
2360
2361 if (RelaxDefault) {
2362 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002363 for (const auto &Act : C.getActions()) {
2364 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002365 RelaxDefault = true;
2366 break;
2367 }
2368 }
2369 }
2370
2371 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002372 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002373}
2374
Douglas Katzman3459ce22015-10-08 04:24:12 +00002375// Extract the integer N from a string spelled "-dwarf-N", returning 0
2376// on mismatch. The StringRef input (rather than an Arg) allows
2377// for use by the "-Xassembler" option parser.
2378static unsigned DwarfVersionNum(StringRef ArgValue) {
2379 return llvm::StringSwitch<unsigned>(ArgValue)
2380 .Case("-gdwarf-2", 2)
2381 .Case("-gdwarf-3", 3)
2382 .Case("-gdwarf-4", 4)
2383 .Default(0);
2384}
2385
2386static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2387 CodeGenOptions::DebugInfoKind DebugInfoKind,
2388 unsigned DwarfVersion) {
2389 switch (DebugInfoKind) {
2390 case CodeGenOptions::DebugLineTablesOnly:
2391 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2392 break;
2393 case CodeGenOptions::LimitedDebugInfo:
2394 CmdArgs.push_back("-debug-info-kind=limited");
2395 break;
2396 case CodeGenOptions::FullDebugInfo:
2397 CmdArgs.push_back("-debug-info-kind=standalone");
2398 break;
2399 default:
2400 break;
2401 }
2402 if (DwarfVersion > 0)
2403 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002404 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002405}
2406
David Blaikie9260ed62013-07-25 21:19:01 +00002407static void CollectArgsForIntegratedAssembler(Compilation &C,
2408 const ArgList &Args,
2409 ArgStringList &CmdArgs,
2410 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002411 if (UseRelaxAll(C, Args))
2412 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002413
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002414 // When passing -I arguments to the assembler we sometimes need to
2415 // unconditionally take the next argument. For example, when parsing
2416 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2417 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2418 // arg after parsing the '-I' arg.
2419 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002420
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002421 // When using an integrated assembler, translate -Wa, and -Xassembler
2422 // options.
2423 bool CompressDebugSections = false;
2424 for (const Arg *A :
2425 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2426 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002427
Benjamin Kramer72e64312015-09-24 14:48:49 +00002428 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002429 if (TakeNextArg) {
2430 CmdArgs.push_back(Value.data());
2431 TakeNextArg = false;
2432 continue;
2433 }
David Blaikie9260ed62013-07-25 21:19:01 +00002434
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002435 switch (C.getDefaultToolChain().getArch()) {
2436 default:
2437 break;
2438 case llvm::Triple::mips:
2439 case llvm::Triple::mipsel:
2440 case llvm::Triple::mips64:
2441 case llvm::Triple::mips64el:
2442 if (Value == "--trap") {
2443 CmdArgs.push_back("-target-feature");
2444 CmdArgs.push_back("+use-tcc-in-div");
2445 continue;
2446 }
2447 if (Value == "--break") {
2448 CmdArgs.push_back("-target-feature");
2449 CmdArgs.push_back("-use-tcc-in-div");
2450 continue;
2451 }
2452 if (Value.startswith("-msoft-float")) {
2453 CmdArgs.push_back("-target-feature");
2454 CmdArgs.push_back("+soft-float");
2455 continue;
2456 }
2457 if (Value.startswith("-mhard-float")) {
2458 CmdArgs.push_back("-target-feature");
2459 CmdArgs.push_back("-soft-float");
2460 continue;
2461 }
2462 break;
2463 }
2464
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002465 if (Value == "-force_cpusubtype_ALL") {
2466 // Do nothing, this is the default and we don't support anything else.
2467 } else if (Value == "-L") {
2468 CmdArgs.push_back("-msave-temp-labels");
2469 } else if (Value == "--fatal-warnings") {
2470 CmdArgs.push_back("-massembler-fatal-warnings");
2471 } else if (Value == "--noexecstack") {
2472 CmdArgs.push_back("-mnoexecstack");
2473 } else if (Value == "-compress-debug-sections" ||
2474 Value == "--compress-debug-sections") {
2475 CompressDebugSections = true;
2476 } else if (Value == "-nocompress-debug-sections" ||
2477 Value == "--nocompress-debug-sections") {
2478 CompressDebugSections = false;
2479 } else if (Value.startswith("-I")) {
2480 CmdArgs.push_back(Value.data());
2481 // We need to consume the next argument if the current arg is a plain
2482 // -I. The next arg will be the include directory.
2483 if (Value == "-I")
2484 TakeNextArg = true;
2485 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002486 // "-gdwarf-N" options are not cc1as options.
2487 unsigned DwarfVersion = DwarfVersionNum(Value);
2488 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2489 CmdArgs.push_back(Value.data());
2490 } else {
2491 RenderDebugEnablingArgs(
2492 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2493 }
Renato Golin7c542b42015-07-27 23:44:45 +00002494 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2495 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2496 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002497 } else {
2498 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002499 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002500 }
2501 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002502 }
2503 if (CompressDebugSections) {
2504 if (llvm::zlib::isAvailable())
2505 CmdArgs.push_back("-compress-debug-sections");
2506 else
2507 D.Diag(diag::warn_debug_compression_unavailable);
2508 }
David Blaikie9260ed62013-07-25 21:19:01 +00002509}
2510
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002511// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002512// FIXME: Make sure we can also emit shared objects if they're requested
2513// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002514static void addClangRT(const ToolChain &TC, const ArgList &Args,
2515 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002516 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002517}
2518
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002519namespace {
2520enum OpenMPRuntimeKind {
2521 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2522 /// without knowing what runtime to target.
2523 OMPRT_Unknown,
2524
2525 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2526 /// the default for Clang.
2527 OMPRT_OMP,
2528
2529 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2530 /// this runtime but can swallow the pragmas, and find and link against the
2531 /// runtime library itself.
2532 OMPRT_GOMP,
2533
Chandler Carruthc6625c62015-05-28 21:10:31 +00002534 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002535 /// OpenMP runtime. We support this mode for users with existing dependencies
2536 /// on this runtime library name.
2537 OMPRT_IOMP5
2538};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002539}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002540
2541/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002542static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2543 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002544 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2545
2546 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2547 if (A)
2548 RuntimeName = A->getValue();
2549
2550 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002551 .Case("libomp", OMPRT_OMP)
2552 .Case("libgomp", OMPRT_GOMP)
2553 .Case("libiomp5", OMPRT_IOMP5)
2554 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002555
2556 if (RT == OMPRT_Unknown) {
2557 if (A)
2558 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002559 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002560 else
2561 // FIXME: We could use a nicer diagnostic here.
2562 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2563 }
2564
2565 return RT;
2566}
2567
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002568static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2569 const ArgList &Args) {
2570 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2571 options::OPT_fno_openmp, false))
2572 return;
2573
2574 switch (getOpenMPRuntime(TC, Args)) {
2575 case OMPRT_OMP:
2576 CmdArgs.push_back("-lomp");
2577 break;
2578 case OMPRT_GOMP:
2579 CmdArgs.push_back("-lgomp");
2580 break;
2581 case OMPRT_IOMP5:
2582 CmdArgs.push_back("-liomp5");
2583 break;
2584 case OMPRT_Unknown:
2585 // Already diagnosed.
2586 break;
2587 }
2588}
2589
Alexey Samsonov52550342014-09-15 19:58:40 +00002590static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2591 ArgStringList &CmdArgs, StringRef Sanitizer,
2592 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002593 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002594 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002595 if (!IsShared) CmdArgs.push_back("-whole-archive");
2596 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2597 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002598}
2599
Alexey Samsonov52550342014-09-15 19:58:40 +00002600// Tries to use a file with the list of dynamic symbols that need to be exported
2601// from the runtime library. Returns true if the file was found.
2602static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2603 ArgStringList &CmdArgs,
2604 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002605 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002606 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2607 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002608 return true;
2609 }
2610 return false;
2611}
2612
2613static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2614 ArgStringList &CmdArgs) {
2615 // Force linking against the system libraries sanitizers depends on
2616 // (see PR15823 why this is necessary).
2617 CmdArgs.push_back("--no-as-needed");
2618 CmdArgs.push_back("-lpthread");
2619 CmdArgs.push_back("-lrt");
2620 CmdArgs.push_back("-lm");
2621 // There's no libdl on FreeBSD.
2622 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2623 CmdArgs.push_back("-ldl");
2624}
2625
2626static void
2627collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2628 SmallVectorImpl<StringRef> &SharedRuntimes,
2629 SmallVectorImpl<StringRef> &StaticRuntimes,
2630 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2631 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2632 // Collect shared runtimes.
2633 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2634 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002635 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002636
Alexey Samsonov52550342014-09-15 19:58:40 +00002637 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002638 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002639 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002640 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002641 }
2642 if (SanArgs.needsAsanRt()) {
2643 if (SanArgs.needsSharedAsanRt()) {
2644 HelperStaticRuntimes.push_back("asan-preinit");
2645 } else {
2646 StaticRuntimes.push_back("asan");
2647 if (SanArgs.linkCXXRuntimes())
2648 StaticRuntimes.push_back("asan_cxx");
2649 }
2650 }
2651 if (SanArgs.needsDfsanRt())
2652 StaticRuntimes.push_back("dfsan");
2653 if (SanArgs.needsLsanRt())
2654 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002655 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002656 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002657 if (SanArgs.linkCXXRuntimes())
2658 StaticRuntimes.push_back("msan_cxx");
2659 }
2660 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002661 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002662 if (SanArgs.linkCXXRuntimes())
2663 StaticRuntimes.push_back("tsan_cxx");
2664 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002665 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002666 StaticRuntimes.push_back("ubsan_standalone");
2667 if (SanArgs.linkCXXRuntimes())
2668 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002669 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002670 if (SanArgs.needsSafeStackRt())
2671 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002672}
2673
Alexey Samsonov52550342014-09-15 19:58:40 +00002674// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2675// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2676static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002677 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002678 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2679 HelperStaticRuntimes;
2680 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2681 HelperStaticRuntimes);
2682 for (auto RT : SharedRuntimes)
2683 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2684 for (auto RT : HelperStaticRuntimes)
2685 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2686 bool AddExportDynamic = false;
2687 for (auto RT : StaticRuntimes) {
2688 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2689 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2690 }
2691 // If there is a static runtime with no dynamic list, force all the symbols
2692 // to be dynamic to be sure we export sanitizer interface functions.
2693 if (AddExportDynamic)
2694 CmdArgs.push_back("-export-dynamic");
2695 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002696}
2697
Reid Kleckner86ea7702015-02-04 23:45:07 +00002698static bool areOptimizationsEnabled(const ArgList &Args) {
2699 // Find the last -O arg and see if it is non-zero.
2700 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2701 return !A->getOption().matches(options::OPT_O0);
2702 // Defaults to -O0.
2703 return false;
2704}
2705
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002706static bool shouldUseFramePointerForTarget(const ArgList &Args,
2707 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002708 switch (Triple.getArch()) {
2709 case llvm::Triple::xcore:
2710 case llvm::Triple::wasm32:
2711 case llvm::Triple::wasm64:
2712 // XCore never wants frame pointers, regardless of OS.
2713 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002714 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002715 default:
2716 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002717 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002718
2719 if (Triple.isOSLinux()) {
2720 switch (Triple.getArch()) {
2721 // Don't use a frame pointer on linux if optimizing for certain targets.
2722 case llvm::Triple::mips64:
2723 case llvm::Triple::mips64el:
2724 case llvm::Triple::mips:
2725 case llvm::Triple::mipsel:
2726 case llvm::Triple::systemz:
2727 case llvm::Triple::x86:
2728 case llvm::Triple::x86_64:
2729 return !areOptimizationsEnabled(Args);
2730 default:
2731 return true;
2732 }
2733 }
2734
2735 if (Triple.isOSWindows()) {
2736 switch (Triple.getArch()) {
2737 case llvm::Triple::x86:
2738 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002739 case llvm::Triple::arm:
2740 case llvm::Triple::thumb:
2741 // Windows on ARM builds with FPO disabled to aid fast stack walking
2742 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002743 default:
2744 // All other supported Windows ISAs use xdata unwind information, so frame
2745 // pointers are not generally useful.
2746 return false;
2747 }
2748 }
2749
2750 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002751}
2752
Rafael Espindola224dd632011-12-14 21:02:23 +00002753static bool shouldUseFramePointer(const ArgList &Args,
2754 const llvm::Triple &Triple) {
2755 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2756 options::OPT_fomit_frame_pointer))
2757 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2758
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002759 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002760}
2761
Eric Christopherb7d97e92013-04-03 01:58:53 +00002762static bool shouldUseLeafFramePointer(const ArgList &Args,
2763 const llvm::Triple &Triple) {
2764 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2765 options::OPT_momit_leaf_frame_pointer))
2766 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2767
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002768 if (Triple.isPS4CPU())
2769 return false;
2770
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002771 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002772}
2773
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002774/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002775static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002776 SmallString<128> cwd;
2777 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002778 CmdArgs.push_back("-fdebug-compilation-dir");
2779 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002780 }
2781}
2782
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002783static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002784 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2785 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2786 SmallString<128> T(FinalOutput->getValue());
2787 llvm::sys::path::replace_extension(T, "dwo");
2788 return Args.MakeArgString(T);
2789 } else {
2790 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002791 SmallString<128> T(
2792 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002793 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002794 llvm::sys::path::replace_extension(F, "dwo");
2795 T += F;
2796 return Args.MakeArgString(F);
2797 }
2798}
2799
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002800static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2801 const JobAction &JA, const ArgList &Args,
2802 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002803 ArgStringList ExtractArgs;
2804 ExtractArgs.push_back("--extract-dwo");
2805
2806 ArgStringList StripArgs;
2807 StripArgs.push_back("--strip-dwo");
2808
2809 // Grabbing the output of the earlier compile step.
2810 StripArgs.push_back(Output.getFilename());
2811 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002812 ExtractArgs.push_back(OutFile);
2813
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002814 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002815 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002816
2817 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002818 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002819
2820 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002821 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002822}
2823
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002824/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002825/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2826static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002827 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002828 if (A->getOption().matches(options::OPT_O4) ||
2829 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002830 return true;
2831
2832 if (A->getOption().matches(options::OPT_O0))
2833 return false;
2834
2835 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2836
Rafael Espindola91780de2013-08-26 14:05:41 +00002837 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002838 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002839 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002840 return true;
2841
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002842 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002843 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002844 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002845
2846 unsigned OptLevel = 0;
2847 if (S.getAsInteger(10, OptLevel))
2848 return false;
2849
2850 return OptLevel > 1;
2851 }
2852
2853 return false;
2854}
2855
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002856/// Add -x lang to \p CmdArgs for \p Input.
2857static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2858 ArgStringList &CmdArgs) {
2859 // When using -verify-pch, we don't want to provide the type
2860 // 'precompiled-header' if it was inferred from the file extension
2861 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2862 return;
2863
2864 CmdArgs.push_back("-x");
2865 if (Args.hasArg(options::OPT_rewrite_objc))
2866 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2867 else
2868 CmdArgs.push_back(types::getTypeName(Input.getType()));
2869}
2870
David Majnemerc371ff02015-03-22 08:39:22 +00002871static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002872 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002873 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002874
2875 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002876 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002877
2878 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002879 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002880 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002881 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002882}
2883
Rafael Espindola577637a2015-01-03 00:06:04 +00002884// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002885// options that build systems might add but are unused when assembling or only
2886// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002887static void claimNoWarnArgs(const ArgList &Args) {
2888 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002889 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00002890 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00002891 Args.ClaimAllArgs(options::OPT_flto);
2892 Args.ClaimAllArgs(options::OPT_fno_lto);
2893}
2894
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002895static void appendUserToPath(SmallVectorImpl<char> &Result) {
2896#ifdef LLVM_ON_UNIX
2897 const char *Username = getenv("LOGNAME");
2898#else
2899 const char *Username = getenv("USERNAME");
2900#endif
2901 if (Username) {
2902 // Validate that LoginName can be used in a path, and get its length.
2903 size_t Len = 0;
2904 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002905 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002906 Username = nullptr;
2907 break;
2908 }
2909 }
2910
2911 if (Username && Len > 0) {
2912 Result.append(Username, Username + Len);
2913 return;
2914 }
2915 }
2916
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002917// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002918#ifdef LLVM_ON_UNIX
2919 std::string UID = llvm::utostr(getuid());
2920#else
2921 // FIXME: Windows seems to have an 'SID' that might work.
2922 std::string UID = "9999";
2923#endif
2924 Result.append(UID.begin(), UID.end());
2925}
2926
David Majnemere11d3732015-06-08 00:22:46 +00002927VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2928 const llvm::Triple &Triple,
2929 const llvm::opt::ArgList &Args,
2930 bool IsWindowsMSVC) {
2931 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2932 IsWindowsMSVC) ||
2933 Args.hasArg(options::OPT_fmsc_version) ||
2934 Args.hasArg(options::OPT_fms_compatibility_version)) {
2935 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2936 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002937 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002938
2939 if (MSCVersion && MSCompatibilityVersion) {
2940 if (D)
2941 D->Diag(diag::err_drv_argument_not_allowed_with)
2942 << MSCVersion->getAsString(Args)
2943 << MSCompatibilityVersion->getAsString(Args);
2944 return VersionTuple();
2945 }
2946
2947 if (MSCompatibilityVersion) {
2948 VersionTuple MSVT;
2949 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2950 D->Diag(diag::err_drv_invalid_value)
2951 << MSCompatibilityVersion->getAsString(Args)
2952 << MSCompatibilityVersion->getValue();
2953 return MSVT;
2954 }
2955
2956 if (MSCVersion) {
2957 unsigned Version = 0;
2958 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2959 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2960 << MSCVersion->getValue();
2961 return getMSCompatibilityVersion(Version);
2962 }
2963
2964 unsigned Major, Minor, Micro;
2965 Triple.getEnvironmentVersion(Major, Minor, Micro);
2966 if (Major || Minor || Micro)
2967 return VersionTuple(Major, Minor, Micro);
2968
2969 return VersionTuple(18);
2970 }
2971 return VersionTuple();
2972}
2973
Diego Novilloa0545962015-07-10 18:00:07 +00002974static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2975 const InputInfo &Output, const ArgList &Args,
2976 ArgStringList &CmdArgs) {
2977 auto *ProfileGenerateArg = Args.getLastArg(
2978 options::OPT_fprofile_instr_generate,
2979 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002980 options::OPT_fprofile_generate_EQ,
2981 options::OPT_fno_profile_instr_generate);
2982 if (ProfileGenerateArg &&
2983 ProfileGenerateArg->getOption().matches(
2984 options::OPT_fno_profile_instr_generate))
2985 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002986
2987 auto *ProfileUseArg = Args.getLastArg(
2988 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002989 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2990 options::OPT_fno_profile_instr_use);
2991 if (ProfileUseArg &&
2992 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2993 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002994
2995 if (ProfileGenerateArg && ProfileUseArg)
2996 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002997 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002998
Diego Novillo758f3f52015-08-05 21:49:51 +00002999 if (ProfileGenerateArg) {
3000 if (ProfileGenerateArg->getOption().matches(
3001 options::OPT_fprofile_instr_generate_EQ))
3002 ProfileGenerateArg->render(Args, CmdArgs);
3003 else if (ProfileGenerateArg->getOption().matches(
3004 options::OPT_fprofile_generate_EQ)) {
3005 SmallString<128> Path(ProfileGenerateArg->getValue());
3006 llvm::sys::path::append(Path, "default.profraw");
3007 CmdArgs.push_back(
3008 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3009 } else
3010 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3011 }
Diego Novilloa0545962015-07-10 18:00:07 +00003012
Diego Novillo758f3f52015-08-05 21:49:51 +00003013 if (ProfileUseArg) {
3014 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3015 ProfileUseArg->render(Args, CmdArgs);
3016 else if ((ProfileUseArg->getOption().matches(
3017 options::OPT_fprofile_use_EQ) ||
3018 ProfileUseArg->getOption().matches(
3019 options::OPT_fprofile_instr_use))) {
3020 SmallString<128> Path(
3021 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3022 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3023 llvm::sys::path::append(Path, "default.profdata");
3024 CmdArgs.push_back(
3025 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3026 }
Diego Novilloa0545962015-07-10 18:00:07 +00003027 }
3028
3029 if (Args.hasArg(options::OPT_ftest_coverage) ||
3030 Args.hasArg(options::OPT_coverage))
3031 CmdArgs.push_back("-femit-coverage-notes");
3032 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3033 false) ||
3034 Args.hasArg(options::OPT_coverage))
3035 CmdArgs.push_back("-femit-coverage-data");
3036
Diego Novilloc4b94da2015-08-05 23:27:40 +00003037 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3038 options::OPT_fno_coverage_mapping, false) &&
3039 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003040 D.Diag(diag::err_drv_argument_only_allowed_with)
3041 << "-fcoverage-mapping"
3042 << "-fprofile-instr-generate";
3043
Diego Novilloc4b94da2015-08-05 23:27:40 +00003044 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3045 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003046 CmdArgs.push_back("-fcoverage-mapping");
3047
3048 if (C.getArgs().hasArg(options::OPT_c) ||
3049 C.getArgs().hasArg(options::OPT_S)) {
3050 if (Output.isFilename()) {
3051 CmdArgs.push_back("-coverage-file");
3052 SmallString<128> CoverageFilename;
3053 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3054 CoverageFilename = FinalOutput->getValue();
3055 } else {
3056 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3057 }
3058 if (llvm::sys::path::is_relative(CoverageFilename)) {
3059 SmallString<128> Pwd;
3060 if (!llvm::sys::fs::current_path(Pwd)) {
3061 llvm::sys::path::append(Pwd, CoverageFilename);
3062 CoverageFilename.swap(Pwd);
3063 }
3064 }
3065 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3066 }
3067 }
3068}
3069
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003070/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3071/// smooshes them together with platform defaults, to decide whether
3072/// this compile should be using PIC mode or not. Returns a tuple of
3073/// (RelocationModel, PICLevel, IsPIE).
3074static std::tuple<llvm::Reloc::Model, unsigned, bool>
3075ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3076 const ArgList &Args) {
3077 // FIXME: why does this code...and so much everywhere else, use both
3078 // ToolChain.getTriple() and Triple?
3079 bool PIE = ToolChain.isPIEDefault();
3080 bool PIC = PIE || ToolChain.isPICDefault();
3081 bool IsPICLevelTwo = PIC;
3082
3083 bool KernelOrKext =
3084 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3085
3086 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003087 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003088 switch (ToolChain.getArch()) {
3089 case llvm::Triple::arm:
3090 case llvm::Triple::armeb:
3091 case llvm::Triple::thumb:
3092 case llvm::Triple::thumbeb:
3093 case llvm::Triple::aarch64:
3094 case llvm::Triple::mips:
3095 case llvm::Triple::mipsel:
3096 case llvm::Triple::mips64:
3097 case llvm::Triple::mips64el:
3098 PIC = true; // "-fpic"
3099 break;
3100
3101 case llvm::Triple::x86:
3102 case llvm::Triple::x86_64:
3103 PIC = true; // "-fPIC"
3104 IsPICLevelTwo = true;
3105 break;
3106
3107 default:
3108 break;
3109 }
3110 }
3111
3112 // OpenBSD-specific defaults for PIE
3113 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3114 switch (ToolChain.getArch()) {
3115 case llvm::Triple::mips64:
3116 case llvm::Triple::mips64el:
3117 case llvm::Triple::sparcel:
3118 case llvm::Triple::x86:
3119 case llvm::Triple::x86_64:
3120 IsPICLevelTwo = false; // "-fpie"
3121 break;
3122
3123 case llvm::Triple::ppc:
3124 case llvm::Triple::sparc:
3125 case llvm::Triple::sparcv9:
3126 IsPICLevelTwo = true; // "-fPIE"
3127 break;
3128
3129 default:
3130 break;
3131 }
3132 }
3133
3134 // The last argument relating to either PIC or PIE wins, and no
3135 // other argument is used. If the last argument is any flavor of the
3136 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3137 // option implicitly enables PIC at the same level.
3138 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3139 options::OPT_fpic, options::OPT_fno_pic,
3140 options::OPT_fPIE, options::OPT_fno_PIE,
3141 options::OPT_fpie, options::OPT_fno_pie);
3142 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3143 // is forced, then neither PIC nor PIE flags will have no effect.
3144 if (!ToolChain.isPICDefaultForced()) {
3145 if (LastPICArg) {
3146 Option O = LastPICArg->getOption();
3147 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3148 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3149 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3150 PIC =
3151 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3152 IsPICLevelTwo =
3153 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3154 } else {
3155 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003156 if (Triple.isPS4CPU()) {
3157 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3158 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3159 if (Model != "kernel") {
3160 PIC = true;
3161 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3162 << LastPICArg->getSpelling();
3163 }
3164 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003165 }
3166 }
3167 }
3168
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003169 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3170 // PIC level would've been set to level 1, force it back to level 2 PIC
3171 // instead.
3172 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003173 IsPICLevelTwo |= ToolChain.isPICDefault();
3174
James Y Knightc4015d32015-08-21 04:14:55 +00003175 // This kernel flags are a trump-card: they will disable PIC/PIE
3176 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003177 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3178 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003179 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003180
3181 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3182 // This is a very special mode. It trumps the other modes, almost no one
3183 // uses it, and it isn't even valid on any OS but Darwin.
3184 if (!ToolChain.getTriple().isOSDarwin())
3185 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3186 << A->getSpelling() << ToolChain.getTriple().str();
3187
3188 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3189
3190 // Only a forced PIC mode can cause the actual compile to have PIC defines
3191 // etc., no flags are sufficient. This behavior was selected to closely
3192 // match that of llvm-gcc and Apple GCC before that.
3193 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3194
3195 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3196 }
3197
3198 if (PIC)
3199 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3200
3201 return std::make_tuple(llvm::Reloc::Static, 0, false);
3202}
3203
3204static const char *RelocationModelName(llvm::Reloc::Model Model) {
3205 switch (Model) {
3206 case llvm::Reloc::Default:
3207 return nullptr;
3208 case llvm::Reloc::Static:
3209 return "static";
3210 case llvm::Reloc::PIC_:
3211 return "pic";
3212 case llvm::Reloc::DynamicNoPIC:
3213 return "dynamic-no-pic";
3214 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003215 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003216}
3217
3218static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3219 ArgStringList &CmdArgs) {
3220 llvm::Reloc::Model RelocationModel;
3221 unsigned PICLevel;
3222 bool IsPIE;
3223 std::tie(RelocationModel, PICLevel, IsPIE) =
3224 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3225
3226 if (RelocationModel != llvm::Reloc::Static)
3227 CmdArgs.push_back("-KPIC");
3228}
3229
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003230void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003231 const InputInfo &Output, const InputInfoList &Inputs,
3232 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003233 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3234 const llvm::Triple Triple(TripleStr);
3235
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003236 bool KernelOrKext =
3237 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003238 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003239 ArgStringList CmdArgs;
3240
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003241 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003242 bool IsWindowsCygnus =
3243 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003244 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003245 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003246
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003247 // Check number of inputs for sanity. We need at least one input.
3248 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003249 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003250 // CUDA compilation may have multiple inputs (source file + results of
3251 // device-side compilations). All other jobs are expected to have exactly one
3252 // input.
3253 bool IsCuda = types::isCuda(Input.getType());
3254 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003255
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003256 // Invoke ourselves in -cc1 mode.
3257 //
3258 // FIXME: Implement custom jobs for internal actions.
3259 CmdArgs.push_back("-cc1");
3260
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003261 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003262 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003263 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003264
James Y Knight2db38f32015-08-15 03:45:25 +00003265 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3266 Triple.getArch() == llvm::Triple::thumb)) {
3267 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003268 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003269 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003270 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003271 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003272 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003273 }
3274
Tim Northover336f1892014-03-29 13:16:12 +00003275 // Push all default warning arguments that are specific to
3276 // the given target. These come before user provided warning options
3277 // are provided.
3278 getToolChain().addClangWarningOptions(CmdArgs);
3279
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003280 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003281 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003282
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003283 if (isa<AnalyzeJobAction>(JA)) {
3284 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3285 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003286 } else if (isa<MigrateJobAction>(JA)) {
3287 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003288 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003289 if (Output.getType() == types::TY_Dependencies)
3290 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003291 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003292 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003293 if (Args.hasArg(options::OPT_rewrite_objc) &&
3294 !Args.hasArg(options::OPT_g_Group))
3295 CmdArgs.push_back("-P");
3296 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003297 } else if (isa<AssembleJobAction>(JA)) {
3298 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003299
David Blaikie9260ed62013-07-25 21:19:01 +00003300 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003301
3302 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003303 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003304 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003305 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003306 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003307
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003308 if (JA.getType() == types::TY_Nothing)
3309 CmdArgs.push_back("-fsyntax-only");
3310 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003311 CmdArgs.push_back("-emit-pch");
3312 else
3313 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003314 } else if (isa<VerifyPCHJobAction>(JA)) {
3315 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003316 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003317 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3318 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003319 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003320 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003321 } else if (JA.getType() == types::TY_LLVM_IR ||
3322 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003323 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003324 } else if (JA.getType() == types::TY_LLVM_BC ||
3325 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003326 CmdArgs.push_back("-emit-llvm-bc");
3327 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003328 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003329 } else if (JA.getType() == types::TY_AST) {
3330 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003331 } else if (JA.getType() == types::TY_ModuleFile) {
3332 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003333 } else if (JA.getType() == types::TY_RewrittenObjC) {
3334 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003335 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003336 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3337 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003338 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003339 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003340 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003341 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003342
3343 // Preserve use-list order by default when emitting bitcode, so that
3344 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3345 // same result as running passes here. For LTO, we don't need to preserve
3346 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003347 if (JA.getType() == types::TY_LLVM_BC)
3348 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003349
3350 if (D.isUsingLTO())
3351 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003352 }
3353
Justin Bognera88f0122014-06-20 22:59:50 +00003354 // We normally speed up the clang process a bit by skipping destructors at
3355 // exit, but when we're generating diagnostics we can rely on some of the
3356 // cleanup.
3357 if (!C.isForDiagnostics())
3358 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003359
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003360// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003361#ifdef NDEBUG
3362 CmdArgs.push_back("-disable-llvm-verifier");
3363#endif
3364
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003365 // Set the main file name, so that debug info works even with
3366 // -save-temps.
3367 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003368 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003369
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003370 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003371 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003372 if (Args.hasArg(options::OPT_static))
3373 CmdArgs.push_back("-static-define");
3374
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003375 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003376 // Enable region store model by default.
3377 CmdArgs.push_back("-analyzer-store=region");
3378
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003379 // Treat blocks as analysis entry points.
3380 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3381
Ted Kremenek49c79792011-03-24 00:28:47 +00003382 CmdArgs.push_back("-analyzer-eagerly-assume");
3383
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003384 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003385 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003386 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003387
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003388 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003389 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003390
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003391 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003392 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003393
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003394 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003395
Artem Belevichba558952015-05-06 18:20:23 +00003396 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003397 CmdArgs.push_back("-analyzer-checker=cplusplus");
3398
Nico Webere8e53112014-05-11 01:04:02 +00003399 // Enable the following experimental checkers for testing.
3400 CmdArgs.push_back(
3401 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003402 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3403 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003404 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003405 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3406 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003407
3408 // Default nullability checks.
3409 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3410 CmdArgs.push_back(
3411 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003412 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003413
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003414 // Set the output format. The default is plist, for (lame) historical
3415 // reasons.
3416 CmdArgs.push_back("-analyzer-output");
3417 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003418 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003419 else
3420 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003421
Ted Kremenekfe449a22010-03-22 22:32:05 +00003422 // Disable the presentation of standard compiler warnings when
3423 // using --analyze. We only want to show static analyzer diagnostics
3424 // or frontend errors.
3425 CmdArgs.push_back("-w");
3426
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003427 // Add -Xanalyzer arguments when running as analyzer.
3428 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003429 }
3430
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003431 CheckCodeGenerationOptions(D, Args);
3432
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003433 llvm::Reloc::Model RelocationModel;
3434 unsigned PICLevel;
3435 bool IsPIE;
3436 std::tie(RelocationModel, PICLevel, IsPIE) =
3437 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003438
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003439 const char *RMName = RelocationModelName(RelocationModel);
3440 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003441 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003442 CmdArgs.push_back(RMName);
3443 }
3444 if (PICLevel > 0) {
3445 CmdArgs.push_back("-pic-level");
3446 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3447 if (IsPIE) {
3448 CmdArgs.push_back("-pie-level");
3449 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003450 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003451 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003452
Renato Golin4854d802015-11-09 12:40:41 +00003453 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3454 CmdArgs.push_back("-meabi");
3455 CmdArgs.push_back(A->getValue());
3456 }
3457
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003458 CmdArgs.push_back("-mthread-model");
3459 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3460 CmdArgs.push_back(A->getValue());
3461 else
3462 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3463
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003464 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3465
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003466 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3467 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003468 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003469
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003470 // LLVM Code Generator Options.
3471
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003472 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3473 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003474 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3475 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003476 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003477 CmdArgs.push_back(A->getValue());
3478 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003479 }
3480 }
3481
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003482 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3483 StringRef v = A->getValue();
3484 CmdArgs.push_back("-mllvm");
3485 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3486 A->claim();
3487 }
3488
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003489 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3490 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003491 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003492 }
3493
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003494 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3495 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003496 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003497 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003498 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003499 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3500 CmdArgs.push_back("-fpcc-struct-return");
3501 } else {
3502 assert(A->getOption().matches(options::OPT_freg_struct_return));
3503 CmdArgs.push_back("-freg-struct-return");
3504 }
3505 }
3506
Roman Divacky65b88cd2011-03-01 17:40:53 +00003507 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3508 CmdArgs.push_back("-mrtd");
3509
Rafael Espindola224dd632011-12-14 21:02:23 +00003510 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003511 CmdArgs.push_back("-mdisable-fp-elim");
3512 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3513 options::OPT_fno_zero_initialized_in_bss))
3514 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003515
3516 bool OFastEnabled = isOptimizationLevelFast(Args);
3517 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3518 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003519 OptSpecifier StrictAliasingAliasOption =
3520 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003521 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3522 // doesn't do any TBAA.
3523 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003524 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003525 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003526 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003527 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3528 options::OPT_fno_struct_path_tbaa))
3529 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003530 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3531 false))
3532 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003533 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3534 options::OPT_fno_strict_vtable_pointers,
3535 false))
3536 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003537 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3538 options::OPT_fno_optimize_sibling_calls))
3539 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003540
Eric Christopher006208c2013-04-04 06:29:47 +00003541 // Handle segmented stacks.
3542 if (Args.hasArg(options::OPT_fsplit_stack))
3543 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003544
3545 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3546 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547 OptSpecifier FastMathAliasOption =
3548 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3549
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003550 // Handle various floating point optimization flags, mapping them to the
3551 // appropriate LLVM code generation flags. The pattern for all of these is to
3552 // default off the codegen optimizations, and if any flag enables them and no
3553 // flag disables them after the flag enabling them, enable the codegen
3554 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003555 if (Arg *A = Args.getLastArg(
3556 options::OPT_ffast_math, FastMathAliasOption,
3557 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3558 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3559 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003560 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3561 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003562 A->getOption().getID() != options::OPT_fhonor_infinities)
3563 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003564 if (Arg *A = Args.getLastArg(
3565 options::OPT_ffast_math, FastMathAliasOption,
3566 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3567 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3568 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003569 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3570 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003571 A->getOption().getID() != options::OPT_fhonor_nans)
3572 CmdArgs.push_back("-menable-no-nans");
3573
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003574 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3575 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003576 if (Arg *A =
3577 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3578 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3579 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003580 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3581 // However, turning *off* -ffast_math merely restores the toolchain default
3582 // (which may be false).
3583 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3584 A->getOption().getID() == options::OPT_ffast_math ||
3585 A->getOption().getID() == options::OPT_Ofast)
3586 MathErrno = false;
3587 else if (A->getOption().getID() == options::OPT_fmath_errno)
3588 MathErrno = true;
3589 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003590 if (MathErrno)
3591 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003592
3593 // There are several flags which require disabling very specific
3594 // optimizations. Any of these being disabled forces us to turn off the
3595 // entire set of LLVM optimizations, so collect them through all the flag
3596 // madness.
3597 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003598 if (Arg *A = Args.getLastArg(
3599 options::OPT_ffast_math, FastMathAliasOption,
3600 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3601 options::OPT_fno_unsafe_math_optimizations,
3602 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003603 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3604 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003605 A->getOption().getID() != options::OPT_fno_associative_math)
3606 AssociativeMath = true;
3607 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003608 if (Arg *A = Args.getLastArg(
3609 options::OPT_ffast_math, FastMathAliasOption,
3610 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3611 options::OPT_fno_unsafe_math_optimizations,
3612 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003613 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3614 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003615 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3616 ReciprocalMath = true;
3617 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003618 if (Arg *A = Args.getLastArg(
3619 options::OPT_ffast_math, FastMathAliasOption,
3620 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3621 options::OPT_fno_unsafe_math_optimizations,
3622 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003623 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3624 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003625 A->getOption().getID() != options::OPT_fsigned_zeros)
3626 SignedZeros = false;
3627 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003628 if (Arg *A = Args.getLastArg(
3629 options::OPT_ffast_math, FastMathAliasOption,
3630 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3631 options::OPT_fno_unsafe_math_optimizations,
3632 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003633 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3634 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003635 A->getOption().getID() != options::OPT_ftrapping_math)
3636 TrappingMath = false;
3637 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3638 !TrappingMath)
3639 CmdArgs.push_back("-menable-unsafe-fp-math");
3640
Sanjay Patel76c9e092015-01-23 16:40:50 +00003641 if (!SignedZeros)
3642 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003643
Sanjay Patel359b1052015-04-09 15:03:23 +00003644 if (ReciprocalMath)
3645 CmdArgs.push_back("-freciprocal-math");
3646
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003647 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003648 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003649 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003650 options::OPT_ffp_contract)) {
3651 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003652 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003653 if (Val == "fast" || Val == "on" || Val == "off") {
3654 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3655 } else {
3656 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003657 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003658 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003659 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3660 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003661 // If fast-math is set then set the fp-contract mode to fast.
3662 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3663 }
3664 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003665
Sanjay Patel2987c292015-06-11 14:53:41 +00003666 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003667
Bob Wilson6a039162012-07-19 03:52:53 +00003668 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3669 // and if we find them, tell the frontend to provide the appropriate
3670 // preprocessor macros. This is distinct from enabling any optimizations as
3671 // these options induce language changes which must survive serialization
3672 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003673 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3674 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003675 if (!A->getOption().matches(options::OPT_fno_fast_math))
3676 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003677 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3678 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003679 if (A->getOption().matches(options::OPT_ffinite_math_only))
3680 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003681
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003682 // Decide whether to use verbose asm. Verbose assembly is the default on
3683 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003684 bool IsIntegratedAssemblerDefault =
3685 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003686 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003687 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003688 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003689 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003690
Rafael Espindolab8a12932015-05-22 20:44:03 +00003691 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3692 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003693 CmdArgs.push_back("-no-integrated-as");
3694
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003695 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3696 CmdArgs.push_back("-mdebug-pass");
3697 CmdArgs.push_back("Structure");
3698 }
3699 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3700 CmdArgs.push_back("-mdebug-pass");
3701 CmdArgs.push_back("Arguments");
3702 }
3703
John McCall8517abc2010-02-19 02:45:38 +00003704 // Enable -mconstructor-aliases except on darwin, where we have to
3705 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003706 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003707 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003708
John McCall7ef5cb32011-03-18 02:56:14 +00003709 // Darwin's kernel doesn't support guard variables; just die if we
3710 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003711 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003712 CmdArgs.push_back("-fforbid-guard-variables");
3713
Akira Hatanaka02028482015-11-12 17:21:22 +00003714 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3715 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003716 CmdArgs.push_back("-mms-bitfields");
3717 }
John McCall8517abc2010-02-19 02:45:38 +00003718
Daniel Dunbar306945d2009-09-16 06:17:29 +00003719 // This is a coarse approximation of what llvm-gcc actually does, both
3720 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3721 // complicated ways.
3722 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003723 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3724 options::OPT_fno_asynchronous_unwind_tables,
3725 (getToolChain().IsUnwindTablesDefault() ||
3726 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3727 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003728 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3729 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003730 CmdArgs.push_back("-munwind-tables");
3731
Chandler Carruth05fb5852012-11-21 23:40:23 +00003732 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003733
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003734 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3735 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003736 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003737 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003738
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003739 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003740 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003741
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003742 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003743 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003744 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003745 }
3746
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003747 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003748 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003749 if (!CPU.empty()) {
3750 CmdArgs.push_back("-target-cpu");
3751 CmdArgs.push_back(Args.MakeArgString(CPU));
3752 }
3753
Rafael Espindolaeb265472013-08-21 21:59:03 +00003754 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3755 CmdArgs.push_back("-mfpmath");
3756 CmdArgs.push_back(A->getValue());
3757 }
3758
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003759 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003760 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003761
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003762 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003763 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003764 default:
3765 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003766
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003767 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003768 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003769 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003770 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003771 // Use the effective triple, which takes into account the deployment target.
3772 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003773 break;
3774
Tim Northover573cbee2014-05-24 12:52:07 +00003775 case llvm::Triple::aarch64:
3776 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003777 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003778 break;
3779
Eric Christopher0b26a612010-03-02 02:41:08 +00003780 case llvm::Triple::mips:
3781 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003782 case llvm::Triple::mips64:
3783 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003784 AddMIPSTargetArgs(Args, CmdArgs);
3785 break;
3786
Ulrich Weigand8afad612014-07-28 13:17:52 +00003787 case llvm::Triple::ppc:
3788 case llvm::Triple::ppc64:
3789 case llvm::Triple::ppc64le:
3790 AddPPCTargetArgs(Args, CmdArgs);
3791 break;
3792
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003793 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003794 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003795 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003796 AddSparcTargetArgs(Args, CmdArgs);
3797 break;
3798
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003799 case llvm::Triple::x86:
3800 case llvm::Triple::x86_64:
3801 AddX86TargetArgs(Args, CmdArgs);
3802 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003803
3804 case llvm::Triple::hexagon:
3805 AddHexagonTargetArgs(Args, CmdArgs);
3806 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003807 }
3808
Douglas Katzman3459ce22015-10-08 04:24:12 +00003809 // The 'g' groups options involve a somewhat intricate sequence of decisions
3810 // about what to pass from the driver to the frontend, but by the time they
3811 // reach cc1 they've been factored into two well-defined orthogonal choices:
3812 // * what level of debug info to generate
3813 // * what dwarf version to write
3814 // This avoids having to monkey around further in cc1 other than to disable
3815 // codeview if not running in a Windows environment. Perhaps even that
3816 // decision should be made in the driver as well though.
3817 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3818 CodeGenOptions::NoDebugInfo;
3819 // These two are potentially updated by AddClangCLArgs.
3820 unsigned DwarfVersion = 0;
3821 bool EmitCodeView = false;
3822
Hans Wennborg75958c42013-08-08 00:17:41 +00003823 // Add clang-cl arguments.
3824 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003825 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003826
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003827 // Pass the linker version in use.
3828 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3829 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003830 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003831 }
3832
Eric Christopherb7d97e92013-04-03 01:58:53 +00003833 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003834 CmdArgs.push_back("-momit-leaf-frame-pointer");
3835
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003836 // Explicitly error on some things we know we don't support and can't just
3837 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003838 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003839 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3840 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003841 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003842 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003843 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3844 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003845 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003846 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003847 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003848 }
3849
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003850 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003851 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003852 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003853 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003854 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3855 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003856 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003857 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003858 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003859
Chad Rosierbe10f982011-08-02 17:58:04 +00003860 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003861 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003862 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3863 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003864 }
3865
Rafael Espindola08a692a2010-03-07 04:46:18 +00003866 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003867 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003868 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003869 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
3870 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
3871 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003872 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003873 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003874 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00003875 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003876 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003877 // Some 'g' group option other than one expressly disabling debug info
3878 // must have been the final (winning) one. They're all equivalent.
3879 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00003880 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003881 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003882
Douglas Katzman3459ce22015-10-08 04:24:12 +00003883 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
3884 // (because that would mean that "-g0" was the rightmost 'g' group option).
3885 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
3886 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
3887 // exists of removing the gdwarf options from the g_group.
3888 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
3889 options::OPT_gdwarf_4))
3890 DwarfVersion = DwarfVersionNum(A->getSpelling());
3891
Reid Kleckner124955a2015-08-05 18:51:13 +00003892 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00003893 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
3894 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
3895 // DwarfVersion remains at 0 if no explicit choice was made.
3896 CmdArgs.push_back("-gcodeview");
3897 } else if (DwarfVersion == 0 &&
3898 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
3899 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
3900 }
Reid Kleckner124955a2015-08-05 18:51:13 +00003901
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003902 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3903 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003904
3905 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00003906 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003907 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003908 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003909
Eric Christopher138c32b2013-09-13 22:37:55 +00003910 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003911 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003912 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003913 CmdArgs.push_back("-dwarf-ext-refs");
3914 CmdArgs.push_back("-fmodule-format=obj");
3915 }
3916
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003917 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3918 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003919 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003920 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003921 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003922 CmdArgs.push_back("-backend-option");
3923 CmdArgs.push_back("-split-dwarf=Enable");
3924 }
3925
Douglas Katzman3459ce22015-10-08 04:24:12 +00003926 // After we've dealt with all combinations of things that could
3927 // make DebugInfoKind be other than None or DebugLineTablesOnly,
3928 // figure out if we need to "upgrade" it to standalone debug info.
3929 // We parse these two '-f' options whether or not they will be used,
3930 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
3931 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
3932 options::OPT_fno_standalone_debug,
3933 getToolChain().GetDefaultStandaloneDebug());
3934 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
3935 DebugInfoKind = CodeGenOptions::FullDebugInfo;
3936 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
3937
Eric Christopher138c32b2013-09-13 22:37:55 +00003938 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3939 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3940 CmdArgs.push_back("-backend-option");
3941 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3942 }
Eric Christophereec89c22013-06-18 00:03:50 +00003943
Eric Christopher0d403d22014-02-14 01:27:03 +00003944 // -gdwarf-aranges turns on the emission of the aranges section in the
3945 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003946 // Always enabled on the PS4.
3947 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00003948 CmdArgs.push_back("-backend-option");
3949 CmdArgs.push_back("-generate-arange-section");
3950 }
3951
David Blaikief36d9ba2014-01-27 18:52:43 +00003952 if (Args.hasFlag(options::OPT_fdebug_types_section,
3953 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003954 CmdArgs.push_back("-backend-option");
3955 CmdArgs.push_back("-generate-type-units");
3956 }
Eric Christophereec89c22013-06-18 00:03:50 +00003957
Ed Schouten6e576152015-03-26 17:50:28 +00003958 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3959 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3960
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003961 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003962 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003963 CmdArgs.push_back("-ffunction-sections");
3964 }
3965
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003966 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3967 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003968 CmdArgs.push_back("-fdata-sections");
3969 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003970
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003971 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003972 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003973 CmdArgs.push_back("-fno-unique-section-names");
3974
Chris Lattner3c77a352010-06-22 00:03:40 +00003975 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3976
Diego Novilloa0545962015-07-10 18:00:07 +00003977 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003978
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003979 // Pass options for controlling the default header search paths.
3980 if (Args.hasArg(options::OPT_nostdinc)) {
3981 CmdArgs.push_back("-nostdsysteminc");
3982 CmdArgs.push_back("-nobuiltininc");
3983 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003984 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003985 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003986 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3987 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3988 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003989
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003990 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003991 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003992 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003993
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003994 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3995
Ted Kremenekf7639e12012-03-06 20:06:33 +00003996 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003997 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003998 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003999 options::OPT_ccc_arcmt_modify,
4000 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004001 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004002 switch (A->getOption().getID()) {
4003 default:
4004 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004005 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004006 CmdArgs.push_back("-arcmt-check");
4007 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004008 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004009 CmdArgs.push_back("-arcmt-modify");
4010 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004011 case options::OPT_ccc_arcmt_migrate:
4012 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004013 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004014 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004015
4016 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4017 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004018 break;
John McCalld70fb982011-06-15 23:25:17 +00004019 }
4020 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004021 } else {
4022 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4023 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4024 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004025 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004026
Ted Kremenekf7639e12012-03-06 20:06:33 +00004027 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4028 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004029 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4030 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004031 }
4032 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004033 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004034
4035 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004036 options::OPT_objcmt_migrate_subscripting,
4037 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004038 // None specified, means enable them all.
4039 CmdArgs.push_back("-objcmt-migrate-literals");
4040 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004041 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004042 } else {
4043 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4044 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004045 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004046 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004047 } else {
4048 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4049 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4050 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4051 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4052 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4053 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004054 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004055 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4056 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4057 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4058 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4059 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4060 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4061 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004062 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004063 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004064 }
4065
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004066 // Add preprocessing options like -I, -D, etc. if we are using the
4067 // preprocessor.
4068 //
4069 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004070 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00004071 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004072
Rafael Espindolaa7431922011-07-21 23:40:37 +00004073 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4074 // that "The compiler can only warn and ignore the option if not recognized".
4075 // When building with ccache, it will pass -D options to clang even on
4076 // preprocessed inputs and configure concludes that -fPIC is not supported.
4077 Args.ClaimAllArgs(options::OPT_D);
4078
Alp Toker7874bdc2013-11-15 20:40:58 +00004079 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004080 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4081 if (A->getOption().matches(options::OPT_O4)) {
4082 CmdArgs.push_back("-O3");
4083 D.Diag(diag::warn_O4_is_O3);
4084 } else {
4085 A->render(Args, CmdArgs);
4086 }
4087 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004088
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004089 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004090 for (const Arg *A :
4091 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4092 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004093 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004094 }
4095
Rafael Espindola577637a2015-01-03 00:06:04 +00004096 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004097
Richard Smith3be1cb22014-08-07 00:24:21 +00004098 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004099 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004100 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4101 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004102 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004103 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004104
4105 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004106 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004107 //
4108 // If a std is supplied, only add -trigraphs if it follows the
4109 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004110 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004111 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4112 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004113 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004114 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004115 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004116 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004117 else
4118 Std->render(Args, CmdArgs);
4119
Nico Weber00721502014-12-23 22:32:37 +00004120 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004121 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004122 options::OPT_ftrigraphs,
4123 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004124 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004125 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004126 } else {
4127 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004128 //
4129 // FIXME: Clang doesn't correctly handle -std= when the input language
4130 // doesn't match. For the time being just ignore this for C++ inputs;
4131 // eventually we want to do all the standard defaulting here instead of
4132 // splitting it between the driver and clang -cc1.
4133 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004134 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4135 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004136 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004137 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004138
Nico Weber00721502014-12-23 22:32:37 +00004139 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4140 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004141 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004142
Richard Smith282b4492013-09-04 22:50:31 +00004143 // GCC's behavior for -Wwrite-strings is a bit strange:
4144 // * In C, this "warning flag" changes the types of string literals from
4145 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4146 // for the discarded qualifier.
4147 // * In C++, this is just a normal warning flag.
4148 //
4149 // Implementing this warning correctly in C is hard, so we follow GCC's
4150 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4151 // a non-const char* in C, rather than using this crude hack.
4152 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004153 // FIXME: This should behave just like a warning flag, and thus should also
4154 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4155 Arg *WriteStrings =
4156 Args.getLastArg(options::OPT_Wwrite_strings,
4157 options::OPT_Wno_write_strings, options::OPT_w);
4158 if (WriteStrings &&
4159 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004160 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004161 }
4162
Chandler Carruth61fbf622011-04-23 09:27:53 +00004163 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004164 // during C++ compilation, which it is by default. GCC keeps this define even
4165 // in the presence of '-w', match this behavior bug-for-bug.
4166 if (types::isCXX(InputType) &&
4167 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4168 true)) {
4169 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004170 }
4171
Chandler Carruthe0391482010-05-22 02:21:53 +00004172 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4173 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4174 if (Asm->getOption().matches(options::OPT_fasm))
4175 CmdArgs.push_back("-fgnu-keywords");
4176 else
4177 CmdArgs.push_back("-fno-gnu-keywords");
4178 }
4179
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004180 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4181 CmdArgs.push_back("-fno-dwarf-directory-asm");
4182
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004183 if (ShouldDisableAutolink(Args, getToolChain()))
4184 CmdArgs.push_back("-fno-autolink");
4185
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004186 // Add in -fdebug-compilation-dir if necessary.
4187 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004188
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004189 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4190 StringRef Map = A->getValue();
4191 if (Map.find('=') == StringRef::npos)
4192 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4193 else
4194 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4195 A->claim();
4196 }
4197
Richard Smith9a568822011-11-21 19:36:32 +00004198 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4199 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004200 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004201 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004202 }
4203
Richard Smith79c927b2013-11-06 19:31:51 +00004204 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4205 CmdArgs.push_back("-foperator-arrow-depth");
4206 CmdArgs.push_back(A->getValue());
4207 }
4208
Richard Smith9a568822011-11-21 19:36:32 +00004209 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4210 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004211 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004212 }
4213
Richard Smitha3d3bd22013-05-08 02:12:03 +00004214 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4215 CmdArgs.push_back("-fconstexpr-steps");
4216 CmdArgs.push_back(A->getValue());
4217 }
4218
Richard Smithb3a14522013-02-22 01:59:51 +00004219 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4220 CmdArgs.push_back("-fbracket-depth");
4221 CmdArgs.push_back(A->getValue());
4222 }
4223
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004224 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4225 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004226 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004227 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004228 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4229 } else
4230 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004231 }
4232
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004233 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004234 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004235
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004236 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4237 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004238 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004239 }
David Chisnall5778fce2009-08-31 16:41:57 +00004240
Chris Lattnere23003d2010-01-09 21:54:33 +00004241 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4242 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004243 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004244 }
4245
Chris Lattnerb35583d2010-04-07 20:49:23 +00004246 CmdArgs.push_back("-ferror-limit");
4247 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004248 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004249 else
4250 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004251
Chandler Carrutha77a7272010-05-06 04:55:18 +00004252 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4253 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004254 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004255 }
4256
4257 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4258 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004259 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004260 }
4261
Richard Smithf6f003a2011-12-16 19:06:07 +00004262 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4263 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004264 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004265 }
4266
Nick Lewycky24653262014-12-16 21:39:02 +00004267 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4268 CmdArgs.push_back("-fspell-checking-limit");
4269 CmdArgs.push_back(A->getValue());
4270 }
4271
Daniel Dunbar2c978472009-11-04 06:24:47 +00004272 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004273 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004274 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004275 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004276 } else {
4277 // If -fmessage-length=N was not specified, determine whether this is a
4278 // terminal and, if so, implicitly define -fmessage-length appropriately.
4279 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004280 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004281 }
4282
John McCallb4a99d32013-02-19 01:57:35 +00004283 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4284 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4285 options::OPT_fvisibility_ms_compat)) {
4286 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4287 CmdArgs.push_back("-fvisibility");
4288 CmdArgs.push_back(A->getValue());
4289 } else {
4290 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4291 CmdArgs.push_back("-fvisibility");
4292 CmdArgs.push_back("hidden");
4293 CmdArgs.push_back("-ftype-visibility");
4294 CmdArgs.push_back("default");
4295 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004296 }
4297
Douglas Gregor08329632010-06-15 17:05:35 +00004298 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004299
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004300 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4301
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004302 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004303 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4304 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004305 CmdArgs.push_back("-ffreestanding");
4306
Daniel Dunbare357d562009-12-03 18:42:11 +00004307 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004308 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004309 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004310 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004311 // Emulated TLS is enabled by default on Android, and can be enabled manually
4312 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004313 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004314 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4315 EmulatedTLSDefault))
4316 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004317 // AltiVec-like language extensions aren't relevant for assembling.
4318 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004319 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004320 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4321 }
Richard Trieu91844232012-06-26 18:18:47 +00004322 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4323 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004324
Alexey Bataevdb390212015-05-20 04:24:19 +00004325 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004326 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4327 options::OPT_fno_openmp, false))
4328 switch (getOpenMPRuntime(getToolChain(), Args)) {
4329 case OMPRT_OMP:
4330 case OMPRT_IOMP5:
4331 // Clang can generate useful OpenMP code for these two runtime libraries.
4332 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004333
4334 // If no option regarding the use of TLS in OpenMP codegeneration is
4335 // given, decide a default based on the target. Otherwise rely on the
4336 // options and pass the right information to the frontend.
4337 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004338 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004339 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004340 break;
4341 default:
4342 // By default, if Clang doesn't know how to generate useful OpenMP code
4343 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4344 // down to the actual compilation.
4345 // FIXME: It would be better to have a mode which *only* omits IR
4346 // generation based on the OpenMP support so that we get consistent
4347 // semantic analysis, etc.
4348 break;
4349 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004350
Peter Collingbourne32701642013-11-01 18:16:25 +00004351 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004352 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004353
Eric Christopher459d2712013-02-19 06:16:53 +00004354 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004355 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4356 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4357 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4358 Arch == llvm::Triple::ppc64le))
4359 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4360 << "ppc/ppc64/ppc64le";
4361 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004362
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004363 // -fzvector is incompatible with -faltivec.
4364 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4365 if (Args.hasArg(options::OPT_faltivec))
4366 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4367 << "-faltivec";
4368
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004369 if (getToolChain().SupportsProfiling())
4370 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004371
4372 // -flax-vector-conversions is default.
4373 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4374 options::OPT_fno_lax_vector_conversions))
4375 CmdArgs.push_back("-fno-lax-vector-conversions");
4376
John Brawna7b4ec02015-08-10 11:11:28 +00004377 if (Args.getLastArg(options::OPT_fapple_kext) ||
4378 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004379 CmdArgs.push_back("-fapple-kext");
4380
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004381 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004382 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004383 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004384 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4385 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004386
4387 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4388 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004389 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004390 }
4391
Bob Wilson14adb362012-02-03 06:27:22 +00004392 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004393
Chandler Carruth6e501032011-03-27 00:04:55 +00004394 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4395 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004396 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004397 if (A->getOption().matches(options::OPT_fwrapv))
4398 CmdArgs.push_back("-fwrapv");
4399 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4400 options::OPT_fno_strict_overflow)) {
4401 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4402 CmdArgs.push_back("-fwrapv");
4403 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004404
4405 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4406 options::OPT_fno_reroll_loops))
4407 if (A->getOption().matches(options::OPT_freroll_loops))
4408 CmdArgs.push_back("-freroll-loops");
4409
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004410 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004411 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4412 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004413
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004414 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4415
Daniel Dunbar4930e332009-11-17 08:07:36 +00004416 // -stack-protector=0 is default.
4417 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004418 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4419 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4420 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4421 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4422 Args.ClaimAllArgs(options::OPT_fstack_protector);
4423 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004424 options::OPT_fstack_protector_all,
4425 options::OPT_fstack_protector_strong,
4426 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004427 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004428 StackProtectorLevel = std::max<unsigned>(
4429 LangOptions::SSPOn,
4430 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004431 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004432 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004433 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004434 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004435 } else {
4436 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004437 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004438 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004439 if (StackProtectorLevel) {
4440 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004441 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004442 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004443
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004444 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004445 for (const Arg *A : Args.filtered(options::OPT__param)) {
4446 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004447 if (Str.startswith("ssp-buffer-size=")) {
4448 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004449 CmdArgs.push_back("-stack-protector-buffer-size");
4450 // FIXME: Verify the argument is a valid integer.
4451 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004452 }
Sean Silva14facf32015-06-09 01:57:17 +00004453 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004454 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004455 }
4456
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004457 // Translate -mstackrealign
4458 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004459 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004460 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004461
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004462 if (Args.hasArg(options::OPT_mstack_alignment)) {
4463 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4464 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004465 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004466
Hans Wennborg77dc2362015-01-20 19:45:50 +00004467 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4468 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4469
4470 if (!Size.empty())
4471 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4472 else
4473 CmdArgs.push_back("-mstack-probe-size=0");
4474 }
4475
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004476 switch (getToolChain().getArch()) {
4477 case llvm::Triple::aarch64:
4478 case llvm::Triple::aarch64_be:
4479 case llvm::Triple::arm:
4480 case llvm::Triple::armeb:
4481 case llvm::Triple::thumb:
4482 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004483 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004484 break;
4485
4486 default:
4487 break;
4488 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004489
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004490 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4491 options::OPT_mno_restrict_it)) {
4492 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4493 CmdArgs.push_back("-backend-option");
4494 CmdArgs.push_back("-arm-restrict-it");
4495 } else {
4496 CmdArgs.push_back("-backend-option");
4497 CmdArgs.push_back("-arm-no-restrict-it");
4498 }
James Y Knight2db38f32015-08-15 03:45:25 +00004499 } else if (Triple.isOSWindows() &&
4500 (Triple.getArch() == llvm::Triple::arm ||
4501 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004502 // Windows on ARM expects restricted IT blocks
4503 CmdArgs.push_back("-backend-option");
4504 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004505 }
4506
Daniel Dunbard18049a2009-04-07 21:16:11 +00004507 // Forward -f options with positive and negative forms; we translate
4508 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004509 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4510 StringRef fname = A->getValue();
4511 if (!llvm::sys::fs::exists(fname))
4512 D.Diag(diag::err_drv_no_such_file) << fname;
4513 else
4514 A->render(Args, CmdArgs);
4515 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004516
John Brawna7b4ec02015-08-10 11:11:28 +00004517 // -fbuiltin is default unless -mkernel is used
4518 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4519 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004520 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004521
Nuno Lopes13c88c72009-12-16 16:59:22 +00004522 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4523 options::OPT_fno_assume_sane_operator_new))
4524 CmdArgs.push_back("-fno-assume-sane-operator-new");
4525
Daniel Dunbar4930e332009-11-17 08:07:36 +00004526 // -fblocks=0 is default.
4527 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004528 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004529 (Args.hasArg(options::OPT_fgnu_runtime) &&
4530 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4531 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004532 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004533
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004534 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004535 !getToolChain().hasBlocksRuntime())
4536 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004537 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004538
Richard Smith47972af2015-06-16 00:08:24 +00004539 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004540 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004541 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004542 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004543 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004544 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4545 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004546 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004547 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004548 HaveModules = true;
4549 }
4550 }
4551
Richard Smith47972af2015-06-16 00:08:24 +00004552 // -fmodule-maps enables implicit reading of module map files. By default,
4553 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004554 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4555 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004556 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004557 }
4558
Daniel Jasperac42b752013-10-21 06:34:34 +00004559 // -fmodules-decluse checks that modules used are declared so (off by
4560 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004561 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004562 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004563 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004564 }
4565
Daniel Jasper962b38e2014-04-11 11:47:45 +00004566 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4567 // all #included headers are part of modules.
4568 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004569 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004570 CmdArgs.push_back("-fmodules-strict-decluse");
4571 }
4572
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004573 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4574 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4575 options::OPT_fno_implicit_modules)) {
4576 CmdArgs.push_back("-fno-implicit-modules");
4577 }
4578
Daniel Jasperac42b752013-10-21 06:34:34 +00004579 // -fmodule-name specifies the module that is currently being built (or
4580 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004581 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004582
Richard Smith9887d792014-10-17 01:42:53 +00004583 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004584 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004585 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004586
Richard Smithe842a472014-10-22 02:05:46 +00004587 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004588 if (HaveModules)
4589 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4590 else
4591 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004592
4593 // -fmodule-cache-path specifies where our implicitly-built module files
4594 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004595 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004596 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004597 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004598 if (HaveModules) {
4599 if (C.isForDiagnostics()) {
4600 // When generating crash reports, we want to emit the modules along with
4601 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004602 Path = Output.getFilename();
4603 llvm::sys::path::replace_extension(Path, ".cache");
4604 llvm::sys::path::append(Path, "modules");
4605 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004606 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004607 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004608 llvm::sys::path::append(Path, "org.llvm.clang.");
4609 appendUserToPath(Path);
4610 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004611 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004612 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004613 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4614 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004615 }
4616
4617 // When building modules and generating crashdumps, we need to dump a module
4618 // dependency VFS alongside the output.
4619 if (HaveModules && C.isForDiagnostics()) {
4620 SmallString<128> VFSDir(Output.getFilename());
4621 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004622 // Add the cache directory as a temp so the crash diagnostics pick it up.
4623 C.addTempFile(Args.MakeArgString(VFSDir));
4624
Justin Bognera88f0122014-06-20 22:59:50 +00004625 llvm::sys::path::append(VFSDir, "vfs");
4626 CmdArgs.push_back("-module-dependency-dir");
4627 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004628 }
4629
Richard Smith9887d792014-10-17 01:42:53 +00004630 if (HaveModules)
4631 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004632
Douglas Gregor35b04d62013-02-07 19:01:24 +00004633 // Pass through all -fmodules-ignore-macro arguments.
4634 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004635 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4636 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004637
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004638 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4639
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004640 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4641 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4642 D.Diag(diag::err_drv_argument_not_allowed_with)
4643 << A->getAsString(Args) << "-fbuild-session-timestamp";
4644
4645 llvm::sys::fs::file_status Status;
4646 if (llvm::sys::fs::status(A->getValue(), Status))
4647 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004648 CmdArgs.push_back(Args.MakeArgString(
4649 "-fbuild-session-timestamp=" +
4650 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004651 }
4652
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004653 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004654 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4655 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004656 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4657
4658 Args.AddLastArg(CmdArgs,
4659 options::OPT_fmodules_validate_once_per_build_session);
4660 }
4661
Ben Langmuirdcf73862014-03-12 00:06:17 +00004662 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4663
John McCalldfea9982010-04-09 19:12:06 +00004664 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004665 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004666 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004667 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004668
Anders Carlssond470fef2010-11-21 00:09:52 +00004669 // -felide-constructors is the default.
4670 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004671 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004672 CmdArgs.push_back("-fno-elide-constructors");
4673
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004674 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004675
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004676 if (KernelOrKext || (types::isCXX(InputType) &&
4677 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4678 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004679 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004680
Tony Linthicum76329bf2011-12-12 21:14:55 +00004681 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004682 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4683 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004684 CmdArgs.push_back("-fshort-enums");
4685
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004686 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004687 if (Arg *A = Args.getLastArg(
4688 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4689 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4690 if (A->getOption().matches(options::OPT_funsigned_char) ||
4691 A->getOption().matches(options::OPT_fno_signed_char)) {
4692 CmdArgs.push_back("-fno-signed-char");
4693 }
4694 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004695 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004696 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004697
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004698 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004699 if (!Args.hasFlag(
4700 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4701 !IsWindowsCygnus && !IsWindowsGNU &&
4702 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4703 getToolChain().getArch() != llvm::Triple::hexagon &&
4704 getToolChain().getArch() != llvm::Triple::xcore &&
4705 ((getToolChain().getTriple().getVendor() !=
4706 llvm::Triple::MipsTechnologies) ||
4707 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004708 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004709 CmdArgs.push_back("-fno-use-cxa-atexit");
4710
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004711 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004712 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004713 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004714 CmdArgs.push_back("-fms-extensions");
4715
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004716 // -fno-use-line-directives is default.
4717 if (Args.hasFlag(options::OPT_fuse_line_directives,
4718 options::OPT_fno_use_line_directives, false))
4719 CmdArgs.push_back("-fuse-line-directives");
4720
Francois Pichet1b4f1632011-09-17 04:32:15 +00004721 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004722 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004723 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004724 (IsWindowsMSVC &&
4725 Args.hasFlag(options::OPT_fms_extensions,
4726 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004727 CmdArgs.push_back("-fms-compatibility");
4728
David Majnemerc371ff02015-03-22 08:39:22 +00004729 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004730 VersionTuple MSVT = visualstudio::getMSVCVersion(
4731 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4732 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004733 CmdArgs.push_back(
4734 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004735
David Majnemer8db91762015-05-18 04:49:30 +00004736 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4737 if (ImplyVCPPCXXVer) {
4738 if (IsMSVC2015Compatible)
4739 CmdArgs.push_back("-std=c++14");
4740 else
4741 CmdArgs.push_back("-std=c++11");
4742 }
4743
Eric Christopher5ecce122013-02-18 00:38:31 +00004744 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004745 if (Args.hasFlag(options::OPT_fborland_extensions,
4746 options::OPT_fno_borland_extensions, false))
4747 CmdArgs.push_back("-fborland-extensions");
4748
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004749 // -fno-declspec is default, except for PS4.
4750 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4751 getToolChain().getTriple().isPS4()))
4752 CmdArgs.push_back("-fdeclspec");
4753 else if (Args.hasArg(options::OPT_fno_declspec))
4754 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4755
David Majnemerc371ff02015-03-22 08:39:22 +00004756 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4757 // than 19.
4758 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4759 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004760 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004761 CmdArgs.push_back("-fno-threadsafe-statics");
4762
Francois Pichet02744872011-09-01 16:38:08 +00004763 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4764 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004765 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004766 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004767 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004768
Chandler Carruthe03aa552010-04-17 20:17:31 +00004769 // -fgnu-keywords default varies depending on language; only pass if
4770 // specified.
4771 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004772 options::OPT_fno_gnu_keywords))
4773 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004774
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004775 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004776 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004777 CmdArgs.push_back("-fgnu89-inline");
4778
Chad Rosier9c76d242012-03-15 22:31:42 +00004779 if (Args.hasArg(options::OPT_fno_inline))
4780 CmdArgs.push_back("-fno-inline");
4781
Chad Rosier64d6be92012-03-06 21:17:19 +00004782 if (Args.hasArg(options::OPT_fno_inline_functions))
4783 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004784
John McCall5fb5df92012-06-20 06:18:46 +00004785 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004786
John McCall5fb5df92012-06-20 06:18:46 +00004787 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004788 // legacy is the default. Except for deployment taget of 10.5,
4789 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4790 // gets ignored silently.
4791 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004792 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4793 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004794 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004795 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004796 if (getToolChain().UseObjCMixedDispatch())
4797 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4798 else
4799 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4800 }
4801 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004802
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004803 // When ObjectiveC legacy runtime is in effect on MacOSX,
4804 // turn on the option to do Array/Dictionary subscripting
4805 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004806 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004807 getToolChain().getTriple().isMacOSX() &&
4808 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4809 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004810 objcRuntime.isNeXTFamily())
4811 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004812
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004813 // -fencode-extended-block-signature=1 is default.
4814 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4815 CmdArgs.push_back("-fencode-extended-block-signature");
4816 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004817
John McCall24fc0de2011-07-06 00:26:06 +00004818 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4819 // NOTE: This logic is duplicated in ToolChains.cpp.
4820 bool ARC = isObjCAutoRefCount(Args);
4821 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004822 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004823
John McCall24fc0de2011-07-06 00:26:06 +00004824 CmdArgs.push_back("-fobjc-arc");
4825
Chandler Carruth491db322011-11-04 07:34:47 +00004826 // FIXME: It seems like this entire block, and several around it should be
4827 // wrapped in isObjC, but for now we just use it here as this is where it
4828 // was being used previously.
4829 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4830 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4831 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4832 else
4833 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4834 }
4835
John McCall24fc0de2011-07-06 00:26:06 +00004836 // Allow the user to enable full exceptions code emission.
4837 // We define off for Objective-CC, on for Objective-C++.
4838 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4839 options::OPT_fno_objc_arc_exceptions,
4840 /*default*/ types::isCXX(InputType)))
4841 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00004842
John McCall24fc0de2011-07-06 00:26:06 +00004843 }
4844
4845 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4846 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004847 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004848 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004849
John McCall24fc0de2011-07-06 00:26:06 +00004850 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4851 // takes precedence.
4852 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4853 if (!GCArg)
4854 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4855 if (GCArg) {
4856 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004857 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004858 } else if (getToolChain().SupportsObjCGC()) {
4859 GCArg->render(Args, CmdArgs);
4860 } else {
4861 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004862 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004863 }
4864 }
4865
John McCallfbe5ed72015-11-05 19:19:56 +00004866 // Pass down -fobjc-weak or -fno-objc-weak if present.
4867 if (types::isObjC(InputType)) {
4868 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
4869 options::OPT_fno_objc_weak);
4870 if (!WeakArg) {
4871 // nothing to do
4872 } else if (GCArg) {
4873 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4874 D.Diag(diag::err_objc_weak_with_gc);
4875 } else if (!objcRuntime.allowsWeak()) {
4876 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4877 D.Diag(diag::err_objc_weak_unsupported);
4878 } else {
4879 WeakArg->render(Args, CmdArgs);
4880 }
4881 }
4882
Bob Wilsonb111ec92015-03-02 19:01:14 +00004883 if (Args.hasFlag(options::OPT_fapplication_extension,
4884 options::OPT_fno_application_extension, false))
4885 CmdArgs.push_back("-fapplication-extension");
4886
Reid Klecknerc542d372014-06-27 17:02:02 +00004887 // Handle GCC-style exception args.
4888 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004889 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4890 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004891
Tim Northovere931f9f2015-10-30 16:30:41 +00004892 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00004893 CmdArgs.push_back("-fsjlj-exceptions");
4894
4895 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004896 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4897 options::OPT_fno_assume_sane_operator_new))
4898 CmdArgs.push_back("-fno-assume-sane-operator-new");
4899
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004900 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4901 // most platforms.
4902 if (Args.hasFlag(options::OPT_fsized_deallocation,
4903 options::OPT_fno_sized_deallocation, false))
4904 CmdArgs.push_back("-fsized-deallocation");
4905
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004906 // -fconstant-cfstrings is default, and may be subject to argument translation
4907 // on Darwin.
4908 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4909 options::OPT_fno_constant_cfstrings) ||
4910 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4911 options::OPT_mno_constant_cfstrings))
4912 CmdArgs.push_back("-fno-constant-cfstrings");
4913
John Thompsoned4e2952009-11-05 20:14:16 +00004914 // -fshort-wchar default varies depending on platform; only
4915 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004916 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4917 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004918 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004919
Hans Wennborg28c96312013-07-31 23:39:13 +00004920 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004921 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004922 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004923 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004924
Daniel Dunbar096ed292011-10-05 21:04:55 +00004925 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4926 // -fno-pack-struct doesn't apply to -fpack-struct=.
4927 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004928 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004929 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004930 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004931 } else if (Args.hasFlag(options::OPT_fpack_struct,
4932 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004933 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004934 }
4935
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004936 // Handle -fmax-type-align=N and -fno-type-align
4937 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4938 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4939 if (!SkipMaxTypeAlign) {
4940 std::string MaxTypeAlignStr = "-fmax-type-align=";
4941 MaxTypeAlignStr += A->getValue();
4942 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4943 }
4944 } else if (getToolChain().getTriple().isOSDarwin()) {
4945 if (!SkipMaxTypeAlign) {
4946 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4947 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4948 }
4949 }
4950
John Brawna7b4ec02015-08-10 11:11:28 +00004951 // -fcommon is the default unless compiling kernel code or the target says so
4952 bool NoCommonDefault =
4953 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4954 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4955 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004956 CmdArgs.push_back("-fno-common");
4957
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004958 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004959 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004960 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004961 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004962 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004963 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004964
Daniel Dunbar6358d682010-10-15 22:30:42 +00004965 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004966 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004967 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004968 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004969
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004970 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004971 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4972 StringRef value = inputCharset->getValue();
4973 if (value != "UTF-8")
4974 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4975 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004976 }
4977
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004978 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004979 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4980 StringRef value = execCharset->getValue();
4981 if (value != "UTF-8")
4982 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4983 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004984 }
4985
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004986 // -fcaret-diagnostics is default.
4987 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4988 options::OPT_fno_caret_diagnostics, true))
4989 CmdArgs.push_back("-fno-caret-diagnostics");
4990
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004991 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004992 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004993 options::OPT_fno_diagnostics_fixit_info))
4994 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004995
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004996 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004997 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004998 options::OPT_fno_diagnostics_show_option))
4999 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005000
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005001 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005002 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005003 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005004 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005005 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005006
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005007 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005008 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005009 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005010 }
5011
Chandler Carruthb6766f02011-03-27 01:50:55 +00005012 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005013 options::OPT_fdiagnostics_show_note_include_stack,
5014 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005015 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005016 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005017 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5018 else
5019 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5020 }
5021
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005022 // Color diagnostics are the default, unless the terminal doesn't support
5023 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005024 // Support both clang's -f[no-]color-diagnostics and gcc's
5025 // -f[no-]diagnostics-colors[=never|always|auto].
5026 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005027 for (const auto &Arg : Args) {
5028 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005029 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5030 !O.matches(options::OPT_fdiagnostics_color) &&
5031 !O.matches(options::OPT_fno_color_diagnostics) &&
5032 !O.matches(options::OPT_fno_diagnostics_color) &&
5033 !O.matches(options::OPT_fdiagnostics_color_EQ))
5034 continue;
5035
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005036 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005037 if (O.matches(options::OPT_fcolor_diagnostics) ||
5038 O.matches(options::OPT_fdiagnostics_color)) {
5039 ShowColors = Colors_On;
5040 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5041 O.matches(options::OPT_fno_diagnostics_color)) {
5042 ShowColors = Colors_Off;
5043 } else {
5044 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005045 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005046 if (value == "always")
5047 ShowColors = Colors_On;
5048 else if (value == "never")
5049 ShowColors = Colors_Off;
5050 else if (value == "auto")
5051 ShowColors = Colors_Auto;
5052 else
5053 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005054 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005055 }
5056 }
5057 if (ShowColors == Colors_On ||
5058 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005059 CmdArgs.push_back("-fcolor-diagnostics");
5060
Nico Rieck7857d462013-09-11 00:38:02 +00005061 if (Args.hasArg(options::OPT_fansi_escape_codes))
5062 CmdArgs.push_back("-fansi-escape-codes");
5063
Daniel Dunbardb097022009-06-08 21:13:54 +00005064 if (!Args.hasFlag(options::OPT_fshow_source_location,
5065 options::OPT_fno_show_source_location))
5066 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005067
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005068 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005069 true))
5070 CmdArgs.push_back("-fno-show-column");
5071
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005072 if (!Args.hasFlag(options::OPT_fspell_checking,
5073 options::OPT_fno_spell_checking))
5074 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005075
Chad Rosierc8e56e82012-12-05 21:08:21 +00005076 // -fno-asm-blocks is default.
5077 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5078 false))
5079 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005080
Steven Wucb0d13f2015-01-16 23:05:28 +00005081 // -fgnu-inline-asm is default.
5082 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5083 options::OPT_fno_gnu_inline_asm, true))
5084 CmdArgs.push_back("-fno-gnu-inline-asm");
5085
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005086 // Enable vectorization per default according to the optimization level
5087 // selected. For optimization levels that want vectorization we use the alias
5088 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005089 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005090 OptSpecifier VectorizeAliasOption =
5091 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005092 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005093 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005094 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005095
Chad Rosier136d67d2014-04-28 19:30:57 +00005096 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005097 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005098 OptSpecifier SLPVectAliasOption =
5099 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005100 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005101 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005102 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005103
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005104 // -fno-slp-vectorize-aggressive is default.
5105 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005106 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005107 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005108
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005109 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5110 A->render(Args, CmdArgs);
5111
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005112 // -fdollars-in-identifiers default varies depending on platform and
5113 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005114 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005115 options::OPT_fno_dollars_in_identifiers)) {
5116 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005117 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005118 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005119 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005120 }
5121
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005122 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5123 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005124 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005125 options::OPT_fno_unit_at_a_time)) {
5126 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005127 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005128 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005129
Eli Friedman055c9702011-11-02 01:53:16 +00005130 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5131 options::OPT_fno_apple_pragma_pack, false))
5132 CmdArgs.push_back("-fapple-pragma-pack");
5133
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005134 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005135 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5136 // by default.
5137 if (getToolChain().getArch() == llvm::Triple::le32) {
5138 CmdArgs.push_back("-fno-math-builtin");
5139 }
5140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005141// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5142//
5143// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005144#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005145 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005146 (getToolChain().getArch() == llvm::Triple::arm ||
5147 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005148 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5149 CmdArgs.push_back("-fno-builtin-strcat");
5150 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5151 CmdArgs.push_back("-fno-builtin-strcpy");
5152 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005153#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005154
Justin Bognera88f0122014-06-20 22:59:50 +00005155 // Enable rewrite includes if the user's asked for it or if we're generating
5156 // diagnostics.
5157 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5158 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005159 if (Args.hasFlag(options::OPT_frewrite_includes,
5160 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005161 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005162 CmdArgs.push_back("-frewrite-includes");
5163
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005164 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005165 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005166 options::OPT_traditional_cpp)) {
5167 if (isa<PreprocessJobAction>(JA))
5168 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005169 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005170 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005171 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005172
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005173 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005174 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005175
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005176 // Handle serialized diagnostics.
5177 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5178 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005179 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005180 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005181
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005182 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5183 CmdArgs.push_back("-fretain-comments-from-system-headers");
5184
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005185 // Forward -fcomment-block-commands to -cc1.
5186 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005187 // Forward -fparse-all-comments to -cc1.
5188 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005189
John Brawnad31ace2015-09-23 13:55:40 +00005190 // Turn -fplugin=name.so into -load name.so
5191 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5192 CmdArgs.push_back("-load");
5193 CmdArgs.push_back(A->getValue());
5194 A->claim();
5195 }
5196
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005197 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5198 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005199 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005200 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5201 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005202
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005203 // We translate this by hand to the -cc1 argument, since nightly test uses
5204 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005205 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005206 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005207 } else
Sean Silva14facf32015-06-09 01:57:17 +00005208 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005209 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005210
Bob Wilson23a55f12014-12-21 07:00:00 +00005211 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005212 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5213 // by the frontend.
5214 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5215 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005216
Daniel Dunbard67a3222009-03-30 06:36:42 +00005217 if (Output.getType() == types::TY_Dependencies) {
5218 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005219 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005220 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005221 CmdArgs.push_back(Output.getFilename());
5222 } else {
5223 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005224 }
5225
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005226 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005227
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005228 if (Input.isFilename())
5229 CmdArgs.push_back(Input.getFilename());
5230 else
5231 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005232
Chris Lattnere9d7d782009-11-03 19:50:27 +00005233 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5234
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005235 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005236
5237 // Optionally embed the -cc1 level arguments into the debug info, for build
5238 // analysis.
5239 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005240 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005241 for (const auto &Arg : Args)
5242 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005243
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005244 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005245 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005246 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005247 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005248 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005249 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005250 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005251 }
5252 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005253 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005254 }
5255
Eric Christopherd3804002013-02-22 20:12:52 +00005256 // Add the split debug info name to the command lines here so we
5257 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005258 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005259 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5260 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005261 const char *SplitDwarfOut;
5262 if (SplitDwarf) {
5263 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005264 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005265 CmdArgs.push_back(SplitDwarfOut);
5266 }
5267
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005268 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5269 // Include them with -fcuda-include-gpubinary.
5270 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005271 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005272 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005273 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005274 }
5275
Eric Christopherd3804002013-02-22 20:12:52 +00005276 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005277 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005278 Output.getType() == types::TY_Object &&
5279 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005280 auto CLCommand =
5281 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005282 C.addCommand(llvm::make_unique<FallbackCommand>(
5283 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005284 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005285 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005286 }
5287
Eric Christopherf1545832013-02-22 23:50:16 +00005288 // Handle the debug info splitting at object creation time if we're
5289 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005290 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005291 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005292 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005293
Roman Divacky178e01602011-02-10 16:52:03 +00005294 if (Arg *A = Args.getLastArg(options::OPT_pg))
5295 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005296 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5297 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005298
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005299 // Claim some arguments which clang supports automatically.
5300
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005301 // -fpch-preprocess is used with gcc to add a special marker in the output to
5302 // include the PCH file. Clang's PTH solution is completely transparent, so we
5303 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005304 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005305
Daniel Dunbar17731772009-03-23 19:03:36 +00005306 // Claim some arguments which clang doesn't support, but we don't
5307 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005308 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5309 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005310
Rafael Espindolab0092d72013-09-04 19:37:35 +00005311 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005312 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005313}
5314
John McCall5fb5df92012-06-20 06:18:46 +00005315/// Add options related to the Objective-C runtime/ABI.
5316///
5317/// Returns true if the runtime is non-fragile.
5318ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5319 ArgStringList &cmdArgs,
5320 RewriteKind rewriteKind) const {
5321 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005322 Arg *runtimeArg =
5323 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5324 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005325
5326 // Just forward -fobjc-runtime= to the frontend. This supercedes
5327 // options about fragility.
5328 if (runtimeArg &&
5329 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5330 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005331 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005332 if (runtime.tryParse(value)) {
5333 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005334 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005335 }
5336
5337 runtimeArg->render(args, cmdArgs);
5338 return runtime;
5339 }
5340
5341 // Otherwise, we'll need the ABI "version". Version numbers are
5342 // slightly confusing for historical reasons:
5343 // 1 - Traditional "fragile" ABI
5344 // 2 - Non-fragile ABI, version 1
5345 // 3 - Non-fragile ABI, version 2
5346 unsigned objcABIVersion = 1;
5347 // If -fobjc-abi-version= is present, use that to set the version.
5348 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005349 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005350 if (value == "1")
5351 objcABIVersion = 1;
5352 else if (value == "2")
5353 objcABIVersion = 2;
5354 else if (value == "3")
5355 objcABIVersion = 3;
5356 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005357 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005358 } else {
5359 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005360 bool nonFragileABIIsDefault =
5361 (rewriteKind == RK_NonFragile ||
5362 (rewriteKind == RK_None &&
5363 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005364 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5365 options::OPT_fno_objc_nonfragile_abi,
5366 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005367// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005368#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5369 unsigned nonFragileABIVersion = 1;
5370#else
5371 unsigned nonFragileABIVersion = 2;
5372#endif
5373
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005374 if (Arg *abiArg =
5375 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005376 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005377 if (value == "1")
5378 nonFragileABIVersion = 1;
5379 else if (value == "2")
5380 nonFragileABIVersion = 2;
5381 else
5382 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005383 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005384 }
5385
5386 objcABIVersion = 1 + nonFragileABIVersion;
5387 } else {
5388 objcABIVersion = 1;
5389 }
5390 }
5391
5392 // We don't actually care about the ABI version other than whether
5393 // it's non-fragile.
5394 bool isNonFragile = objcABIVersion != 1;
5395
5396 // If we have no runtime argument, ask the toolchain for its default runtime.
5397 // However, the rewriter only really supports the Mac runtime, so assume that.
5398 ObjCRuntime runtime;
5399 if (!runtimeArg) {
5400 switch (rewriteKind) {
5401 case RK_None:
5402 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5403 break;
5404 case RK_Fragile:
5405 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5406 break;
5407 case RK_NonFragile:
5408 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5409 break;
5410 }
5411
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005412 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005413 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5414 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005415 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005416 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5417
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005418 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005419 } else {
5420 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5421 }
5422
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005423 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005424 } else {
5425 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005426 // Legacy behaviour is to target the gnustep runtime if we are i
5427 // non-fragile mode or the GCC runtime in fragile mode.
5428 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005429 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005430 else
5431 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005432 }
5433
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005434 cmdArgs.push_back(
5435 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005436 return runtime;
5437}
5438
Reid Klecknerc542d372014-06-27 17:02:02 +00005439static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5440 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5441 I += HaveDash;
5442 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005443}
Reid Klecknerc542d372014-06-27 17:02:02 +00005444
Benjamin Kramere003ca22015-10-28 13:54:16 +00005445namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005446struct EHFlags {
5447 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5448 bool Synch;
5449 bool Asynch;
5450 bool NoExceptC;
5451};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005452} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005453
5454/// /EH controls whether to run destructor cleanups when exceptions are
5455/// thrown. There are three modifiers:
5456/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5457/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5458/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5459/// - c: Assume that extern "C" functions are implicitly noexcept. This
5460/// modifier is an optimization, so we ignore it for now.
5461/// The default is /EHs-c-, meaning cleanups are disabled.
5462static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5463 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005464
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005465 std::vector<std::string> EHArgs =
5466 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005467 for (auto EHVal : EHArgs) {
5468 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5469 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005470 case 'a':
5471 EH.Asynch = maybeConsumeDash(EHVal, I);
5472 continue;
5473 case 'c':
5474 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5475 continue;
5476 case 's':
5477 EH.Synch = maybeConsumeDash(EHVal, I);
5478 continue;
5479 default:
5480 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005481 }
5482 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5483 break;
5484 }
5485 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005486
Reid Klecknerc542d372014-06-27 17:02:02 +00005487 return EH;
5488}
5489
Douglas Katzman3459ce22015-10-08 04:24:12 +00005490void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5491 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5492 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005493 unsigned RTOptionID = options::OPT__SLASH_MT;
5494
Hans Wennborgf1a74252013-09-10 20:18:04 +00005495 if (Args.hasArg(options::OPT__SLASH_LDd))
5496 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5497 // but defining _DEBUG is sticky.
5498 RTOptionID = options::OPT__SLASH_MTd;
5499
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005500 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005501 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005502
David Majnemere2afb472015-07-24 06:49:13 +00005503 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005504 switch (RTOptionID) {
5505 case options::OPT__SLASH_MD:
5506 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005507 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005508 CmdArgs.push_back("-D_MT");
5509 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005510 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005511 break;
5512 case options::OPT__SLASH_MDd:
5513 CmdArgs.push_back("-D_DEBUG");
5514 CmdArgs.push_back("-D_MT");
5515 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005516 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005517 break;
5518 case options::OPT__SLASH_MT:
5519 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005520 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005521 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005522 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005523 break;
5524 case options::OPT__SLASH_MTd:
5525 CmdArgs.push_back("-D_DEBUG");
5526 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005527 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005528 break;
5529 default:
5530 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005531 }
5532
David Majnemere2afb472015-07-24 06:49:13 +00005533 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5534 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5535 } else {
5536 CmdArgs.push_back(FlagForCRT.data());
5537
5538 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5539 // users want. The /Za flag to cl.exe turns this off, but it's not
5540 // implemented in clang.
5541 CmdArgs.push_back("--dependent-lib=oldnames");
5542 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005543
Hans Wennborg8858a032014-07-21 23:42:07 +00005544 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5545 // would produce interleaved output, so ignore /showIncludes in such cases.
5546 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5547 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5548 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005549
David Majnemerf6072342014-07-01 22:24:56 +00005550 // This controls whether or not we emit RTTI data for polymorphic types.
5551 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5552 /*default=*/false))
5553 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005554
Reid Kleckner124955a2015-08-05 18:51:13 +00005555 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005556 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005557 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5558 // If we are emitting CV but not DWARF, don't build information that LLVM
5559 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005560 if (*EmitCodeView && !EmitDwarf)
5561 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5562 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005563 CmdArgs.push_back("-gcodeview");
5564
Reid Klecknerc542d372014-06-27 17:02:02 +00005565 const Driver &D = getToolChain().getDriver();
5566 EHFlags EH = parseClangCLEHFlags(D, Args);
5567 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005568 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005569 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005570 CmdArgs.push_back("-fexceptions");
5571 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005572
Hans Wennborge50cec32014-06-13 20:59:54 +00005573 // /EP should expand to -E -P.
5574 if (Args.hasArg(options::OPT__SLASH_EP)) {
5575 CmdArgs.push_back("-E");
5576 CmdArgs.push_back("-P");
5577 }
5578
David Majnemera5b195a2015-02-14 01:35:12 +00005579 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005580 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5581 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005582 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5583 else
5584 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5585
5586 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5587 VolatileOptionID = A->getOption().getID();
5588
5589 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5590 CmdArgs.push_back("-fms-volatile");
5591
David Majnemer86c318f2014-02-11 21:05:00 +00005592 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5593 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5594 if (MostGeneralArg && BestCaseArg)
5595 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5596 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5597
5598 if (MostGeneralArg) {
5599 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5600 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5601 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5602
5603 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5604 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5605 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5606 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5607 << FirstConflict->getAsString(Args)
5608 << SecondConflict->getAsString(Args);
5609
5610 if (SingleArg)
5611 CmdArgs.push_back("-fms-memptr-rep=single");
5612 else if (MultipleArg)
5613 CmdArgs.push_back("-fms-memptr-rep=multiple");
5614 else
5615 CmdArgs.push_back("-fms-memptr-rep=virtual");
5616 }
5617
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005618 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5619 A->render(Args, CmdArgs);
5620
Hans Wennborg81f74482013-09-10 01:07:07 +00005621 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5622 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005623 if (Args.hasArg(options::OPT__SLASH_fallback))
5624 CmdArgs.push_back("msvc-fallback");
5625 else
5626 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005627 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005628}
5629
Douglas Katzman95354292015-06-23 20:42:09 +00005630visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005631 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005632 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005633 return CLFallback.get();
5634}
5635
Daniel Sanders7f933f42015-01-30 17:35:23 +00005636void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5637 ArgStringList &CmdArgs) const {
5638 StringRef CPUName;
5639 StringRef ABIName;
5640 const llvm::Triple &Triple = getToolChain().getTriple();
5641 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5642
5643 CmdArgs.push_back("-target-abi");
5644 CmdArgs.push_back(ABIName.data());
5645}
5646
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005647void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005648 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005649 const ArgList &Args,
5650 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005651 ArgStringList CmdArgs;
5652
5653 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5654 const InputInfo &Input = Inputs[0];
5655
James Y Knight2db38f32015-08-15 03:45:25 +00005656 std::string TripleStr =
5657 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5658 const llvm::Triple Triple(TripleStr);
5659
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005660 // Don't warn about "clang -w -c foo.s"
5661 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005662 // and "clang -emit-llvm -c foo.s"
5663 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005664
Rafael Espindola577637a2015-01-03 00:06:04 +00005665 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005666
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005667 // Invoke ourselves in -cc1as mode.
5668 //
5669 // FIXME: Implement custom jobs for internal actions.
5670 CmdArgs.push_back("-cc1as");
5671
5672 // Add the "effective" target triple.
5673 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005674 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5675
5676 // Set the output mode, we currently only expect to be used as a real
5677 // assembler.
5678 CmdArgs.push_back("-filetype");
5679 CmdArgs.push_back("obj");
5680
Eric Christopher45f2e712012-12-18 00:31:10 +00005681 // Set the main file name, so that debug info works even with
5682 // -save-temps or preprocessed assembly.
5683 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005684 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005685
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005686 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005687 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005688 if (!CPU.empty()) {
5689 CmdArgs.push_back("-target-cpu");
5690 CmdArgs.push_back(Args.MakeArgString(CPU));
5691 }
5692
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005693 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005694 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005695
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005696 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005697 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005698
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005699 // Pass along any -I options so we get proper .include search paths.
5700 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5701
Eric Christopherfc3ee562012-01-10 00:38:01 +00005702 // Determine the original source input.
5703 const Action *SourceAction = &JA;
5704 while (SourceAction->getKind() != Action::InputClass) {
5705 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5706 SourceAction = SourceAction->getInputs()[0];
5707 }
5708
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005709 // Forward -g and handle debug info related flags, assuming we are dealing
5710 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005711 if (SourceAction->getType() == types::TY_Asm ||
5712 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005713 bool WantDebug = false;
5714 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005715 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005716 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5717 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005718 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005719 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005720 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005721 if (DwarfVersion == 0)
5722 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005723 RenderDebugEnablingArgs(Args, CmdArgs,
5724 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5725 : CodeGenOptions::NoDebugInfo),
5726 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005727
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005728 // Add the -fdebug-compilation-dir flag if needed.
5729 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005730
5731 // Set the AT_producer to the clang version when using the integrated
5732 // assembler on assembly source files.
5733 CmdArgs.push_back("-dwarf-debug-producer");
5734 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005735
5736 // And pass along -I options
5737 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005738 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005739
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005740 // Handle -fPIC et al -- the relocation-model affects the assembler
5741 // for some targets.
5742 llvm::Reloc::Model RelocationModel;
5743 unsigned PICLevel;
5744 bool IsPIE;
5745 std::tie(RelocationModel, PICLevel, IsPIE) =
5746 ParsePICArgs(getToolChain(), Triple, Args);
5747
5748 const char *RMName = RelocationModelName(RelocationModel);
5749 if (RMName) {
5750 CmdArgs.push_back("-mrelocation-model");
5751 CmdArgs.push_back(RMName);
5752 }
5753
Kevin Enderby292dc082011-12-22 19:31:58 +00005754 // Optionally embed the -cc1as level arguments into the debug info, for build
5755 // analysis.
5756 if (getToolChain().UseDwarfDebugFlags()) {
5757 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005758 for (const auto &Arg : Args)
5759 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005760
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005761 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005762 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5763 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005764 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005765 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005766 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005767 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005768 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005769 }
5770 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005771 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005772 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005773
5774 // FIXME: Add -static support, once we have it.
5775
Daniel Sanders7f933f42015-01-30 17:35:23 +00005776 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005777 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005778 default:
5779 break;
5780
5781 case llvm::Triple::mips:
5782 case llvm::Triple::mipsel:
5783 case llvm::Triple::mips64:
5784 case llvm::Triple::mips64el:
5785 AddMIPSTargetArgs(Args, CmdArgs);
5786 break;
5787 }
5788
David Blaikie372d9502014-01-17 03:17:40 +00005789 // Consume all the warning flags. Usually this would be handled more
5790 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5791 // doesn't handle that so rather than warning about unused flags that are
5792 // actually used, we'll lie by omission instead.
5793 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005794 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5795 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005796
David Blaikie9260ed62013-07-25 21:19:01 +00005797 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5798 getToolChain().getDriver());
5799
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005800 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005801
5802 assert(Output.isFilename() && "Unexpected lipo output.");
5803 CmdArgs.push_back("-o");
5804 CmdArgs.push_back(Output.getFilename());
5805
Daniel Dunbarb440f562010-08-02 02:38:21 +00005806 assert(Input.isFilename() && "Invalid input.");
5807 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005808
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005809 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005810 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005811
5812 // Handle the debug info splitting at object creation time if we're
5813 // creating an object.
5814 // TODO: Currently only works on linux with newer objcopy.
5815 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005816 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005817 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005818 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005819}
5820
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005821void GnuTool::anchor() {}
5822
Daniel Dunbara3246a02009-03-18 08:07:30 +00005823void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005824 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005825 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005826 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005827 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005828 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005829
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005830 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005831 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005832 // Don't forward any -g arguments to assembly steps.
5833 if (isa<AssembleJobAction>(JA) &&
5834 A->getOption().matches(options::OPT_g_Group))
5835 continue;
5836
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005837 // Don't forward any -W arguments to assembly and link steps.
5838 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5839 A->getOption().matches(options::OPT_W_Group))
5840 continue;
5841
Daniel Dunbar2da02722009-03-19 07:55:12 +00005842 // It is unfortunate that we have to claim here, as this means
5843 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005844 // platforms using a generic gcc, even if we are just using gcc
5845 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005846 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005847 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005848 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005849 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005850
Daniel Dunbar4e295052010-01-25 22:35:08 +00005851 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005852
5853 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005854 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005855 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005856 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005857 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005858 }
5859
Daniel Dunbar5716d872009-05-02 21:41:52 +00005860 // Try to force gcc to match the tool chain we want, if we recognize
5861 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005862 //
5863 // FIXME: The triple class should directly provide the information we want
5864 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005865 switch (getToolChain().getArch()) {
5866 default:
5867 break;
5868 case llvm::Triple::x86:
5869 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005870 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005871 break;
5872 case llvm::Triple::x86_64:
5873 case llvm::Triple::ppc64:
5874 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005875 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005876 break;
5877 case llvm::Triple::sparcel:
5878 CmdArgs.push_back("-EL");
5879 break;
5880 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005881
Daniel Dunbarb440f562010-08-02 02:38:21 +00005882 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005883 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005884 CmdArgs.push_back(Output.getFilename());
5885 } else {
5886 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005887 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005888 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005889
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005890 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005891
5892 // Only pass -x if gcc will understand it; otherwise hope gcc
5893 // understands the suffix correctly. The main use case this would go
5894 // wrong in is for linker inputs if they happened to have an odd
5895 // suffix; really the only way to get this to happen is a command
5896 // like '-x foobar a.c' which will treat a.c like a linker input.
5897 //
5898 // FIXME: For the linker case specifically, can we safely convert
5899 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005900 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005901 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005902 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5903 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005904 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005905 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005906 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005907 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005908 else if (II.getType() == types::TY_ModuleFile)
5909 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005910 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005911
Daniel Dunbara3246a02009-03-18 08:07:30 +00005912 if (types::canTypeBeUserSpecified(II.getType())) {
5913 CmdArgs.push_back("-x");
5914 CmdArgs.push_back(types::getTypeName(II.getType()));
5915 }
5916
Daniel Dunbarb440f562010-08-02 02:38:21 +00005917 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005918 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005919 else {
5920 const Arg &A = II.getInputArg();
5921
5922 // Reverse translate some rewritten options.
5923 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5924 CmdArgs.push_back("-lstdc++");
5925 continue;
5926 }
5927
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005928 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005929 A.render(Args, CmdArgs);
5930 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005931 }
5932
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005933 const std::string customGCCName = D.getCCCGenericGCCName();
5934 const char *GCCName;
5935 if (!customGCCName.empty())
5936 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005937 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005938 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005939 } else
5940 GCCName = "gcc";
5941
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005942 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005943 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005944}
5945
Douglas Katzman95354292015-06-23 20:42:09 +00005946void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5947 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005948 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005949}
5950
Douglas Katzman95354292015-06-23 20:42:09 +00005951void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5952 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005953 const Driver &D = getToolChain().getDriver();
5954
Eric Christophercc7ff502015-01-29 00:56:17 +00005955 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005956 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005957 case types::TY_LLVM_IR:
5958 case types::TY_LTO_IR:
5959 case types::TY_LLVM_BC:
5960 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005961 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005962 break;
5963 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005964 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005965 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005966 case types::TY_Nothing:
5967 CmdArgs.push_back("-fsyntax-only");
5968 break;
5969 default:
5970 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005971 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005972}
5973
Douglas Katzman95354292015-06-23 20:42:09 +00005974void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5975 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005976 // The types are (hopefully) good enough.
5977}
5978
Tony Linthicum76329bf2011-12-12 21:14:55 +00005979// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005980void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5981 ArgStringList &CmdArgs) const {}
5982void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5983 const InputInfo &Output,
5984 const InputInfoList &Inputs,
5985 const ArgList &Args,
5986 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005987 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005988
5989 const Driver &D = getToolChain().getDriver();
5990 ArgStringList CmdArgs;
5991
5992 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005993 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005994 CmdArgs.push_back(Args.MakeArgString(MarchString));
5995
5996 RenderExtraToolArgs(JA, CmdArgs);
5997
5998 if (Output.isFilename()) {
5999 CmdArgs.push_back("-o");
6000 CmdArgs.push_back(Output.getFilename());
6001 } else {
6002 assert(Output.isNothing() && "Unexpected output");
6003 CmdArgs.push_back("-fsyntax-only");
6004 }
6005
Douglas Katzman54366072015-07-27 16:53:08 +00006006 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006007 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006008
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006009 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006010
Tony Linthicum76329bf2011-12-12 21:14:55 +00006011 // Only pass -x if gcc will understand it; otherwise hope gcc
6012 // understands the suffix correctly. The main use case this would go
6013 // wrong in is for linker inputs if they happened to have an odd
6014 // suffix; really the only way to get this to happen is a command
6015 // like '-x foobar a.c' which will treat a.c like a linker input.
6016 //
6017 // FIXME: For the linker case specifically, can we safely convert
6018 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006019 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006020 // Don't try to pass LLVM or AST inputs to a generic gcc.
6021 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
6022 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
6023 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006024 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006025 else if (II.getType() == types::TY_AST)
6026 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006027 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006028 else if (II.getType() == types::TY_ModuleFile)
6029 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006030 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006031
6032 if (II.isFilename())
6033 CmdArgs.push_back(II.getFilename());
6034 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006035 // Don't render as input, we need gcc to do the translations.
6036 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006037 II.getInputArg().render(Args, CmdArgs);
6038 }
6039
6040 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006041 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006042 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006043}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006044
Douglas Katzman95354292015-06-23 20:42:09 +00006045void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6046 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006047 // The types are (hopefully) good enough.
6048}
6049
Douglas Katzman54366072015-07-27 16:53:08 +00006050static void
6051constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
6052 const toolchains::HexagonToolChain &ToolChain,
6053 const InputInfo &Output, const InputInfoList &Inputs,
6054 const ArgList &Args, ArgStringList &CmdArgs,
6055 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006056
Matthew Curtise689b052012-12-06 15:46:07 +00006057 const Driver &D = ToolChain.getDriver();
6058
Matthew Curtise689b052012-12-06 15:46:07 +00006059 //----------------------------------------------------------------------------
6060 //
6061 //----------------------------------------------------------------------------
6062 bool hasStaticArg = Args.hasArg(options::OPT_static);
6063 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006064 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00006065 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
6066 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6067 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006068 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006069 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006070
Matthew Curtise689b052012-12-06 15:46:07 +00006071 //----------------------------------------------------------------------------
6072 // Silence warnings for various options
6073 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00006074
Matthew Curtise689b052012-12-06 15:46:07 +00006075 Args.ClaimAllArgs(options::OPT_g_Group);
6076 Args.ClaimAllArgs(options::OPT_emit_llvm);
6077 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6078 // handled somewhere else.
6079 Args.ClaimAllArgs(options::OPT_static_libgcc);
6080
6081 //----------------------------------------------------------------------------
6082 //
6083 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006084 for (const auto &Opt : ToolChain.ExtraOpts)
6085 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006086
Douglas Katzman54366072015-07-27 16:53:08 +00006087 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00006088 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00006089
Matthew Curtise689b052012-12-06 15:46:07 +00006090 if (buildingLib) {
6091 CmdArgs.push_back("-shared");
6092 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
6093 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00006094 }
6095
Matthew Curtise689b052012-12-06 15:46:07 +00006096 if (hasStaticArg)
6097 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006098
Matthew Curtise8f80a12012-12-06 17:49:03 +00006099 if (buildPIE && !buildingLib)
6100 CmdArgs.push_back("-pie");
6101
Douglas Katzman54366072015-07-27 16:53:08 +00006102 if (const char *v =
6103 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006104 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00006105 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006106 }
6107
Matthew Curtise689b052012-12-06 15:46:07 +00006108 //----------------------------------------------------------------------------
6109 //
6110 //----------------------------------------------------------------------------
6111 CmdArgs.push_back("-o");
6112 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006113
Matthew Curtise689b052012-12-06 15:46:07 +00006114 const std::string MarchSuffix = "/" + MarchString;
6115 const std::string G0Suffix = "/G0";
6116 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00006117 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006118 const std::string StartFilesDir =
6119 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006120
6121 //----------------------------------------------------------------------------
6122 // moslib
6123 //----------------------------------------------------------------------------
6124 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006125 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006126
Sean Silva14facf32015-06-09 01:57:17 +00006127 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6128 A->claim();
6129 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00006130 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006131 }
Matthew Curtise689b052012-12-06 15:46:07 +00006132 if (oslibs.empty()) {
6133 oslibs.push_back("standalone");
6134 hasStandalone = true;
6135 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006136
Matthew Curtise689b052012-12-06 15:46:07 +00006137 //----------------------------------------------------------------------------
6138 // Start Files
6139 //----------------------------------------------------------------------------
6140 if (incStdLib && incStartFiles) {
6141
6142 if (!buildingLib) {
6143 if (hasStandalone) {
6144 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006145 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00006146 }
6147 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
6148 }
6149 std::string initObj = useShared ? "/initS.o" : "/init.o";
6150 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
6151 }
6152
6153 //----------------------------------------------------------------------------
6154 // Library Search Paths
6155 //----------------------------------------------------------------------------
6156 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006157 for (const auto &LibPath : LibPaths)
6158 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006159
6160 //----------------------------------------------------------------------------
6161 //
6162 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006163 Args.AddAllArgs(CmdArgs,
6164 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6165 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006166
6167 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6168
6169 //----------------------------------------------------------------------------
6170 // Libraries
6171 //----------------------------------------------------------------------------
6172 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006173 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006174 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6175 CmdArgs.push_back("-lm");
6176 }
6177
6178 CmdArgs.push_back("--start-group");
6179
6180 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006181 for (const std::string &Lib : oslibs)
6182 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006183 CmdArgs.push_back("-lc");
6184 }
6185 CmdArgs.push_back("-lgcc");
6186
6187 CmdArgs.push_back("--end-group");
6188 }
6189
6190 //----------------------------------------------------------------------------
6191 // End files
6192 //----------------------------------------------------------------------------
6193 if (incStdLib && incStartFiles) {
6194 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6195 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6196 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006197}
6198
Douglas Katzman95354292015-06-23 20:42:09 +00006199void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6200 const InputInfo &Output,
6201 const InputInfoList &Inputs,
6202 const ArgList &Args,
6203 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006204
Douglas Katzman54366072015-07-27 16:53:08 +00006205 const toolchains::HexagonToolChain &ToolChain =
6206 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006207
6208 ArgStringList CmdArgs;
6209 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6210 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006211
6212 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006213 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006214 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006215}
6216// Hexagon tools end.
6217
Tom Stellard8fa33092015-07-18 01:49:05 +00006218void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6219 const InputInfo &Output,
6220 const InputInfoList &Inputs,
6221 const ArgList &Args,
6222 const char *LinkingOutput) const {
6223
6224 std::string Linker = getToolChain().GetProgramPath(getShortName());
6225 ArgStringList CmdArgs;
6226 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006227 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006228 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006229 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006230 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6231 CmdArgs.push_back("-o");
6232 CmdArgs.push_back(Output.getFilename());
6233 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6234 CmdArgs, Inputs));
6235}
6236// AMDGPU tools end.
6237
Renato Golin7c542b42015-07-27 23:44:45 +00006238const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006239 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006240 if (!Arch.empty())
6241 MArch = Arch;
6242 else
Bernard Ogden31561762013-12-12 13:27:11 +00006243 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006244 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006245
6246 // Handle -march=native.
6247 if (MArch == "native") {
6248 std::string CPU = llvm::sys::getHostCPUName();
6249 if (CPU != "generic") {
6250 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006251 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006252 // If there is no valid architecture suffix for this CPU we don't know how
6253 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006254 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006255 MArch = "";
6256 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006257 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006258 }
6259 }
6260
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006261 return MArch;
6262}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006263
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006264/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006265StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006266 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006267 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6268 // here means an -march=native that we can't handle, so instead return no CPU.
6269 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006270 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006271
John Brawna95c1a82015-05-08 12:52:18 +00006272 // We need to return an empty string here on invalid MArch values as the
6273 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006274 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006275}
6276
6277/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006278std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006279 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006280 // FIXME: Warn on inconsistent use of -mcpu and -march.
6281 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006282 if (!CPU.empty()) {
6283 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006284 // Handle -mcpu=native.
6285 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006286 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006287 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006288 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006289 }
6290
Renato Goline17c5802015-07-27 23:44:42 +00006291 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006292}
6293
6294/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006295/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006296// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006297StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6298 const llvm::Triple &Triple) {
6299 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006300 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006301 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006302 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006303 if (ArchKind == llvm::ARM::AK_INVALID)
6304 // In case of generic Arch, i.e. "arm",
6305 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006306 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006307 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006308 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6309 // armv7k triple if it's actually been specified via "-arch armv7k".
6310 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006311 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006312 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006313 }
Renato Golin3c007252015-05-28 15:05:53 +00006314 if (ArchKind == llvm::ARM::AK_INVALID)
6315 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006316 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006317}
6318
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006319void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006320 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006321 if (Args.hasArg(options::OPT_r))
6322 return;
6323
John Brawn94fd9632015-05-21 12:19:49 +00006324 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6325 // to generate BE-8 executables.
6326 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6327 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006328}
6329
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006330mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006331 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6332 // was first introduced in Release 3. However, other compilers have
6333 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006334 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6335 .Case("mips1", NanLegacy)
6336 .Case("mips2", NanLegacy)
6337 .Case("mips3", NanLegacy)
6338 .Case("mips4", NanLegacy)
6339 .Case("mips5", NanLegacy)
6340 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006341 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006342 .Case("mips32r3", NanLegacy | Nan2008)
6343 .Case("mips32r5", NanLegacy | Nan2008)
6344 .Case("mips32r6", Nan2008)
6345 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006346 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006347 .Case("mips64r3", NanLegacy | Nan2008)
6348 .Case("mips64r5", NanLegacy | Nan2008)
6349 .Case("mips64r6", Nan2008)
6350 .Default(NanLegacy);
6351}
6352
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006353bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6354 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6355 return A && (A->getValue() == StringRef(Value));
6356}
6357
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006358bool mips::isUCLibc(const ArgList &Args) {
6359 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006360 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006361}
6362
Daniel Sanders2bf13662014-07-10 14:40:57 +00006363bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006364 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6365 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006366 .Case("2008", true)
6367 .Case("legacy", false)
6368 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006369
6370 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006371 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006372 .Cases("mips32r6", "mips64r6", true)
6373 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006374
6375 return false;
6376}
6377
Daniel Sanders379d44b2014-07-16 11:52:23 +00006378bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006379 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006380 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006381 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006382 return false;
6383
6384 if (ABIName != "32")
6385 return false;
6386
Toma Tabacu94ea6862015-06-16 13:54:13 +00006387 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6388 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006389 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006390 return false;
6391
Daniel Sanders379d44b2014-07-16 11:52:23 +00006392 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006393 .Cases("mips2", "mips3", "mips4", "mips5", true)
6394 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6395 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6396 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006397}
6398
Toma Tabacu94ea6862015-06-16 13:54:13 +00006399bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6400 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006401 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006402 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6403
6404 // FPXX shouldn't be used if -msingle-float is present.
6405 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6406 options::OPT_mdouble_float))
6407 if (A->getOption().matches(options::OPT_msingle_float))
6408 UseFPXX = false;
6409
6410 return UseFPXX;
6411}
6412
Tim Northover157d9112014-01-16 08:48:16 +00006413llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006414 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6415 // archs which Darwin doesn't use.
6416
6417 // The matching this routine does is fairly pointless, since it is neither the
6418 // complete architecture list, nor a reasonable subset. The problem is that
6419 // historically the driver driver accepts this and also ties its -march=
6420 // handling to the architecture name, so we need to be careful before removing
6421 // support for it.
6422
6423 // This code must be kept in sync with Clang's Darwin specific argument
6424 // translation.
6425
6426 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006427 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6428 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6429 .Case("ppc64", llvm::Triple::ppc64)
6430 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6431 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6432 llvm::Triple::x86)
6433 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6434 // This is derived from the driver driver.
6435 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6436 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6437 .Cases("armv7s", "xscale", llvm::Triple::arm)
6438 .Case("arm64", llvm::Triple::aarch64)
6439 .Case("r600", llvm::Triple::r600)
6440 .Case("amdgcn", llvm::Triple::amdgcn)
6441 .Case("nvptx", llvm::Triple::nvptx)
6442 .Case("nvptx64", llvm::Triple::nvptx64)
6443 .Case("amdil", llvm::Triple::amdil)
6444 .Case("spir", llvm::Triple::spir)
6445 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006446}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006447
Tim Northover157d9112014-01-16 08:48:16 +00006448void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006449 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006450 T.setArch(Arch);
6451
6452 if (Str == "x86_64h")
6453 T.setArchName(Str);
6454 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6455 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006456 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006457 }
6458}
6459
Bob Wilsondecc03e2012-11-23 06:14:39 +00006460const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006461 const InputInfo &Input) {
6462 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006463}
6464
Bob Wilsondecc03e2012-11-23 06:14:39 +00006465const char *Clang::getBaseInputStem(const ArgList &Args,
6466 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006467 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006468
Chris Lattner906bb902011-01-16 08:14:11 +00006469 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006470 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006471
6472 return Str;
6473}
6474
Bob Wilsondecc03e2012-11-23 06:14:39 +00006475const char *Clang::getDependencyFileName(const ArgList &Args,
6476 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006477 // FIXME: Think about this more.
6478 std::string Res;
6479
6480 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006481 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006482 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006483 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006484 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006485 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006486 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006487}
6488
Douglas Katzman95354292015-06-23 20:42:09 +00006489void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6490 const InputInfo &Output,
6491 const InputInfoList &Inputs,
6492 const ArgList &Args,
6493 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006494 const ToolChain &ToolChain = getToolChain();
6495 const Driver &D = ToolChain.getDriver();
6496 ArgStringList CmdArgs;
6497
6498 // Silence warning for "clang -g foo.o -o foo"
6499 Args.ClaimAllArgs(options::OPT_g_Group);
6500 // and "clang -emit-llvm foo.o -o foo"
6501 Args.ClaimAllArgs(options::OPT_emit_llvm);
6502 // and for "clang -w foo.o -o foo". Other warning options are already
6503 // handled somewhere else.
6504 Args.ClaimAllArgs(options::OPT_w);
6505
6506 if (!D.SysRoot.empty())
6507 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6508
6509 // CloudABI only supports static linkage.
6510 CmdArgs.push_back("-Bstatic");
6511 CmdArgs.push_back("--eh-frame-hdr");
6512 CmdArgs.push_back("--gc-sections");
6513
6514 if (Output.isFilename()) {
6515 CmdArgs.push_back("-o");
6516 CmdArgs.push_back(Output.getFilename());
6517 } else {
6518 assert(Output.isNothing() && "Invalid output.");
6519 }
6520
6521 if (!Args.hasArg(options::OPT_nostdlib) &&
6522 !Args.hasArg(options::OPT_nostartfiles)) {
6523 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6524 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6525 }
6526
6527 Args.AddAllArgs(CmdArgs, options::OPT_L);
6528 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6529 for (const auto &Path : Paths)
6530 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006531 Args.AddAllArgs(CmdArgs,
6532 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6533 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006534
Teresa Johnson945bc502015-10-15 20:35:53 +00006535 if (D.isUsingLTO())
6536 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006537
6538 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6539
6540 if (!Args.hasArg(options::OPT_nostdlib) &&
6541 !Args.hasArg(options::OPT_nodefaultlibs)) {
6542 if (D.CCCIsCXX())
6543 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6544 CmdArgs.push_back("-lc");
6545 CmdArgs.push_back("-lcompiler_rt");
6546 }
6547
6548 if (!Args.hasArg(options::OPT_nostdlib) &&
6549 !Args.hasArg(options::OPT_nostartfiles))
6550 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6551
6552 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006553 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006554}
6555
Douglas Katzman95354292015-06-23 20:42:09 +00006556void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6557 const InputInfo &Output,
6558 const InputInfoList &Inputs,
6559 const ArgList &Args,
6560 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006561 ArgStringList CmdArgs;
6562
6563 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6564 const InputInfo &Input = Inputs[0];
6565
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006566 // Determine the original source input.
6567 const Action *SourceAction = &JA;
6568 while (SourceAction->getKind() != Action::InputClass) {
6569 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6570 SourceAction = SourceAction->getInputs()[0];
6571 }
6572
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006573 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006574 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006575 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6576 // FIXME: at run-time detect assembler capabilities or rely on version
6577 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006578 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006579 const llvm::Triple &T(getToolChain().getTriple());
6580 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006581 CmdArgs.push_back("-Q");
6582 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006583
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006584 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006585 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006586 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006587 if (Args.hasArg(options::OPT_gstabs))
6588 CmdArgs.push_back("--gstabs");
6589 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006590 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006591 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006592
Daniel Dunbarbe220842009-03-20 16:06:39 +00006593 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006594 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006595
Daniel Dunbar6d484762010-07-22 01:47:22 +00006596 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006597 if (getToolChain().getArch() == llvm::Triple::x86 ||
6598 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006599 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6600 CmdArgs.push_back("-force_cpusubtype_ALL");
6601
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006602 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006603 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006604 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006605 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006606 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006607 CmdArgs.push_back("-static");
6608
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006609 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006610
6611 assert(Output.isFilename() && "Unexpected lipo output.");
6612 CmdArgs.push_back("-o");
6613 CmdArgs.push_back(Output.getFilename());
6614
Daniel Dunbarb440f562010-08-02 02:38:21 +00006615 assert(Input.isFilename() && "Invalid input.");
6616 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006617
6618 // asm_final spec is empty.
6619
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006620 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006621 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006622}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006623
Tim Northover157d9112014-01-16 08:48:16 +00006624void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006625
Tim Northover157d9112014-01-16 08:48:16 +00006626void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6627 ArgStringList &CmdArgs) const {
6628 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006629
Daniel Dunbarc1964212009-03-26 16:23:12 +00006630 // Derived from darwin_arch spec.
6631 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006632 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006633
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006634 // FIXME: Is this needed anymore?
6635 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006636 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006637}
6638
Douglas Katzman95354292015-06-23 20:42:09 +00006639bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006640 // We only need to generate a temp path for LTO if we aren't compiling object
6641 // files. When compiling source files, we run 'dsymutil' after linking. We
6642 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006643 for (const auto &Input : Inputs)
6644 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006645 return true;
6646
6647 return false;
6648}
6649
Douglas Katzman95354292015-06-23 20:42:09 +00006650void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6651 ArgStringList &CmdArgs,
6652 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006653 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006654 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006656 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006657 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6658 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006659 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6660 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006661 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006662 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006663 }
6664
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006665 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006666 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006667 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6668 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006669
Bob Wilson3d27dad2013-08-02 22:25:34 +00006670 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6671 CmdArgs.push_back("-export_dynamic");
6672
Bob Wilsonb111ec92015-03-02 19:01:14 +00006673 // If we are using App Extension restrictions, pass a flag to the linker
6674 // telling it that the compiled code has been audited.
6675 if (Args.hasFlag(options::OPT_fapplication_extension,
6676 options::OPT_fno_application_extension, false))
6677 CmdArgs.push_back("-application_extension");
6678
Teresa Johnson945bc502015-10-15 20:35:53 +00006679 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006680 // If we are using LTO, then automatically create a temporary file path for
6681 // the linker to use, so that it's lifetime will extend past a possible
6682 // dsymutil step.
6683 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6684 const char *TmpPath = C.getArgs().MakeArgString(
6685 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6686 C.addTempFile(TmpPath);
6687 CmdArgs.push_back("-object_path_lto");
6688 CmdArgs.push_back(TmpPath);
6689 }
6690
6691 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6692 // it in clang installed libraries. If not found, the option is not used
6693 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6694 if (Version[0] >= 133) {
6695 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6696 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6697 SmallString<128> LibLTOPath(P);
6698 llvm::sys::path::append(LibLTOPath, "lib");
6699 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6700 if (llvm::sys::fs::exists(LibLTOPath)) {
6701 CmdArgs.push_back("-lto_library");
6702 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6703 } else {
6704 D.Diag(diag::warn_drv_lto_libpath);
6705 }
6706 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006707 }
6708
Daniel Dunbarc1964212009-03-26 16:23:12 +00006709 // Derived from the "link" spec.
6710 Args.AddAllArgs(CmdArgs, options::OPT_static);
6711 if (!Args.hasArg(options::OPT_static))
6712 CmdArgs.push_back("-dynamic");
6713 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6714 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6715 // here. How do we wish to handle such things?
6716 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006717
Daniel Dunbarc1964212009-03-26 16:23:12 +00006718 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006719 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006720 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006721 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006722
6723 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6724 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6725 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6726
6727 Arg *A;
6728 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6729 (A = Args.getLastArg(options::OPT_current__version)) ||
6730 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006731 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6732 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006733
6734 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6735 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6736 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6737 } else {
6738 CmdArgs.push_back("-dylib");
6739
6740 Arg *A;
6741 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6742 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6743 (A = Args.getLastArg(options::OPT_client__name)) ||
6744 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6745 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6746 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006747 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6748 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006749
Daniel Dunbarc1964212009-03-26 16:23:12 +00006750 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6751 "-dylib_compatibility_version");
6752 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6753 "-dylib_current_version");
6754
Tim Northover157d9112014-01-16 08:48:16 +00006755 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006756
6757 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6758 "-dylib_install_name");
6759 }
6760
6761 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6762 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6763 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006764 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006765 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006766 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6767 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6768 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6769 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6770 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6771 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006772 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006773 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6774 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6775 Args.AddAllArgs(CmdArgs, options::OPT_init);
6776
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006777 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006778 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006779
Daniel Dunbarc1964212009-03-26 16:23:12 +00006780 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6781 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6782 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6783 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6784 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006785
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006786 if (const Arg *A =
6787 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6788 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006789 if (A->getOption().matches(options::OPT_fpie) ||
6790 A->getOption().matches(options::OPT_fPIE))
6791 CmdArgs.push_back("-pie");
6792 else
6793 CmdArgs.push_back("-no_pie");
6794 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006795
6796 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6797 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6798 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6799 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6800 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6801 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6802 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6803 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6804 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6805 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6806 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6807 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6808 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6809 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6810 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6811 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006812
Daniel Dunbar84384642011-05-02 21:03:47 +00006813 // Give --sysroot= preference, over the Apple specific behavior to also use
6814 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006815 StringRef sysroot = C.getSysRoot();
6816 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006817 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006818 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006819 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6820 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006821 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006822 }
6823
Daniel Dunbarc1964212009-03-26 16:23:12 +00006824 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6825 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6826 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6827 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6828 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006829 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006830 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6831 Args.AddAllArgs(CmdArgs, options::OPT_y);
6832 Args.AddLastArg(CmdArgs, options::OPT_w);
6833 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6834 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6835 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6836 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6837 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6838 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6839 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6840 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6841 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6842 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6843 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6844 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6845}
6846
Douglas Katzman95354292015-06-23 20:42:09 +00006847void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6848 const InputInfo &Output,
6849 const InputInfoList &Inputs,
6850 const ArgList &Args,
6851 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006852 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006853
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006854 // If the number of arguments surpasses the system limits, we will encode the
6855 // input files in a separate file, shortening the command line. To this end,
6856 // build a list of input file names that can be passed via a file with the
6857 // -filelist linker option.
6858 llvm::opt::ArgStringList InputFileList;
6859
Daniel Dunbarc1964212009-03-26 16:23:12 +00006860 // The logic here is derived from gcc's behavior; most of which
6861 // comes from specs (starting with link_command). Consult gcc for
6862 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006863 ArgStringList CmdArgs;
6864
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006865 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6866 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6867 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006868 for (const auto &Arg : Args)
6869 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006870 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006871 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006872 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006873 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006874 return;
6875 }
6876
Daniel Dunbarc1964212009-03-26 16:23:12 +00006877 // I'm not sure why this particular decomposition exists in gcc, but
6878 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006879 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006880
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006881 // It seems that the 'e' option is completely ignored for dynamic executables
6882 // (the default), and with static executables, the last one wins, as expected.
6883 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6884 options::OPT_Z_Flag, options::OPT_u_Group,
6885 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006886
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006887 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6888 // members of static archive libraries which implement Objective-C classes or
6889 // categories.
6890 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6891 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006892
Daniel Dunbarc1964212009-03-26 16:23:12 +00006893 CmdArgs.push_back("-o");
6894 CmdArgs.push_back(Output.getFilename());
6895
Chad Rosier06fd3c62012-05-16 23:45:12 +00006896 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006897 !Args.hasArg(options::OPT_nostartfiles))
6898 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006899
Peter Collingbournec4122c12015-06-15 21:08:13 +00006900 // SafeStack requires its own runtime libraries
6901 // These libraries should be linked first, to make sure the
6902 // __safestack_init constructor executes before everything else
6903 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6904 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6905 "libclang_rt.safestack_osx.a",
6906 /*AlwaysLink=*/true);
6907 }
6908
Daniel Dunbarc1964212009-03-26 16:23:12 +00006909 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006910
Douglas Gregor9295df02012-05-15 21:00:27 +00006911 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006912 // Build the input file for -filelist (list of linker input files) in case we
6913 // need it later
6914 for (const auto &II : Inputs) {
6915 if (!II.isFilename()) {
6916 // This is a linker input argument.
6917 // We cannot mix input arguments and file names in a -filelist input, thus
6918 // we prematurely stop our list (remaining files shall be passed as
6919 // arguments).
6920 if (InputFileList.size() > 0)
6921 break;
6922
6923 continue;
6924 }
6925
6926 InputFileList.push_back(II.getFilename());
6927 }
6928
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006929 if (!Args.hasArg(options::OPT_nostdlib) &&
6930 !Args.hasArg(options::OPT_nodefaultlibs))
6931 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6932
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006933 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006934 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006935 // We use arclite library for both ARC and subscripting support.
6936 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6937
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006938 CmdArgs.push_back("-framework");
6939 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006940 // Link libobj.
6941 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006942 }
John McCall31168b02011-06-15 23:02:42 +00006943
Daniel Dunbarc1964212009-03-26 16:23:12 +00006944 if (LinkingOutput) {
6945 CmdArgs.push_back("-arch_multiple");
6946 CmdArgs.push_back("-final_output");
6947 CmdArgs.push_back(LinkingOutput);
6948 }
6949
Daniel Dunbarc1964212009-03-26 16:23:12 +00006950 if (Args.hasArg(options::OPT_fnested_functions))
6951 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006952
Justin Bognerc7701242015-05-12 05:44:36 +00006953 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6954
Daniel Dunbarc1964212009-03-26 16:23:12 +00006955 if (!Args.hasArg(options::OPT_nostdlib) &&
6956 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006957 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006958 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006959
Daniel Dunbarc1964212009-03-26 16:23:12 +00006960 // link_ssp spec is empty.
6961
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006962 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006963 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006964 }
6965
Chad Rosier06fd3c62012-05-16 23:45:12 +00006966 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006967 !Args.hasArg(options::OPT_nostartfiles)) {
6968 // endfile_spec is empty.
6969 }
6970
6971 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6972 Args.AddAllArgs(CmdArgs, options::OPT_F);
6973
Steven Wu3ffb61b2015-02-06 18:08:29 +00006974 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006975 for (const Arg *A : Args.filtered(options::OPT_iframework))
6976 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006977
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006978 if (!Args.hasArg(options::OPT_nostdlib) &&
6979 !Args.hasArg(options::OPT_nodefaultlibs)) {
6980 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6981 if (A->getValue() == StringRef("Accelerate")) {
6982 CmdArgs.push_back("-framework");
6983 CmdArgs.push_back("Accelerate");
6984 }
6985 }
6986 }
6987
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006988 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006989 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006990 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006991 Cmd->setInputFileList(std::move(InputFileList));
6992 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006993}
6994
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006995void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006996 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006997 const InputInfoList &Inputs,
6998 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006999 const char *LinkingOutput) const {
7000 ArgStringList CmdArgs;
7001
7002 CmdArgs.push_back("-create");
7003 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007004
7005 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007006 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007007
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007008 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007009 assert(II.isFilename() && "Unexpected lipo input.");
7010 CmdArgs.push_back(II.getFilename());
7011 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007012
7013 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007014 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007015}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007016
Daniel Dunbar88299622010-06-04 18:28:36 +00007017void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007018 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007019 const InputInfoList &Inputs,
7020 const ArgList &Args,
7021 const char *LinkingOutput) const {
7022 ArgStringList CmdArgs;
7023
Daniel Dunbareb86b042011-05-09 17:23:16 +00007024 CmdArgs.push_back("-o");
7025 CmdArgs.push_back(Output.getFilename());
7026
Daniel Dunbar88299622010-06-04 18:28:36 +00007027 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7028 const InputInfo &Input = Inputs[0];
7029 assert(Input.isFilename() && "Unexpected dsymutil input.");
7030 CmdArgs.push_back(Input.getFilename());
7031
Daniel Dunbar88299622010-06-04 18:28:36 +00007032 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007033 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007034 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007035}
7036
Eric Christopher551ef452011-08-23 17:56:55 +00007037void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007038 const InputInfo &Output,
7039 const InputInfoList &Inputs,
7040 const ArgList &Args,
7041 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007042 ArgStringList CmdArgs;
7043 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007044 CmdArgs.push_back("--debug-info");
7045 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007046 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007047
7048 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7049 const InputInfo &Input = Inputs[0];
7050 assert(Input.isFilename() && "Unexpected verify input");
7051
7052 // Grabbing the output of the earlier dsymutil run.
7053 CmdArgs.push_back(Input.getFilename());
7054
7055 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007056 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007057 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007058}
7059
Douglas Katzman95354292015-06-23 20:42:09 +00007060void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007061 const InputInfo &Output,
7062 const InputInfoList &Inputs,
7063 const ArgList &Args,
7064 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007065 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007066 ArgStringList CmdArgs;
7067
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007068 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007069
7070 CmdArgs.push_back("-o");
7071 CmdArgs.push_back(Output.getFilename());
7072
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007073 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007074 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007075
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007076 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007077 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007078}
7079
Douglas Katzman95354292015-06-23 20:42:09 +00007080void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7081 const InputInfo &Output,
7082 const InputInfoList &Inputs,
7083 const ArgList &Args,
7084 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007085 ArgStringList CmdArgs;
7086
David Chisnall272a0712012-02-29 15:06:12 +00007087 // Demangle C++ names in errors
7088 CmdArgs.push_back("-C");
7089
David Chisnallf571cde2012-02-15 13:39:01 +00007090 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7091 (!Args.hasArg(options::OPT_shared))) {
7092 CmdArgs.push_back("-e");
7093 CmdArgs.push_back("_start");
7094 }
7095
7096 if (Args.hasArg(options::OPT_static)) {
7097 CmdArgs.push_back("-Bstatic");
7098 CmdArgs.push_back("-dn");
7099 } else {
7100 CmdArgs.push_back("-Bdynamic");
7101 if (Args.hasArg(options::OPT_shared)) {
7102 CmdArgs.push_back("-shared");
7103 } else {
7104 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007105 CmdArgs.push_back(
7106 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007107 }
7108 }
7109
7110 if (Output.isFilename()) {
7111 CmdArgs.push_back("-o");
7112 CmdArgs.push_back(Output.getFilename());
7113 } else {
7114 assert(Output.isNothing() && "Invalid output.");
7115 }
7116
7117 if (!Args.hasArg(options::OPT_nostdlib) &&
7118 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007119 if (!Args.hasArg(options::OPT_shared))
7120 CmdArgs.push_back(
7121 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7122
7123 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7124 CmdArgs.push_back(
7125 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7126 CmdArgs.push_back(
7127 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007128 }
7129
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007130 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
7131 for (const auto &Path : Paths)
7132 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00007133
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007134 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7135 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007136
7137 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7138
7139 if (!Args.hasArg(options::OPT_nostdlib) &&
7140 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007141 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007142 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007143 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007144 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007145 if (!Args.hasArg(options::OPT_shared)) {
7146 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007147 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007148 }
David Chisnallf571cde2012-02-15 13:39:01 +00007149 }
7150
7151 if (!Args.hasArg(options::OPT_nostdlib) &&
7152 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007153 CmdArgs.push_back(
7154 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007155 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007156 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007157
Xinliang David Li69306c02015-10-22 06:15:31 +00007158 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007159
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007160 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007161 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007162}
7163
Douglas Katzman95354292015-06-23 20:42:09 +00007164void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7165 const InputInfo &Output,
7166 const InputInfoList &Inputs,
7167 const ArgList &Args,
7168 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007169 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007170 ArgStringList CmdArgs;
7171
Rafael Espindolacc126272014-02-28 01:55:21 +00007172 switch (getToolChain().getArch()) {
7173 case llvm::Triple::x86:
7174 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7175 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007176 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007177 break;
7178
7179 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007180 CmdArgs.push_back("-mppc");
7181 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007182 break;
7183
7184 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007185 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007186 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007187 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7188 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7189 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007190 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007191 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007192
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007193 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007194 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007195 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7196 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7197 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007198 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007199 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007200
7201 case llvm::Triple::mips64:
7202 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007203 StringRef CPUName;
7204 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007205 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007206
7207 CmdArgs.push_back("-mabi");
7208 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7209
7210 if (getToolChain().getArch() == llvm::Triple::mips64)
7211 CmdArgs.push_back("-EB");
7212 else
7213 CmdArgs.push_back("-EL");
7214
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007215 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007216 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007217 }
7218
Rafael Espindolacc126272014-02-28 01:55:21 +00007219 default:
7220 break;
7221 }
7222
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007223 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007224
7225 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007226 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007227
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007228 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007229 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007230
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007231 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007232 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007233}
7234
Douglas Katzman95354292015-06-23 20:42:09 +00007235void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7236 const InputInfo &Output,
7237 const InputInfoList &Inputs,
7238 const ArgList &Args,
7239 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007240 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007241 ArgStringList CmdArgs;
7242
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007243 // Silence warning for "clang -g foo.o -o foo"
7244 Args.ClaimAllArgs(options::OPT_g_Group);
7245 // and "clang -emit-llvm foo.o -o foo"
7246 Args.ClaimAllArgs(options::OPT_emit_llvm);
7247 // and for "clang -w foo.o -o foo". Other warning options are already
7248 // handled somewhere else.
7249 Args.ClaimAllArgs(options::OPT_w);
7250
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007251 if (getToolChain().getArch() == llvm::Triple::mips64)
7252 CmdArgs.push_back("-EB");
7253 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7254 CmdArgs.push_back("-EL");
7255
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007256 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007257 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007258 CmdArgs.push_back("-e");
7259 CmdArgs.push_back("__start");
7260 }
7261
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007262 if (Args.hasArg(options::OPT_static)) {
7263 CmdArgs.push_back("-Bstatic");
7264 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007265 if (Args.hasArg(options::OPT_rdynamic))
7266 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007267 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007268 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007269 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007270 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007271 } else {
7272 CmdArgs.push_back("-dynamic-linker");
7273 CmdArgs.push_back("/usr/libexec/ld.so");
7274 }
7275 }
7276
Rafael Espindola044f7832013-06-05 04:28:55 +00007277 if (Args.hasArg(options::OPT_nopie))
7278 CmdArgs.push_back("-nopie");
7279
Daniel Dunbarb440f562010-08-02 02:38:21 +00007280 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007281 CmdArgs.push_back("-o");
7282 CmdArgs.push_back(Output.getFilename());
7283 } else {
7284 assert(Output.isNothing() && "Invalid output.");
7285 }
7286
7287 if (!Args.hasArg(options::OPT_nostdlib) &&
7288 !Args.hasArg(options::OPT_nostartfiles)) {
7289 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007290 if (Args.hasArg(options::OPT_pg))
7291 CmdArgs.push_back(
7292 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007293 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007294 CmdArgs.push_back(
7295 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7296 CmdArgs.push_back(
7297 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007298 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007299 CmdArgs.push_back(
7300 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007301 }
7302 }
7303
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007304 std::string Triple = getToolChain().getTripleString();
7305 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007306 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007307 CmdArgs.push_back(
7308 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007309
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007310 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7311 options::OPT_e, options::OPT_s, options::OPT_t,
7312 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007313
Daniel Dunbar54423b22010-09-17 00:24:54 +00007314 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007315
7316 if (!Args.hasArg(options::OPT_nostdlib) &&
7317 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007318 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007319 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007320 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007321 CmdArgs.push_back("-lm_p");
7322 else
7323 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007324 }
7325
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007326 // FIXME: For some reason GCC passes -lgcc before adding
7327 // the default system libraries. Just mimic this for now.
7328 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007329
Eric Christopher17674ec2012-09-13 06:32:34 +00007330 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007331 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7332 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007333 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007334 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007335 }
7336
Chandler Carruth45661652011-12-17 22:32:42 +00007337 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007338 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007339 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007340 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007341 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007342 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007343
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007344 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007345 }
7346
7347 if (!Args.hasArg(options::OPT_nostdlib) &&
7348 !Args.hasArg(options::OPT_nostartfiles)) {
7349 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007350 CmdArgs.push_back(
7351 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007352 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007353 CmdArgs.push_back(
7354 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007355 }
7356
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007357 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007358 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007359}
Ed Schoutene33194b2009-04-02 19:13:12 +00007360
Douglas Katzman95354292015-06-23 20:42:09 +00007361void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7362 const InputInfo &Output,
7363 const InputInfoList &Inputs,
7364 const ArgList &Args,
7365 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007366 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007367 ArgStringList CmdArgs;
7368
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007369 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007370
7371 CmdArgs.push_back("-o");
7372 CmdArgs.push_back(Output.getFilename());
7373
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007374 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007375 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007376
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007377 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007378 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007379}
7380
Douglas Katzman95354292015-06-23 20:42:09 +00007381void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7382 const InputInfo &Output,
7383 const InputInfoList &Inputs,
7384 const ArgList &Args,
7385 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007386 const Driver &D = getToolChain().getDriver();
7387 ArgStringList CmdArgs;
7388
7389 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7390 (!Args.hasArg(options::OPT_shared))) {
7391 CmdArgs.push_back("-e");
7392 CmdArgs.push_back("__start");
7393 }
7394
7395 if (Args.hasArg(options::OPT_static)) {
7396 CmdArgs.push_back("-Bstatic");
7397 } else {
7398 if (Args.hasArg(options::OPT_rdynamic))
7399 CmdArgs.push_back("-export-dynamic");
7400 CmdArgs.push_back("--eh-frame-hdr");
7401 CmdArgs.push_back("-Bdynamic");
7402 if (Args.hasArg(options::OPT_shared)) {
7403 CmdArgs.push_back("-shared");
7404 } else {
7405 CmdArgs.push_back("-dynamic-linker");
7406 CmdArgs.push_back("/usr/libexec/ld.so");
7407 }
7408 }
7409
7410 if (Output.isFilename()) {
7411 CmdArgs.push_back("-o");
7412 CmdArgs.push_back(Output.getFilename());
7413 } else {
7414 assert(Output.isNothing() && "Invalid output.");
7415 }
7416
7417 if (!Args.hasArg(options::OPT_nostdlib) &&
7418 !Args.hasArg(options::OPT_nostartfiles)) {
7419 if (!Args.hasArg(options::OPT_shared)) {
7420 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007421 CmdArgs.push_back(
7422 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007423 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007424 CmdArgs.push_back(
7425 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7426 CmdArgs.push_back(
7427 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007428 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007429 CmdArgs.push_back(
7430 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007431 }
7432 }
7433
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007434 Args.AddAllArgs(CmdArgs,
7435 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007436
7437 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7438
7439 if (!Args.hasArg(options::OPT_nostdlib) &&
7440 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007441 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007442 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7443 if (Args.hasArg(options::OPT_pg))
7444 CmdArgs.push_back("-lm_p");
7445 else
7446 CmdArgs.push_back("-lm");
7447 }
7448
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007449 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007450 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007451 CmdArgs.push_back("-lpthread_p");
7452 else
7453 CmdArgs.push_back("-lpthread");
7454 }
7455
Eli Friedman9fa28852012-08-08 23:57:20 +00007456 if (!Args.hasArg(options::OPT_shared)) {
7457 if (Args.hasArg(options::OPT_pg))
7458 CmdArgs.push_back("-lc_p");
7459 else
7460 CmdArgs.push_back("-lc");
7461 }
7462
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007463 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007464 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007465 case llvm::Triple::arm:
7466 MyArch = "arm";
7467 break;
7468 case llvm::Triple::x86:
7469 MyArch = "i386";
7470 break;
7471 case llvm::Triple::x86_64:
7472 MyArch = "amd64";
7473 break;
7474 default:
7475 llvm_unreachable("Unsupported architecture");
7476 }
7477 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007478 }
7479
7480 if (!Args.hasArg(options::OPT_nostdlib) &&
7481 !Args.hasArg(options::OPT_nostartfiles)) {
7482 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007483 CmdArgs.push_back(
7484 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007485 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007486 CmdArgs.push_back(
7487 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007488 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007489
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007490 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007491 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007492}
7493
Douglas Katzman95354292015-06-23 20:42:09 +00007494void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7495 const InputInfo &Output,
7496 const InputInfoList &Inputs,
7497 const ArgList &Args,
7498 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007499 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007500 ArgStringList CmdArgs;
7501
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007502 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7503 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007504 switch (getToolChain().getArch()) {
7505 default:
7506 break;
7507 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007508 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007509 break;
7510 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007511 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007512 break;
7513 case llvm::Triple::mips:
7514 case llvm::Triple::mipsel:
7515 case llvm::Triple::mips64:
7516 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007517 StringRef CPUName;
7518 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007519 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007520
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007521 CmdArgs.push_back("-march");
7522 CmdArgs.push_back(CPUName.data());
7523
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007524 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007525 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007526
7527 if (getToolChain().getArch() == llvm::Triple::mips ||
7528 getToolChain().getArch() == llvm::Triple::mips64)
7529 CmdArgs.push_back("-EB");
7530 else
7531 CmdArgs.push_back("-EL");
7532
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007533 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007534 break;
7535 }
7536 case llvm::Triple::arm:
7537 case llvm::Triple::armeb:
7538 case llvm::Triple::thumb:
7539 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007540 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007541
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007542 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007543 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007544 else
Renato Golinf4421f72014-02-19 10:44:07 +00007545 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007546
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007547 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007548 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007549 case llvm::Triple::GNUEABI:
7550 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007551 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007552 break;
7553
7554 default:
7555 CmdArgs.push_back("-matpcs");
7556 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007557 break;
7558 }
7559 case llvm::Triple::sparc:
7560 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007561 case llvm::Triple::sparcv9: {
7562 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7563 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007564 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007565 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007566 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007567 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007568
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007569 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007570
7571 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007572 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007573
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007574 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007575 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007576
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007577 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007578 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007579}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007580
Douglas Katzman95354292015-06-23 20:42:09 +00007581void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7582 const InputInfo &Output,
7583 const InputInfoList &Inputs,
7584 const ArgList &Args,
7585 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007586 const toolchains::FreeBSD &ToolChain =
7587 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007588 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007589 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007590 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007591 !Args.hasArg(options::OPT_shared) &&
7592 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007593 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007594
7595 // Silence warning for "clang -g foo.o -o foo"
7596 Args.ClaimAllArgs(options::OPT_g_Group);
7597 // and "clang -emit-llvm foo.o -o foo"
7598 Args.ClaimAllArgs(options::OPT_emit_llvm);
7599 // and for "clang -w foo.o -o foo". Other warning options are already
7600 // handled somewhere else.
7601 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007602
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007603 if (!D.SysRoot.empty())
7604 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7605
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007606 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007607 CmdArgs.push_back("-pie");
7608
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007609 if (Args.hasArg(options::OPT_static)) {
7610 CmdArgs.push_back("-Bstatic");
7611 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007612 if (Args.hasArg(options::OPT_rdynamic))
7613 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007614 CmdArgs.push_back("--eh-frame-hdr");
7615 if (Args.hasArg(options::OPT_shared)) {
7616 CmdArgs.push_back("-Bshareable");
7617 } else {
7618 CmdArgs.push_back("-dynamic-linker");
7619 CmdArgs.push_back("/libexec/ld-elf.so.1");
7620 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007621 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007622 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7623 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7624 CmdArgs.push_back("--hash-style=both");
7625 }
7626 }
7627 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007628 }
7629
7630 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7631 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007632 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007633 CmdArgs.push_back("-m");
7634 CmdArgs.push_back("elf_i386_fbsd");
7635 }
7636
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007637 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007638 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007639 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007640 }
7641
Daniel Dunbarb440f562010-08-02 02:38:21 +00007642 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007643 CmdArgs.push_back("-o");
7644 CmdArgs.push_back(Output.getFilename());
7645 } else {
7646 assert(Output.isNothing() && "Invalid output.");
7647 }
7648
7649 if (!Args.hasArg(options::OPT_nostdlib) &&
7650 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007651 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007652 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007653 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007654 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007655 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007656 crt1 = "Scrt1.o";
7657 else
7658 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007659 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007660 if (crt1)
7661 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7662
7663 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7664
Craig Topper92fc2df2014-05-17 16:56:41 +00007665 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007666 if (Args.hasArg(options::OPT_static))
7667 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007668 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007669 crtbegin = "crtbeginS.o";
7670 else
7671 crtbegin = "crtbegin.o";
7672
7673 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007674 }
7675
7676 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007677 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007678 for (const auto &Path : Paths)
7679 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007680 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7681 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007682 Args.AddAllArgs(CmdArgs, options::OPT_s);
7683 Args.AddAllArgs(CmdArgs, options::OPT_t);
7684 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7685 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007686
Teresa Johnson945bc502015-10-15 20:35:53 +00007687 if (D.isUsingLTO())
7688 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007689
Alexey Samsonov52550342014-09-15 19:58:40 +00007690 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007691 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007692
7693 if (!Args.hasArg(options::OPT_nostdlib) &&
7694 !Args.hasArg(options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007695 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007696 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007697 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007698 if (Args.hasArg(options::OPT_pg))
7699 CmdArgs.push_back("-lm_p");
7700 else
7701 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007702 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007703 if (NeedsSanitizerDeps)
7704 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007705 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7706 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007707 if (Args.hasArg(options::OPT_pg))
7708 CmdArgs.push_back("-lgcc_p");
7709 else
7710 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007711 if (Args.hasArg(options::OPT_static)) {
7712 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007713 } else if (Args.hasArg(options::OPT_pg)) {
7714 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007715 } else {
7716 CmdArgs.push_back("--as-needed");
7717 CmdArgs.push_back("-lgcc_s");
7718 CmdArgs.push_back("--no-as-needed");
7719 }
7720
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007721 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007722 if (Args.hasArg(options::OPT_pg))
7723 CmdArgs.push_back("-lpthread_p");
7724 else
7725 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007726 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007727
Roman Divacky66f22762011-02-10 16:59:40 +00007728 if (Args.hasArg(options::OPT_pg)) {
7729 if (Args.hasArg(options::OPT_shared))
7730 CmdArgs.push_back("-lc");
7731 else
7732 CmdArgs.push_back("-lc_p");
7733 CmdArgs.push_back("-lgcc_p");
7734 } else {
7735 CmdArgs.push_back("-lc");
7736 CmdArgs.push_back("-lgcc");
7737 }
7738
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007739 if (Args.hasArg(options::OPT_static)) {
7740 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007741 } else if (Args.hasArg(options::OPT_pg)) {
7742 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007743 } else {
7744 CmdArgs.push_back("--as-needed");
7745 CmdArgs.push_back("-lgcc_s");
7746 CmdArgs.push_back("--no-as-needed");
7747 }
7748 }
7749
7750 if (!Args.hasArg(options::OPT_nostdlib) &&
7751 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007752 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007753 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007754 else
7755 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007756 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007757 }
7758
Xinliang David Li69306c02015-10-22 06:15:31 +00007759 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007760
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007761 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007762 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007763}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007764
Douglas Katzman95354292015-06-23 20:42:09 +00007765void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007766 const InputInfo &Output,
7767 const InputInfoList &Inputs,
7768 const ArgList &Args,
7769 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007770 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007771 ArgStringList CmdArgs;
7772
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007773 // GNU as needs different flags for creating the correct output format
7774 // on architectures with different ABIs or optional feature sets.
7775 switch (getToolChain().getArch()) {
7776 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007777 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007778 break;
7779 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007780 case llvm::Triple::armeb:
7781 case llvm::Triple::thumb:
7782 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007783 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007784 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7785 std::string Arch =
7786 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007787 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007788 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007789 }
7790
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007791 case llvm::Triple::mips:
7792 case llvm::Triple::mipsel:
7793 case llvm::Triple::mips64:
7794 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007795 StringRef CPUName;
7796 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007797 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007798
7799 CmdArgs.push_back("-march");
7800 CmdArgs.push_back(CPUName.data());
7801
7802 CmdArgs.push_back("-mabi");
7803 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7804
7805 if (getToolChain().getArch() == llvm::Triple::mips ||
7806 getToolChain().getArch() == llvm::Triple::mips64)
7807 CmdArgs.push_back("-EB");
7808 else
7809 CmdArgs.push_back("-EL");
7810
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007811 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007812 break;
7813 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007814
7815 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007816 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007817 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007818 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7819 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007820 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007821 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007822 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007823
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007824 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007825 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007826 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7827 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007828 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007829 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007830 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007831
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007832 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007833 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007834 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007835
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007836 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007837
7838 CmdArgs.push_back("-o");
7839 CmdArgs.push_back(Output.getFilename());
7840
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007841 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007842 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007843
David Chisnallddbd68f2011-09-27 22:03:18 +00007844 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007845 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007846}
7847
Douglas Katzman95354292015-06-23 20:42:09 +00007848void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7849 const InputInfo &Output,
7850 const InputInfoList &Inputs,
7851 const ArgList &Args,
7852 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007853 const Driver &D = getToolChain().getDriver();
7854 ArgStringList CmdArgs;
7855
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007856 if (!D.SysRoot.empty())
7857 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7858
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007859 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007860 if (Args.hasArg(options::OPT_static)) {
7861 CmdArgs.push_back("-Bstatic");
7862 } else {
7863 if (Args.hasArg(options::OPT_rdynamic))
7864 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007865 if (Args.hasArg(options::OPT_shared)) {
7866 CmdArgs.push_back("-Bshareable");
7867 } else {
7868 CmdArgs.push_back("-dynamic-linker");
7869 CmdArgs.push_back("/libexec/ld.elf_so");
7870 }
7871 }
7872
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007873 // Many NetBSD architectures support more than one ABI.
7874 // Determine the correct emulation for ld.
7875 switch (getToolChain().getArch()) {
7876 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007877 CmdArgs.push_back("-m");
7878 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007879 break;
7880 case llvm::Triple::arm:
7881 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007882 CmdArgs.push_back("-m");
7883 switch (getToolChain().getTriple().getEnvironment()) {
7884 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007885 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007886 CmdArgs.push_back("armelf_nbsd_eabi");
7887 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007888 case llvm::Triple::EABIHF:
7889 case llvm::Triple::GNUEABIHF:
7890 CmdArgs.push_back("armelf_nbsd_eabihf");
7891 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007892 default:
7893 CmdArgs.push_back("armelf_nbsd");
7894 break;
7895 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007896 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007897 case llvm::Triple::armeb:
7898 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007899 arm::appendEBLinkFlags(
7900 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007901 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007902 CmdArgs.push_back("-m");
7903 switch (getToolChain().getTriple().getEnvironment()) {
7904 case llvm::Triple::EABI:
7905 case llvm::Triple::GNUEABI:
7906 CmdArgs.push_back("armelfb_nbsd_eabi");
7907 break;
7908 case llvm::Triple::EABIHF:
7909 case llvm::Triple::GNUEABIHF:
7910 CmdArgs.push_back("armelfb_nbsd_eabihf");
7911 break;
7912 default:
7913 CmdArgs.push_back("armelfb_nbsd");
7914 break;
7915 }
7916 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007917 case llvm::Triple::mips64:
7918 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007919 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007920 CmdArgs.push_back("-m");
7921 if (getToolChain().getArch() == llvm::Triple::mips64)
7922 CmdArgs.push_back("elf32btsmip");
7923 else
7924 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007925 } else if (mips::hasMipsAbiArg(Args, "64")) {
7926 CmdArgs.push_back("-m");
7927 if (getToolChain().getArch() == llvm::Triple::mips64)
7928 CmdArgs.push_back("elf64btsmip");
7929 else
7930 CmdArgs.push_back("elf64ltsmip");
7931 }
7932 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007933 case llvm::Triple::ppc:
7934 CmdArgs.push_back("-m");
7935 CmdArgs.push_back("elf32ppc_nbsd");
7936 break;
7937
7938 case llvm::Triple::ppc64:
7939 case llvm::Triple::ppc64le:
7940 CmdArgs.push_back("-m");
7941 CmdArgs.push_back("elf64ppc");
7942 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007943
7944 case llvm::Triple::sparc:
7945 CmdArgs.push_back("-m");
7946 CmdArgs.push_back("elf32_sparc");
7947 break;
7948
7949 case llvm::Triple::sparcv9:
7950 CmdArgs.push_back("-m");
7951 CmdArgs.push_back("elf64_sparc");
7952 break;
7953
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007954 default:
7955 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007956 }
7957
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007958 if (Output.isFilename()) {
7959 CmdArgs.push_back("-o");
7960 CmdArgs.push_back(Output.getFilename());
7961 } else {
7962 assert(Output.isNothing() && "Invalid output.");
7963 }
7964
7965 if (!Args.hasArg(options::OPT_nostdlib) &&
7966 !Args.hasArg(options::OPT_nostartfiles)) {
7967 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007968 CmdArgs.push_back(
7969 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7970 CmdArgs.push_back(
7971 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7972 CmdArgs.push_back(
7973 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007974 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007975 CmdArgs.push_back(
7976 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7977 CmdArgs.push_back(
7978 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007979 }
7980 }
7981
7982 Args.AddAllArgs(CmdArgs, options::OPT_L);
7983 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7984 Args.AddAllArgs(CmdArgs, options::OPT_e);
7985 Args.AddAllArgs(CmdArgs, options::OPT_s);
7986 Args.AddAllArgs(CmdArgs, options::OPT_t);
7987 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7988 Args.AddAllArgs(CmdArgs, options::OPT_r);
7989
7990 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7991
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007992 unsigned Major, Minor, Micro;
7993 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7994 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007995 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007996 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007997 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007998 case llvm::Triple::arm:
7999 case llvm::Triple::armeb:
8000 case llvm::Triple::thumb:
8001 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008002 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008003 case llvm::Triple::ppc64:
8004 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008005 case llvm::Triple::x86:
8006 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008007 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008008 break;
8009 default:
8010 break;
8011 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008012 }
8013
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008014 if (!Args.hasArg(options::OPT_nostdlib) &&
8015 !Args.hasArg(options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008016 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008017 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008018 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8019 CmdArgs.push_back("-lm");
8020 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008021 if (Args.hasArg(options::OPT_pthread))
8022 CmdArgs.push_back("-lpthread");
8023 CmdArgs.push_back("-lc");
8024
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008025 if (useLibgcc) {
8026 if (Args.hasArg(options::OPT_static)) {
8027 // libgcc_eh depends on libc, so resolve as much as possible,
8028 // pull in any new requirements from libc and then get the rest
8029 // of libgcc.
8030 CmdArgs.push_back("-lgcc_eh");
8031 CmdArgs.push_back("-lc");
8032 CmdArgs.push_back("-lgcc");
8033 } else {
8034 CmdArgs.push_back("-lgcc");
8035 CmdArgs.push_back("--as-needed");
8036 CmdArgs.push_back("-lgcc_s");
8037 CmdArgs.push_back("--no-as-needed");
8038 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008039 }
8040 }
8041
8042 if (!Args.hasArg(options::OPT_nostdlib) &&
8043 !Args.hasArg(options::OPT_nostartfiles)) {
8044 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008045 CmdArgs.push_back(
8046 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008047 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008048 CmdArgs.push_back(
8049 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8050 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008051 }
8052
Xinliang David Li69306c02015-10-22 06:15:31 +00008053 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008054
Logan Chieneb9162f2014-06-26 14:23:45 +00008055 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008056 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008057}
8058
Douglas Katzman95354292015-06-23 20:42:09 +00008059void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8060 const InputInfo &Output,
8061 const InputInfoList &Inputs,
8062 const ArgList &Args,
8063 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008064 claimNoWarnArgs(Args);
8065
James Y Knight2db38f32015-08-15 03:45:25 +00008066 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8067 llvm::Triple Triple = llvm::Triple(TripleStr);
8068
Rafael Espindola92b00932010-08-10 00:25:48 +00008069 ArgStringList CmdArgs;
8070
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008071 llvm::Reloc::Model RelocationModel;
8072 unsigned PICLevel;
8073 bool IsPIE;
8074 std::tie(RelocationModel, PICLevel, IsPIE) =
8075 ParsePICArgs(getToolChain(), Triple, Args);
8076
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008077 switch (getToolChain().getArch()) {
8078 default:
8079 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008080 // Add --32/--64 to make sure we get the format we want.
8081 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008082 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008083 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008084 break;
8085 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008086 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8087 CmdArgs.push_back("--x32");
8088 else
8089 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008090 break;
8091 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008092 CmdArgs.push_back("-a32");
8093 CmdArgs.push_back("-mppc");
8094 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008095 break;
8096 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008097 CmdArgs.push_back("-a64");
8098 CmdArgs.push_back("-mppc64");
8099 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008100 break;
8101 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008102 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008103 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008104 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008105 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008106 break;
8107 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008108 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008109 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008110 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8111 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8112 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008113 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008114 }
8115 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008116 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008117 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8118 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8119 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008120 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008121 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008122 case llvm::Triple::arm:
8123 case llvm::Triple::armeb:
8124 case llvm::Triple::thumb:
8125 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008126 const llvm::Triple &Triple2 = getToolChain().getTriple();
8127 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008128 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008129 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008130 break;
8131 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008132 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008133 break;
8134 default:
8135 break;
8136 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008137
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008138 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008139 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8140 case arm::FloatABI::Soft:
8141 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8142 break;
8143 case arm::FloatABI::SoftFP:
8144 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8145 break;
8146 case arm::FloatABI::Hard:
8147 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8148 break;
8149 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008150
8151 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008152
8153 // FIXME: remove krait check when GNU tools support krait cpu
8154 // for now replace it with -march=armv7-a to avoid a lower
8155 // march from being picked in the absence of a cpu flag.
8156 Arg *A;
8157 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008158 StringRef(A->getValue()).lower() == "krait")
8159 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008160 else
8161 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008162 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008163 break;
8164 }
8165 case llvm::Triple::mips:
8166 case llvm::Triple::mipsel:
8167 case llvm::Triple::mips64:
8168 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008169 StringRef CPUName;
8170 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008171 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008172 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008173
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008174 CmdArgs.push_back("-march");
8175 CmdArgs.push_back(CPUName.data());
8176
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008177 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008178 CmdArgs.push_back(ABIName.data());
8179
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008180 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8181 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008182 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008183 CmdArgs.push_back("-mno-shared");
8184
Daniel Sanders379d44b2014-07-16 11:52:23 +00008185 // LLVM doesn't support -mplt yet and acts as if it is always given.
8186 // However, -mplt has no effect with the N64 ABI.
8187 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008188
8189 if (getToolChain().getArch() == llvm::Triple::mips ||
8190 getToolChain().getArch() == llvm::Triple::mips64)
8191 CmdArgs.push_back("-EB");
8192 else
8193 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008194
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008195 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8196 if (StringRef(A->getValue()) == "2008")
8197 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8198 }
8199
Daniel Sanders379d44b2014-07-16 11:52:23 +00008200 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8201 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8202 options::OPT_mfp64)) {
8203 A->claim();
8204 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008205 } else if (mips::shouldUseFPXX(
8206 Args, getToolChain().getTriple(), CPUName, ABIName,
8207 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008208 CmdArgs.push_back("-mfpxx");
8209
8210 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8211 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008212 if (Arg *A =
8213 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008214 if (A->getOption().matches(options::OPT_mips16)) {
8215 A->claim();
8216 A->render(Args, CmdArgs);
8217 } else {
8218 A->claim();
8219 CmdArgs.push_back("-no-mips16");
8220 }
8221 }
8222
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008223 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8224 options::OPT_mno_micromips);
8225 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8226 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8227
Simon Atanasyanbd986632013-11-26 11:58:04 +00008228 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8229 // Do not use AddLastArg because not all versions of MIPS assembler
8230 // support -mmsa / -mno-msa options.
8231 if (A->getOption().matches(options::OPT_mmsa))
8232 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8233 }
8234
Daniel Sanders379d44b2014-07-16 11:52:23 +00008235 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8236 options::OPT_msoft_float);
8237
Toma Tabacub36d6102015-06-11 12:13:18 +00008238 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8239 options::OPT_msingle_float);
8240
Daniel Sanders379d44b2014-07-16 11:52:23 +00008241 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8242 options::OPT_mno_odd_spreg);
8243
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008244 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008245 break;
8246 }
8247 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008248 // Always pass an -march option, since our default of z10 is later
8249 // than the GNU assembler's default.
8250 StringRef CPUName = getSystemZTargetCPU(Args);
8251 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008252 break;
8253 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008254 }
8255
Renato Golina74bbc72015-07-22 15:32:36 +00008256 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008257 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008258
8259 CmdArgs.push_back("-o");
8260 CmdArgs.push_back(Output.getFilename());
8261
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008262 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008263 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008264
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008265 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008266 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008267
8268 // Handle the debug info splitting at object creation time if we're
8269 // creating an object.
8270 // TODO: Currently only works on linux with newer objcopy.
8271 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008272 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008273 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008274 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008275}
8276
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008277static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008278 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008279 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008280 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008281 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8282 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008283 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008284 CmdArgs.push_back("-lgcc");
8285
Logan Chien3d3373c2012-11-19 12:04:11 +00008286 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008287 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008288 CmdArgs.push_back("-lgcc");
8289 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008290 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008291 CmdArgs.push_back("--as-needed");
8292 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008293 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008294 CmdArgs.push_back("--no-as-needed");
8295 }
8296
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008297 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008298 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008299 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008300 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008301
8302 // According to Android ABI, we have to link with libdl if we are
8303 // linking with non-static libgcc.
8304 //
8305 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8306 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8307 if (isAndroid && !StaticLibgcc)
8308 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008309}
8310
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008311static std::string getLinuxDynamicLinker(const ArgList &Args,
8312 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008313 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8314
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008315 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008316 if (ToolChain.getTriple().isArch64Bit())
8317 return "/system/bin/linker64";
8318 else
8319 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008320 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8321 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008322 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008323 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008324 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008325 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008326 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008327 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008328 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008329 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008330 return "/lib/ld-linux-armhf.so.3";
8331 else
8332 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008333 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8334 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008335 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008336 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008337 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008338 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008339 return "/lib/ld-linux.so.3";
8340 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8341 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008342 std::string LibDir =
8343 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008344 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008345 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008346 if (mips::isUCLibc(Args))
8347 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008348 else if (!ToolChain.getTriple().hasEnvironment()) {
8349 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8350 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8351 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8352 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008353 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008354
8355 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008356 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008357 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008358 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008359 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8360 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008361 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008362 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008363 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8364 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008365 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008366 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008367 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008368 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008369 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008370 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008371 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8372 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008373 else
8374 return "/lib64/ld-linux-x86-64.so.2";
8375}
8376
Renato Golinc4b49242014-02-13 10:01:16 +00008377static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008378 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008379 // Make use of compiler-rt if --rtlib option is used
8380 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8381
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008382 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008383 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008384 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008385 default:
8386 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008387 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008388 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008389 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008390 break;
8391 }
Renato Golinc4b49242014-02-13 10:01:16 +00008392 break;
8393 case ToolChain::RLT_Libgcc:
8394 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8395 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008396 }
8397}
8398
Rafael Espindola1e085772014-08-15 17:14:35 +00008399static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8400 switch (T.getArch()) {
8401 case llvm::Triple::x86:
8402 return "elf_i386";
8403 case llvm::Triple::aarch64:
8404 return "aarch64linux";
8405 case llvm::Triple::aarch64_be:
8406 return "aarch64_be_linux";
8407 case llvm::Triple::arm:
8408 case llvm::Triple::thumb:
8409 return "armelf_linux_eabi";
8410 case llvm::Triple::armeb:
8411 case llvm::Triple::thumbeb:
8412 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8413 case llvm::Triple::ppc:
8414 return "elf32ppclinux";
8415 case llvm::Triple::ppc64:
8416 return "elf64ppc";
8417 case llvm::Triple::ppc64le:
8418 return "elf64lppc";
8419 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008420 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008421 return "elf32_sparc";
8422 case llvm::Triple::sparcv9:
8423 return "elf64_sparc";
8424 case llvm::Triple::mips:
8425 return "elf32btsmip";
8426 case llvm::Triple::mipsel:
8427 return "elf32ltsmip";
8428 case llvm::Triple::mips64:
8429 if (mips::hasMipsAbiArg(Args, "n32"))
8430 return "elf32btsmipn32";
8431 return "elf64btsmip";
8432 case llvm::Triple::mips64el:
8433 if (mips::hasMipsAbiArg(Args, "n32"))
8434 return "elf32ltsmipn32";
8435 return "elf64ltsmip";
8436 case llvm::Triple::systemz:
8437 return "elf64_s390";
8438 case llvm::Triple::x86_64:
8439 if (T.getEnvironment() == llvm::Triple::GNUX32)
8440 return "elf32_x86_64";
8441 return "elf_x86_64";
8442 default:
8443 llvm_unreachable("Unexpected arch");
8444 }
8445}
8446
Douglas Katzman95354292015-06-23 20:42:09 +00008447void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8448 const InputInfo &Output,
8449 const InputInfoList &Inputs,
8450 const ArgList &Args,
8451 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008452 const toolchains::Linux &ToolChain =
8453 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008454 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008455
8456 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8457 llvm::Triple Triple = llvm::Triple(TripleStr);
8458
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008459 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008460 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008461 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008462 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8463 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008464 const bool HasCRTBeginEndFiles =
8465 ToolChain.getTriple().hasEnvironment() ||
8466 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008467
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008468 ArgStringList CmdArgs;
8469
Rafael Espindolad1002f62010-11-15 18:28:16 +00008470 // Silence warning for "clang -g foo.o -o foo"
8471 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008472 // and "clang -emit-llvm foo.o -o foo"
8473 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008474 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008475 // handled somewhere else.
8476 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008477
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008478 if (llvm::sys::path::filename(ToolChain.Linker) == "lld") {
8479 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008480 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008481 CmdArgs.push_back("-target");
8482 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8483 }
8484
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008485 if (!D.SysRoot.empty())
8486 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008487
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008488 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008489 CmdArgs.push_back("-pie");
8490
Rafael Espindola1c76c592010-11-07 22:57:16 +00008491 if (Args.hasArg(options::OPT_rdynamic))
8492 CmdArgs.push_back("-export-dynamic");
8493
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008494 if (Args.hasArg(options::OPT_s))
8495 CmdArgs.push_back("-s");
8496
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008497 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008498 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008499
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008500 for (const auto &Opt : ToolChain.ExtraOpts)
8501 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008502
8503 if (!Args.hasArg(options::OPT_static)) {
8504 CmdArgs.push_back("--eh-frame-hdr");
8505 }
8506
8507 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008508 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008509
8510 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008511 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8512 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008513 CmdArgs.push_back("-Bstatic");
8514 else
8515 CmdArgs.push_back("-static");
8516 } else if (Args.hasArg(options::OPT_shared)) {
8517 CmdArgs.push_back("-shared");
8518 }
8519
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008520 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8521 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008522 (!Args.hasArg(options::OPT_static) &&
8523 !Args.hasArg(options::OPT_shared))) {
8524 CmdArgs.push_back("-dynamic-linker");
8525 CmdArgs.push_back(Args.MakeArgString(
8526 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8527 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008528
8529 CmdArgs.push_back("-o");
8530 CmdArgs.push_back(Output.getFilename());
8531
Rafael Espindola81937ec2010-12-01 01:52:43 +00008532 if (!Args.hasArg(options::OPT_nostdlib) &&
8533 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008534 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008535 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008536 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008537 if (Args.hasArg(options::OPT_pg))
8538 crt1 = "gcrt1.o";
8539 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008540 crt1 = "Scrt1.o";
8541 else
8542 crt1 = "crt1.o";
8543 }
8544 if (crt1)
8545 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008546
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008547 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8548 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008549
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008550 const char *crtbegin;
8551 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008552 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008553 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008554 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008555 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008556 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008557 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008558 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008559
8560 if (HasCRTBeginEndFiles)
8561 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008562
8563 // Add crtfastmath.o if available and fast math is enabled.
8564 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008565 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008566
8567 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008568 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008569
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008570 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008571
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008572 for (const auto &Path : Paths)
8573 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008574
Teresa Johnson945bc502015-10-15 20:35:53 +00008575 if (D.isUsingLTO())
8576 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008577
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008578 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8579 CmdArgs.push_back("--no-demangle");
8580
Alexey Samsonov52550342014-09-15 19:58:40 +00008581 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008582 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008583 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008584 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008585
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008586 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008587 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008588 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008589 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008590 if (OnlyLibstdcxxStatic)
8591 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008592 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008593 if (OnlyLibstdcxxStatic)
8594 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008595 CmdArgs.push_back("-lm");
8596 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008597 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8598 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008599
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008600 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008601 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8602 if (Args.hasArg(options::OPT_static))
8603 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008604
Alexey Samsonov52550342014-09-15 19:58:40 +00008605 if (NeedsSanitizerDeps)
8606 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8607
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008608 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8609 Args.hasArg(options::OPT_pthreads);
8610
8611 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8612 options::OPT_fno_openmp, false)) {
8613 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8614 // FIXME: Does this really make sense for all GNU toolchains?
8615 WantPthread = true;
8616
8617 // Also link the particular OpenMP runtimes.
8618 switch (getOpenMPRuntime(ToolChain, Args)) {
8619 case OMPRT_OMP:
8620 CmdArgs.push_back("-lomp");
8621 break;
8622 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008623 CmdArgs.push_back("-lgomp");
8624
8625 // FIXME: Exclude this for platforms with libgomp that don't require
8626 // librt. Most modern Linux platforms require it, but some may not.
8627 CmdArgs.push_back("-lrt");
8628 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008629 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008630 CmdArgs.push_back("-liomp5");
8631 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008632 case OMPRT_Unknown:
8633 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008634 break;
8635 }
Chandler Carruth01538002013-01-17 13:19:29 +00008636 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008637
Renato Golinc4b49242014-02-13 10:01:16 +00008638 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008639
Richard Smith31d1de22015-05-20 22:48:44 +00008640 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008641 CmdArgs.push_back("-lpthread");
8642
8643 CmdArgs.push_back("-lc");
8644
8645 if (Args.hasArg(options::OPT_static))
8646 CmdArgs.push_back("--end-group");
8647 else
Renato Golinc4b49242014-02-13 10:01:16 +00008648 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008649 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008650
Rafael Espindola81937ec2010-12-01 01:52:43 +00008651 if (!Args.hasArg(options::OPT_nostartfiles)) {
8652 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008653 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008654 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008655 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008656 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008657 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008658 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008659
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008660 if (HasCRTBeginEndFiles)
8661 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008662 if (!isAndroid)
8663 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008664 }
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008665 } else if (Args.hasArg(options::OPT_rtlib_EQ))
8666 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008667
Justin Bognerd3371d82015-07-17 03:35:54 +00008668 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8669 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008670}
8671
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008672// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8673// for the various SFI requirements like register masking. The assembly tool
8674// inserts the file containing the macros as an input into all the assembly
8675// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008676void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8677 const InputInfo &Output,
8678 const InputInfoList &Inputs,
8679 const ArgList &Args,
8680 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008681 const toolchains::NaClToolChain &ToolChain =
8682 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008683 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8684 "nacl-arm-macros.s");
8685 InputInfoList NewInputs;
8686 NewInputs.push_back(NaClMacros);
8687 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008688 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8689 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008690}
8691
Douglas Katzman750cfc52015-06-29 18:42:16 +00008692// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008693// we use static by default, do not yet support sanitizers or LTO, and a few
8694// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008695// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008696void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8697 const InputInfo &Output,
8698 const InputInfoList &Inputs,
8699 const ArgList &Args,
8700 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008701
Douglas Katzman54366072015-07-27 16:53:08 +00008702 const toolchains::NaClToolChain &ToolChain =
8703 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008704 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008705 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008706 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008707 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008708
8709 ArgStringList CmdArgs;
8710
8711 // Silence warning for "clang -g foo.o -o foo"
8712 Args.ClaimAllArgs(options::OPT_g_Group);
8713 // and "clang -emit-llvm foo.o -o foo"
8714 Args.ClaimAllArgs(options::OPT_emit_llvm);
8715 // and for "clang -w foo.o -o foo". Other warning options are already
8716 // handled somewhere else.
8717 Args.ClaimAllArgs(options::OPT_w);
8718
8719 if (!D.SysRoot.empty())
8720 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8721
8722 if (Args.hasArg(options::OPT_rdynamic))
8723 CmdArgs.push_back("-export-dynamic");
8724
8725 if (Args.hasArg(options::OPT_s))
8726 CmdArgs.push_back("-s");
8727
Douglas Katzman54366072015-07-27 16:53:08 +00008728 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8729 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008730 CmdArgs.push_back("--build-id");
8731
8732 if (!IsStatic)
8733 CmdArgs.push_back("--eh-frame-hdr");
8734
8735 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008736 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008737 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008738 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008739 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008740 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008741 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008742 else if (Arch == llvm::Triple::mipsel)
8743 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008744 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008745 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8746 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008747
8748 if (IsStatic)
8749 CmdArgs.push_back("-static");
8750 else if (Args.hasArg(options::OPT_shared))
8751 CmdArgs.push_back("-shared");
8752
8753 CmdArgs.push_back("-o");
8754 CmdArgs.push_back(Output.getFilename());
8755 if (!Args.hasArg(options::OPT_nostdlib) &&
8756 !Args.hasArg(options::OPT_nostartfiles)) {
8757 if (!Args.hasArg(options::OPT_shared))
8758 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8759 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8760
8761 const char *crtbegin;
8762 if (IsStatic)
8763 crtbegin = "crtbeginT.o";
8764 else if (Args.hasArg(options::OPT_shared))
8765 crtbegin = "crtbeginS.o";
8766 else
8767 crtbegin = "crtbegin.o";
8768 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8769 }
8770
8771 Args.AddAllArgs(CmdArgs, options::OPT_L);
8772 Args.AddAllArgs(CmdArgs, options::OPT_u);
8773
8774 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8775
8776 for (const auto &Path : Paths)
8777 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8778
8779 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8780 CmdArgs.push_back("--no-demangle");
8781
8782 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8783
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008784 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008785 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008786 bool OnlyLibstdcxxStatic =
8787 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008788 if (OnlyLibstdcxxStatic)
8789 CmdArgs.push_back("-Bstatic");
8790 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8791 if (OnlyLibstdcxxStatic)
8792 CmdArgs.push_back("-Bdynamic");
8793 CmdArgs.push_back("-lm");
8794 }
8795
8796 if (!Args.hasArg(options::OPT_nostdlib)) {
8797 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8798 // Always use groups, since it has no effect on dynamic libraries.
8799 CmdArgs.push_back("--start-group");
8800 CmdArgs.push_back("-lc");
8801 // NaCl's libc++ currently requires libpthread, so just always include it
8802 // in the group for C++.
8803 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008804 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008805 // Gold, used by Mips, handles nested groups differently than ld, and
8806 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8807 // which is not a desired behaviour here.
8808 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8809 if (getToolChain().getArch() == llvm::Triple::mipsel)
8810 CmdArgs.push_back("-lnacl");
8811
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008812 CmdArgs.push_back("-lpthread");
8813 }
8814
8815 CmdArgs.push_back("-lgcc");
8816 CmdArgs.push_back("--as-needed");
8817 if (IsStatic)
8818 CmdArgs.push_back("-lgcc_eh");
8819 else
8820 CmdArgs.push_back("-lgcc_s");
8821 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008822
8823 // Mips needs to create and use pnacl_legacy library that contains
8824 // definitions from bitcode/pnaclmm.c and definitions for
8825 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8826 if (getToolChain().getArch() == llvm::Triple::mipsel)
8827 CmdArgs.push_back("-lpnacl_legacy");
8828
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008829 CmdArgs.push_back("--end-group");
8830 }
8831
8832 if (!Args.hasArg(options::OPT_nostartfiles)) {
8833 const char *crtend;
8834 if (Args.hasArg(options::OPT_shared))
8835 crtend = "crtendS.o";
8836 else
8837 crtend = "crtend.o";
8838
8839 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8840 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8841 }
8842 }
8843
Justin Bognerd3371d82015-07-17 03:35:54 +00008844 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8845 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008846}
8847
Douglas Katzman95354292015-06-23 20:42:09 +00008848void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8849 const InputInfo &Output,
8850 const InputInfoList &Inputs,
8851 const ArgList &Args,
8852 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008853 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008854 ArgStringList CmdArgs;
8855
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008856 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008857
8858 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008859 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008860
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008861 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008862 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008863
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008864 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008865 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008866}
8867
Douglas Katzman95354292015-06-23 20:42:09 +00008868void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8869 const InputInfo &Output,
8870 const InputInfoList &Inputs,
8871 const ArgList &Args,
8872 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008873 const Driver &D = getToolChain().getDriver();
8874 ArgStringList CmdArgs;
8875
Daniel Dunbarb440f562010-08-02 02:38:21 +00008876 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008877 CmdArgs.push_back("-o");
8878 CmdArgs.push_back(Output.getFilename());
8879 } else {
8880 assert(Output.isNothing() && "Invalid output.");
8881 }
8882
8883 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008884 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008885 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8886 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8887 CmdArgs.push_back(
8888 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8889 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008890 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008891
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008892 Args.AddAllArgs(CmdArgs,
8893 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008894
Daniel Dunbar54423b22010-09-17 00:24:54 +00008895 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008896
Xinliang David Li69306c02015-10-22 06:15:31 +00008897 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008898
Chris Lattner3e2ee142010-07-07 16:01:42 +00008899 if (!Args.hasArg(options::OPT_nostdlib) &&
8900 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008901 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008902 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008903 CmdArgs.push_back("-lm");
8904 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008905 }
8906
8907 if (!Args.hasArg(options::OPT_nostdlib) &&
8908 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008909 if (Args.hasArg(options::OPT_pthread))
8910 CmdArgs.push_back("-lpthread");
8911 CmdArgs.push_back("-lc");
8912 CmdArgs.push_back("-lCompilerRT-Generic");
8913 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8914 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008915 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008916 }
8917
Logan Chieneb9162f2014-06-26 14:23:45 +00008918 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008919 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008920}
8921
Daniel Dunbarcc912342009-05-02 18:28:39 +00008922/// DragonFly Tools
8923
8924// For now, DragonFly Assemble does just about the same as for
8925// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008926void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8927 const InputInfo &Output,
8928 const InputInfoList &Inputs,
8929 const ArgList &Args,
8930 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008931 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008932 ArgStringList CmdArgs;
8933
8934 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8935 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008936 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008937 CmdArgs.push_back("--32");
8938
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008939 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008940
8941 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008942 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008943
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008944 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008945 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008946
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008947 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008948 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008949}
8950
Douglas Katzman95354292015-06-23 20:42:09 +00008951void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8952 const InputInfo &Output,
8953 const InputInfoList &Inputs,
8954 const ArgList &Args,
8955 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008956 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008957 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008958 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008959
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008960 if (!D.SysRoot.empty())
8961 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8962
John McCall65b8da02013-04-11 22:55:55 +00008963 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008964 if (Args.hasArg(options::OPT_static)) {
8965 CmdArgs.push_back("-Bstatic");
8966 } else {
John McCall65b8da02013-04-11 22:55:55 +00008967 if (Args.hasArg(options::OPT_rdynamic))
8968 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008969 if (Args.hasArg(options::OPT_shared))
8970 CmdArgs.push_back("-Bshareable");
8971 else {
8972 CmdArgs.push_back("-dynamic-linker");
8973 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8974 }
John McCall65b8da02013-04-11 22:55:55 +00008975 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008976 }
8977
8978 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8979 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008980 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008981 CmdArgs.push_back("-m");
8982 CmdArgs.push_back("elf_i386");
8983 }
8984
Daniel Dunbarb440f562010-08-02 02:38:21 +00008985 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008986 CmdArgs.push_back("-o");
8987 CmdArgs.push_back(Output.getFilename());
8988 } else {
8989 assert(Output.isNothing() && "Invalid output.");
8990 }
8991
8992 if (!Args.hasArg(options::OPT_nostdlib) &&
8993 !Args.hasArg(options::OPT_nostartfiles)) {
8994 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008995 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008996 CmdArgs.push_back(
8997 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008998 else {
8999 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009000 CmdArgs.push_back(
9001 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009002 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009003 CmdArgs.push_back(
9004 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009005 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009006 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009007 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009008 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009009 CmdArgs.push_back(
9010 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009011 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009012 CmdArgs.push_back(
9013 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009014 }
9015
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009016 Args.AddAllArgs(CmdArgs,
9017 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009018
Daniel Dunbar54423b22010-09-17 00:24:54 +00009019 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009020
9021 if (!Args.hasArg(options::OPT_nostdlib) &&
9022 !Args.hasArg(options::OPT_nodefaultlibs)) {
9023 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9024 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009025 if (UseGCC47)
9026 CmdArgs.push_back("-L/usr/lib/gcc47");
9027 else
9028 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009029
9030 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009031 if (UseGCC47) {
9032 CmdArgs.push_back("-rpath");
9033 CmdArgs.push_back("/usr/lib/gcc47");
9034 } else {
9035 CmdArgs.push_back("-rpath");
9036 CmdArgs.push_back("/usr/lib/gcc44");
9037 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009038 }
9039
Hans Wennborg70850d82013-07-18 20:29:38 +00009040 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009041 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009042 CmdArgs.push_back("-lm");
9043 }
9044
Daniel Dunbarcc912342009-05-02 18:28:39 +00009045 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009046 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009047
9048 if (!Args.hasArg(options::OPT_nolibc)) {
9049 CmdArgs.push_back("-lc");
9050 }
9051
John McCall65b8da02013-04-11 22:55:55 +00009052 if (UseGCC47) {
9053 if (Args.hasArg(options::OPT_static) ||
9054 Args.hasArg(options::OPT_static_libgcc)) {
9055 CmdArgs.push_back("-lgcc");
9056 CmdArgs.push_back("-lgcc_eh");
9057 } else {
9058 if (Args.hasArg(options::OPT_shared_libgcc)) {
9059 CmdArgs.push_back("-lgcc_pic");
9060 if (!Args.hasArg(options::OPT_shared))
9061 CmdArgs.push_back("-lgcc");
9062 } else {
9063 CmdArgs.push_back("-lgcc");
9064 CmdArgs.push_back("--as-needed");
9065 CmdArgs.push_back("-lgcc_pic");
9066 CmdArgs.push_back("--no-as-needed");
9067 }
9068 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009069 } else {
John McCall65b8da02013-04-11 22:55:55 +00009070 if (Args.hasArg(options::OPT_shared)) {
9071 CmdArgs.push_back("-lgcc_pic");
9072 } else {
9073 CmdArgs.push_back("-lgcc");
9074 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009075 }
9076 }
9077
9078 if (!Args.hasArg(options::OPT_nostdlib) &&
9079 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009080 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009081 CmdArgs.push_back(
9082 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009083 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009084 CmdArgs.push_back(
9085 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9086 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009087 }
9088
Xinliang David Li69306c02015-10-22 06:15:31 +00009089 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009090
Logan Chieneb9162f2014-06-26 14:23:45 +00009091 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009092 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009093}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009094
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009095// Try to find Exe from a Visual Studio distribution. This first tries to find
9096// an installed copy of Visual Studio and, failing that, looks in the PATH,
9097// making sure that whatever executable that's found is not a same-named exe
9098// from clang itself to prevent clang from falling back to itself.
9099static std::string FindVisualStudioExecutable(const ToolChain &TC,
9100 const char *Exe,
9101 const char *ClangProgramPath) {
9102 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9103 std::string visualStudioBinDir;
9104 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9105 visualStudioBinDir)) {
9106 SmallString<128> FilePath(visualStudioBinDir);
9107 llvm::sys::path::append(FilePath, Exe);
9108 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9109 return FilePath.str();
9110 }
9111
9112 return Exe;
9113}
9114
Douglas Katzman95354292015-06-23 20:42:09 +00009115void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9116 const InputInfo &Output,
9117 const InputInfoList &Inputs,
9118 const ArgList &Args,
9119 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009120 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009121 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009122
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009123 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9124 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009125 CmdArgs.push_back(
9126 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009127
9128 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009129 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009130 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009131
Zachary Turner10d75b22014-10-22 20:40:43 +00009132 if (!llvm::sys::Process::GetEnv("LIB")) {
9133 // If the VC environment hasn't been configured (perhaps because the user
9134 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009135 // the environment variable is set however, assume the user knows what
9136 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009137 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009138 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009139 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9140 SmallString<128> LibDir(VisualStudioDir);
9141 llvm::sys::path::append(LibDir, "VC", "lib");
9142 switch (MSVC.getArch()) {
9143 case llvm::Triple::x86:
9144 // x86 just puts the libraries directly in lib
9145 break;
9146 case llvm::Triple::x86_64:
9147 llvm::sys::path::append(LibDir, "amd64");
9148 break;
9149 case llvm::Triple::arm:
9150 llvm::sys::path::append(LibDir, "arm");
9151 break;
9152 default:
9153 break;
9154 }
9155 CmdArgs.push_back(
9156 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009157
9158 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9159 std::string UniversalCRTLibPath;
9160 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9161 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9162 UniversalCRTLibPath.c_str()));
9163 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009164 }
9165
9166 std::string WindowsSdkLibPath;
9167 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9168 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9169 WindowsSdkLibPath.c_str()));
9170 }
9171
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009172 CmdArgs.push_back("-nologo");
9173
Reid Kleckner124955a2015-08-05 18:51:13 +00009174 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009175 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009176
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009177 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009178 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009179 if (DLL) {
9180 CmdArgs.push_back(Args.MakeArgString("-dll"));
9181
9182 SmallString<128> ImplibName(Output.getFilename());
9183 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009184 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009185 }
9186
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009187 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009188 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009189 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009190 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009191 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9192 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009193 // Make sure the dynamic runtime thunk is not optimized out at link time
9194 // to ensure proper SEH handling.
9195 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009196 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009197 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009198 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009199 for (const auto &Lib : {"asan", "asan_cxx"})
9200 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009201 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009202 }
9203
Hans Wennborg2e274592013-08-13 23:38:57 +00009204 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009205
Alexey Bataevc7e84352015-08-19 04:49:01 +00009206 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9207 options::OPT_fno_openmp, false)) {
9208 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9209 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9210 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9211 TC.getDriver().Dir + "/../lib"));
9212 switch (getOpenMPRuntime(getToolChain(), Args)) {
9213 case OMPRT_OMP:
9214 CmdArgs.push_back("-defaultlib:libomp.lib");
9215 break;
9216 case OMPRT_IOMP5:
9217 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9218 break;
9219 case OMPRT_GOMP:
9220 break;
9221 case OMPRT_Unknown:
9222 // Already diagnosed.
9223 break;
9224 }
9225 }
9226
Reid Kleckner337188f2014-09-16 19:22:00 +00009227 // Add filenames, libraries, and other linker inputs.
9228 for (const auto &Input : Inputs) {
9229 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009230 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009231 continue;
9232 }
9233
9234 const Arg &A = Input.getInputArg();
9235
9236 // Render -l options differently for the MSVC linker.
9237 if (A.getOption().matches(options::OPT_l)) {
9238 StringRef Lib = A.getValue();
9239 const char *LinkLibArg;
9240 if (Lib.endswith(".lib"))
9241 LinkLibArg = Args.MakeArgString(Lib);
9242 else
9243 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9244 CmdArgs.push_back(LinkLibArg);
9245 continue;
9246 }
9247
9248 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9249 // or -L. Render it, even if MSVC doesn't understand it.
9250 A.renderAsInput(Args, CmdArgs);
9251 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009252
Zachary Turner719f58c2014-12-01 23:06:47 +00009253 // We need to special case some linker paths. In the case of lld, we need to
9254 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9255 // linker, we need to use a special search algorithm.
9256 llvm::SmallString<128> linkPath;
9257 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9258 if (Linker.equals_lower("lld"))
9259 Linker = "lld-link";
9260
9261 if (Linker.equals_lower("link")) {
9262 // If we're using the MSVC linker, it's not sufficient to just use link
9263 // from the program PATH, because other environments like GnuWin32 install
9264 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009265 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009266 C.getDriver().getClangProgramPath());
9267 } else {
9268 linkPath = Linker;
9269 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009270 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009271 }
9272
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009273 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009274 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009275}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009276
Douglas Katzman95354292015-06-23 20:42:09 +00009277void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9278 const InputInfo &Output,
9279 const InputInfoList &Inputs,
9280 const ArgList &Args,
9281 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009282 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9283}
9284
Douglas Katzman95354292015-06-23 20:42:09 +00009285std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009286 Compilation &C, const JobAction &JA, const InputInfo &Output,
9287 const InputInfoList &Inputs, const ArgList &Args,
9288 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009289 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009290 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009291 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009292 CmdArgs.push_back("/W0"); // No warnings.
9293
9294 // The goal is to be able to invoke this tool correctly based on
9295 // any flag accepted by clang-cl.
9296
9297 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009298 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009299
9300 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009301 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9302 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9303 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009304 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9305 if (A->getOption().getID() == options::OPT_O0) {
9306 CmdArgs.push_back("/Od");
9307 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009308 CmdArgs.push_back("/Og");
9309
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009310 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009311 if (OptLevel == "s" || OptLevel == "z")
9312 CmdArgs.push_back("/Os");
9313 else
9314 CmdArgs.push_back("/Ot");
9315
9316 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009317 }
9318 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009319 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9320 options::OPT_fno_omit_frame_pointer))
9321 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9322 ? "/Oy"
9323 : "/Oy-");
9324 if (!Args.hasArg(options::OPT_fwritable_strings))
9325 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009326
Nico Weber3f8dafb2015-03-12 19:37:10 +00009327 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009328 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9329
David Majnemerf6072342014-07-01 22:24:56 +00009330 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9331 /*default=*/false))
9332 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009333 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9334 options::OPT_fno_function_sections))
9335 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9336 ? "/Gy"
9337 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009338 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9339 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009340 CmdArgs.push_back(
9341 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009342 if (Args.hasArg(options::OPT_fsyntax_only))
9343 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009344 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9345 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009346 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009347
Nico Weber3f8dafb2015-03-12 19:37:10 +00009348 std::vector<std::string> Includes =
9349 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009350 for (const auto &Include : Includes)
9351 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009352
Hans Wennborg87cfa712013-09-19 20:32:16 +00009353 // Flags that can simply be passed through.
9354 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9355 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009356 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009357 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009358
9359 // The order of these flags is relevant, so pick the last one.
9360 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9361 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9362 A->render(Args, CmdArgs);
9363
Hans Wennborg87cfa712013-09-19 20:32:16 +00009364 // Input filename.
9365 assert(Inputs.size() == 1);
9366 const InputInfo &II = Inputs[0];
9367 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9368 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9369 if (II.isFilename())
9370 CmdArgs.push_back(II.getFilename());
9371 else
9372 II.getInputArg().renderAsInput(Args, CmdArgs);
9373
9374 // Output filename.
9375 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009376 const char *Fo =
9377 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009378 CmdArgs.push_back(Fo);
9379
Hans Wennborg188382e2013-09-20 18:16:35 +00009380 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009381 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9382 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009383 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009384 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009385}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009386
Yaron Keren1c0070c2015-07-02 04:45:27 +00009387/// MinGW Tools
9388void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9389 const InputInfo &Output,
9390 const InputInfoList &Inputs,
9391 const ArgList &Args,
9392 const char *LinkingOutput) const {
9393 claimNoWarnArgs(Args);
9394 ArgStringList CmdArgs;
9395
9396 if (getToolChain().getArch() == llvm::Triple::x86) {
9397 CmdArgs.push_back("--32");
9398 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9399 CmdArgs.push_back("--64");
9400 }
9401
9402 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9403
9404 CmdArgs.push_back("-o");
9405 CmdArgs.push_back(Output.getFilename());
9406
9407 for (const auto &II : Inputs)
9408 CmdArgs.push_back(II.getFilename());
9409
9410 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009411 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009412
9413 if (Args.hasArg(options::OPT_gsplit_dwarf))
9414 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9415 SplitDebugName(Args, Inputs[0]));
9416}
9417
9418void MinGW::Linker::AddLibGCC(const ArgList &Args,
9419 ArgStringList &CmdArgs) const {
9420 if (Args.hasArg(options::OPT_mthreads))
9421 CmdArgs.push_back("-lmingwthrd");
9422 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009423
Yaron Kerenaa281332015-08-09 00:24:07 +00009424 // Make use of compiler-rt if --rtlib option is used
9425 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9426 if (RLT == ToolChain::RLT_Libgcc) {
9427 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9428 Args.hasArg(options::OPT_static);
9429 bool Shared = Args.hasArg(options::OPT_shared);
9430 bool CXX = getToolChain().getDriver().CCCIsCXX();
9431
9432 if (Static || (!CXX && !Shared)) {
9433 CmdArgs.push_back("-lgcc");
9434 CmdArgs.push_back("-lgcc_eh");
9435 } else {
9436 CmdArgs.push_back("-lgcc_s");
9437 CmdArgs.push_back("-lgcc");
9438 }
9439 } else {
9440 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9441 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009442
Yaron Keren1c0070c2015-07-02 04:45:27 +00009443 CmdArgs.push_back("-lmoldname");
9444 CmdArgs.push_back("-lmingwex");
9445 CmdArgs.push_back("-lmsvcrt");
9446}
9447
9448void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9449 const InputInfo &Output,
9450 const InputInfoList &Inputs,
9451 const ArgList &Args,
9452 const char *LinkingOutput) const {
9453 const ToolChain &TC = getToolChain();
9454 const Driver &D = TC.getDriver();
9455 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9456
9457 ArgStringList CmdArgs;
9458
9459 // Silence warning for "clang -g foo.o -o foo"
9460 Args.ClaimAllArgs(options::OPT_g_Group);
9461 // and "clang -emit-llvm foo.o -o foo"
9462 Args.ClaimAllArgs(options::OPT_emit_llvm);
9463 // and for "clang -w foo.o -o foo". Other warning options are already
9464 // handled somewhere else.
9465 Args.ClaimAllArgs(options::OPT_w);
9466
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009467 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9468 if (LinkerName.equals_lower("lld")) {
9469 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009470 CmdArgs.push_back("old-gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009471 } else if (!LinkerName.equals_lower("ld")) {
9472 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009473 }
9474
Yaron Keren1c0070c2015-07-02 04:45:27 +00009475 if (!D.SysRoot.empty())
9476 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9477
9478 if (Args.hasArg(options::OPT_s))
9479 CmdArgs.push_back("-s");
9480
9481 CmdArgs.push_back("-m");
9482 if (TC.getArch() == llvm::Triple::x86)
9483 CmdArgs.push_back("i386pe");
9484 if (TC.getArch() == llvm::Triple::x86_64)
9485 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009486 if (TC.getArch() == llvm::Triple::arm)
9487 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009488
9489 if (Args.hasArg(options::OPT_mwindows)) {
9490 CmdArgs.push_back("--subsystem");
9491 CmdArgs.push_back("windows");
9492 } else if (Args.hasArg(options::OPT_mconsole)) {
9493 CmdArgs.push_back("--subsystem");
9494 CmdArgs.push_back("console");
9495 }
9496
9497 if (Args.hasArg(options::OPT_static))
9498 CmdArgs.push_back("-Bstatic");
9499 else {
9500 if (Args.hasArg(options::OPT_mdll))
9501 CmdArgs.push_back("--dll");
9502 else if (Args.hasArg(options::OPT_shared))
9503 CmdArgs.push_back("--shared");
9504 CmdArgs.push_back("-Bdynamic");
9505 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9506 CmdArgs.push_back("-e");
9507 if (TC.getArch() == llvm::Triple::x86)
9508 CmdArgs.push_back("_DllMainCRTStartup@12");
9509 else
9510 CmdArgs.push_back("DllMainCRTStartup");
9511 CmdArgs.push_back("--enable-auto-image-base");
9512 }
9513 }
9514
9515 CmdArgs.push_back("-o");
9516 CmdArgs.push_back(Output.getFilename());
9517
9518 Args.AddAllArgs(CmdArgs, options::OPT_e);
9519 // FIXME: add -N, -n flags
9520 Args.AddLastArg(CmdArgs, options::OPT_r);
9521 Args.AddLastArg(CmdArgs, options::OPT_s);
9522 Args.AddLastArg(CmdArgs, options::OPT_t);
9523 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9524 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9525
9526 if (!Args.hasArg(options::OPT_nostdlib) &&
9527 !Args.hasArg(options::OPT_nostartfiles)) {
9528 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9529 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9530 } else {
9531 if (Args.hasArg(options::OPT_municode))
9532 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9533 else
9534 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9535 }
9536 if (Args.hasArg(options::OPT_pg))
9537 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9538 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9539 }
9540
9541 Args.AddAllArgs(CmdArgs, options::OPT_L);
9542 const ToolChain::path_list Paths = TC.getFilePaths();
9543 for (const auto &Path : Paths)
9544 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9545
9546 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9547
9548 // TODO: Add ASan stuff here
9549
9550 // TODO: Add profile stuff here
9551
9552 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9553 !Args.hasArg(options::OPT_nodefaultlibs)) {
9554 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9555 !Args.hasArg(options::OPT_static);
9556 if (OnlyLibstdcxxStatic)
9557 CmdArgs.push_back("-Bstatic");
9558 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9559 if (OnlyLibstdcxxStatic)
9560 CmdArgs.push_back("-Bdynamic");
9561 }
9562
9563 if (!Args.hasArg(options::OPT_nostdlib)) {
9564 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9565 if (Args.hasArg(options::OPT_static))
9566 CmdArgs.push_back("--start-group");
9567
9568 if (Args.hasArg(options::OPT_fstack_protector) ||
9569 Args.hasArg(options::OPT_fstack_protector_strong) ||
9570 Args.hasArg(options::OPT_fstack_protector_all)) {
9571 CmdArgs.push_back("-lssp_nonshared");
9572 CmdArgs.push_back("-lssp");
9573 }
9574 if (Args.hasArg(options::OPT_fopenmp))
9575 CmdArgs.push_back("-lgomp");
9576
9577 AddLibGCC(Args, CmdArgs);
9578
9579 if (Args.hasArg(options::OPT_pg))
9580 CmdArgs.push_back("-lgmon");
9581
Yaron Kerenadce68e2015-07-06 18:52:19 +00009582 if (Args.hasArg(options::OPT_pthread))
9583 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009584
9585 // add system libraries
9586 if (Args.hasArg(options::OPT_mwindows)) {
9587 CmdArgs.push_back("-lgdi32");
9588 CmdArgs.push_back("-lcomdlg32");
9589 }
9590 CmdArgs.push_back("-ladvapi32");
9591 CmdArgs.push_back("-lshell32");
9592 CmdArgs.push_back("-luser32");
9593 CmdArgs.push_back("-lkernel32");
9594
9595 if (Args.hasArg(options::OPT_static))
9596 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009597 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009598 AddLibGCC(Args, CmdArgs);
9599 }
9600
9601 if (!Args.hasArg(options::OPT_nostartfiles)) {
9602 // Add crtfastmath.o if available and fast math is enabled.
9603 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9604
9605 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9606 }
9607 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009608 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009609 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009610}
9611
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009612/// XCore Tools
9613// We pass assemble and link construction to the xcc tool.
9614
Douglas Katzman95354292015-06-23 20:42:09 +00009615void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9616 const InputInfo &Output,
9617 const InputInfoList &Inputs,
9618 const ArgList &Args,
9619 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009620 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009621 ArgStringList CmdArgs;
9622
9623 CmdArgs.push_back("-o");
9624 CmdArgs.push_back(Output.getFilename());
9625
9626 CmdArgs.push_back("-c");
9627
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009628 if (Args.hasArg(options::OPT_v))
9629 CmdArgs.push_back("-v");
9630
Robert Lytton894d25c2014-05-02 09:33:25 +00009631 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9632 if (!A->getOption().matches(options::OPT_g0))
9633 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009634
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009635 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9636 false))
9637 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009638
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009639 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009640
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009641 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009642 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009643
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009644 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009645 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009646}
9647
Douglas Katzman95354292015-06-23 20:42:09 +00009648void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9649 const InputInfo &Output,
9650 const InputInfoList &Inputs,
9651 const ArgList &Args,
9652 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009653 ArgStringList CmdArgs;
9654
9655 if (Output.isFilename()) {
9656 CmdArgs.push_back("-o");
9657 CmdArgs.push_back(Output.getFilename());
9658 } else {
9659 assert(Output.isNothing() && "Invalid output.");
9660 }
9661
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009662 if (Args.hasArg(options::OPT_v))
9663 CmdArgs.push_back("-v");
9664
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009665 // Pass -fexceptions through to the linker if it was present.
9666 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9667 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009668 CmdArgs.push_back("-fexceptions");
9669
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009670 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9671
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009672 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009673 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009674}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009675
Douglas Katzman95354292015-06-23 20:42:09 +00009676void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9677 const InputInfo &Output,
9678 const InputInfoList &Inputs,
9679 const ArgList &Args,
9680 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009681 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009682 const auto &TC =
9683 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9684 ArgStringList CmdArgs;
9685 const char *Exec;
9686
9687 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009688 default:
9689 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009690 case llvm::Triple::arm:
9691 case llvm::Triple::thumb:
9692 break;
9693 case llvm::Triple::x86:
9694 CmdArgs.push_back("--32");
9695 break;
9696 case llvm::Triple::x86_64:
9697 CmdArgs.push_back("--64");
9698 break;
9699 }
9700
9701 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9702
9703 CmdArgs.push_back("-o");
9704 CmdArgs.push_back(Output.getFilename());
9705
9706 for (const auto &Input : Inputs)
9707 CmdArgs.push_back(Input.getFilename());
9708
9709 const std::string Assembler = TC.GetProgramPath("as");
9710 Exec = Args.MakeArgString(Assembler);
9711
Justin Bognerd3371d82015-07-17 03:35:54 +00009712 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009713}
9714
Douglas Katzman95354292015-06-23 20:42:09 +00009715void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9716 const InputInfo &Output,
9717 const InputInfoList &Inputs,
9718 const ArgList &Args,
9719 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009720 const auto &TC =
9721 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9722 const llvm::Triple &T = TC.getTriple();
9723 const Driver &D = TC.getDriver();
9724 SmallString<128> EntryPoint;
9725 ArgStringList CmdArgs;
9726 const char *Exec;
9727
9728 // Silence warning for "clang -g foo.o -o foo"
9729 Args.ClaimAllArgs(options::OPT_g_Group);
9730 // and "clang -emit-llvm foo.o -o foo"
9731 Args.ClaimAllArgs(options::OPT_emit_llvm);
9732 // and for "clang -w foo.o -o foo"
9733 Args.ClaimAllArgs(options::OPT_w);
9734 // Other warning options are already handled somewhere else.
9735
9736 if (!D.SysRoot.empty())
9737 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9738
9739 if (Args.hasArg(options::OPT_pie))
9740 CmdArgs.push_back("-pie");
9741 if (Args.hasArg(options::OPT_rdynamic))
9742 CmdArgs.push_back("-export-dynamic");
9743 if (Args.hasArg(options::OPT_s))
9744 CmdArgs.push_back("--strip-all");
9745
9746 CmdArgs.push_back("-m");
9747 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009748 default:
9749 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009750 case llvm::Triple::arm:
9751 case llvm::Triple::thumb:
9752 // FIXME: this is incorrect for WinCE
9753 CmdArgs.push_back("thumb2pe");
9754 break;
9755 case llvm::Triple::x86:
9756 CmdArgs.push_back("i386pe");
9757 EntryPoint.append("_");
9758 break;
9759 case llvm::Triple::x86_64:
9760 CmdArgs.push_back("i386pep");
9761 break;
9762 }
9763
9764 if (Args.hasArg(options::OPT_shared)) {
9765 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009766 default:
9767 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009768 case llvm::Triple::arm:
9769 case llvm::Triple::thumb:
9770 case llvm::Triple::x86_64:
9771 EntryPoint.append("_DllMainCRTStartup");
9772 break;
9773 case llvm::Triple::x86:
9774 EntryPoint.append("_DllMainCRTStartup@12");
9775 break;
9776 }
9777
9778 CmdArgs.push_back("-shared");
9779 CmdArgs.push_back("-Bdynamic");
9780
9781 CmdArgs.push_back("--enable-auto-image-base");
9782
9783 CmdArgs.push_back("--entry");
9784 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9785 } else {
9786 EntryPoint.append("mainCRTStartup");
9787
9788 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9789 : "-Bdynamic");
9790
9791 if (!Args.hasArg(options::OPT_nostdlib) &&
9792 !Args.hasArg(options::OPT_nostartfiles)) {
9793 CmdArgs.push_back("--entry");
9794 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9795 }
9796
9797 // FIXME: handle subsystem
9798 }
9799
9800 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009801 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009802
9803 CmdArgs.push_back("-o");
9804 CmdArgs.push_back(Output.getFilename());
9805
9806 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9807 SmallString<261> ImpLib(Output.getFilename());
9808 llvm::sys::path::replace_extension(ImpLib, ".lib");
9809
9810 CmdArgs.push_back("--out-implib");
9811 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9812 }
9813
9814 if (!Args.hasArg(options::OPT_nostdlib) &&
9815 !Args.hasArg(options::OPT_nostartfiles)) {
9816 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9817 const char *CRTBegin;
9818
9819 CRTBegin =
9820 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9821 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9822 }
9823
9824 Args.AddAllArgs(CmdArgs, options::OPT_L);
9825
9826 const auto &Paths = TC.getFilePaths();
9827 for (const auto &Path : Paths)
9828 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9829
9830 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9831
9832 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9833 !Args.hasArg(options::OPT_nodefaultlibs)) {
9834 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9835 !Args.hasArg(options::OPT_static);
9836 if (StaticCXX)
9837 CmdArgs.push_back("-Bstatic");
9838 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9839 if (StaticCXX)
9840 CmdArgs.push_back("-Bdynamic");
9841 }
9842
9843 if (!Args.hasArg(options::OPT_nostdlib)) {
9844 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9845 // TODO handle /MT[d] /MD[d]
9846 CmdArgs.push_back("-lmsvcrt");
9847 AddRunTimeLibs(TC, D, CmdArgs, Args);
9848 }
9849 }
9850
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009851 if (TC.getSanitizerArgs().needsAsanRt()) {
9852 // TODO handle /MT[d] /MD[d]
9853 if (Args.hasArg(options::OPT_shared)) {
9854 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9855 } else {
9856 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9857 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9858 // Make sure the dynamic runtime thunk is not optimized out at link time
9859 // to ensure proper SEH handling.
9860 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9861 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9862 ? "___asan_seh_interceptor"
9863 : "__asan_seh_interceptor"));
9864 }
9865 }
9866
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009867 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009868
Justin Bognerd3371d82015-07-17 03:35:54 +00009869 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009870}
Douglas Katzman84a75642015-06-19 14:55:19 +00009871
Douglas Katzman95354292015-06-23 20:42:09 +00009872void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9873 const InputInfo &Output,
9874 const InputInfoList &Inputs,
9875 const ArgList &Args,
9876 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009877
9878 ArgStringList CmdArgs;
9879
9880 assert(Inputs.size() == 1);
9881 const InputInfo &II = Inputs[0];
9882 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9883 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9884
Douglas Katzman84a75642015-06-19 14:55:19 +00009885 CmdArgs.push_back("-DMYRIAD2");
9886 CmdArgs.push_back("-mcpu=myriad2");
9887 CmdArgs.push_back("-S");
9888
Douglas Katzmanf6071112015-08-03 14:34:22 +00009889 // Append all -I, -iquote, -isystem paths, defines/undefines,
9890 // 'f' flags, optimize flags, and warning options.
9891 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009892 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9893 options::OPT_D, options::OPT_U,
9894 options::OPT_f_Group, options::OPT_f_clang_Group,
9895 options::OPT_g_Group, options::OPT_M_Group,
9896 options::OPT_O_Group, options::OPT_W_Group});
9897
9898 // If we're producing a dependency file, and assembly is the final action,
9899 // then the name of the target in the dependency file should be the '.o'
9900 // file, not the '.s' file produced by this step. For example, instead of
9901 // /tmp/mumble.s: mumble.c .../someheader.h
9902 // the filename on the lefthand side should be "mumble.o"
9903 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9904 C.getActions().size() == 1 &&
9905 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9906 Arg *A = Args.getLastArg(options::OPT_o);
9907 if (A) {
9908 CmdArgs.push_back("-MT");
9909 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9910 }
9911 }
9912
Douglas Katzman84a75642015-06-19 14:55:19 +00009913 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9914
9915 CmdArgs.push_back(II.getFilename());
9916 CmdArgs.push_back("-o");
9917 CmdArgs.push_back(Output.getFilename());
9918
9919 std::string Exec =
9920 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009921 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9922 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009923}
9924
Douglas Katzman95354292015-06-23 20:42:09 +00009925void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9926 const InputInfo &Output,
9927 const InputInfoList &Inputs,
9928 const ArgList &Args,
9929 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009930 ArgStringList CmdArgs;
9931
9932 assert(Inputs.size() == 1);
9933 const InputInfo &II = Inputs[0];
9934 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9935 assert(Output.getType() == types::TY_Object);
9936
9937 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009938 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009939 CmdArgs.push_back("-noSPrefixing");
9940 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009941 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9942 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9943 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009944 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009945 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009946 }
9947 CmdArgs.push_back("-elf"); // Output format.
9948 CmdArgs.push_back(II.getFilename());
9949 CmdArgs.push_back(
9950 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9951
9952 std::string Exec =
9953 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009954 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9955 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009956}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009957
9958void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9959 const InputInfo &Output,
9960 const InputInfoList &Inputs,
9961 const ArgList &Args,
9962 const char *LinkingOutput) const {
9963 const auto &TC =
9964 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9965 const llvm::Triple &T = TC.getTriple();
9966 ArgStringList CmdArgs;
9967 bool UseStartfiles = !Args.hasArg(options::OPT_nostartfiles);
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009968 bool UseDefaultLibs = !Args.hasArg(options::OPT_nostdlib) &&
9969 !Args.hasArg(options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009970
9971 std::string StartFilesDir, BuiltinLibDir;
9972 TC.getCompilerSupportDir(StartFilesDir);
9973 TC.getBuiltinLibDir(BuiltinLibDir);
9974
9975 if (T.getArch() == llvm::Triple::sparc)
9976 CmdArgs.push_back("-EB");
9977 else // SHAVE assumes little-endian, and sparcel is expressly so.
9978 CmdArgs.push_back("-EL");
9979
9980 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9981 // but we never pass through a --sysroot option and various other bits.
9982 // For example, there are no sanitizers (yet) nor gold linker.
9983
9984 // Eat some arguments that may be present but have no effect.
9985 Args.ClaimAllArgs(options::OPT_g_Group);
9986 Args.ClaimAllArgs(options::OPT_w);
9987 Args.ClaimAllArgs(options::OPT_static_libgcc);
9988
9989 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9990 CmdArgs.push_back("-s");
9991
9992 CmdArgs.push_back("-o");
9993 CmdArgs.push_back(Output.getFilename());
9994
9995 if (UseStartfiles) {
9996 // If you want startfiles, it means you want the builtin crti and crtbegin,
9997 // but not crt0. Myriad link commands provide their own crt0.o as needed.
9998 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crti.o"));
9999 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtbegin.o"));
10000 }
10001
10002 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10003 options::OPT_e, options::OPT_s, options::OPT_t,
10004 options::OPT_Z_Flag, options::OPT_r});
10005
Douglas Katzman526b5f92015-10-21 19:33:54 +000010006 // The linker doesn't use these builtin paths unless directed to,
10007 // because it was not compiled for support with sysroots, nor does
10008 // it have a default of little-endian with FPU.
10009 CmdArgs.push_back(Args.MakeArgString("-L" + BuiltinLibDir));
10010 CmdArgs.push_back(Args.MakeArgString("-L" + StartFilesDir));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010011
10012 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10013
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010014 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010015 if (C.getDriver().CCCIsCXX())
10016 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010017 if (T.getOS() == llvm::Triple::RTEMS) {
10018 CmdArgs.push_back("--start-group");
10019 CmdArgs.push_back("-lc");
10020 // You must provide your own "-L" option to enable finding these.
10021 CmdArgs.push_back("-lrtemscpu");
10022 CmdArgs.push_back("-lrtemsbsp");
10023 CmdArgs.push_back("--end-group");
10024 } else {
10025 CmdArgs.push_back("-lc");
10026 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010027 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010028 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010029 if (UseStartfiles) {
10030 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtend.o"));
10031 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtn.o"));
10032 }
10033
10034 std::string Exec =
10035 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10036 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10037 CmdArgs, Inputs));
10038}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010039
10040void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10041 const InputInfo &Output,
10042 const InputInfoList &Inputs,
10043 const ArgList &Args,
10044 const char *LinkingOutput) const {
10045 claimNoWarnArgs(Args);
10046 ArgStringList CmdArgs;
10047
10048 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10049
10050 CmdArgs.push_back("-o");
10051 CmdArgs.push_back(Output.getFilename());
10052
10053 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10054 const InputInfo &Input = Inputs[0];
10055 assert(Input.isFilename() && "Invalid input.");
10056 CmdArgs.push_back(Input.getFilename());
10057
10058 const char *Exec =
10059 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10060 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10061}
10062
10063static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
10064 ArgStringList &CmdArgs) {
10065 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
10066 false) ||
10067 Args.hasArg(options::OPT_fprofile_generate) ||
10068 Args.hasArg(options::OPT_fprofile_instr_generate) ||
10069 Args.hasArg(options::OPT_fcreate_profile) ||
10070 Args.hasArg(options::OPT_coverage)))
10071 return;
10072
10073 assert(TC.getTriple().isPS4CPU() &&
10074 "Profiling libraries are only implemented for the PS4 CPU");
10075 CmdArgs.push_back("-lclang_rt.profile-x86_64");
10076}
10077
10078static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10079 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10080 if (SanArgs.needsUbsanRt()) {
10081 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10082 }
10083 if (SanArgs.needsAsanRt()) {
10084 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10085 }
10086}
10087
10088static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10089 const JobAction &JA, const InputInfo &Output,
10090 const InputInfoList &Inputs,
10091 const ArgList &Args,
10092 const char *LinkingOutput) {
10093 const toolchains::FreeBSD &ToolChain =
10094 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10095 const Driver &D = ToolChain.getDriver();
10096 ArgStringList CmdArgs;
10097
10098 // Silence warning for "clang -g foo.o -o foo"
10099 Args.ClaimAllArgs(options::OPT_g_Group);
10100 // and "clang -emit-llvm foo.o -o foo"
10101 Args.ClaimAllArgs(options::OPT_emit_llvm);
10102 // and for "clang -w foo.o -o foo". Other warning options are already
10103 // handled somewhere else.
10104 Args.ClaimAllArgs(options::OPT_w);
10105
10106 if (!D.SysRoot.empty())
10107 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10108
10109 if (Args.hasArg(options::OPT_pie))
10110 CmdArgs.push_back("-pie");
10111
10112 if (Args.hasArg(options::OPT_rdynamic))
10113 CmdArgs.push_back("-export-dynamic");
10114 if (Args.hasArg(options::OPT_shared))
10115 CmdArgs.push_back("--oformat=so");
10116
10117 if (Output.isFilename()) {
10118 CmdArgs.push_back("-o");
10119 CmdArgs.push_back(Output.getFilename());
10120 } else {
10121 assert(Output.isNothing() && "Invalid output.");
10122 }
10123
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010124 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10125
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010126 Args.AddAllArgs(CmdArgs, options::OPT_L);
10127 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10128 Args.AddAllArgs(CmdArgs, options::OPT_e);
10129 Args.AddAllArgs(CmdArgs, options::OPT_s);
10130 Args.AddAllArgs(CmdArgs, options::OPT_t);
10131 Args.AddAllArgs(CmdArgs, options::OPT_r);
10132
10133 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10134 CmdArgs.push_back("--no-demangle");
10135
10136 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10137
10138 if (Args.hasArg(options::OPT_pthread)) {
10139 CmdArgs.push_back("-lpthread");
10140 }
10141
10142 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010143
10144 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10145
10146 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10147}
10148
10149static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10150 const JobAction &JA, const InputInfo &Output,
10151 const InputInfoList &Inputs,
10152 const ArgList &Args,
10153 const char *LinkingOutput) {
10154 const toolchains::FreeBSD &ToolChain =
10155 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10156 const Driver &D = ToolChain.getDriver();
10157 ArgStringList CmdArgs;
10158
10159 // Silence warning for "clang -g foo.o -o foo"
10160 Args.ClaimAllArgs(options::OPT_g_Group);
10161 // and "clang -emit-llvm foo.o -o foo"
10162 Args.ClaimAllArgs(options::OPT_emit_llvm);
10163 // and for "clang -w foo.o -o foo". Other warning options are already
10164 // handled somewhere else.
10165 Args.ClaimAllArgs(options::OPT_w);
10166
10167 if (!D.SysRoot.empty())
10168 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10169
10170 if (Args.hasArg(options::OPT_pie))
10171 CmdArgs.push_back("-pie");
10172
10173 if (Args.hasArg(options::OPT_static)) {
10174 CmdArgs.push_back("-Bstatic");
10175 } else {
10176 if (Args.hasArg(options::OPT_rdynamic))
10177 CmdArgs.push_back("-export-dynamic");
10178 CmdArgs.push_back("--eh-frame-hdr");
10179 if (Args.hasArg(options::OPT_shared)) {
10180 CmdArgs.push_back("-Bshareable");
10181 } else {
10182 CmdArgs.push_back("-dynamic-linker");
10183 CmdArgs.push_back("/libexec/ld-elf.so.1");
10184 }
10185 CmdArgs.push_back("--enable-new-dtags");
10186 }
10187
10188 if (Output.isFilename()) {
10189 CmdArgs.push_back("-o");
10190 CmdArgs.push_back(Output.getFilename());
10191 } else {
10192 assert(Output.isNothing() && "Invalid output.");
10193 }
10194
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010195 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10196
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010197 if (!Args.hasArg(options::OPT_nostdlib) &&
10198 !Args.hasArg(options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010199 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010200 if (!Args.hasArg(options::OPT_shared)) {
10201 if (Args.hasArg(options::OPT_pg))
10202 crt1 = "gcrt1.o";
10203 else if (Args.hasArg(options::OPT_pie))
10204 crt1 = "Scrt1.o";
10205 else
10206 crt1 = "crt1.o";
10207 }
10208 if (crt1)
10209 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10210
10211 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10212
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010213 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010214 if (Args.hasArg(options::OPT_static))
10215 crtbegin = "crtbeginT.o";
10216 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10217 crtbegin = "crtbeginS.o";
10218 else
10219 crtbegin = "crtbegin.o";
10220
10221 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10222 }
10223
10224 Args.AddAllArgs(CmdArgs, options::OPT_L);
10225
10226 const ToolChain::path_list Paths = ToolChain.getFilePaths();
10227 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
10228 i != e; ++i)
10229 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
10230
10231 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10232 Args.AddAllArgs(CmdArgs, options::OPT_e);
10233 Args.AddAllArgs(CmdArgs, options::OPT_s);
10234 Args.AddAllArgs(CmdArgs, options::OPT_t);
10235 Args.AddAllArgs(CmdArgs, options::OPT_r);
10236
10237 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10238 CmdArgs.push_back("--no-demangle");
10239
10240 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10241
10242 if (!Args.hasArg(options::OPT_nostdlib) &&
10243 !Args.hasArg(options::OPT_nodefaultlibs)) {
10244 // For PS4, we always want to pass libm, libstdc++ and libkernel
10245 // libraries for both C and C++ compilations.
10246 CmdArgs.push_back("-lkernel");
10247 if (D.CCCIsCXX()) {
10248 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10249 if (Args.hasArg(options::OPT_pg))
10250 CmdArgs.push_back("-lm_p");
10251 else
10252 CmdArgs.push_back("-lm");
10253 }
10254 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10255 // the default system libraries. Just mimic this for now.
10256 if (Args.hasArg(options::OPT_pg))
10257 CmdArgs.push_back("-lgcc_p");
10258 else
10259 CmdArgs.push_back("-lcompiler_rt");
10260 if (Args.hasArg(options::OPT_static)) {
10261 CmdArgs.push_back("-lstdc++");
10262 } else if (Args.hasArg(options::OPT_pg)) {
10263 CmdArgs.push_back("-lgcc_eh_p");
10264 } else {
10265 CmdArgs.push_back("--as-needed");
10266 CmdArgs.push_back("-lstdc++");
10267 CmdArgs.push_back("--no-as-needed");
10268 }
10269
10270 if (Args.hasArg(options::OPT_pthread)) {
10271 if (Args.hasArg(options::OPT_pg))
10272 CmdArgs.push_back("-lpthread_p");
10273 else
10274 CmdArgs.push_back("-lpthread");
10275 }
10276
10277 if (Args.hasArg(options::OPT_pg)) {
10278 if (Args.hasArg(options::OPT_shared))
10279 CmdArgs.push_back("-lc");
10280 else {
10281 if (Args.hasArg(options::OPT_static)) {
10282 CmdArgs.push_back("--start-group");
10283 CmdArgs.push_back("-lc_p");
10284 CmdArgs.push_back("-lpthread_p");
10285 CmdArgs.push_back("--end-group");
10286 } else {
10287 CmdArgs.push_back("-lc_p");
10288 }
10289 }
10290 CmdArgs.push_back("-lgcc_p");
10291 } else {
10292 if (Args.hasArg(options::OPT_static)) {
10293 CmdArgs.push_back("--start-group");
10294 CmdArgs.push_back("-lc");
10295 CmdArgs.push_back("-lpthread");
10296 CmdArgs.push_back("--end-group");
10297 } else {
10298 CmdArgs.push_back("-lc");
10299 }
10300 CmdArgs.push_back("-lcompiler_rt");
10301 }
10302
10303 if (Args.hasArg(options::OPT_static)) {
10304 CmdArgs.push_back("-lstdc++");
10305 } else if (Args.hasArg(options::OPT_pg)) {
10306 CmdArgs.push_back("-lgcc_eh_p");
10307 } else {
10308 CmdArgs.push_back("--as-needed");
10309 CmdArgs.push_back("-lstdc++");
10310 CmdArgs.push_back("--no-as-needed");
10311 }
10312 }
10313
10314 if (!Args.hasArg(options::OPT_nostdlib) &&
10315 !Args.hasArg(options::OPT_nostartfiles)) {
10316 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10317 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10318 else
10319 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10320 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10321 }
10322
10323 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010324
10325 const char *Exec =
10326#ifdef LLVM_ON_WIN32
10327 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10328#else
10329 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10330#endif
10331
10332 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10333}
10334
10335void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10336 const InputInfo &Output,
10337 const InputInfoList &Inputs,
10338 const ArgList &Args,
10339 const char *LinkingOutput) const {
10340 const toolchains::FreeBSD &ToolChain =
10341 static_cast<const toolchains::FreeBSD &>(getToolChain());
10342 const Driver &D = ToolChain.getDriver();
10343 bool PS4Linker;
10344 StringRef LinkerOptName;
10345 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10346 LinkerOptName = A->getValue();
10347 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10348 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10349 }
10350
10351 if (LinkerOptName == "gold")
10352 PS4Linker = false;
10353 else if (LinkerOptName == "ps4")
10354 PS4Linker = true;
10355 else
10356 PS4Linker = !Args.hasArg(options::OPT_shared);
10357
10358 if (PS4Linker)
10359 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10360 else
10361 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10362}