blob: d6a3a1f482dea693b2c5a12ef18855962aaf6a4f [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,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000281 const InputInfoList &Inputs,
282 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000283 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000284
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000285 CheckPreprocessingOptions(D, Args);
286
287 Args.AddLastArg(CmdArgs, options::OPT_C);
288 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000289
290 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000291 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000292 (A = Args.getLastArg(options::OPT_MD)) ||
293 (A = Args.getLastArg(options::OPT_MMD))) {
294 // Determine the output location.
295 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000296 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000297 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000298 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000299 } else if (Output.getType() == types::TY_Dependencies) {
300 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000301 } else if (A->getOption().matches(options::OPT_M) ||
302 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 DepFile = "-";
304 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000305 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000306 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000307 }
308 CmdArgs.push_back("-dependency-file");
309 CmdArgs.push_back(DepFile);
310
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000311 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000312 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
313 const char *DepTarget;
314
315 // If user provided -o, that is the dependency target, except
316 // when we are only generating a dependency file.
317 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
318 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000319 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 } else {
321 // Otherwise derive from the base input.
322 //
323 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000324 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000325 llvm::sys::path::replace_extension(P, "o");
326 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327 }
328
329 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000330 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000331 QuoteTarget(DepTarget, Quoted);
332 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000333 }
334
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000335 if (A->getOption().matches(options::OPT_M) ||
336 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000337 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000338 if ((isa<PrecompileJobAction>(JA) &&
339 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
340 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000341 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000342 }
343
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000344 if (Args.hasArg(options::OPT_MG)) {
345 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000346 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000347 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000348 CmdArgs.push_back("-MG");
349 }
350
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000352 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000353
354 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000355 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000356 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000357
Daniel Dunbara442fd52010-06-11 22:00:13 +0000358 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000359 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000360 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000361 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000362 CmdArgs.push_back(Args.MakeArgString(Quoted));
363
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000364 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000365 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000366 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367 }
368 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000369
Douglas Gregor111af7d2009-04-18 00:34:01 +0000370 // Add -i* options, and automatically translate to
371 // -include-pch/-include-pth for transparent PCH support. It's
372 // wonky, but we include looking for .gch so we can support seamless
373 // replacement into a build system already set up to be generating
374 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000375 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000376 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000377 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000378 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
379 RenderedImplicitInclude = true;
380
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000381 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000382 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000383
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000384 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000385 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000386 SmallString<128> P(A->getValue());
387 // We want the files to have a name like foo.h.pch. Add a dummy extension
388 // so that replace_extension does the right thing.
389 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000390 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000391 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000392 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000393 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000394 }
395
Douglas Gregor111af7d2009-04-18 00:34:01 +0000396 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000397 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000398 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000399 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000400 }
401
Douglas Gregor111af7d2009-04-18 00:34:01 +0000402 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000403 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000404 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000405 FoundPCH = UsePCH;
406 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000407 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000408 }
409
410 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000411 if (IsFirstImplicitInclude) {
412 A->claim();
413 if (UsePCH)
414 CmdArgs.push_back("-include-pch");
415 else
416 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000417 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000418 continue;
419 } else {
420 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000421 D.Diag(diag::warn_drv_pch_not_first_include) << P
422 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000423 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000424 }
425 }
426
427 // Not translated, render as usual.
428 A->claim();
429 A->render(Args, CmdArgs);
430 }
431
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000432 Args.AddAllArgs(CmdArgs,
433 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
434 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000435
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000436 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000437
438 // FIXME: There is a very unfortunate problem here, some troubled
439 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
440 // really support that we would have to parse and then translate
441 // those options. :(
442 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
443 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000444
445 // -I- is a deprecated GCC feature, reject it.
446 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000447 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000448
449 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
450 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000451 StringRef sysroot = C.getSysRoot();
452 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000453 if (!Args.hasArg(options::OPT_isysroot)) {
454 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000455 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000456 }
457 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000458
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000459 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000460 // FIXME: We should probably sink the logic for handling these from the
461 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000462 // CPATH - included following the user specified includes (but prior to
463 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000467 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000469 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000470 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000471 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000472 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000473
Artem Belevichfa11ab52015-11-17 22:28:46 +0000474 // Optional AuxToolChain indicates that we need to include headers
475 // for more than one target. If that's the case, add include paths
476 // from AuxToolChain right after include paths of the same kind for
477 // the current target.
478
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000479 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000480 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000481 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000482 if (AuxToolChain)
483 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
484 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000485
486 // Add system include arguments.
487 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000488 if (AuxToolChain)
489 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
490
491 // Add CUDA include arguments, if needed.
492 if (types::isCuda(Inputs[0].getType()))
493 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000494}
495
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000496// FIXME: Move to target hook.
497static bool isSignedCharDefault(const llvm::Triple &Triple) {
498 switch (Triple.getArch()) {
499 default:
500 return true;
501
Tim Northover9bb857a2013-01-31 12:13:10 +0000502 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000503 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000504 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000505 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000506 case llvm::Triple::thumb:
507 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000508 if (Triple.isOSDarwin() || Triple.isOSWindows())
509 return true;
510 return false;
511
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000512 case llvm::Triple::ppc:
513 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000514 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000515 return true;
516 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000517
David Majnemerdcecd932015-05-23 19:23:55 +0000518 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000519 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000520 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000521 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000522 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000523 }
524}
525
Robert Lytton0e076492013-08-13 09:43:10 +0000526static bool isNoCommonDefault(const llvm::Triple &Triple) {
527 switch (Triple.getArch()) {
528 default:
529 return false;
530
531 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000532 case llvm::Triple::wasm32:
533 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000534 return true;
535 }
536}
537
Renato Goline17c5802015-07-27 23:44:42 +0000538// ARM tools start.
539
540// Get SubArch (vN).
541static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
542 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000543 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000544}
545
546// True if M-profile.
547static bool isARMMProfile(const llvm::Triple &Triple) {
548 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000549 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000550 return Profile == llvm::ARM::PK_M;
551}
552
553// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000554static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
555 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000556 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
557 CPU = A->getValue();
558 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
559 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000560 if (!FromAs)
561 return;
562
563 for (const Arg *A :
564 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
565 StringRef Value = A->getValue();
566 if (Value.startswith("-mcpu="))
567 CPU = Value.substr(6);
568 if (Value.startswith("-march="))
569 Arch = Value.substr(7);
570 }
Renato Goline17c5802015-07-27 23:44:42 +0000571}
572
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000573// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000574// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000575static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000576 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000577 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000578 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
579 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000580 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
581}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000582
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000583// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000584static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000585 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000586 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000587 unsigned FPUID = llvm::ARM::parseFPU(FPU);
588 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000589 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
590}
591
Bradley Smithbbf5a002015-11-18 16:33:48 +0000592// Decode ARM features from string like +[no]featureA+[no]featureB+...
593static bool DecodeARMFeatures(const Driver &D, StringRef text,
594 std::vector<const char *> &Features) {
595 SmallVector<StringRef, 8> Split;
596 text.split(Split, StringRef("+"), -1, false);
597
598 for (StringRef Feature : Split) {
599 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
600 if (FeatureName)
601 Features.push_back(FeatureName);
602 else
603 return false;
604 }
605 return true;
606}
607
Renato Golin7c542b42015-07-27 23:44:45 +0000608// Check if -march is valid by checking if it can be canonicalised and parsed.
609// getARMArch is used here instead of just checking the -march value in order
610// to handle -march=native correctly.
611static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000612 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000613 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000614 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000615 std::pair<StringRef, StringRef> Split = ArchName.split("+");
616
Renato Goline17c5802015-07-27 23:44:42 +0000617 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000618 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
619 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000620 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000621}
622
Renato Golin7c542b42015-07-27 23:44:45 +0000623// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
624static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
625 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000626 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000627 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000628 std::pair<StringRef, StringRef> Split = CPUName.split("+");
629
Renato Goline17c5802015-07-27 23:44:42 +0000630 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000631 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
632 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000633 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000634}
635
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000636static bool useAAPCSForMachO(const llvm::Triple &T) {
637 // The backend is hardwired to assume AAPCS for M-class processors, ensure
638 // the frontend matches that.
639 return T.getEnvironment() == llvm::Triple::EABI ||
640 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
641}
642
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000643// Select the float ABI as determined by -msoft-float, -mhard-float, and
644// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000645arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
646 const Driver &D = TC.getDriver();
647 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000648 auto SubArch = getARMSubArchVersionNumber(Triple);
649 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000650 if (Arg *A =
651 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
652 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000653 if (A->getOption().matches(options::OPT_msoft_float)) {
654 ABI = FloatABI::Soft;
655 } else if (A->getOption().matches(options::OPT_mhard_float)) {
656 ABI = FloatABI::Hard;
657 } else {
658 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
659 .Case("soft", FloatABI::Soft)
660 .Case("softfp", FloatABI::SoftFP)
661 .Case("hard", FloatABI::Hard)
662 .Default(FloatABI::Invalid);
663 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000664 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000665 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000666 }
667 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000668
669 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
670 // "apcs-gnu".
671 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000672 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000673 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
674 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000675 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000676 }
677
678 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000679 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000680 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000681 case llvm::Triple::Darwin:
682 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000683 case llvm::Triple::IOS:
684 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000685 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000686 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000687 break;
688 }
Tim Northover756447a2015-10-30 16:30:36 +0000689 case llvm::Triple::WatchOS:
690 ABI = FloatABI::Hard;
691 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000692
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000693 // FIXME: this is invalid for WindowsCE
694 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000695 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000696 break;
697
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000698 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000699 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000700 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000701 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000702 break;
703 default:
704 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000705 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000706 break;
707 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000708 break;
709
Daniel Dunbar78485922009-09-10 23:00:09 +0000710 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000711 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000712 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000713 case llvm::Triple::EABIHF:
714 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000715 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000716 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000717 case llvm::Triple::EABI:
718 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000719 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000720 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000721 case llvm::Triple::Android:
722 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000723 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000724 default:
725 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000726 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000727 if (Triple.getOS() != llvm::Triple::UnknownOS ||
728 !Triple.isOSBinFormatMachO())
729 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000730 break;
731 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000732 }
733 }
734
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000735 assert(ABI != FloatABI::Invalid && "must select an ABI");
736 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000737}
738
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000739static void getARMTargetFeatures(const ToolChain &TC,
740 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000741 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000742 std::vector<const char *> &Features,
743 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000744 const Driver &D = TC.getDriver();
745
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000746 bool KernelOrKext =
747 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000748 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000749 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
750 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
751
Nico Weber6e0ebae2015-04-29 21:16:40 +0000752 if (!ForAS) {
753 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
754 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
755 // stripped out by the ARM target. We should probably pass this a new
756 // -target-option, which is handled by the -cc1/-cc1as invocation.
757 //
758 // FIXME2: For consistency, it would be ideal if we set up the target
759 // machine state the same when using the frontend or the assembler. We don't
760 // currently do that for the assembler, we pass the options directly to the
761 // backend and never even instantiate the frontend TargetInfo. If we did,
762 // and used its handleTargetFeatures hook, then we could ensure the
763 // assembler and the frontend behave the same.
764
765 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000766 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000767 Features.push_back("+soft-float");
768
769 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000770 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000771 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000772 } else {
773 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
774 // to the assembler correctly.
775 for (const Arg *A :
776 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
777 StringRef Value = A->getValue();
778 if (Value.startswith("-mfpu=")) {
779 WaFPU = A;
780 } else if (Value.startswith("-mcpu=")) {
781 WaCPU = A;
782 } else if (Value.startswith("-mhwdiv=")) {
783 WaHDiv = A;
784 } else if (Value.startswith("-march=")) {
785 WaArch = A;
786 }
787 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000788 }
789
Renato Golin7c542b42015-07-27 23:44:45 +0000790 // Check -march. ClangAs gives preference to -Wa,-march=.
791 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000792 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000793 if (WaArch) {
794 if (ArchArg)
795 D.Diag(clang::diag::warn_drv_unused_argument)
796 << ArchArg->getAsString(Args);
797 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000798 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000799 // FIXME: Set Arch.
800 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
801 } else if (ArchArg) {
802 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000803 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000804 }
805
Renato Golin7c542b42015-07-27 23:44:45 +0000806 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
807 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000808 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000809 if (WaCPU) {
810 if (CPUArg)
811 D.Diag(clang::diag::warn_drv_unused_argument)
812 << CPUArg->getAsString(Args);
813 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000814 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000815 } else if (CPUArg) {
816 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000817 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000818 }
John Brawna95c1a82015-05-08 12:52:18 +0000819
Renato Golin23459c62015-07-30 16:40:17 +0000820 // Add CPU features for generic CPUs
821 if (CPUName == "native") {
822 llvm::StringMap<bool> HostFeatures;
823 if (llvm::sys::getHostCPUFeatures(HostFeatures))
824 for (auto &F : HostFeatures)
825 Features.push_back(
826 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
827 }
828
829 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
830 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
831 if (WaFPU) {
832 if (FPUArg)
833 D.Diag(clang::diag::warn_drv_unused_argument)
834 << FPUArg->getAsString(Args);
835 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
836 Features);
837 } else if (FPUArg) {
838 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
839 }
840
841 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
842 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
843 if (WaHDiv) {
844 if (HDivArg)
845 D.Diag(clang::diag::warn_drv_unused_argument)
846 << HDivArg->getAsString(Args);
847 getARMHWDivFeatures(D, WaHDiv, Args,
848 StringRef(WaHDiv->getValue()).substr(8), Features);
849 } else if (HDivArg)
850 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
851
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000852 // Setting -msoft-float effectively disables NEON because of the GCC
853 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000854 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000855 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000856 // Also need to explicitly disable features which imply NEON.
857 Features.push_back("-crypto");
858 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000859
Eric Christopher269c2a22015-04-04 03:34:43 +0000860 // En/disable crc code generation.
861 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000862 if (A->getOption().matches(options::OPT_mcrc))
863 Features.push_back("+crc");
864 else
865 Features.push_back("-crc");
866 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000867
868 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
869 Features.insert(Features.begin(), "+v8.1a");
870 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000871
Akira Hatanakac2694822015-07-07 08:28:42 +0000872 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
873 // neither options are specified, see if we are compiling for kernel/kext and
874 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000875 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
876 options::OPT_mno_long_calls)) {
877 if (A->getOption().matches(options::OPT_mlong_calls))
878 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000879 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
880 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000881 Features.push_back("+long-calls");
882 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000883
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000884 // Kernel code has more strict alignment requirements.
885 if (KernelOrKext)
886 Features.push_back("+strict-align");
887 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
888 options::OPT_munaligned_access)) {
889 if (A->getOption().matches(options::OPT_munaligned_access)) {
890 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
891 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
892 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
893 } else
894 Features.push_back("+strict-align");
895 } else {
896 // Assume pre-ARMv6 doesn't support unaligned accesses.
897 //
898 // ARMv6 may or may not support unaligned accesses depending on the
899 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
900 // Darwin and NetBSD targets support unaligned accesses, and others don't.
901 //
902 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
903 // which raises an alignment fault on unaligned accesses. Linux
904 // defaults this bit to 0 and handles it as a system-wide (not
905 // per-process) setting. It is therefore safe to assume that ARMv7+
906 // Linux targets support unaligned accesses. The same goes for NaCl.
907 //
908 // The above behavior is consistent with GCC.
909 int VersionNum = getARMSubArchVersionNumber(Triple);
910 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000911 if (VersionNum < 6 ||
912 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000913 Features.push_back("+strict-align");
914 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
915 if (VersionNum < 7)
916 Features.push_back("+strict-align");
917 } else
918 Features.push_back("+strict-align");
919 }
920
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000921 // llvm does not support reserving registers in general. There is support
922 // for reserving r9 on ARM though (defined as a platform-specific register
923 // in ARM EABI).
924 if (Args.hasArg(options::OPT_ffixed_r9))
925 Features.push_back("+reserve-r9");
926
Akira Hatanaka580efb22015-07-16 00:43:00 +0000927 // The kext linker doesn't know how to deal with movw/movt.
928 if (KernelOrKext)
929 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000930}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000931
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000932void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
933 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000934 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000935 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000936 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000937 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000938 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000939 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000940 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000941 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000942 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000943 } else if (Triple.isWatchOS()) {
944 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000945 } else {
946 ABIName = "apcs-gnu";
947 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000948 } else if (Triple.isOSWindows()) {
949 // FIXME: this is invalid for WindowsCE
950 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000951 } else {
952 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000953 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000954 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000955 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000956 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000957 ABIName = "aapcs-linux";
958 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000959 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000960 case llvm::Triple::EABI:
961 ABIName = "aapcs";
962 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000963 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000964 if (Triple.getOS() == llvm::Triple::NetBSD)
965 ABIName = "apcs-gnu";
966 else
967 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000968 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000969 }
970 }
971 CmdArgs.push_back("-target-abi");
972 CmdArgs.push_back(ABIName);
973
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000974 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000975 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000976 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000977 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000978 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000979 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000980 CmdArgs.push_back("-mfloat-abi");
981 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000982 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000983 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000984 CmdArgs.push_back("-mfloat-abi");
985 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000986 } else {
987 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000988 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000989 CmdArgs.push_back("-mfloat-abi");
990 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000991 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000992
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000993 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000994 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
995 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000996 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000997 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000998 CmdArgs.push_back("-arm-global-merge=false");
999 else
1000 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001001 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001002
Bob Wilson9c8af452013-04-11 18:53:25 +00001003 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001004 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001005 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001006}
Renato Goline17c5802015-07-27 23:44:42 +00001007// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001008
Tim Northover573cbee2014-05-24 12:52:07 +00001009/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1010/// targeting.
1011static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001012 Arg *A;
1013 std::string CPU;
1014 // If we have -mtune or -mcpu, use that.
1015 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001016 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001017 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001018 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001019 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001020 }
1021
Kevin Qin110db6f2014-07-18 07:03:22 +00001022 // Handle CPU name is 'native'.
1023 if (CPU == "native")
1024 return llvm::sys::getHostCPUName();
1025 else if (CPU.size())
1026 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001027
James Molloy9b1586b2014-04-17 12:51:17 +00001028 // Make sure we pick "cyclone" if -arch is used.
1029 // FIXME: Should this be picked by checking the target triple instead?
1030 if (Args.getLastArg(options::OPT_arch))
1031 return "cyclone";
1032
1033 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001034}
1035
Tim Northover573cbee2014-05-24 12:52:07 +00001036void Clang::AddAArch64TargetArgs(const ArgList &Args,
1037 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001038 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1039 llvm::Triple Triple(TripleStr);
1040
1041 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1042 Args.hasArg(options::OPT_mkernel) ||
1043 Args.hasArg(options::OPT_fapple_kext))
1044 CmdArgs.push_back("-disable-red-zone");
1045
1046 if (!Args.hasFlag(options::OPT_mimplicit_float,
1047 options::OPT_mno_implicit_float, true))
1048 CmdArgs.push_back("-no-implicit-float");
1049
Craig Topper92fc2df2014-05-17 16:56:41 +00001050 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001051 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1052 ABIName = A->getValue();
1053 else if (Triple.isOSDarwin())
1054 ABIName = "darwinpcs";
1055 else
1056 ABIName = "aapcs";
1057
1058 CmdArgs.push_back("-target-abi");
1059 CmdArgs.push_back(ABIName);
1060
Bradley Smith9ff64332014-10-13 10:16:06 +00001061 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1062 options::OPT_mno_fix_cortex_a53_835769)) {
1063 CmdArgs.push_back("-backend-option");
1064 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1065 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1066 else
1067 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001068 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001069 // Enabled A53 errata (835769) workaround by default on android
1070 CmdArgs.push_back("-backend-option");
1071 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001072 }
1073
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001074 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001075 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1076 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001077 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001078 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001079 CmdArgs.push_back("-aarch64-global-merge=false");
1080 else
1081 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001082 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001083}
1084
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001085// Get CPU and ABI names. They are not independent
1086// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001087void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1088 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001089 const char *DefMips32CPU = "mips32r2";
1090 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001091
Daniel Sanders2bf13662014-07-10 14:40:57 +00001092 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1093 // default for mips64(el)?-img-linux-gnu.
1094 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1095 Triple.getEnvironment() == llvm::Triple::GNU) {
1096 DefMips32CPU = "mips32r6";
1097 DefMips64CPU = "mips64r6";
1098 }
Renato Golin7c542b42015-07-27 23:44:45 +00001099
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001100 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001101 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001102 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001103
Brad Smithba26f582015-01-06 02:53:17 +00001104 // MIPS3 is the default for mips64*-unknown-openbsd.
1105 if (Triple.getOS() == llvm::Triple::OpenBSD)
1106 DefMips64CPU = "mips3";
1107
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001108 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001109 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001110
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001111 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001112 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001113 // Convert a GNU style Mips ABI name to the name
1114 // accepted by LLVM Mips backend.
1115 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001116 .Case("32", "o32")
1117 .Case("64", "n64")
1118 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001119 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001120
1121 // Setup default CPU and ABI names.
1122 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001123 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001124 default:
1125 llvm_unreachable("Unexpected triple arch name");
1126 case llvm::Triple::mips:
1127 case llvm::Triple::mipsel:
1128 CPUName = DefMips32CPU;
1129 break;
1130 case llvm::Triple::mips64:
1131 case llvm::Triple::mips64el:
1132 CPUName = DefMips64CPU;
1133 break;
1134 }
1135 }
1136
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001137 if (ABIName.empty()) {
1138 // Deduce ABI name from the target triple.
1139 if (Triple.getArch() == llvm::Triple::mips ||
1140 Triple.getArch() == llvm::Triple::mipsel)
1141 ABIName = "o32";
1142 else
1143 ABIName = "n64";
1144 }
1145
1146 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001147 // Deduce CPU name from ABI name.
1148 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001149 .Cases("o32", "eabi", DefMips32CPU)
1150 .Cases("n32", "n64", DefMips64CPU)
1151 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001152 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001153
1154 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001155}
1156
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001157std::string mips::getMipsABILibSuffix(const ArgList &Args,
1158 const llvm::Triple &Triple) {
1159 StringRef CPUName, ABIName;
1160 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1161 return llvm::StringSwitch<std::string>(ABIName)
1162 .Case("o32", "")
1163 .Case("n32", "32")
1164 .Case("n64", "64");
1165}
1166
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001167// Convert ABI name to the GNU tools acceptable variant.
1168static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1169 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001170 .Case("o32", "32")
1171 .Case("n64", "64")
1172 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001173}
1174
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001175// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1176// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001177static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1178 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001179 if (Arg *A =
1180 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1181 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001182 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001183 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001184 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001185 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001186 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001187 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1188 .Case("soft", mips::FloatABI::Soft)
1189 .Case("hard", mips::FloatABI::Hard)
1190 .Default(mips::FloatABI::Invalid);
1191 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001192 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001193 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001194 }
1195 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001196 }
1197
1198 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 // Assume "hard", because it's a default value used by gcc.
1201 // When we start to recognize specific target MIPS processors,
1202 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001203 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001204 }
1205
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001206 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1207 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001208}
1209
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001210static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001211 std::vector<const char *> &Features,
1212 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001213 StringRef FeatureName) {
1214 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001215 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001216 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001217 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001218 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001219 }
1220}
1221
Daniel Sanders379d44b2014-07-16 11:52:23 +00001222static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1223 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001224 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001225 StringRef CPUName;
1226 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001227 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001228 ABIName = getGnuCompatibleMipsABIName(ABIName);
1229
Daniel Sandersfeb61302014-08-08 15:47:17 +00001230 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1231 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001232
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001233 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1234 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001235 // FIXME: Note, this is a hack. We need to pass the selected float
1236 // mode to the MipsTargetInfoBase to define appropriate macros there.
1237 // Now it is the only method.
1238 Features.push_back("+soft-float");
1239 }
1240
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001241 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001242 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001243 if (Val == "2008") {
1244 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1245 Features.push_back("+nan2008");
1246 else {
1247 Features.push_back("-nan2008");
1248 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1249 }
1250 } else if (Val == "legacy") {
1251 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1252 Features.push_back("-nan2008");
1253 else {
1254 Features.push_back("+nan2008");
1255 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1256 }
1257 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001258 D.Diag(diag::err_drv_unsupported_option_argument)
1259 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001260 }
1261
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001262 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1263 options::OPT_mdouble_float, "single-float");
1264 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1265 "mips16");
1266 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1267 options::OPT_mno_micromips, "micromips");
1268 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1269 "dsp");
1270 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1271 "dspr2");
1272 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1273 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001274
1275 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1276 // pass -mfpxx
1277 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1278 options::OPT_mfp64)) {
1279 if (A->getOption().matches(options::OPT_mfp32))
1280 Features.push_back(Args.MakeArgString("-fp64"));
1281 else if (A->getOption().matches(options::OPT_mfpxx)) {
1282 Features.push_back(Args.MakeArgString("+fpxx"));
1283 Features.push_back(Args.MakeArgString("+nooddspreg"));
1284 } else
1285 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001286 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001287 Features.push_back(Args.MakeArgString("+fpxx"));
1288 Features.push_back(Args.MakeArgString("+nooddspreg"));
1289 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001290
Daniel Sanders28e5d392014-07-10 10:39:51 +00001291 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1292 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001293}
1294
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001295void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001296 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001297 const Driver &D = getToolChain().getDriver();
1298 StringRef CPUName;
1299 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001300 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001301 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001302
1303 CmdArgs.push_back("-target-abi");
1304 CmdArgs.push_back(ABIName.data());
1305
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001306 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1307 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001308 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001309 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001310 CmdArgs.push_back("-mfloat-abi");
1311 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001312 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001313 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001314 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001315 CmdArgs.push_back("-mfloat-abi");
1316 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001317 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001318
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001319 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1320 if (A->getOption().matches(options::OPT_mxgot)) {
1321 CmdArgs.push_back("-mllvm");
1322 CmdArgs.push_back("-mxgot");
1323 }
1324 }
1325
Simon Atanasyanc580b322013-05-11 06:33:44 +00001326 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1327 options::OPT_mno_ldc1_sdc1)) {
1328 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1329 CmdArgs.push_back("-mllvm");
1330 CmdArgs.push_back("-mno-ldc1-sdc1");
1331 }
1332 }
1333
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001334 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1335 options::OPT_mno_check_zero_division)) {
1336 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1337 CmdArgs.push_back("-mllvm");
1338 CmdArgs.push_back("-mno-check-zero-division");
1339 }
1340 }
1341
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001342 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001343 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001344 CmdArgs.push_back("-mllvm");
1345 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1346 A->claim();
1347 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001348}
1349
Hal Finkel8eb59282012-06-11 22:35:19 +00001350/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1351static std::string getPPCTargetCPU(const ArgList &Args) {
1352 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001353 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001354
1355 if (CPUName == "native") {
1356 std::string CPU = llvm::sys::getHostCPUName();
1357 if (!CPU.empty() && CPU != "generic")
1358 return CPU;
1359 else
1360 return "";
1361 }
1362
1363 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001364 .Case("common", "generic")
1365 .Case("440", "440")
1366 .Case("440fp", "440")
1367 .Case("450", "450")
1368 .Case("601", "601")
1369 .Case("602", "602")
1370 .Case("603", "603")
1371 .Case("603e", "603e")
1372 .Case("603ev", "603ev")
1373 .Case("604", "604")
1374 .Case("604e", "604e")
1375 .Case("620", "620")
1376 .Case("630", "pwr3")
1377 .Case("G3", "g3")
1378 .Case("7400", "7400")
1379 .Case("G4", "g4")
1380 .Case("7450", "7450")
1381 .Case("G4+", "g4+")
1382 .Case("750", "750")
1383 .Case("970", "970")
1384 .Case("G5", "g5")
1385 .Case("a2", "a2")
1386 .Case("a2q", "a2q")
1387 .Case("e500mc", "e500mc")
1388 .Case("e5500", "e5500")
1389 .Case("power3", "pwr3")
1390 .Case("power4", "pwr4")
1391 .Case("power5", "pwr5")
1392 .Case("power5x", "pwr5x")
1393 .Case("power6", "pwr6")
1394 .Case("power6x", "pwr6x")
1395 .Case("power7", "pwr7")
1396 .Case("power8", "pwr8")
1397 .Case("pwr3", "pwr3")
1398 .Case("pwr4", "pwr4")
1399 .Case("pwr5", "pwr5")
1400 .Case("pwr5x", "pwr5x")
1401 .Case("pwr6", "pwr6")
1402 .Case("pwr6x", "pwr6x")
1403 .Case("pwr7", "pwr7")
1404 .Case("pwr8", "pwr8")
1405 .Case("powerpc", "ppc")
1406 .Case("powerpc64", "ppc64")
1407 .Case("powerpc64le", "ppc64le")
1408 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001409 }
1410
1411 return "";
1412}
1413
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001414static void getPPCTargetFeatures(const ArgList &Args,
1415 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001416 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1417 StringRef Name = A->getOption().getName();
1418 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001419
1420 // Skip over "-m".
1421 assert(Name.startswith("m") && "Invalid feature name.");
1422 Name = Name.substr(1);
1423
1424 bool IsNegative = Name.startswith("no-");
1425 if (IsNegative)
1426 Name = Name.substr(3);
1427
1428 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1429 // pass the correct option to the backend while calling the frontend
1430 // option the same.
1431 // TODO: Change the LLVM backend option maybe?
1432 if (Name == "mfcrf")
1433 Name = "mfocrf";
1434
1435 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1436 }
1437
1438 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001439 AddTargetFeature(Args, Features, options::OPT_faltivec,
1440 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001441}
1442
Ulrich Weigand8afad612014-07-28 13:17:52 +00001443void Clang::AddPPCTargetArgs(const ArgList &Args,
1444 ArgStringList &CmdArgs) const {
1445 // Select the ABI to use.
1446 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001447 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001448 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001449 case llvm::Triple::ppc64: {
1450 // When targeting a processor that supports QPX, or if QPX is
1451 // specifically enabled, default to using the ABI that supports QPX (so
1452 // long as it is not specifically disabled).
1453 bool HasQPX = false;
1454 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1455 HasQPX = A->getValue() == StringRef("a2q");
1456 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1457 if (HasQPX) {
1458 ABIName = "elfv1-qpx";
1459 break;
1460 }
1461
Ulrich Weigand8afad612014-07-28 13:17:52 +00001462 ABIName = "elfv1";
1463 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001464 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001465 case llvm::Triple::ppc64le:
1466 ABIName = "elfv2";
1467 break;
1468 default:
1469 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001470 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001471
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001472 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1473 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1474 // the option if given as we don't have backend support for any targets
1475 // that don't use the altivec abi.
1476 if (StringRef(A->getValue()) != "altivec")
1477 ABIName = A->getValue();
1478
Ulrich Weigand8afad612014-07-28 13:17:52 +00001479 if (ABIName) {
1480 CmdArgs.push_back("-target-abi");
1481 CmdArgs.push_back(ABIName);
1482 }
1483}
1484
1485bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1486 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1487 return A && (A->getValue() == StringRef(Value));
1488}
1489
Tom Stellard6674c702013-04-01 20:56:53 +00001490/// Get the (LLVM) name of the R600 gpu we are targeting.
1491static std::string getR600TargetGPU(const ArgList &Args) {
1492 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001493 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001494 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001495 .Cases("rv630", "rv635", "r600")
1496 .Cases("rv610", "rv620", "rs780", "rs880")
1497 .Case("rv740", "rv770")
1498 .Case("palm", "cedar")
1499 .Cases("sumo", "sumo2", "sumo")
1500 .Case("hemlock", "cypress")
1501 .Case("aruba", "cayman")
1502 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001503 }
1504 return "";
1505}
1506
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001507void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001508 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001509 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001510 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001511
James Y Knightb2406522015-06-15 20:51:24 +00001512 bool SoftFloatABI = false;
1513 if (Arg *A =
1514 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001515 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001516 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001517 }
1518
James Y Knightb2406522015-06-15 20:51:24 +00001519 // Only the hard-float ABI on Sparc is standardized, and it is the
1520 // default. GCC also supports a nonstandard soft-float ABI mode, and
1521 // perhaps LLVM should implement that, too. However, since llvm
1522 // currently does not support Sparc soft-float, at all, display an
1523 // error if it's requested.
1524 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001525 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1526 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001527 }
1528}
1529
Richard Sandiford4652d892013-07-19 16:51:51 +00001530static const char *getSystemZTargetCPU(const ArgList &Args) {
1531 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1532 return A->getValue();
1533 return "z10";
1534}
1535
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001536static void getSystemZTargetFeatures(const ArgList &Args,
1537 std::vector<const char *> &Features) {
1538 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001539 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001540 if (A->getOption().matches(options::OPT_mhtm))
1541 Features.push_back("+transactional-execution");
1542 else
1543 Features.push_back("-transactional-execution");
1544 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001545 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001546 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001547 if (A->getOption().matches(options::OPT_mvx))
1548 Features.push_back("+vector");
1549 else
1550 Features.push_back("-vector");
1551 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001552}
1553
Chandler Carruth953fb082013-01-13 11:46:33 +00001554static const char *getX86TargetCPU(const ArgList &Args,
1555 const llvm::Triple &Triple) {
1556 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001557 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001558 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001559 return "core-avx2";
1560
Chandler Carruth953fb082013-01-13 11:46:33 +00001561 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001562 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001563
1564 // FIXME: Reject attempts to use -march=native unless the target matches
1565 // the host.
1566 //
1567 // FIXME: We should also incorporate the detected target features for use
1568 // with -native.
1569 std::string CPU = llvm::sys::getHostCPUName();
1570 if (!CPU.empty() && CPU != "generic")
1571 return Args.MakeArgString(CPU);
1572 }
1573
Reid Kleckner3123eff2015-06-30 16:32:04 +00001574 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1575 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1576 StringRef Arch = A->getValue();
1577 const char *CPU;
1578 if (Triple.getArch() == llvm::Triple::x86) {
1579 CPU = llvm::StringSwitch<const char *>(Arch)
1580 .Case("IA32", "i386")
1581 .Case("SSE", "pentium3")
1582 .Case("SSE2", "pentium4")
1583 .Case("AVX", "sandybridge")
1584 .Case("AVX2", "haswell")
1585 .Default(nullptr);
1586 } else {
1587 CPU = llvm::StringSwitch<const char *>(Arch)
1588 .Case("AVX", "sandybridge")
1589 .Case("AVX2", "haswell")
1590 .Default(nullptr);
1591 }
1592 if (CPU)
1593 return CPU;
1594 }
1595
Chandler Carruth953fb082013-01-13 11:46:33 +00001596 // Select the default CPU if none was given (or detection failed).
1597
1598 if (Triple.getArch() != llvm::Triple::x86_64 &&
1599 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001600 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001601
1602 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1603
1604 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001605 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001606 if (Triple.getArchName() == "x86_64h")
1607 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001608 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001610
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001611 // Set up default CPU name for PS4 compilers.
1612 if (Triple.isPS4CPU())
1613 return "btver2";
1614
Alexey Bataev286d1b92014-01-31 04:07:13 +00001615 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001616 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001617 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001618
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001619 // Everything else goes to x86-64 in 64-bit mode.
1620 if (Is64Bit)
1621 return "x86-64";
1622
1623 switch (Triple.getOS()) {
1624 case llvm::Triple::FreeBSD:
1625 case llvm::Triple::NetBSD:
1626 case llvm::Triple::OpenBSD:
1627 return "i486";
1628 case llvm::Triple::Haiku:
1629 return "i586";
1630 case llvm::Triple::Bitrig:
1631 return "i686";
1632 default:
1633 // Fallback to p4.
1634 return "pentium4";
1635 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001636}
1637
Dan Gohmanc2853072015-09-03 22:51:53 +00001638/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1639static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1640 // If we have -mcpu=, use that.
1641 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1642 StringRef CPU = A->getValue();
1643
1644#ifdef __wasm__
1645 // Handle "native" by examining the host. "native" isn't meaningful when
1646 // cross compiling, so only support this when the host is also WebAssembly.
1647 if (CPU == "native")
1648 return llvm::sys::getHostCPUName();
1649#endif
1650
1651 return CPU;
1652 }
1653
1654 return "generic";
1655}
1656
Renato Golin7c542b42015-07-27 23:44:45 +00001657static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1658 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001659 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001660 default:
1661 return "";
1662
Amara Emerson703da2e2013-10-31 09:32:33 +00001663 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001664 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001665 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001666
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001667 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001668 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001669 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001670 case llvm::Triple::thumbeb: {
1671 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001672 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001673 return arm::getARMTargetCPU(MCPU, MArch, T);
1674 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001675 case llvm::Triple::mips:
1676 case llvm::Triple::mipsel:
1677 case llvm::Triple::mips64:
1678 case llvm::Triple::mips64el: {
1679 StringRef CPUName;
1680 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001681 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001682 return CPUName;
1683 }
1684
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001685 case llvm::Triple::nvptx:
1686 case llvm::Triple::nvptx64:
1687 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1688 return A->getValue();
1689 return "";
1690
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001691 case llvm::Triple::ppc:
1692 case llvm::Triple::ppc64:
1693 case llvm::Triple::ppc64le: {
1694 std::string TargetCPUName = getPPCTargetCPU(Args);
1695 // LLVM may default to generating code for the native CPU,
1696 // but, like gcc, we default to a more generic option for
1697 // each architecture. (except on Darwin)
1698 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1699 if (T.getArch() == llvm::Triple::ppc64)
1700 TargetCPUName = "ppc64";
1701 else if (T.getArch() == llvm::Triple::ppc64le)
1702 TargetCPUName = "ppc64le";
1703 else
1704 TargetCPUName = "ppc";
1705 }
1706 return TargetCPUName;
1707 }
1708
1709 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001710 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001711 case llvm::Triple::sparcv9:
1712 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001713 return A->getValue();
1714 return "";
1715
1716 case llvm::Triple::x86:
1717 case llvm::Triple::x86_64:
1718 return getX86TargetCPU(Args, T);
1719
1720 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001721 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001722
1723 case llvm::Triple::systemz:
1724 return getSystemZTargetCPU(Args);
1725
1726 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001727 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001728 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001729
1730 case llvm::Triple::wasm32:
1731 case llvm::Triple::wasm64:
1732 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001733 }
1734}
1735
Alp Tokerce365ca2013-12-02 12:43:03 +00001736static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001737 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001738 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1739 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1740 // forward.
1741 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001742 std::string Plugin =
1743 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001744 CmdArgs.push_back(Args.MakeArgString(Plugin));
1745
1746 // Try to pass driver level flags relevant to LTO code generation down to
1747 // the plugin.
1748
1749 // Handle flags for selecting CPU variants.
1750 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1751 if (!CPU.empty())
1752 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001753
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001754 if (IsThinLTO)
1755 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001756}
1757
Sanjay Patel2987c292015-06-11 14:53:41 +00001758/// This is a helper function for validating the optional refinement step
1759/// parameter in reciprocal argument strings. Return false if there is an error
1760/// parsing the refinement step. Otherwise, return true and set the Position
1761/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001762static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001763 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001764 const char RefinementStepToken = ':';
1765 Position = In.find(RefinementStepToken);
1766 if (Position != StringRef::npos) {
1767 StringRef Option = A.getOption().getName();
1768 StringRef RefStep = In.substr(Position + 1);
1769 // Allow exactly one numeric character for the additional refinement
1770 // step parameter. This is reasonable for all currently-supported
1771 // operations and architectures because we would expect that a larger value
1772 // of refinement steps would cause the estimate "optimization" to
1773 // under-perform the native operation. Also, if the estimate does not
1774 // converge quickly, it probably will not ever converge, so further
1775 // refinement steps will not produce a better answer.
1776 if (RefStep.size() != 1) {
1777 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1778 return false;
1779 }
1780 char RefStepChar = RefStep[0];
1781 if (RefStepChar < '0' || RefStepChar > '9') {
1782 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1783 return false;
1784 }
1785 }
1786 return true;
1787}
1788
1789/// The -mrecip flag requires processing of many optional parameters.
1790static void ParseMRecip(const Driver &D, const ArgList &Args,
1791 ArgStringList &OutStrings) {
1792 StringRef DisabledPrefixIn = "!";
1793 StringRef DisabledPrefixOut = "!";
1794 StringRef EnabledPrefixOut = "";
1795 StringRef Out = "-mrecip=";
1796
1797 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1798 if (!A)
1799 return;
1800
1801 unsigned NumOptions = A->getNumValues();
1802 if (NumOptions == 0) {
1803 // No option is the same as "all".
1804 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1805 return;
1806 }
1807
1808 // Pass through "all", "none", or "default" with an optional refinement step.
1809 if (NumOptions == 1) {
1810 StringRef Val = A->getValue(0);
1811 size_t RefStepLoc;
1812 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1813 return;
1814 StringRef ValBase = Val.slice(0, RefStepLoc);
1815 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1816 OutStrings.push_back(Args.MakeArgString(Out + Val));
1817 return;
1818 }
1819 }
1820
1821 // Each reciprocal type may be enabled or disabled individually.
1822 // Check each input value for validity, concatenate them all back together,
1823 // and pass through.
1824
1825 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001826 OptionStrings.insert(std::make_pair("divd", false));
1827 OptionStrings.insert(std::make_pair("divf", false));
1828 OptionStrings.insert(std::make_pair("vec-divd", false));
1829 OptionStrings.insert(std::make_pair("vec-divf", false));
1830 OptionStrings.insert(std::make_pair("sqrtd", false));
1831 OptionStrings.insert(std::make_pair("sqrtf", false));
1832 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1833 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001834
1835 for (unsigned i = 0; i != NumOptions; ++i) {
1836 StringRef Val = A->getValue(i);
1837
1838 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1839 // Ignore the disablement token for string matching.
1840 if (IsDisabled)
1841 Val = Val.substr(1);
1842
1843 size_t RefStep;
1844 if (!getRefinementStep(Val, D, *A, RefStep))
1845 return;
1846
1847 StringRef ValBase = Val.slice(0, RefStep);
1848 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1849 if (OptionIter == OptionStrings.end()) {
1850 // Try again specifying float suffix.
1851 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1852 if (OptionIter == OptionStrings.end()) {
1853 // The input name did not match any known option string.
1854 D.Diag(diag::err_drv_unknown_argument) << Val;
1855 return;
1856 }
1857 // The option was specified without a float or double suffix.
1858 // Make sure that the double entry was not already specified.
1859 // The float entry will be checked below.
1860 if (OptionStrings[ValBase.str() + 'd']) {
1861 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1862 return;
1863 }
1864 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001865
Sanjay Patel2987c292015-06-11 14:53:41 +00001866 if (OptionIter->second == true) {
1867 // Duplicate option specified.
1868 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1869 return;
1870 }
1871
1872 // Mark the matched option as found. Do not allow duplicate specifiers.
1873 OptionIter->second = true;
1874
1875 // If the precision was not specified, also mark the double entry as found.
1876 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1877 OptionStrings[ValBase.str() + 'd'] = true;
1878
1879 // Build the output string.
1880 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1881 Out = Args.MakeArgString(Out + Prefix + Val);
1882 if (i != NumOptions - 1)
1883 Out = Args.MakeArgString(Out + ",");
1884 }
1885
1886 OutStrings.push_back(Args.MakeArgString(Out));
1887}
1888
Eric Christopherc54920a2015-03-23 19:26:05 +00001889static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001890 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001891 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001892 // If -march=native, autodetect the feature list.
1893 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1894 if (StringRef(A->getValue()) == "native") {
1895 llvm::StringMap<bool> HostFeatures;
1896 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1897 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 Features.push_back(
1899 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001900 }
1901 }
1902
Jim Grosbach82eee262013-11-16 00:53:35 +00001903 if (Triple.getArchName() == "x86_64h") {
1904 // x86_64h implies quite a few of the more modern subtarget features
1905 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1906 Features.push_back("-rdrnd");
1907 Features.push_back("-aes");
1908 Features.push_back("-pclmul");
1909 Features.push_back("-rtm");
1910 Features.push_back("-hle");
1911 Features.push_back("-fsgsbase");
1912 }
1913
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001914 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001915 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001916 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001917 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001918 Features.push_back("+sse4.2");
1919 Features.push_back("+popcnt");
1920 } else
1921 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001922 }
1923
Eric Christopherc54920a2015-03-23 19:26:05 +00001924 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001925 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1926 StringRef Arch = A->getValue();
1927 bool ArchUsed = false;
1928 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001929 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001930 if (Arch == "AVX" || Arch == "AVX2") {
1931 ArchUsed = true;
1932 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1933 }
1934 }
1935 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001936 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001937 if (Arch == "IA32") {
1938 ArchUsed = true;
1939 } else if (Arch == "SSE" || Arch == "SSE2") {
1940 ArchUsed = true;
1941 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1942 }
1943 }
1944 if (!ArchUsed)
1945 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1946 }
1947
Jim Grosbach82eee262013-11-16 00:53:35 +00001948 // Now add any that the user explicitly requested on the command line,
1949 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001950 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1951 StringRef Name = A->getOption().getName();
1952 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001953
1954 // Skip over "-m".
1955 assert(Name.startswith("m") && "Invalid feature name.");
1956 Name = Name.substr(1);
1957
1958 bool IsNegative = Name.startswith("no-");
1959 if (IsNegative)
1960 Name = Name.substr(3);
1961
1962 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1963 }
1964}
1965
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001966void Clang::AddX86TargetArgs(const ArgList &Args,
1967 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001968 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001969 Args.hasArg(options::OPT_mkernel) ||
1970 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001971 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001972
Bob Wilson2616e2e2013-02-10 16:01:41 +00001973 // Default to avoid implicit floating-point for kernel/kext code, but allow
1974 // that to be overridden with -mno-soft-float.
1975 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1976 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001977 if (Arg *A = Args.getLastArg(
1978 options::OPT_msoft_float, options::OPT_mno_soft_float,
1979 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001980 const Option &O = A->getOption();
1981 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1982 O.matches(options::OPT_msoft_float));
1983 }
1984 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001985 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001986
1987 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1988 StringRef Value = A->getValue();
1989 if (Value == "intel" || Value == "att") {
1990 CmdArgs.push_back("-mllvm");
1991 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1992 } else {
1993 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1994 << A->getOption().getName() << Value;
1995 }
1996 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001997}
1998
Tony Linthicum76329bf2011-12-12 21:14:55 +00001999void Clang::AddHexagonTargetArgs(const ArgList &Args,
2000 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002001 CmdArgs.push_back("-mqdsp6-compat");
2002 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002003
Douglas Katzman54366072015-07-27 16:53:08 +00002004 if (const char *v =
2005 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002006 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002007 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002008 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002009 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002010 }
2011
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002012 if (!Args.hasArg(options::OPT_fno_short_enums))
2013 CmdArgs.push_back("-fshort-enums");
2014 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002015 CmdArgs.push_back("-mllvm");
2016 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002017 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002018 CmdArgs.push_back("-mllvm");
2019 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002020}
2021
Kevin Qin110db6f2014-07-18 07:03:22 +00002022// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002023static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002024 std::vector<const char *> &Features) {
2025 SmallVector<StringRef, 8> Split;
2026 text.split(Split, StringRef("+"), -1, false);
2027
Benjamin Kramer72e64312015-09-24 14:48:49 +00002028 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002029 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002030 .Case("fp", "+fp-armv8")
2031 .Case("simd", "+neon")
2032 .Case("crc", "+crc")
2033 .Case("crypto", "+crypto")
2034 .Case("nofp", "-fp-armv8")
2035 .Case("nosimd", "-neon")
2036 .Case("nocrc", "-crc")
2037 .Case("nocrypto", "-crypto")
2038 .Default(nullptr);
2039 if (result)
2040 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002041 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002042 D.Diag(diag::err_drv_no_neon_modifier);
2043 else
2044 return false;
2045 }
2046 return true;
2047}
2048
2049// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2050// decode CPU and feature.
2051static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2052 std::vector<const char *> &Features) {
2053 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2054 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002055 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
2056 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002057 Features.push_back("+neon");
2058 Features.push_back("+crc");
2059 Features.push_back("+crypto");
2060 } else if (CPU == "generic") {
2061 Features.push_back("+neon");
2062 } else {
2063 return false;
2064 }
2065
2066 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2067 return false;
2068
2069 return true;
2070}
2071
2072static bool
2073getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2074 const ArgList &Args,
2075 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002076 std::string MarchLowerCase = March.lower();
2077 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002078
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002079 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002080 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002081 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002082 Features.push_back("+v8.1a");
2083 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002084 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002085 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002086
2087 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2088 return false;
2089
2090 return true;
2091}
2092
2093static bool
2094getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2095 const ArgList &Args,
2096 std::vector<const char *> &Features) {
2097 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002098 std::string McpuLowerCase = Mcpu.lower();
2099 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002100 return false;
2101
2102 return true;
2103}
2104
2105static bool
2106getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2107 const ArgList &Args,
2108 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002109 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002110 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002111 if (MtuneLowerCase == "native")
2112 MtuneLowerCase = llvm::sys::getHostCPUName();
2113 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002114 Features.push_back("+zcm");
2115 Features.push_back("+zcz");
2116 }
2117 return true;
2118}
2119
2120static bool
2121getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2122 const ArgList &Args,
2123 std::vector<const char *> &Features) {
2124 StringRef CPU;
2125 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002126 std::string McpuLowerCase = Mcpu.lower();
2127 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002128 return false;
2129
2130 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2131}
2132
Justin Bognerf9052562015-11-13 23:07:31 +00002133static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002134 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002135 Arg *A;
2136 bool success = true;
2137 // Enable NEON by default.
2138 Features.push_back("+neon");
2139 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2140 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2141 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2142 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002143 else if (Args.hasArg(options::OPT_arch))
2144 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2145 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002146
2147 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2148 success =
2149 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2150 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2151 success =
2152 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002153 else if (Args.hasArg(options::OPT_arch))
2154 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2155 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002156
2157 if (!success)
2158 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002159
2160 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2161 Features.push_back("-fp-armv8");
2162 Features.push_back("-crypto");
2163 Features.push_back("-neon");
2164 }
Bradley Smith418c5932014-05-02 15:17:51 +00002165
2166 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002167 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002168 if (A->getOption().matches(options::OPT_mcrc))
2169 Features.push_back("+crc");
2170 else
2171 Features.push_back("-crc");
2172 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002173
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002174 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2175 options::OPT_munaligned_access))
2176 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2177 Features.push_back("+strict-align");
2178
Justin Bognerf9052562015-11-13 23:07:31 +00002179 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002180 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002181}
2182
Dan Gohmanc2853072015-09-03 22:51:53 +00002183static void getWebAssemblyTargetFeatures(const ArgList &Args,
2184 std::vector<const char *> &Features) {
2185 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2186 StringRef Name = A->getOption().getName();
2187 A->claim();
2188
2189 // Skip over "-m".
2190 assert(Name.startswith("m") && "Invalid feature name.");
2191 Name = Name.substr(1);
2192
2193 bool IsNegative = Name.startswith("no-");
2194 if (IsNegative)
2195 Name = Name.substr(3);
2196
2197 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2198 }
2199}
2200
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002201static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002202 const ArgList &Args, ArgStringList &CmdArgs,
2203 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002204 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002205 std::vector<const char *> Features;
2206 switch (Triple.getArch()) {
2207 default:
2208 break;
2209 case llvm::Triple::mips:
2210 case llvm::Triple::mipsel:
2211 case llvm::Triple::mips64:
2212 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002213 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002214 break;
2215
2216 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002217 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002218 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002219 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002220 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002221 break;
2222
2223 case llvm::Triple::ppc:
2224 case llvm::Triple::ppc64:
2225 case llvm::Triple::ppc64le:
2226 getPPCTargetFeatures(Args, Features);
2227 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002228 case llvm::Triple::systemz:
2229 getSystemZTargetFeatures(Args, Features);
2230 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002231 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002232 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002233 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002234 break;
2235 case llvm::Triple::x86:
2236 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002237 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002238 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002239 case llvm::Triple::wasm32:
2240 case llvm::Triple::wasm64:
2241 getWebAssemblyTargetFeatures(Args, Features);
2242 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002243 }
Rafael Espindola43964802013-08-21 17:34:32 +00002244
2245 // Find the last of each feature.
2246 llvm::StringMap<unsigned> LastOpt;
2247 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2248 const char *Name = Features[I];
2249 assert(Name[0] == '-' || Name[0] == '+');
2250 LastOpt[Name + 1] = I;
2251 }
2252
2253 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2254 // If this feature was overridden, ignore it.
2255 const char *Name = Features[I];
2256 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2257 assert(LastI != LastOpt.end());
2258 unsigned Last = LastI->second;
2259 if (Last != I)
2260 continue;
2261
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002262 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002263 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002264 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002265}
2266
David Majnemerae394812014-12-09 00:12:30 +00002267static bool
2268shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2269 const llvm::Triple &Triple) {
2270 // We use the zero-cost exception tables for Objective-C if the non-fragile
2271 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2272 // later.
2273 if (runtime.isNonFragile())
2274 return true;
2275
2276 if (!Triple.isMacOSX())
2277 return false;
2278
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002279 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002280 (Triple.getArch() == llvm::Triple::x86_64 ||
2281 Triple.getArch() == llvm::Triple::arm));
2282}
2283
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002284/// Adds exception related arguments to the driver command arguments. There's a
2285/// master flag, -fexceptions and also language specific flags to enable/disable
2286/// C++ and Objective-C exceptions. This makes it possible to for example
2287/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002288static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002289 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002290 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002291 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002292 const Driver &D = TC.getDriver();
2293 const llvm::Triple &Triple = TC.getTriple();
2294
Chad Rosier4fab82c2012-03-26 22:04:46 +00002295 if (KernelOrKext) {
2296 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2297 // arguments now to avoid warnings about unused arguments.
2298 Args.ClaimAllArgs(options::OPT_fexceptions);
2299 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2300 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2301 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2302 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2303 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002304 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002305 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002306
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002307 // See if the user explicitly enabled exceptions.
2308 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2309 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002310
David Majnemerae394812014-12-09 00:12:30 +00002311 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2312 // is not necessarily sensible, but follows GCC.
2313 if (types::isObjC(InputType) &&
2314 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002315 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002316 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002317
David Majnemerae394812014-12-09 00:12:30 +00002318 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002319 }
2320
2321 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002322 // Disable C++ EH by default on XCore, PS4, and MSVC.
2323 // FIXME: Remove MSVC from this list once things work.
2324 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2325 !Triple.isPS4CPU() &&
2326 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002327 Arg *ExceptionArg = Args.getLastArg(
2328 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2329 options::OPT_fexceptions, options::OPT_fno_exceptions);
2330 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002331 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002332 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2333 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002334
2335 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002336 if (Triple.isPS4CPU()) {
2337 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2338 assert(ExceptionArg &&
2339 "On the PS4 exceptions should only be enabled if passing "
2340 "an argument");
2341 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2342 const Arg *RTTIArg = TC.getRTTIArg();
2343 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2344 D.Diag(diag::err_drv_argument_not_allowed_with)
2345 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2346 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2347 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2348 } else
2349 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2350
Anders Carlssone96ab552011-02-28 02:27:16 +00002351 CmdArgs.push_back("-fcxx-exceptions");
2352
David Majnemer8de68642014-12-05 08:11:58 +00002353 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002354 }
2355 }
2356
David Majnemer8de68642014-12-05 08:11:58 +00002357 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002358 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002359}
2360
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002361static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002362 bool Default = true;
2363 if (TC.getTriple().isOSDarwin()) {
2364 // The native darwin assembler doesn't support the linker_option directives,
2365 // so we disable them if we think the .s file will be passed to it.
2366 Default = TC.useIntegratedAs();
2367 }
2368 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2369 Default);
2370}
2371
Ted Kremenek62093662013-03-12 17:02:12 +00002372static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2373 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002374 bool UseDwarfDirectory =
2375 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2376 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002377 return !UseDwarfDirectory;
2378}
2379
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002380/// \brief Check whether the given input tree contains any compilation actions.
2381static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002382 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002383 return true;
2384
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002385 for (const auto &Act : *A)
2386 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002387 return true;
2388
2389 return false;
2390}
2391
2392/// \brief Check if -relax-all should be passed to the internal assembler.
2393/// This is done by default when compiling non-assembler source with -O0.
2394static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2395 bool RelaxDefault = true;
2396
2397 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2398 RelaxDefault = A->getOption().matches(options::OPT_O0);
2399
2400 if (RelaxDefault) {
2401 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002402 for (const auto &Act : C.getActions()) {
2403 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002404 RelaxDefault = true;
2405 break;
2406 }
2407 }
2408 }
2409
2410 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002411 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002412}
2413
Douglas Katzman3459ce22015-10-08 04:24:12 +00002414// Extract the integer N from a string spelled "-dwarf-N", returning 0
2415// on mismatch. The StringRef input (rather than an Arg) allows
2416// for use by the "-Xassembler" option parser.
2417static unsigned DwarfVersionNum(StringRef ArgValue) {
2418 return llvm::StringSwitch<unsigned>(ArgValue)
2419 .Case("-gdwarf-2", 2)
2420 .Case("-gdwarf-3", 3)
2421 .Case("-gdwarf-4", 4)
2422 .Default(0);
2423}
2424
2425static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2426 CodeGenOptions::DebugInfoKind DebugInfoKind,
2427 unsigned DwarfVersion) {
2428 switch (DebugInfoKind) {
2429 case CodeGenOptions::DebugLineTablesOnly:
2430 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2431 break;
2432 case CodeGenOptions::LimitedDebugInfo:
2433 CmdArgs.push_back("-debug-info-kind=limited");
2434 break;
2435 case CodeGenOptions::FullDebugInfo:
2436 CmdArgs.push_back("-debug-info-kind=standalone");
2437 break;
2438 default:
2439 break;
2440 }
2441 if (DwarfVersion > 0)
2442 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002443 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002444}
2445
David Blaikie9260ed62013-07-25 21:19:01 +00002446static void CollectArgsForIntegratedAssembler(Compilation &C,
2447 const ArgList &Args,
2448 ArgStringList &CmdArgs,
2449 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002450 if (UseRelaxAll(C, Args))
2451 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002452
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002453 // When passing -I arguments to the assembler we sometimes need to
2454 // unconditionally take the next argument. For example, when parsing
2455 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2456 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2457 // arg after parsing the '-I' arg.
2458 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002459
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002460 // When using an integrated assembler, translate -Wa, and -Xassembler
2461 // options.
2462 bool CompressDebugSections = false;
2463 for (const Arg *A :
2464 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2465 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002466
Benjamin Kramer72e64312015-09-24 14:48:49 +00002467 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002468 if (TakeNextArg) {
2469 CmdArgs.push_back(Value.data());
2470 TakeNextArg = false;
2471 continue;
2472 }
David Blaikie9260ed62013-07-25 21:19:01 +00002473
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002474 switch (C.getDefaultToolChain().getArch()) {
2475 default:
2476 break;
2477 case llvm::Triple::mips:
2478 case llvm::Triple::mipsel:
2479 case llvm::Triple::mips64:
2480 case llvm::Triple::mips64el:
2481 if (Value == "--trap") {
2482 CmdArgs.push_back("-target-feature");
2483 CmdArgs.push_back("+use-tcc-in-div");
2484 continue;
2485 }
2486 if (Value == "--break") {
2487 CmdArgs.push_back("-target-feature");
2488 CmdArgs.push_back("-use-tcc-in-div");
2489 continue;
2490 }
2491 if (Value.startswith("-msoft-float")) {
2492 CmdArgs.push_back("-target-feature");
2493 CmdArgs.push_back("+soft-float");
2494 continue;
2495 }
2496 if (Value.startswith("-mhard-float")) {
2497 CmdArgs.push_back("-target-feature");
2498 CmdArgs.push_back("-soft-float");
2499 continue;
2500 }
2501 break;
2502 }
2503
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002504 if (Value == "-force_cpusubtype_ALL") {
2505 // Do nothing, this is the default and we don't support anything else.
2506 } else if (Value == "-L") {
2507 CmdArgs.push_back("-msave-temp-labels");
2508 } else if (Value == "--fatal-warnings") {
2509 CmdArgs.push_back("-massembler-fatal-warnings");
2510 } else if (Value == "--noexecstack") {
2511 CmdArgs.push_back("-mnoexecstack");
2512 } else if (Value == "-compress-debug-sections" ||
2513 Value == "--compress-debug-sections") {
2514 CompressDebugSections = true;
2515 } else if (Value == "-nocompress-debug-sections" ||
2516 Value == "--nocompress-debug-sections") {
2517 CompressDebugSections = false;
2518 } else if (Value.startswith("-I")) {
2519 CmdArgs.push_back(Value.data());
2520 // We need to consume the next argument if the current arg is a plain
2521 // -I. The next arg will be the include directory.
2522 if (Value == "-I")
2523 TakeNextArg = true;
2524 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002525 // "-gdwarf-N" options are not cc1as options.
2526 unsigned DwarfVersion = DwarfVersionNum(Value);
2527 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2528 CmdArgs.push_back(Value.data());
2529 } else {
2530 RenderDebugEnablingArgs(
2531 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2532 }
Renato Golin7c542b42015-07-27 23:44:45 +00002533 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2534 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2535 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002536 } else {
2537 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002538 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002539 }
2540 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002541 }
2542 if (CompressDebugSections) {
2543 if (llvm::zlib::isAvailable())
2544 CmdArgs.push_back("-compress-debug-sections");
2545 else
2546 D.Diag(diag::warn_debug_compression_unavailable);
2547 }
David Blaikie9260ed62013-07-25 21:19:01 +00002548}
2549
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002550// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002551// FIXME: Make sure we can also emit shared objects if they're requested
2552// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002553static void addClangRT(const ToolChain &TC, const ArgList &Args,
2554 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002555 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002556}
2557
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002558namespace {
2559enum OpenMPRuntimeKind {
2560 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2561 /// without knowing what runtime to target.
2562 OMPRT_Unknown,
2563
2564 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2565 /// the default for Clang.
2566 OMPRT_OMP,
2567
2568 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2569 /// this runtime but can swallow the pragmas, and find and link against the
2570 /// runtime library itself.
2571 OMPRT_GOMP,
2572
Chandler Carruthc6625c62015-05-28 21:10:31 +00002573 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002574 /// OpenMP runtime. We support this mode for users with existing dependencies
2575 /// on this runtime library name.
2576 OMPRT_IOMP5
2577};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002578}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002579
2580/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002581static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2582 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002583 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2584
2585 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2586 if (A)
2587 RuntimeName = A->getValue();
2588
2589 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002590 .Case("libomp", OMPRT_OMP)
2591 .Case("libgomp", OMPRT_GOMP)
2592 .Case("libiomp5", OMPRT_IOMP5)
2593 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002594
2595 if (RT == OMPRT_Unknown) {
2596 if (A)
2597 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002598 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002599 else
2600 // FIXME: We could use a nicer diagnostic here.
2601 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2602 }
2603
2604 return RT;
2605}
2606
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002607static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2608 const ArgList &Args) {
2609 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2610 options::OPT_fno_openmp, false))
2611 return;
2612
2613 switch (getOpenMPRuntime(TC, Args)) {
2614 case OMPRT_OMP:
2615 CmdArgs.push_back("-lomp");
2616 break;
2617 case OMPRT_GOMP:
2618 CmdArgs.push_back("-lgomp");
2619 break;
2620 case OMPRT_IOMP5:
2621 CmdArgs.push_back("-liomp5");
2622 break;
2623 case OMPRT_Unknown:
2624 // Already diagnosed.
2625 break;
2626 }
2627}
2628
Alexey Samsonov52550342014-09-15 19:58:40 +00002629static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2630 ArgStringList &CmdArgs, StringRef Sanitizer,
2631 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002632 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002633 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002634 if (!IsShared) CmdArgs.push_back("-whole-archive");
2635 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2636 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002637}
2638
Alexey Samsonov52550342014-09-15 19:58:40 +00002639// Tries to use a file with the list of dynamic symbols that need to be exported
2640// from the runtime library. Returns true if the file was found.
2641static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2642 ArgStringList &CmdArgs,
2643 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002644 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002645 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2646 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002647 return true;
2648 }
2649 return false;
2650}
2651
2652static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2653 ArgStringList &CmdArgs) {
2654 // Force linking against the system libraries sanitizers depends on
2655 // (see PR15823 why this is necessary).
2656 CmdArgs.push_back("--no-as-needed");
2657 CmdArgs.push_back("-lpthread");
2658 CmdArgs.push_back("-lrt");
2659 CmdArgs.push_back("-lm");
2660 // There's no libdl on FreeBSD.
2661 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2662 CmdArgs.push_back("-ldl");
2663}
2664
2665static void
2666collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2667 SmallVectorImpl<StringRef> &SharedRuntimes,
2668 SmallVectorImpl<StringRef> &StaticRuntimes,
2669 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2670 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2671 // Collect shared runtimes.
2672 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2673 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002674 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002675
Alexey Samsonov52550342014-09-15 19:58:40 +00002676 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002677 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002678 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002679 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002680 }
2681 if (SanArgs.needsAsanRt()) {
2682 if (SanArgs.needsSharedAsanRt()) {
2683 HelperStaticRuntimes.push_back("asan-preinit");
2684 } else {
2685 StaticRuntimes.push_back("asan");
2686 if (SanArgs.linkCXXRuntimes())
2687 StaticRuntimes.push_back("asan_cxx");
2688 }
2689 }
2690 if (SanArgs.needsDfsanRt())
2691 StaticRuntimes.push_back("dfsan");
2692 if (SanArgs.needsLsanRt())
2693 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002694 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002695 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002696 if (SanArgs.linkCXXRuntimes())
2697 StaticRuntimes.push_back("msan_cxx");
2698 }
2699 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002700 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002701 if (SanArgs.linkCXXRuntimes())
2702 StaticRuntimes.push_back("tsan_cxx");
2703 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002704 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002705 StaticRuntimes.push_back("ubsan_standalone");
2706 if (SanArgs.linkCXXRuntimes())
2707 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002708 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002709 if (SanArgs.needsSafeStackRt())
2710 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002711}
2712
Alexey Samsonov52550342014-09-15 19:58:40 +00002713// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2714// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2715static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002716 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002717 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2718 HelperStaticRuntimes;
2719 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2720 HelperStaticRuntimes);
2721 for (auto RT : SharedRuntimes)
2722 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2723 for (auto RT : HelperStaticRuntimes)
2724 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2725 bool AddExportDynamic = false;
2726 for (auto RT : StaticRuntimes) {
2727 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2728 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2729 }
2730 // If there is a static runtime with no dynamic list, force all the symbols
2731 // to be dynamic to be sure we export sanitizer interface functions.
2732 if (AddExportDynamic)
2733 CmdArgs.push_back("-export-dynamic");
2734 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002735}
2736
Reid Kleckner86ea7702015-02-04 23:45:07 +00002737static bool areOptimizationsEnabled(const ArgList &Args) {
2738 // Find the last -O arg and see if it is non-zero.
2739 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2740 return !A->getOption().matches(options::OPT_O0);
2741 // Defaults to -O0.
2742 return false;
2743}
2744
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002745static bool shouldUseFramePointerForTarget(const ArgList &Args,
2746 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002747 switch (Triple.getArch()) {
2748 case llvm::Triple::xcore:
2749 case llvm::Triple::wasm32:
2750 case llvm::Triple::wasm64:
2751 // XCore never wants frame pointers, regardless of OS.
2752 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002753 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002754 default:
2755 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002756 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002757
2758 if (Triple.isOSLinux()) {
2759 switch (Triple.getArch()) {
2760 // Don't use a frame pointer on linux if optimizing for certain targets.
2761 case llvm::Triple::mips64:
2762 case llvm::Triple::mips64el:
2763 case llvm::Triple::mips:
2764 case llvm::Triple::mipsel:
2765 case llvm::Triple::systemz:
2766 case llvm::Triple::x86:
2767 case llvm::Triple::x86_64:
2768 return !areOptimizationsEnabled(Args);
2769 default:
2770 return true;
2771 }
2772 }
2773
2774 if (Triple.isOSWindows()) {
2775 switch (Triple.getArch()) {
2776 case llvm::Triple::x86:
2777 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002778 case llvm::Triple::arm:
2779 case llvm::Triple::thumb:
2780 // Windows on ARM builds with FPO disabled to aid fast stack walking
2781 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002782 default:
2783 // All other supported Windows ISAs use xdata unwind information, so frame
2784 // pointers are not generally useful.
2785 return false;
2786 }
2787 }
2788
2789 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002790}
2791
Rafael Espindola224dd632011-12-14 21:02:23 +00002792static bool shouldUseFramePointer(const ArgList &Args,
2793 const llvm::Triple &Triple) {
2794 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2795 options::OPT_fomit_frame_pointer))
2796 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2797
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002798 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002799}
2800
Eric Christopherb7d97e92013-04-03 01:58:53 +00002801static bool shouldUseLeafFramePointer(const ArgList &Args,
2802 const llvm::Triple &Triple) {
2803 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2804 options::OPT_momit_leaf_frame_pointer))
2805 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2806
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002807 if (Triple.isPS4CPU())
2808 return false;
2809
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002810 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002811}
2812
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002813/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002814static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002815 SmallString<128> cwd;
2816 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002817 CmdArgs.push_back("-fdebug-compilation-dir");
2818 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002819 }
2820}
2821
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002822static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002823 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2824 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2825 SmallString<128> T(FinalOutput->getValue());
2826 llvm::sys::path::replace_extension(T, "dwo");
2827 return Args.MakeArgString(T);
2828 } else {
2829 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002830 SmallString<128> T(
2831 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002832 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002833 llvm::sys::path::replace_extension(F, "dwo");
2834 T += F;
2835 return Args.MakeArgString(F);
2836 }
2837}
2838
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002839static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2840 const JobAction &JA, const ArgList &Args,
2841 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002842 ArgStringList ExtractArgs;
2843 ExtractArgs.push_back("--extract-dwo");
2844
2845 ArgStringList StripArgs;
2846 StripArgs.push_back("--strip-dwo");
2847
2848 // Grabbing the output of the earlier compile step.
2849 StripArgs.push_back(Output.getFilename());
2850 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002851 ExtractArgs.push_back(OutFile);
2852
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002853 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002854 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002855
2856 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002857 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002858
2859 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002860 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002861}
2862
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002863/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002864/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2865static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002866 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002867 if (A->getOption().matches(options::OPT_O4) ||
2868 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002869 return true;
2870
2871 if (A->getOption().matches(options::OPT_O0))
2872 return false;
2873
2874 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2875
Rafael Espindola91780de2013-08-26 14:05:41 +00002876 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002877 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002878 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002879 return true;
2880
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002881 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002882 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002883 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002884
2885 unsigned OptLevel = 0;
2886 if (S.getAsInteger(10, OptLevel))
2887 return false;
2888
2889 return OptLevel > 1;
2890 }
2891
2892 return false;
2893}
2894
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002895/// Add -x lang to \p CmdArgs for \p Input.
2896static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2897 ArgStringList &CmdArgs) {
2898 // When using -verify-pch, we don't want to provide the type
2899 // 'precompiled-header' if it was inferred from the file extension
2900 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2901 return;
2902
2903 CmdArgs.push_back("-x");
2904 if (Args.hasArg(options::OPT_rewrite_objc))
2905 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2906 else
2907 CmdArgs.push_back(types::getTypeName(Input.getType()));
2908}
2909
David Majnemerc371ff02015-03-22 08:39:22 +00002910static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002911 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002912 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002913
2914 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002915 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002916
2917 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002918 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002919 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002920 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002921}
2922
Rafael Espindola577637a2015-01-03 00:06:04 +00002923// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002924// options that build systems might add but are unused when assembling or only
2925// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002926static void claimNoWarnArgs(const ArgList &Args) {
2927 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002928 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00002929 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00002930 Args.ClaimAllArgs(options::OPT_flto);
2931 Args.ClaimAllArgs(options::OPT_fno_lto);
2932}
2933
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002934static void appendUserToPath(SmallVectorImpl<char> &Result) {
2935#ifdef LLVM_ON_UNIX
2936 const char *Username = getenv("LOGNAME");
2937#else
2938 const char *Username = getenv("USERNAME");
2939#endif
2940 if (Username) {
2941 // Validate that LoginName can be used in a path, and get its length.
2942 size_t Len = 0;
2943 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002944 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002945 Username = nullptr;
2946 break;
2947 }
2948 }
2949
2950 if (Username && Len > 0) {
2951 Result.append(Username, Username + Len);
2952 return;
2953 }
2954 }
2955
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002956// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002957#ifdef LLVM_ON_UNIX
2958 std::string UID = llvm::utostr(getuid());
2959#else
2960 // FIXME: Windows seems to have an 'SID' that might work.
2961 std::string UID = "9999";
2962#endif
2963 Result.append(UID.begin(), UID.end());
2964}
2965
David Majnemere11d3732015-06-08 00:22:46 +00002966VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2967 const llvm::Triple &Triple,
2968 const llvm::opt::ArgList &Args,
2969 bool IsWindowsMSVC) {
2970 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2971 IsWindowsMSVC) ||
2972 Args.hasArg(options::OPT_fmsc_version) ||
2973 Args.hasArg(options::OPT_fms_compatibility_version)) {
2974 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2975 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002976 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002977
2978 if (MSCVersion && MSCompatibilityVersion) {
2979 if (D)
2980 D->Diag(diag::err_drv_argument_not_allowed_with)
2981 << MSCVersion->getAsString(Args)
2982 << MSCompatibilityVersion->getAsString(Args);
2983 return VersionTuple();
2984 }
2985
2986 if (MSCompatibilityVersion) {
2987 VersionTuple MSVT;
2988 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2989 D->Diag(diag::err_drv_invalid_value)
2990 << MSCompatibilityVersion->getAsString(Args)
2991 << MSCompatibilityVersion->getValue();
2992 return MSVT;
2993 }
2994
2995 if (MSCVersion) {
2996 unsigned Version = 0;
2997 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2998 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2999 << MSCVersion->getValue();
3000 return getMSCompatibilityVersion(Version);
3001 }
3002
3003 unsigned Major, Minor, Micro;
3004 Triple.getEnvironmentVersion(Major, Minor, Micro);
3005 if (Major || Minor || Micro)
3006 return VersionTuple(Major, Minor, Micro);
3007
3008 return VersionTuple(18);
3009 }
3010 return VersionTuple();
3011}
3012
Diego Novilloa0545962015-07-10 18:00:07 +00003013static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3014 const InputInfo &Output, const ArgList &Args,
3015 ArgStringList &CmdArgs) {
3016 auto *ProfileGenerateArg = Args.getLastArg(
3017 options::OPT_fprofile_instr_generate,
3018 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003019 options::OPT_fprofile_generate_EQ,
3020 options::OPT_fno_profile_instr_generate);
3021 if (ProfileGenerateArg &&
3022 ProfileGenerateArg->getOption().matches(
3023 options::OPT_fno_profile_instr_generate))
3024 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003025
3026 auto *ProfileUseArg = Args.getLastArg(
3027 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003028 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3029 options::OPT_fno_profile_instr_use);
3030 if (ProfileUseArg &&
3031 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3032 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003033
3034 if (ProfileGenerateArg && ProfileUseArg)
3035 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003036 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003037
Diego Novillo758f3f52015-08-05 21:49:51 +00003038 if (ProfileGenerateArg) {
3039 if (ProfileGenerateArg->getOption().matches(
3040 options::OPT_fprofile_instr_generate_EQ))
3041 ProfileGenerateArg->render(Args, CmdArgs);
3042 else if (ProfileGenerateArg->getOption().matches(
3043 options::OPT_fprofile_generate_EQ)) {
3044 SmallString<128> Path(ProfileGenerateArg->getValue());
3045 llvm::sys::path::append(Path, "default.profraw");
3046 CmdArgs.push_back(
3047 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3048 } else
3049 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3050 }
Diego Novilloa0545962015-07-10 18:00:07 +00003051
Diego Novillo758f3f52015-08-05 21:49:51 +00003052 if (ProfileUseArg) {
3053 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3054 ProfileUseArg->render(Args, CmdArgs);
3055 else if ((ProfileUseArg->getOption().matches(
3056 options::OPT_fprofile_use_EQ) ||
3057 ProfileUseArg->getOption().matches(
3058 options::OPT_fprofile_instr_use))) {
3059 SmallString<128> Path(
3060 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3061 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3062 llvm::sys::path::append(Path, "default.profdata");
3063 CmdArgs.push_back(
3064 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3065 }
Diego Novilloa0545962015-07-10 18:00:07 +00003066 }
3067
3068 if (Args.hasArg(options::OPT_ftest_coverage) ||
3069 Args.hasArg(options::OPT_coverage))
3070 CmdArgs.push_back("-femit-coverage-notes");
3071 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3072 false) ||
3073 Args.hasArg(options::OPT_coverage))
3074 CmdArgs.push_back("-femit-coverage-data");
3075
Diego Novilloc4b94da2015-08-05 23:27:40 +00003076 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3077 options::OPT_fno_coverage_mapping, false) &&
3078 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003079 D.Diag(diag::err_drv_argument_only_allowed_with)
3080 << "-fcoverage-mapping"
3081 << "-fprofile-instr-generate";
3082
Diego Novilloc4b94da2015-08-05 23:27:40 +00003083 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3084 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003085 CmdArgs.push_back("-fcoverage-mapping");
3086
3087 if (C.getArgs().hasArg(options::OPT_c) ||
3088 C.getArgs().hasArg(options::OPT_S)) {
3089 if (Output.isFilename()) {
3090 CmdArgs.push_back("-coverage-file");
3091 SmallString<128> CoverageFilename;
3092 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3093 CoverageFilename = FinalOutput->getValue();
3094 } else {
3095 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3096 }
3097 if (llvm::sys::path::is_relative(CoverageFilename)) {
3098 SmallString<128> Pwd;
3099 if (!llvm::sys::fs::current_path(Pwd)) {
3100 llvm::sys::path::append(Pwd, CoverageFilename);
3101 CoverageFilename.swap(Pwd);
3102 }
3103 }
3104 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3105 }
3106 }
3107}
3108
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003109/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3110/// smooshes them together with platform defaults, to decide whether
3111/// this compile should be using PIC mode or not. Returns a tuple of
3112/// (RelocationModel, PICLevel, IsPIE).
3113static std::tuple<llvm::Reloc::Model, unsigned, bool>
3114ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3115 const ArgList &Args) {
3116 // FIXME: why does this code...and so much everywhere else, use both
3117 // ToolChain.getTriple() and Triple?
3118 bool PIE = ToolChain.isPIEDefault();
3119 bool PIC = PIE || ToolChain.isPICDefault();
3120 bool IsPICLevelTwo = PIC;
3121
3122 bool KernelOrKext =
3123 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3124
3125 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003126 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003127 switch (ToolChain.getArch()) {
3128 case llvm::Triple::arm:
3129 case llvm::Triple::armeb:
3130 case llvm::Triple::thumb:
3131 case llvm::Triple::thumbeb:
3132 case llvm::Triple::aarch64:
3133 case llvm::Triple::mips:
3134 case llvm::Triple::mipsel:
3135 case llvm::Triple::mips64:
3136 case llvm::Triple::mips64el:
3137 PIC = true; // "-fpic"
3138 break;
3139
3140 case llvm::Triple::x86:
3141 case llvm::Triple::x86_64:
3142 PIC = true; // "-fPIC"
3143 IsPICLevelTwo = true;
3144 break;
3145
3146 default:
3147 break;
3148 }
3149 }
3150
3151 // OpenBSD-specific defaults for PIE
3152 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3153 switch (ToolChain.getArch()) {
3154 case llvm::Triple::mips64:
3155 case llvm::Triple::mips64el:
3156 case llvm::Triple::sparcel:
3157 case llvm::Triple::x86:
3158 case llvm::Triple::x86_64:
3159 IsPICLevelTwo = false; // "-fpie"
3160 break;
3161
3162 case llvm::Triple::ppc:
3163 case llvm::Triple::sparc:
3164 case llvm::Triple::sparcv9:
3165 IsPICLevelTwo = true; // "-fPIE"
3166 break;
3167
3168 default:
3169 break;
3170 }
3171 }
3172
3173 // The last argument relating to either PIC or PIE wins, and no
3174 // other argument is used. If the last argument is any flavor of the
3175 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3176 // option implicitly enables PIC at the same level.
3177 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3178 options::OPT_fpic, options::OPT_fno_pic,
3179 options::OPT_fPIE, options::OPT_fno_PIE,
3180 options::OPT_fpie, options::OPT_fno_pie);
3181 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3182 // is forced, then neither PIC nor PIE flags will have no effect.
3183 if (!ToolChain.isPICDefaultForced()) {
3184 if (LastPICArg) {
3185 Option O = LastPICArg->getOption();
3186 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3187 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3188 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3189 PIC =
3190 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3191 IsPICLevelTwo =
3192 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3193 } else {
3194 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003195 if (Triple.isPS4CPU()) {
3196 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3197 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3198 if (Model != "kernel") {
3199 PIC = true;
3200 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3201 << LastPICArg->getSpelling();
3202 }
3203 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003204 }
3205 }
3206 }
3207
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003208 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3209 // PIC level would've been set to level 1, force it back to level 2 PIC
3210 // instead.
3211 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003212 IsPICLevelTwo |= ToolChain.isPICDefault();
3213
James Y Knightc4015d32015-08-21 04:14:55 +00003214 // This kernel flags are a trump-card: they will disable PIC/PIE
3215 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003216 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3217 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003218 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003219
3220 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3221 // This is a very special mode. It trumps the other modes, almost no one
3222 // uses it, and it isn't even valid on any OS but Darwin.
3223 if (!ToolChain.getTriple().isOSDarwin())
3224 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3225 << A->getSpelling() << ToolChain.getTriple().str();
3226
3227 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3228
3229 // Only a forced PIC mode can cause the actual compile to have PIC defines
3230 // etc., no flags are sufficient. This behavior was selected to closely
3231 // match that of llvm-gcc and Apple GCC before that.
3232 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3233
3234 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3235 }
3236
3237 if (PIC)
3238 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3239
3240 return std::make_tuple(llvm::Reloc::Static, 0, false);
3241}
3242
3243static const char *RelocationModelName(llvm::Reloc::Model Model) {
3244 switch (Model) {
3245 case llvm::Reloc::Default:
3246 return nullptr;
3247 case llvm::Reloc::Static:
3248 return "static";
3249 case llvm::Reloc::PIC_:
3250 return "pic";
3251 case llvm::Reloc::DynamicNoPIC:
3252 return "dynamic-no-pic";
3253 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003254 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003255}
3256
3257static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3258 ArgStringList &CmdArgs) {
3259 llvm::Reloc::Model RelocationModel;
3260 unsigned PICLevel;
3261 bool IsPIE;
3262 std::tie(RelocationModel, PICLevel, IsPIE) =
3263 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3264
3265 if (RelocationModel != llvm::Reloc::Static)
3266 CmdArgs.push_back("-KPIC");
3267}
3268
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003269void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003270 const InputInfo &Output, const InputInfoList &Inputs,
3271 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003272 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3273 const llvm::Triple Triple(TripleStr);
3274
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003275 bool KernelOrKext =
3276 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003277 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003278 ArgStringList CmdArgs;
3279
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003280 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003281 bool IsWindowsCygnus =
3282 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003283 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003284 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003285
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003286 // Check number of inputs for sanity. We need at least one input.
3287 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003288 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003289 // CUDA compilation may have multiple inputs (source file + results of
3290 // device-side compilations). All other jobs are expected to have exactly one
3291 // input.
3292 bool IsCuda = types::isCuda(Input.getType());
3293 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003294
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003295 // Invoke ourselves in -cc1 mode.
3296 //
3297 // FIXME: Implement custom jobs for internal actions.
3298 CmdArgs.push_back("-cc1");
3299
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003300 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003301 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003302 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003303
Artem Belevichfa11ab52015-11-17 22:28:46 +00003304 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003305 if (IsCuda) {
3306 // FIXME: We need a (better) way to pass information about
3307 // particular compilation pass we're constructing here. For now we
3308 // can check which toolchain we're using and pick the other one to
3309 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003310 if (&getToolChain() == C.getCudaDeviceToolChain())
3311 AuxToolChain = C.getCudaHostToolChain();
3312 else if (&getToolChain() == C.getCudaHostToolChain())
3313 AuxToolChain = C.getCudaDeviceToolChain();
3314 else
3315 llvm_unreachable("Can't figure out CUDA compilation mode.");
3316 assert(AuxToolChain != nullptr && "No aux toolchain.");
3317 CmdArgs.push_back("-aux-triple");
3318 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003319 CmdArgs.push_back("-fcuda-target-overloads");
3320 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003321 }
3322
James Y Knight2db38f32015-08-15 03:45:25 +00003323 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3324 Triple.getArch() == llvm::Triple::thumb)) {
3325 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003326 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003327 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003328 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003329 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003330 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003331 }
3332
Tim Northover336f1892014-03-29 13:16:12 +00003333 // Push all default warning arguments that are specific to
3334 // the given target. These come before user provided warning options
3335 // are provided.
3336 getToolChain().addClangWarningOptions(CmdArgs);
3337
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003338 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003339 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003340
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003341 if (isa<AnalyzeJobAction>(JA)) {
3342 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3343 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003344 } else if (isa<MigrateJobAction>(JA)) {
3345 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003346 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003347 if (Output.getType() == types::TY_Dependencies)
3348 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003349 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003350 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003351 if (Args.hasArg(options::OPT_rewrite_objc) &&
3352 !Args.hasArg(options::OPT_g_Group))
3353 CmdArgs.push_back("-P");
3354 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003355 } else if (isa<AssembleJobAction>(JA)) {
3356 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003357
David Blaikie9260ed62013-07-25 21:19:01 +00003358 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003359
3360 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003361 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003362 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003363 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003364 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003365
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003366 if (JA.getType() == types::TY_Nothing)
3367 CmdArgs.push_back("-fsyntax-only");
3368 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003369 CmdArgs.push_back("-emit-pch");
3370 else
3371 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003372 } else if (isa<VerifyPCHJobAction>(JA)) {
3373 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003374 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003375 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3376 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003377 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003378 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003379 } else if (JA.getType() == types::TY_LLVM_IR ||
3380 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003381 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003382 } else if (JA.getType() == types::TY_LLVM_BC ||
3383 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003384 CmdArgs.push_back("-emit-llvm-bc");
3385 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003386 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003387 } else if (JA.getType() == types::TY_AST) {
3388 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003389 } else if (JA.getType() == types::TY_ModuleFile) {
3390 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003391 } else if (JA.getType() == types::TY_RewrittenObjC) {
3392 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003393 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003394 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3395 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003396 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003397 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003398 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003399 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003400
3401 // Preserve use-list order by default when emitting bitcode, so that
3402 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3403 // same result as running passes here. For LTO, we don't need to preserve
3404 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003405 if (JA.getType() == types::TY_LLVM_BC)
3406 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003407
3408 if (D.isUsingLTO())
3409 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003410 }
3411
Justin Bognera88f0122014-06-20 22:59:50 +00003412 // We normally speed up the clang process a bit by skipping destructors at
3413 // exit, but when we're generating diagnostics we can rely on some of the
3414 // cleanup.
3415 if (!C.isForDiagnostics())
3416 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003417
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003418// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003419#ifdef NDEBUG
3420 CmdArgs.push_back("-disable-llvm-verifier");
3421#endif
3422
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003423 // Set the main file name, so that debug info works even with
3424 // -save-temps.
3425 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003426 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003427
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003428 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003429 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003430 if (Args.hasArg(options::OPT_static))
3431 CmdArgs.push_back("-static-define");
3432
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003433 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003434 // Enable region store model by default.
3435 CmdArgs.push_back("-analyzer-store=region");
3436
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003437 // Treat blocks as analysis entry points.
3438 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3439
Ted Kremenek49c79792011-03-24 00:28:47 +00003440 CmdArgs.push_back("-analyzer-eagerly-assume");
3441
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003442 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003443 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003444 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003445
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003446 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003447 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003448
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003449 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003450 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003451
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003452 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003453
Artem Belevichba558952015-05-06 18:20:23 +00003454 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003455 CmdArgs.push_back("-analyzer-checker=cplusplus");
3456
Nico Webere8e53112014-05-11 01:04:02 +00003457 // Enable the following experimental checkers for testing.
3458 CmdArgs.push_back(
3459 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003460 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3461 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003462 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003463 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3464 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003465
3466 // Default nullability checks.
3467 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3468 CmdArgs.push_back(
3469 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003470 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003471
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003472 // Set the output format. The default is plist, for (lame) historical
3473 // reasons.
3474 CmdArgs.push_back("-analyzer-output");
3475 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003476 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003477 else
3478 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003479
Ted Kremenekfe449a22010-03-22 22:32:05 +00003480 // Disable the presentation of standard compiler warnings when
3481 // using --analyze. We only want to show static analyzer diagnostics
3482 // or frontend errors.
3483 CmdArgs.push_back("-w");
3484
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003485 // Add -Xanalyzer arguments when running as analyzer.
3486 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003487 }
3488
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003489 CheckCodeGenerationOptions(D, Args);
3490
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003491 llvm::Reloc::Model RelocationModel;
3492 unsigned PICLevel;
3493 bool IsPIE;
3494 std::tie(RelocationModel, PICLevel, IsPIE) =
3495 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003496
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003497 const char *RMName = RelocationModelName(RelocationModel);
3498 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003499 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003500 CmdArgs.push_back(RMName);
3501 }
3502 if (PICLevel > 0) {
3503 CmdArgs.push_back("-pic-level");
3504 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3505 if (IsPIE) {
3506 CmdArgs.push_back("-pie-level");
3507 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003508 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003509 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003510
Renato Golin4854d802015-11-09 12:40:41 +00003511 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3512 CmdArgs.push_back("-meabi");
3513 CmdArgs.push_back(A->getValue());
3514 }
3515
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003516 CmdArgs.push_back("-mthread-model");
3517 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3518 CmdArgs.push_back(A->getValue());
3519 else
3520 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3521
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003522 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3523
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003524 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3525 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003526 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003527
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003528 // LLVM Code Generator Options.
3529
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003530 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3531 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003532 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3533 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003534 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003535 CmdArgs.push_back(A->getValue());
3536 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003537 }
3538 }
3539
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003540 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3541 StringRef v = A->getValue();
3542 CmdArgs.push_back("-mllvm");
3543 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3544 A->claim();
3545 }
3546
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003547 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3548 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003549 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003550 }
3551
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003552 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3553 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003554 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003555 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003556 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003557 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3558 CmdArgs.push_back("-fpcc-struct-return");
3559 } else {
3560 assert(A->getOption().matches(options::OPT_freg_struct_return));
3561 CmdArgs.push_back("-freg-struct-return");
3562 }
3563 }
3564
Roman Divacky65b88cd2011-03-01 17:40:53 +00003565 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3566 CmdArgs.push_back("-mrtd");
3567
Rafael Espindola224dd632011-12-14 21:02:23 +00003568 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003569 CmdArgs.push_back("-mdisable-fp-elim");
3570 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3571 options::OPT_fno_zero_initialized_in_bss))
3572 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003573
3574 bool OFastEnabled = isOptimizationLevelFast(Args);
3575 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3576 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003577 OptSpecifier StrictAliasingAliasOption =
3578 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003579 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3580 // doesn't do any TBAA.
3581 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003582 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003583 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003584 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003585 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3586 options::OPT_fno_struct_path_tbaa))
3587 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003588 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3589 false))
3590 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003591 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3592 options::OPT_fno_strict_vtable_pointers,
3593 false))
3594 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003595 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3596 options::OPT_fno_optimize_sibling_calls))
3597 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003598
Eric Christopher006208c2013-04-04 06:29:47 +00003599 // Handle segmented stacks.
3600 if (Args.hasArg(options::OPT_fsplit_stack))
3601 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003602
3603 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3604 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003605 OptSpecifier FastMathAliasOption =
3606 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3607
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003608 // Handle various floating point optimization flags, mapping them to the
3609 // appropriate LLVM code generation flags. The pattern for all of these is to
3610 // default off the codegen optimizations, and if any flag enables them and no
3611 // flag disables them after the flag enabling them, enable the codegen
3612 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003613 if (Arg *A = Args.getLastArg(
3614 options::OPT_ffast_math, FastMathAliasOption,
3615 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3616 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3617 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003618 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3619 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003620 A->getOption().getID() != options::OPT_fhonor_infinities)
3621 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003622 if (Arg *A = Args.getLastArg(
3623 options::OPT_ffast_math, FastMathAliasOption,
3624 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3625 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3626 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003627 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3628 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003629 A->getOption().getID() != options::OPT_fhonor_nans)
3630 CmdArgs.push_back("-menable-no-nans");
3631
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003632 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3633 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003634 if (Arg *A =
3635 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3636 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3637 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003638 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3639 // However, turning *off* -ffast_math merely restores the toolchain default
3640 // (which may be false).
3641 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3642 A->getOption().getID() == options::OPT_ffast_math ||
3643 A->getOption().getID() == options::OPT_Ofast)
3644 MathErrno = false;
3645 else if (A->getOption().getID() == options::OPT_fmath_errno)
3646 MathErrno = true;
3647 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003648 if (MathErrno)
3649 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003650
3651 // There are several flags which require disabling very specific
3652 // optimizations. Any of these being disabled forces us to turn off the
3653 // entire set of LLVM optimizations, so collect them through all the flag
3654 // madness.
3655 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003656 if (Arg *A = Args.getLastArg(
3657 options::OPT_ffast_math, FastMathAliasOption,
3658 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3659 options::OPT_fno_unsafe_math_optimizations,
3660 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003661 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3662 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003663 A->getOption().getID() != options::OPT_fno_associative_math)
3664 AssociativeMath = true;
3665 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003666 if (Arg *A = Args.getLastArg(
3667 options::OPT_ffast_math, FastMathAliasOption,
3668 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3669 options::OPT_fno_unsafe_math_optimizations,
3670 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003671 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3672 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003673 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3674 ReciprocalMath = true;
3675 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003676 if (Arg *A = Args.getLastArg(
3677 options::OPT_ffast_math, FastMathAliasOption,
3678 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3679 options::OPT_fno_unsafe_math_optimizations,
3680 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003681 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3682 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003683 A->getOption().getID() != options::OPT_fsigned_zeros)
3684 SignedZeros = false;
3685 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003686 if (Arg *A = Args.getLastArg(
3687 options::OPT_ffast_math, FastMathAliasOption,
3688 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3689 options::OPT_fno_unsafe_math_optimizations,
3690 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003691 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3692 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003693 A->getOption().getID() != options::OPT_ftrapping_math)
3694 TrappingMath = false;
3695 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3696 !TrappingMath)
3697 CmdArgs.push_back("-menable-unsafe-fp-math");
3698
Sanjay Patel76c9e092015-01-23 16:40:50 +00003699 if (!SignedZeros)
3700 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003701
Sanjay Patel359b1052015-04-09 15:03:23 +00003702 if (ReciprocalMath)
3703 CmdArgs.push_back("-freciprocal-math");
3704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003705 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003706 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003707 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003708 options::OPT_ffp_contract)) {
3709 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003710 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003711 if (Val == "fast" || Val == "on" || Val == "off") {
3712 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3713 } else {
3714 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003715 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003716 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003717 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3718 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003719 // If fast-math is set then set the fp-contract mode to fast.
3720 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3721 }
3722 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003723
Sanjay Patel2987c292015-06-11 14:53:41 +00003724 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003725
Bob Wilson6a039162012-07-19 03:52:53 +00003726 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3727 // and if we find them, tell the frontend to provide the appropriate
3728 // preprocessor macros. This is distinct from enabling any optimizations as
3729 // these options induce language changes which must survive serialization
3730 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003731 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3732 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003733 if (!A->getOption().matches(options::OPT_fno_fast_math))
3734 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003735 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3736 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003737 if (A->getOption().matches(options::OPT_ffinite_math_only))
3738 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003739
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003740 // Decide whether to use verbose asm. Verbose assembly is the default on
3741 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003742 bool IsIntegratedAssemblerDefault =
3743 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003744 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003745 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003746 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003747 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003748
Rafael Espindolab8a12932015-05-22 20:44:03 +00003749 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3750 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003751 CmdArgs.push_back("-no-integrated-as");
3752
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003753 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3754 CmdArgs.push_back("-mdebug-pass");
3755 CmdArgs.push_back("Structure");
3756 }
3757 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3758 CmdArgs.push_back("-mdebug-pass");
3759 CmdArgs.push_back("Arguments");
3760 }
3761
John McCall8517abc2010-02-19 02:45:38 +00003762 // Enable -mconstructor-aliases except on darwin, where we have to
3763 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003764 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003765 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003766
John McCall7ef5cb32011-03-18 02:56:14 +00003767 // Darwin's kernel doesn't support guard variables; just die if we
3768 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003769 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003770 CmdArgs.push_back("-fforbid-guard-variables");
3771
Akira Hatanaka02028482015-11-12 17:21:22 +00003772 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3773 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003774 CmdArgs.push_back("-mms-bitfields");
3775 }
John McCall8517abc2010-02-19 02:45:38 +00003776
Daniel Dunbar306945d2009-09-16 06:17:29 +00003777 // This is a coarse approximation of what llvm-gcc actually does, both
3778 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3779 // complicated ways.
3780 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003781 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3782 options::OPT_fno_asynchronous_unwind_tables,
3783 (getToolChain().IsUnwindTablesDefault() ||
3784 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3785 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003786 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3787 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003788 CmdArgs.push_back("-munwind-tables");
3789
Chandler Carruth05fb5852012-11-21 23:40:23 +00003790 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003791
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003792 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3793 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003794 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003795 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003796
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003797 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003798 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003799
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003800 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003801 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003802 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003803 }
3804
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003805 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003806 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003807 if (!CPU.empty()) {
3808 CmdArgs.push_back("-target-cpu");
3809 CmdArgs.push_back(Args.MakeArgString(CPU));
3810 }
3811
Rafael Espindolaeb265472013-08-21 21:59:03 +00003812 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3813 CmdArgs.push_back("-mfpmath");
3814 CmdArgs.push_back(A->getValue());
3815 }
3816
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003817 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003818 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003819
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003820 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003821 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003822 default:
3823 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003824
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003825 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003826 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003827 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003828 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003829 // Use the effective triple, which takes into account the deployment target.
3830 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003831 break;
3832
Tim Northover573cbee2014-05-24 12:52:07 +00003833 case llvm::Triple::aarch64:
3834 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003835 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003836 break;
3837
Eric Christopher0b26a612010-03-02 02:41:08 +00003838 case llvm::Triple::mips:
3839 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003840 case llvm::Triple::mips64:
3841 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003842 AddMIPSTargetArgs(Args, CmdArgs);
3843 break;
3844
Ulrich Weigand8afad612014-07-28 13:17:52 +00003845 case llvm::Triple::ppc:
3846 case llvm::Triple::ppc64:
3847 case llvm::Triple::ppc64le:
3848 AddPPCTargetArgs(Args, CmdArgs);
3849 break;
3850
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003851 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003852 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003853 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003854 AddSparcTargetArgs(Args, CmdArgs);
3855 break;
3856
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003857 case llvm::Triple::x86:
3858 case llvm::Triple::x86_64:
3859 AddX86TargetArgs(Args, CmdArgs);
3860 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003861
3862 case llvm::Triple::hexagon:
3863 AddHexagonTargetArgs(Args, CmdArgs);
3864 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003865 }
3866
Douglas Katzman3459ce22015-10-08 04:24:12 +00003867 // The 'g' groups options involve a somewhat intricate sequence of decisions
3868 // about what to pass from the driver to the frontend, but by the time they
3869 // reach cc1 they've been factored into two well-defined orthogonal choices:
3870 // * what level of debug info to generate
3871 // * what dwarf version to write
3872 // This avoids having to monkey around further in cc1 other than to disable
3873 // codeview if not running in a Windows environment. Perhaps even that
3874 // decision should be made in the driver as well though.
3875 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3876 CodeGenOptions::NoDebugInfo;
3877 // These two are potentially updated by AddClangCLArgs.
3878 unsigned DwarfVersion = 0;
3879 bool EmitCodeView = false;
3880
Hans Wennborg75958c42013-08-08 00:17:41 +00003881 // Add clang-cl arguments.
3882 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003883 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003884
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003885 // Pass the linker version in use.
3886 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3887 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003888 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003889 }
3890
Eric Christopherb7d97e92013-04-03 01:58:53 +00003891 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003892 CmdArgs.push_back("-momit-leaf-frame-pointer");
3893
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003894 // Explicitly error on some things we know we don't support and can't just
3895 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003896 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003897 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3898 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003899 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003900 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003901 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3902 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003903 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003904 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003905 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003906 }
3907
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003908 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003909 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003910 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003911 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003912 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3913 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003914 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003915 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003916 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003917
Chad Rosierbe10f982011-08-02 17:58:04 +00003918 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003919 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003920 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3921 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003922 }
3923
Rafael Espindola08a692a2010-03-07 04:46:18 +00003924 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003925 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003926 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003927 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
3928 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
3929 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003930 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003931 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003932 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00003933 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003934 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003935 // Some 'g' group option other than one expressly disabling debug info
3936 // must have been the final (winning) one. They're all equivalent.
3937 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00003938 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003939 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003940
Douglas Katzman3459ce22015-10-08 04:24:12 +00003941 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
3942 // (because that would mean that "-g0" was the rightmost 'g' group option).
3943 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
3944 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
3945 // exists of removing the gdwarf options from the g_group.
3946 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
3947 options::OPT_gdwarf_4))
3948 DwarfVersion = DwarfVersionNum(A->getSpelling());
3949
Reid Kleckner124955a2015-08-05 18:51:13 +00003950 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00003951 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
3952 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
3953 // DwarfVersion remains at 0 if no explicit choice was made.
3954 CmdArgs.push_back("-gcodeview");
3955 } else if (DwarfVersion == 0 &&
3956 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
3957 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
3958 }
Reid Kleckner124955a2015-08-05 18:51:13 +00003959
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003960 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3961 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003962
3963 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00003964 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003965 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003966 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003967
Eric Christopher138c32b2013-09-13 22:37:55 +00003968 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003969 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003970 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003971 CmdArgs.push_back("-dwarf-ext-refs");
3972 CmdArgs.push_back("-fmodule-format=obj");
3973 }
3974
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003975 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3976 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003977 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003978 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003979 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003980 CmdArgs.push_back("-backend-option");
3981 CmdArgs.push_back("-split-dwarf=Enable");
3982 }
3983
Douglas Katzman3459ce22015-10-08 04:24:12 +00003984 // After we've dealt with all combinations of things that could
3985 // make DebugInfoKind be other than None or DebugLineTablesOnly,
3986 // figure out if we need to "upgrade" it to standalone debug info.
3987 // We parse these two '-f' options whether or not they will be used,
3988 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
3989 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
3990 options::OPT_fno_standalone_debug,
3991 getToolChain().GetDefaultStandaloneDebug());
3992 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
3993 DebugInfoKind = CodeGenOptions::FullDebugInfo;
3994 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
3995
Eric Christopher138c32b2013-09-13 22:37:55 +00003996 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3997 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3998 CmdArgs.push_back("-backend-option");
3999 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4000 }
Eric Christophereec89c22013-06-18 00:03:50 +00004001
Eric Christopher0d403d22014-02-14 01:27:03 +00004002 // -gdwarf-aranges turns on the emission of the aranges section in the
4003 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004004 // Always enabled on the PS4.
4005 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004006 CmdArgs.push_back("-backend-option");
4007 CmdArgs.push_back("-generate-arange-section");
4008 }
4009
David Blaikief36d9ba2014-01-27 18:52:43 +00004010 if (Args.hasFlag(options::OPT_fdebug_types_section,
4011 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004012 CmdArgs.push_back("-backend-option");
4013 CmdArgs.push_back("-generate-type-units");
4014 }
Eric Christophereec89c22013-06-18 00:03:50 +00004015
Ed Schouten6e576152015-03-26 17:50:28 +00004016 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4017 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4018
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004019 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004020 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004021 CmdArgs.push_back("-ffunction-sections");
4022 }
4023
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004024 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4025 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004026 CmdArgs.push_back("-fdata-sections");
4027 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004028
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004029 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004030 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004031 CmdArgs.push_back("-fno-unique-section-names");
4032
Chris Lattner3c77a352010-06-22 00:03:40 +00004033 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4034
Diego Novilloa0545962015-07-10 18:00:07 +00004035 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004036
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004037 // Pass options for controlling the default header search paths.
4038 if (Args.hasArg(options::OPT_nostdinc)) {
4039 CmdArgs.push_back("-nostdsysteminc");
4040 CmdArgs.push_back("-nobuiltininc");
4041 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004042 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004043 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004044 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4045 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4046 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004047
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004048 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004049 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004050 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004051
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004052 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4053
Ted Kremenekf7639e12012-03-06 20:06:33 +00004054 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004055 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004056 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004057 options::OPT_ccc_arcmt_modify,
4058 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004059 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004060 switch (A->getOption().getID()) {
4061 default:
4062 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004063 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004064 CmdArgs.push_back("-arcmt-check");
4065 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004066 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004067 CmdArgs.push_back("-arcmt-modify");
4068 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004069 case options::OPT_ccc_arcmt_migrate:
4070 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004071 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004072 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004073
4074 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4075 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004076 break;
John McCalld70fb982011-06-15 23:25:17 +00004077 }
4078 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004079 } else {
4080 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4081 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4082 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004083 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004084
Ted Kremenekf7639e12012-03-06 20:06:33 +00004085 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4086 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004087 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4088 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004089 }
4090 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004091 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004092
4093 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004094 options::OPT_objcmt_migrate_subscripting,
4095 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004096 // None specified, means enable them all.
4097 CmdArgs.push_back("-objcmt-migrate-literals");
4098 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004099 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004100 } else {
4101 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4102 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004103 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004104 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004105 } else {
4106 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4107 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4108 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4109 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4110 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4111 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004112 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004113 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4114 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4115 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4116 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4117 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4118 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4119 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004120 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004121 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004122 }
4123
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004124 // Add preprocessing options like -I, -D, etc. if we are using the
4125 // preprocessor.
4126 //
4127 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004128 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004129 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4130 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004131
Rafael Espindolaa7431922011-07-21 23:40:37 +00004132 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4133 // that "The compiler can only warn and ignore the option if not recognized".
4134 // When building with ccache, it will pass -D options to clang even on
4135 // preprocessed inputs and configure concludes that -fPIC is not supported.
4136 Args.ClaimAllArgs(options::OPT_D);
4137
Alp Toker7874bdc2013-11-15 20:40:58 +00004138 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004139 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4140 if (A->getOption().matches(options::OPT_O4)) {
4141 CmdArgs.push_back("-O3");
4142 D.Diag(diag::warn_O4_is_O3);
4143 } else {
4144 A->render(Args, CmdArgs);
4145 }
4146 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004147
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004148 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004149 for (const Arg *A :
4150 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4151 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004152 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004153 }
4154
Rafael Espindola577637a2015-01-03 00:06:04 +00004155 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004156
Richard Smith3be1cb22014-08-07 00:24:21 +00004157 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004158 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004159 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4160 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004161 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004162 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004163
4164 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004165 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004166 //
4167 // If a std is supplied, only add -trigraphs if it follows the
4168 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004169 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004170 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4171 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004172 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004173 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004174 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004175 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004176 else
4177 Std->render(Args, CmdArgs);
4178
Nico Weber00721502014-12-23 22:32:37 +00004179 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004180 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004181 options::OPT_ftrigraphs,
4182 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004183 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004184 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004185 } else {
4186 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004187 //
4188 // FIXME: Clang doesn't correctly handle -std= when the input language
4189 // doesn't match. For the time being just ignore this for C++ inputs;
4190 // eventually we want to do all the standard defaulting here instead of
4191 // splitting it between the driver and clang -cc1.
4192 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004193 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4194 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004195 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004196 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004197
Nico Weber00721502014-12-23 22:32:37 +00004198 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4199 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004200 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004201
Richard Smith282b4492013-09-04 22:50:31 +00004202 // GCC's behavior for -Wwrite-strings is a bit strange:
4203 // * In C, this "warning flag" changes the types of string literals from
4204 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4205 // for the discarded qualifier.
4206 // * In C++, this is just a normal warning flag.
4207 //
4208 // Implementing this warning correctly in C is hard, so we follow GCC's
4209 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4210 // a non-const char* in C, rather than using this crude hack.
4211 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004212 // FIXME: This should behave just like a warning flag, and thus should also
4213 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4214 Arg *WriteStrings =
4215 Args.getLastArg(options::OPT_Wwrite_strings,
4216 options::OPT_Wno_write_strings, options::OPT_w);
4217 if (WriteStrings &&
4218 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004219 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004220 }
4221
Chandler Carruth61fbf622011-04-23 09:27:53 +00004222 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004223 // during C++ compilation, which it is by default. GCC keeps this define even
4224 // in the presence of '-w', match this behavior bug-for-bug.
4225 if (types::isCXX(InputType) &&
4226 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4227 true)) {
4228 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004229 }
4230
Chandler Carruthe0391482010-05-22 02:21:53 +00004231 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4232 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4233 if (Asm->getOption().matches(options::OPT_fasm))
4234 CmdArgs.push_back("-fgnu-keywords");
4235 else
4236 CmdArgs.push_back("-fno-gnu-keywords");
4237 }
4238
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004239 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4240 CmdArgs.push_back("-fno-dwarf-directory-asm");
4241
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004242 if (ShouldDisableAutolink(Args, getToolChain()))
4243 CmdArgs.push_back("-fno-autolink");
4244
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004245 // Add in -fdebug-compilation-dir if necessary.
4246 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004247
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004248 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4249 StringRef Map = A->getValue();
4250 if (Map.find('=') == StringRef::npos)
4251 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4252 else
4253 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4254 A->claim();
4255 }
4256
Richard Smith9a568822011-11-21 19:36:32 +00004257 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4258 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004259 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004260 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004261 }
4262
Richard Smith79c927b2013-11-06 19:31:51 +00004263 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4264 CmdArgs.push_back("-foperator-arrow-depth");
4265 CmdArgs.push_back(A->getValue());
4266 }
4267
Richard Smith9a568822011-11-21 19:36:32 +00004268 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4269 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004270 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004271 }
4272
Richard Smitha3d3bd22013-05-08 02:12:03 +00004273 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4274 CmdArgs.push_back("-fconstexpr-steps");
4275 CmdArgs.push_back(A->getValue());
4276 }
4277
Richard Smithb3a14522013-02-22 01:59:51 +00004278 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4279 CmdArgs.push_back("-fbracket-depth");
4280 CmdArgs.push_back(A->getValue());
4281 }
4282
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004283 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4284 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004285 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004286 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004287 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4288 } else
4289 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004290 }
4291
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004292 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004293 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004294
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004295 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4296 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004297 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004298 }
David Chisnall5778fce2009-08-31 16:41:57 +00004299
Chris Lattnere23003d2010-01-09 21:54:33 +00004300 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4301 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004302 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004303 }
4304
Chris Lattnerb35583d2010-04-07 20:49:23 +00004305 CmdArgs.push_back("-ferror-limit");
4306 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004307 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004308 else
4309 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004310
Chandler Carrutha77a7272010-05-06 04:55:18 +00004311 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4312 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004313 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004314 }
4315
4316 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4317 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004318 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004319 }
4320
Richard Smithf6f003a2011-12-16 19:06:07 +00004321 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4322 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004323 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004324 }
4325
Nick Lewycky24653262014-12-16 21:39:02 +00004326 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4327 CmdArgs.push_back("-fspell-checking-limit");
4328 CmdArgs.push_back(A->getValue());
4329 }
4330
Daniel Dunbar2c978472009-11-04 06:24:47 +00004331 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004332 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004333 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004334 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004335 } else {
4336 // If -fmessage-length=N was not specified, determine whether this is a
4337 // terminal and, if so, implicitly define -fmessage-length appropriately.
4338 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004339 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004340 }
4341
John McCallb4a99d32013-02-19 01:57:35 +00004342 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4343 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4344 options::OPT_fvisibility_ms_compat)) {
4345 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4346 CmdArgs.push_back("-fvisibility");
4347 CmdArgs.push_back(A->getValue());
4348 } else {
4349 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4350 CmdArgs.push_back("-fvisibility");
4351 CmdArgs.push_back("hidden");
4352 CmdArgs.push_back("-ftype-visibility");
4353 CmdArgs.push_back("default");
4354 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004355 }
4356
Douglas Gregor08329632010-06-15 17:05:35 +00004357 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004358
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004359 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4360
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004361 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004362 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4363 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004364 CmdArgs.push_back("-ffreestanding");
4365
Daniel Dunbare357d562009-12-03 18:42:11 +00004366 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004367 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004368 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004369 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004370 // Emulated TLS is enabled by default on Android, and can be enabled manually
4371 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004372 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004373 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4374 EmulatedTLSDefault))
4375 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004376 // AltiVec-like language extensions aren't relevant for assembling.
4377 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004378 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004379 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4380 }
Richard Trieu91844232012-06-26 18:18:47 +00004381 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4382 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004383
Alexey Bataevdb390212015-05-20 04:24:19 +00004384 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004385 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4386 options::OPT_fno_openmp, false))
4387 switch (getOpenMPRuntime(getToolChain(), Args)) {
4388 case OMPRT_OMP:
4389 case OMPRT_IOMP5:
4390 // Clang can generate useful OpenMP code for these two runtime libraries.
4391 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004392
4393 // If no option regarding the use of TLS in OpenMP codegeneration is
4394 // given, decide a default based on the target. Otherwise rely on the
4395 // options and pass the right information to the frontend.
4396 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004397 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004398 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004399 break;
4400 default:
4401 // By default, if Clang doesn't know how to generate useful OpenMP code
4402 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4403 // down to the actual compilation.
4404 // FIXME: It would be better to have a mode which *only* omits IR
4405 // generation based on the OpenMP support so that we get consistent
4406 // semantic analysis, etc.
4407 break;
4408 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004409
Peter Collingbourne32701642013-11-01 18:16:25 +00004410 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004411 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004412
Eric Christopher459d2712013-02-19 06:16:53 +00004413 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004414 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4415 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4416 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4417 Arch == llvm::Triple::ppc64le))
4418 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4419 << "ppc/ppc64/ppc64le";
4420 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004421
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004422 // -fzvector is incompatible with -faltivec.
4423 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4424 if (Args.hasArg(options::OPT_faltivec))
4425 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4426 << "-faltivec";
4427
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004428 if (getToolChain().SupportsProfiling())
4429 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004430
4431 // -flax-vector-conversions is default.
4432 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4433 options::OPT_fno_lax_vector_conversions))
4434 CmdArgs.push_back("-fno-lax-vector-conversions");
4435
John Brawna7b4ec02015-08-10 11:11:28 +00004436 if (Args.getLastArg(options::OPT_fapple_kext) ||
4437 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004438 CmdArgs.push_back("-fapple-kext");
4439
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004440 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004441 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004442 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004443 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4444 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004445
4446 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4447 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004448 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004449 }
4450
Bob Wilson14adb362012-02-03 06:27:22 +00004451 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004452
Chandler Carruth6e501032011-03-27 00:04:55 +00004453 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4454 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004455 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004456 if (A->getOption().matches(options::OPT_fwrapv))
4457 CmdArgs.push_back("-fwrapv");
4458 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4459 options::OPT_fno_strict_overflow)) {
4460 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4461 CmdArgs.push_back("-fwrapv");
4462 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004463
4464 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4465 options::OPT_fno_reroll_loops))
4466 if (A->getOption().matches(options::OPT_freroll_loops))
4467 CmdArgs.push_back("-freroll-loops");
4468
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004469 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004470 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4471 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004472
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004473 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4474
Daniel Dunbar4930e332009-11-17 08:07:36 +00004475 // -stack-protector=0 is default.
4476 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004477 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4478 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4479 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4480 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4481 Args.ClaimAllArgs(options::OPT_fstack_protector);
4482 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004483 options::OPT_fstack_protector_all,
4484 options::OPT_fstack_protector_strong,
4485 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004486 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004487 StackProtectorLevel = std::max<unsigned>(
4488 LangOptions::SSPOn,
4489 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004490 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004491 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004492 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004493 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004494 } else {
4495 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004496 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004497 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004498 if (StackProtectorLevel) {
4499 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004500 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004501 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004502
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004503 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004504 for (const Arg *A : Args.filtered(options::OPT__param)) {
4505 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004506 if (Str.startswith("ssp-buffer-size=")) {
4507 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004508 CmdArgs.push_back("-stack-protector-buffer-size");
4509 // FIXME: Verify the argument is a valid integer.
4510 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004511 }
Sean Silva14facf32015-06-09 01:57:17 +00004512 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004513 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004514 }
4515
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004516 // Translate -mstackrealign
4517 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004518 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004519 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004520
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004521 if (Args.hasArg(options::OPT_mstack_alignment)) {
4522 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4523 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004524 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004525
Hans Wennborg77dc2362015-01-20 19:45:50 +00004526 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4527 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4528
4529 if (!Size.empty())
4530 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4531 else
4532 CmdArgs.push_back("-mstack-probe-size=0");
4533 }
4534
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004535 switch (getToolChain().getArch()) {
4536 case llvm::Triple::aarch64:
4537 case llvm::Triple::aarch64_be:
4538 case llvm::Triple::arm:
4539 case llvm::Triple::armeb:
4540 case llvm::Triple::thumb:
4541 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004542 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004543 break;
4544
4545 default:
4546 break;
4547 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004548
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004549 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4550 options::OPT_mno_restrict_it)) {
4551 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4552 CmdArgs.push_back("-backend-option");
4553 CmdArgs.push_back("-arm-restrict-it");
4554 } else {
4555 CmdArgs.push_back("-backend-option");
4556 CmdArgs.push_back("-arm-no-restrict-it");
4557 }
James Y Knight2db38f32015-08-15 03:45:25 +00004558 } else if (Triple.isOSWindows() &&
4559 (Triple.getArch() == llvm::Triple::arm ||
4560 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004561 // Windows on ARM expects restricted IT blocks
4562 CmdArgs.push_back("-backend-option");
4563 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004564 }
4565
Daniel Dunbard18049a2009-04-07 21:16:11 +00004566 // Forward -f options with positive and negative forms; we translate
4567 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004568 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4569 StringRef fname = A->getValue();
4570 if (!llvm::sys::fs::exists(fname))
4571 D.Diag(diag::err_drv_no_such_file) << fname;
4572 else
4573 A->render(Args, CmdArgs);
4574 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004575
John Brawna7b4ec02015-08-10 11:11:28 +00004576 // -fbuiltin is default unless -mkernel is used
4577 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4578 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004579 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004580
Nuno Lopes13c88c72009-12-16 16:59:22 +00004581 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4582 options::OPT_fno_assume_sane_operator_new))
4583 CmdArgs.push_back("-fno-assume-sane-operator-new");
4584
Daniel Dunbar4930e332009-11-17 08:07:36 +00004585 // -fblocks=0 is default.
4586 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004587 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004588 (Args.hasArg(options::OPT_fgnu_runtime) &&
4589 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4590 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004591 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004592
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004593 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004594 !getToolChain().hasBlocksRuntime())
4595 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004596 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004597
Richard Smith47972af2015-06-16 00:08:24 +00004598 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004599 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004600 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004601 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004602 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004603 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4604 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004605 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004606 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004607 HaveModules = true;
4608 }
4609 }
4610
Richard Smith47972af2015-06-16 00:08:24 +00004611 // -fmodule-maps enables implicit reading of module map files. By default,
4612 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004613 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4614 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004615 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004616 }
4617
Daniel Jasperac42b752013-10-21 06:34:34 +00004618 // -fmodules-decluse checks that modules used are declared so (off by
4619 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004620 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004621 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004622 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004623 }
4624
Daniel Jasper962b38e2014-04-11 11:47:45 +00004625 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4626 // all #included headers are part of modules.
4627 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004628 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004629 CmdArgs.push_back("-fmodules-strict-decluse");
4630 }
4631
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004632 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4633 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4634 options::OPT_fno_implicit_modules)) {
4635 CmdArgs.push_back("-fno-implicit-modules");
4636 }
4637
Daniel Jasperac42b752013-10-21 06:34:34 +00004638 // -fmodule-name specifies the module that is currently being built (or
4639 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004640 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004641
Richard Smith9887d792014-10-17 01:42:53 +00004642 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004643 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004644 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004645
Richard Smithe842a472014-10-22 02:05:46 +00004646 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004647 if (HaveModules)
4648 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4649 else
4650 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004651
4652 // -fmodule-cache-path specifies where our implicitly-built module files
4653 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004654 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004655 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004656 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004657 if (HaveModules) {
4658 if (C.isForDiagnostics()) {
4659 // When generating crash reports, we want to emit the modules along with
4660 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004661 Path = Output.getFilename();
4662 llvm::sys::path::replace_extension(Path, ".cache");
4663 llvm::sys::path::append(Path, "modules");
4664 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004665 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004666 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004667 llvm::sys::path::append(Path, "org.llvm.clang.");
4668 appendUserToPath(Path);
4669 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004670 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004671 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004672 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4673 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004674 }
4675
4676 // When building modules and generating crashdumps, we need to dump a module
4677 // dependency VFS alongside the output.
4678 if (HaveModules && C.isForDiagnostics()) {
4679 SmallString<128> VFSDir(Output.getFilename());
4680 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004681 // Add the cache directory as a temp so the crash diagnostics pick it up.
4682 C.addTempFile(Args.MakeArgString(VFSDir));
4683
Justin Bognera88f0122014-06-20 22:59:50 +00004684 llvm::sys::path::append(VFSDir, "vfs");
4685 CmdArgs.push_back("-module-dependency-dir");
4686 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004687 }
4688
Richard Smith9887d792014-10-17 01:42:53 +00004689 if (HaveModules)
4690 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004691
Douglas Gregor35b04d62013-02-07 19:01:24 +00004692 // Pass through all -fmodules-ignore-macro arguments.
4693 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004694 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4695 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004696
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004697 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4698
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004699 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4700 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4701 D.Diag(diag::err_drv_argument_not_allowed_with)
4702 << A->getAsString(Args) << "-fbuild-session-timestamp";
4703
4704 llvm::sys::fs::file_status Status;
4705 if (llvm::sys::fs::status(A->getValue(), Status))
4706 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004707 CmdArgs.push_back(Args.MakeArgString(
4708 "-fbuild-session-timestamp=" +
4709 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004710 }
4711
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004712 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004713 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4714 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004715 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4716
4717 Args.AddLastArg(CmdArgs,
4718 options::OPT_fmodules_validate_once_per_build_session);
4719 }
4720
Ben Langmuirdcf73862014-03-12 00:06:17 +00004721 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4722
John McCalldfea9982010-04-09 19:12:06 +00004723 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004724 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004725 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004726 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004727
Anders Carlssond470fef2010-11-21 00:09:52 +00004728 // -felide-constructors is the default.
4729 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004730 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004731 CmdArgs.push_back("-fno-elide-constructors");
4732
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004733 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004734
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004735 if (KernelOrKext || (types::isCXX(InputType) &&
4736 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4737 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004738 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004739
Tony Linthicum76329bf2011-12-12 21:14:55 +00004740 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004741 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4742 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004743 CmdArgs.push_back("-fshort-enums");
4744
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004745 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004746 if (Arg *A = Args.getLastArg(
4747 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4748 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4749 if (A->getOption().matches(options::OPT_funsigned_char) ||
4750 A->getOption().matches(options::OPT_fno_signed_char)) {
4751 CmdArgs.push_back("-fno-signed-char");
4752 }
4753 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004754 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004755 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004756
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004757 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004758 if (!Args.hasFlag(
4759 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4760 !IsWindowsCygnus && !IsWindowsGNU &&
4761 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4762 getToolChain().getArch() != llvm::Triple::hexagon &&
4763 getToolChain().getArch() != llvm::Triple::xcore &&
4764 ((getToolChain().getTriple().getVendor() !=
4765 llvm::Triple::MipsTechnologies) ||
4766 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004767 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004768 CmdArgs.push_back("-fno-use-cxa-atexit");
4769
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004770 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004771 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004772 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004773 CmdArgs.push_back("-fms-extensions");
4774
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004775 // -fno-use-line-directives is default.
4776 if (Args.hasFlag(options::OPT_fuse_line_directives,
4777 options::OPT_fno_use_line_directives, false))
4778 CmdArgs.push_back("-fuse-line-directives");
4779
Francois Pichet1b4f1632011-09-17 04:32:15 +00004780 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004781 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004782 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004783 (IsWindowsMSVC &&
4784 Args.hasFlag(options::OPT_fms_extensions,
4785 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004786 CmdArgs.push_back("-fms-compatibility");
4787
David Majnemerc371ff02015-03-22 08:39:22 +00004788 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004789 VersionTuple MSVT = visualstudio::getMSVCVersion(
4790 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4791 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004792 CmdArgs.push_back(
4793 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004794
David Majnemer8db91762015-05-18 04:49:30 +00004795 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4796 if (ImplyVCPPCXXVer) {
4797 if (IsMSVC2015Compatible)
4798 CmdArgs.push_back("-std=c++14");
4799 else
4800 CmdArgs.push_back("-std=c++11");
4801 }
4802
Eric Christopher5ecce122013-02-18 00:38:31 +00004803 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004804 if (Args.hasFlag(options::OPT_fborland_extensions,
4805 options::OPT_fno_borland_extensions, false))
4806 CmdArgs.push_back("-fborland-extensions");
4807
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004808 // -fno-declspec is default, except for PS4.
4809 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4810 getToolChain().getTriple().isPS4()))
4811 CmdArgs.push_back("-fdeclspec");
4812 else if (Args.hasArg(options::OPT_fno_declspec))
4813 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4814
David Majnemerc371ff02015-03-22 08:39:22 +00004815 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4816 // than 19.
4817 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4818 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004819 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004820 CmdArgs.push_back("-fno-threadsafe-statics");
4821
Francois Pichet02744872011-09-01 16:38:08 +00004822 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4823 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004824 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004825 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004826 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004827
Chandler Carruthe03aa552010-04-17 20:17:31 +00004828 // -fgnu-keywords default varies depending on language; only pass if
4829 // specified.
4830 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004831 options::OPT_fno_gnu_keywords))
4832 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004833
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004834 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004835 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004836 CmdArgs.push_back("-fgnu89-inline");
4837
Chad Rosier9c76d242012-03-15 22:31:42 +00004838 if (Args.hasArg(options::OPT_fno_inline))
4839 CmdArgs.push_back("-fno-inline");
4840
Chad Rosier64d6be92012-03-06 21:17:19 +00004841 if (Args.hasArg(options::OPT_fno_inline_functions))
4842 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004843
John McCall5fb5df92012-06-20 06:18:46 +00004844 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004845
John McCall5fb5df92012-06-20 06:18:46 +00004846 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004847 // legacy is the default. Except for deployment taget of 10.5,
4848 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4849 // gets ignored silently.
4850 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004851 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4852 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004853 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004854 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004855 if (getToolChain().UseObjCMixedDispatch())
4856 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4857 else
4858 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4859 }
4860 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004861
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004862 // When ObjectiveC legacy runtime is in effect on MacOSX,
4863 // turn on the option to do Array/Dictionary subscripting
4864 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004865 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004866 getToolChain().getTriple().isMacOSX() &&
4867 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4868 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004869 objcRuntime.isNeXTFamily())
4870 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004871
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004872 // -fencode-extended-block-signature=1 is default.
4873 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4874 CmdArgs.push_back("-fencode-extended-block-signature");
4875 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004876
John McCall24fc0de2011-07-06 00:26:06 +00004877 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4878 // NOTE: This logic is duplicated in ToolChains.cpp.
4879 bool ARC = isObjCAutoRefCount(Args);
4880 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004881 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004882
John McCall24fc0de2011-07-06 00:26:06 +00004883 CmdArgs.push_back("-fobjc-arc");
4884
Chandler Carruth491db322011-11-04 07:34:47 +00004885 // FIXME: It seems like this entire block, and several around it should be
4886 // wrapped in isObjC, but for now we just use it here as this is where it
4887 // was being used previously.
4888 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4889 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4890 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4891 else
4892 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4893 }
4894
John McCall24fc0de2011-07-06 00:26:06 +00004895 // Allow the user to enable full exceptions code emission.
4896 // We define off for Objective-CC, on for Objective-C++.
4897 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4898 options::OPT_fno_objc_arc_exceptions,
4899 /*default*/ types::isCXX(InputType)))
4900 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00004901
John McCall24fc0de2011-07-06 00:26:06 +00004902 }
4903
4904 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4905 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004906 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004907 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004908
John McCall24fc0de2011-07-06 00:26:06 +00004909 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4910 // takes precedence.
4911 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4912 if (!GCArg)
4913 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4914 if (GCArg) {
4915 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004916 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004917 } else if (getToolChain().SupportsObjCGC()) {
4918 GCArg->render(Args, CmdArgs);
4919 } else {
4920 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004921 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004922 }
4923 }
4924
John McCallfbe5ed72015-11-05 19:19:56 +00004925 // Pass down -fobjc-weak or -fno-objc-weak if present.
4926 if (types::isObjC(InputType)) {
4927 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
4928 options::OPT_fno_objc_weak);
4929 if (!WeakArg) {
4930 // nothing to do
4931 } else if (GCArg) {
4932 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4933 D.Diag(diag::err_objc_weak_with_gc);
4934 } else if (!objcRuntime.allowsWeak()) {
4935 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4936 D.Diag(diag::err_objc_weak_unsupported);
4937 } else {
4938 WeakArg->render(Args, CmdArgs);
4939 }
4940 }
4941
Bob Wilsonb111ec92015-03-02 19:01:14 +00004942 if (Args.hasFlag(options::OPT_fapplication_extension,
4943 options::OPT_fno_application_extension, false))
4944 CmdArgs.push_back("-fapplication-extension");
4945
Reid Klecknerc542d372014-06-27 17:02:02 +00004946 // Handle GCC-style exception args.
4947 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004948 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4949 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004950
Tim Northovere931f9f2015-10-30 16:30:41 +00004951 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00004952 CmdArgs.push_back("-fsjlj-exceptions");
4953
4954 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004955 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4956 options::OPT_fno_assume_sane_operator_new))
4957 CmdArgs.push_back("-fno-assume-sane-operator-new");
4958
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004959 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4960 // most platforms.
4961 if (Args.hasFlag(options::OPT_fsized_deallocation,
4962 options::OPT_fno_sized_deallocation, false))
4963 CmdArgs.push_back("-fsized-deallocation");
4964
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004965 // -fconstant-cfstrings is default, and may be subject to argument translation
4966 // on Darwin.
4967 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4968 options::OPT_fno_constant_cfstrings) ||
4969 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4970 options::OPT_mno_constant_cfstrings))
4971 CmdArgs.push_back("-fno-constant-cfstrings");
4972
John Thompsoned4e2952009-11-05 20:14:16 +00004973 // -fshort-wchar default varies depending on platform; only
4974 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004975 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4976 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004977 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004978
Hans Wennborg28c96312013-07-31 23:39:13 +00004979 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004980 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004981 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004982 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004983
Daniel Dunbar096ed292011-10-05 21:04:55 +00004984 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4985 // -fno-pack-struct doesn't apply to -fpack-struct=.
4986 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004987 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004988 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004989 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004990 } else if (Args.hasFlag(options::OPT_fpack_struct,
4991 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004992 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004993 }
4994
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004995 // Handle -fmax-type-align=N and -fno-type-align
4996 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4997 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4998 if (!SkipMaxTypeAlign) {
4999 std::string MaxTypeAlignStr = "-fmax-type-align=";
5000 MaxTypeAlignStr += A->getValue();
5001 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5002 }
5003 } else if (getToolChain().getTriple().isOSDarwin()) {
5004 if (!SkipMaxTypeAlign) {
5005 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5006 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5007 }
5008 }
5009
John Brawna7b4ec02015-08-10 11:11:28 +00005010 // -fcommon is the default unless compiling kernel code or the target says so
5011 bool NoCommonDefault =
5012 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5013 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5014 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005015 CmdArgs.push_back("-fno-common");
5016
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005017 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005018 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005019 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005020 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005021 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005022 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005023
Daniel Dunbar6358d682010-10-15 22:30:42 +00005024 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005025 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005026 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005027 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005028
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005029 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005030 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5031 StringRef value = inputCharset->getValue();
5032 if (value != "UTF-8")
5033 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5034 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005035 }
5036
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005037 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005038 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5039 StringRef value = execCharset->getValue();
5040 if (value != "UTF-8")
5041 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5042 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005043 }
5044
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005045 // -fcaret-diagnostics is default.
5046 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5047 options::OPT_fno_caret_diagnostics, true))
5048 CmdArgs.push_back("-fno-caret-diagnostics");
5049
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005050 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005051 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005052 options::OPT_fno_diagnostics_fixit_info))
5053 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005054
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005055 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005056 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005057 options::OPT_fno_diagnostics_show_option))
5058 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005059
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005060 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005061 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005062 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005063 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005064 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005065
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005066 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005067 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005068 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005069 }
5070
Chandler Carruthb6766f02011-03-27 01:50:55 +00005071 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005072 options::OPT_fdiagnostics_show_note_include_stack,
5073 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005074 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005075 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005076 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5077 else
5078 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5079 }
5080
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005081 // Color diagnostics are the default, unless the terminal doesn't support
5082 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005083 // Support both clang's -f[no-]color-diagnostics and gcc's
5084 // -f[no-]diagnostics-colors[=never|always|auto].
5085 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005086 for (const auto &Arg : Args) {
5087 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005088 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5089 !O.matches(options::OPT_fdiagnostics_color) &&
5090 !O.matches(options::OPT_fno_color_diagnostics) &&
5091 !O.matches(options::OPT_fno_diagnostics_color) &&
5092 !O.matches(options::OPT_fdiagnostics_color_EQ))
5093 continue;
5094
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005095 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005096 if (O.matches(options::OPT_fcolor_diagnostics) ||
5097 O.matches(options::OPT_fdiagnostics_color)) {
5098 ShowColors = Colors_On;
5099 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5100 O.matches(options::OPT_fno_diagnostics_color)) {
5101 ShowColors = Colors_Off;
5102 } else {
5103 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005104 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005105 if (value == "always")
5106 ShowColors = Colors_On;
5107 else if (value == "never")
5108 ShowColors = Colors_Off;
5109 else if (value == "auto")
5110 ShowColors = Colors_Auto;
5111 else
5112 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005113 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005114 }
5115 }
5116 if (ShowColors == Colors_On ||
5117 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005118 CmdArgs.push_back("-fcolor-diagnostics");
5119
Nico Rieck7857d462013-09-11 00:38:02 +00005120 if (Args.hasArg(options::OPT_fansi_escape_codes))
5121 CmdArgs.push_back("-fansi-escape-codes");
5122
Daniel Dunbardb097022009-06-08 21:13:54 +00005123 if (!Args.hasFlag(options::OPT_fshow_source_location,
5124 options::OPT_fno_show_source_location))
5125 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005126
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005127 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005128 true))
5129 CmdArgs.push_back("-fno-show-column");
5130
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005131 if (!Args.hasFlag(options::OPT_fspell_checking,
5132 options::OPT_fno_spell_checking))
5133 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005134
Chad Rosierc8e56e82012-12-05 21:08:21 +00005135 // -fno-asm-blocks is default.
5136 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5137 false))
5138 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005139
Steven Wucb0d13f2015-01-16 23:05:28 +00005140 // -fgnu-inline-asm is default.
5141 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5142 options::OPT_fno_gnu_inline_asm, true))
5143 CmdArgs.push_back("-fno-gnu-inline-asm");
5144
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005145 // Enable vectorization per default according to the optimization level
5146 // selected. For optimization levels that want vectorization we use the alias
5147 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005148 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005149 OptSpecifier VectorizeAliasOption =
5150 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005151 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005152 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005153 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005154
Chad Rosier136d67d2014-04-28 19:30:57 +00005155 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005156 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005157 OptSpecifier SLPVectAliasOption =
5158 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005159 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005160 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005161 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005162
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005163 // -fno-slp-vectorize-aggressive is default.
5164 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005165 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005166 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005167
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005168 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5169 A->render(Args, CmdArgs);
5170
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005171 // -fdollars-in-identifiers default varies depending on platform and
5172 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005173 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005174 options::OPT_fno_dollars_in_identifiers)) {
5175 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005176 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005177 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005178 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005179 }
5180
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005181 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5182 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005183 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005184 options::OPT_fno_unit_at_a_time)) {
5185 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005186 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005187 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005188
Eli Friedman055c9702011-11-02 01:53:16 +00005189 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5190 options::OPT_fno_apple_pragma_pack, false))
5191 CmdArgs.push_back("-fapple-pragma-pack");
5192
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005193 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005194 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5195 // by default.
5196 if (getToolChain().getArch() == llvm::Triple::le32) {
5197 CmdArgs.push_back("-fno-math-builtin");
5198 }
5199
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005200// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5201//
5202// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005203#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005204 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005205 (getToolChain().getArch() == llvm::Triple::arm ||
5206 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005207 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5208 CmdArgs.push_back("-fno-builtin-strcat");
5209 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5210 CmdArgs.push_back("-fno-builtin-strcpy");
5211 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005212#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005213
Justin Bognera88f0122014-06-20 22:59:50 +00005214 // Enable rewrite includes if the user's asked for it or if we're generating
5215 // diagnostics.
5216 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5217 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005218 if (Args.hasFlag(options::OPT_frewrite_includes,
5219 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005220 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005221 CmdArgs.push_back("-frewrite-includes");
5222
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005223 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005224 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005225 options::OPT_traditional_cpp)) {
5226 if (isa<PreprocessJobAction>(JA))
5227 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005228 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005229 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005230 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005231
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005232 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005233 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005234
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005235 // Handle serialized diagnostics.
5236 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5237 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005238 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005239 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005240
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005241 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5242 CmdArgs.push_back("-fretain-comments-from-system-headers");
5243
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005244 // Forward -fcomment-block-commands to -cc1.
5245 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005246 // Forward -fparse-all-comments to -cc1.
5247 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005248
John Brawnad31ace2015-09-23 13:55:40 +00005249 // Turn -fplugin=name.so into -load name.so
5250 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5251 CmdArgs.push_back("-load");
5252 CmdArgs.push_back(A->getValue());
5253 A->claim();
5254 }
5255
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005256 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5257 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005258 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005259 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5260 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005261
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005262 // We translate this by hand to the -cc1 argument, since nightly test uses
5263 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005264 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005265 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005266 } else
Sean Silva14facf32015-06-09 01:57:17 +00005267 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005268 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005269
Bob Wilson23a55f12014-12-21 07:00:00 +00005270 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005271 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5272 // by the frontend.
5273 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5274 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005275
Daniel Dunbard67a3222009-03-30 06:36:42 +00005276 if (Output.getType() == types::TY_Dependencies) {
5277 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005278 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005279 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005280 CmdArgs.push_back(Output.getFilename());
5281 } else {
5282 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005283 }
5284
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005285 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005286
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005287 if (Input.isFilename())
5288 CmdArgs.push_back(Input.getFilename());
5289 else
5290 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005291
Chris Lattnere9d7d782009-11-03 19:50:27 +00005292 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5293
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005294 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005295
5296 // Optionally embed the -cc1 level arguments into the debug info, for build
5297 // analysis.
5298 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005299 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005300 for (const auto &Arg : Args)
5301 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005302
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005303 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005304 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005305 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005306 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005307 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005308 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005309 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005310 }
5311 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005312 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005313 }
5314
Eric Christopherd3804002013-02-22 20:12:52 +00005315 // Add the split debug info name to the command lines here so we
5316 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005317 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005318 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5319 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005320 const char *SplitDwarfOut;
5321 if (SplitDwarf) {
5322 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005323 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005324 CmdArgs.push_back(SplitDwarfOut);
5325 }
5326
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005327 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5328 // Include them with -fcuda-include-gpubinary.
5329 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005330 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005331 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005332 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005333 }
5334
Eric Christopherd3804002013-02-22 20:12:52 +00005335 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005336 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005337 Output.getType() == types::TY_Object &&
5338 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005339 auto CLCommand =
5340 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005341 C.addCommand(llvm::make_unique<FallbackCommand>(
5342 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005343 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005344 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005345 }
5346
Eric Christopherf1545832013-02-22 23:50:16 +00005347 // Handle the debug info splitting at object creation time if we're
5348 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005349 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005350 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005351 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005352
Roman Divacky178e01602011-02-10 16:52:03 +00005353 if (Arg *A = Args.getLastArg(options::OPT_pg))
5354 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005355 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5356 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005357
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005358 // Claim some arguments which clang supports automatically.
5359
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005360 // -fpch-preprocess is used with gcc to add a special marker in the output to
5361 // include the PCH file. Clang's PTH solution is completely transparent, so we
5362 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005363 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005364
Daniel Dunbar17731772009-03-23 19:03:36 +00005365 // Claim some arguments which clang doesn't support, but we don't
5366 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005367 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5368 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005369
Rafael Espindolab0092d72013-09-04 19:37:35 +00005370 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005371 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005372}
5373
John McCall5fb5df92012-06-20 06:18:46 +00005374/// Add options related to the Objective-C runtime/ABI.
5375///
5376/// Returns true if the runtime is non-fragile.
5377ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5378 ArgStringList &cmdArgs,
5379 RewriteKind rewriteKind) const {
5380 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005381 Arg *runtimeArg =
5382 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5383 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005384
5385 // Just forward -fobjc-runtime= to the frontend. This supercedes
5386 // options about fragility.
5387 if (runtimeArg &&
5388 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5389 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005390 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005391 if (runtime.tryParse(value)) {
5392 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005393 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005394 }
5395
5396 runtimeArg->render(args, cmdArgs);
5397 return runtime;
5398 }
5399
5400 // Otherwise, we'll need the ABI "version". Version numbers are
5401 // slightly confusing for historical reasons:
5402 // 1 - Traditional "fragile" ABI
5403 // 2 - Non-fragile ABI, version 1
5404 // 3 - Non-fragile ABI, version 2
5405 unsigned objcABIVersion = 1;
5406 // If -fobjc-abi-version= is present, use that to set the version.
5407 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005408 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005409 if (value == "1")
5410 objcABIVersion = 1;
5411 else if (value == "2")
5412 objcABIVersion = 2;
5413 else if (value == "3")
5414 objcABIVersion = 3;
5415 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005416 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005417 } else {
5418 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005419 bool nonFragileABIIsDefault =
5420 (rewriteKind == RK_NonFragile ||
5421 (rewriteKind == RK_None &&
5422 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005423 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5424 options::OPT_fno_objc_nonfragile_abi,
5425 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005426// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005427#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5428 unsigned nonFragileABIVersion = 1;
5429#else
5430 unsigned nonFragileABIVersion = 2;
5431#endif
5432
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005433 if (Arg *abiArg =
5434 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005435 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005436 if (value == "1")
5437 nonFragileABIVersion = 1;
5438 else if (value == "2")
5439 nonFragileABIVersion = 2;
5440 else
5441 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005442 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005443 }
5444
5445 objcABIVersion = 1 + nonFragileABIVersion;
5446 } else {
5447 objcABIVersion = 1;
5448 }
5449 }
5450
5451 // We don't actually care about the ABI version other than whether
5452 // it's non-fragile.
5453 bool isNonFragile = objcABIVersion != 1;
5454
5455 // If we have no runtime argument, ask the toolchain for its default runtime.
5456 // However, the rewriter only really supports the Mac runtime, so assume that.
5457 ObjCRuntime runtime;
5458 if (!runtimeArg) {
5459 switch (rewriteKind) {
5460 case RK_None:
5461 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5462 break;
5463 case RK_Fragile:
5464 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5465 break;
5466 case RK_NonFragile:
5467 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5468 break;
5469 }
5470
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005471 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005472 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5473 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005474 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005475 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5476
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005477 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005478 } else {
5479 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5480 }
5481
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005482 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005483 } else {
5484 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005485 // Legacy behaviour is to target the gnustep runtime if we are i
5486 // non-fragile mode or the GCC runtime in fragile mode.
5487 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005488 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005489 else
5490 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005491 }
5492
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005493 cmdArgs.push_back(
5494 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005495 return runtime;
5496}
5497
Reid Klecknerc542d372014-06-27 17:02:02 +00005498static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5499 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5500 I += HaveDash;
5501 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005502}
Reid Klecknerc542d372014-06-27 17:02:02 +00005503
Benjamin Kramere003ca22015-10-28 13:54:16 +00005504namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005505struct EHFlags {
5506 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5507 bool Synch;
5508 bool Asynch;
5509 bool NoExceptC;
5510};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005511} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005512
5513/// /EH controls whether to run destructor cleanups when exceptions are
5514/// thrown. There are three modifiers:
5515/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5516/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5517/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5518/// - c: Assume that extern "C" functions are implicitly noexcept. This
5519/// modifier is an optimization, so we ignore it for now.
5520/// The default is /EHs-c-, meaning cleanups are disabled.
5521static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5522 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005523
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005524 std::vector<std::string> EHArgs =
5525 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005526 for (auto EHVal : EHArgs) {
5527 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5528 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005529 case 'a':
5530 EH.Asynch = maybeConsumeDash(EHVal, I);
5531 continue;
5532 case 'c':
5533 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5534 continue;
5535 case 's':
5536 EH.Synch = maybeConsumeDash(EHVal, I);
5537 continue;
5538 default:
5539 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005540 }
5541 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5542 break;
5543 }
5544 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005545
Reid Klecknerc542d372014-06-27 17:02:02 +00005546 return EH;
5547}
5548
Douglas Katzman3459ce22015-10-08 04:24:12 +00005549void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5550 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5551 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005552 unsigned RTOptionID = options::OPT__SLASH_MT;
5553
Hans Wennborgf1a74252013-09-10 20:18:04 +00005554 if (Args.hasArg(options::OPT__SLASH_LDd))
5555 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5556 // but defining _DEBUG is sticky.
5557 RTOptionID = options::OPT__SLASH_MTd;
5558
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005559 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005560 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005561
David Majnemere2afb472015-07-24 06:49:13 +00005562 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005563 switch (RTOptionID) {
5564 case options::OPT__SLASH_MD:
5565 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005566 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005567 CmdArgs.push_back("-D_MT");
5568 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005569 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005570 break;
5571 case options::OPT__SLASH_MDd:
5572 CmdArgs.push_back("-D_DEBUG");
5573 CmdArgs.push_back("-D_MT");
5574 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005575 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005576 break;
5577 case options::OPT__SLASH_MT:
5578 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005579 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005580 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005581 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005582 break;
5583 case options::OPT__SLASH_MTd:
5584 CmdArgs.push_back("-D_DEBUG");
5585 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005586 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005587 break;
5588 default:
5589 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005590 }
5591
David Majnemere2afb472015-07-24 06:49:13 +00005592 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5593 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5594 } else {
5595 CmdArgs.push_back(FlagForCRT.data());
5596
5597 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5598 // users want. The /Za flag to cl.exe turns this off, but it's not
5599 // implemented in clang.
5600 CmdArgs.push_back("--dependent-lib=oldnames");
5601 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005602
Hans Wennborg8858a032014-07-21 23:42:07 +00005603 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5604 // would produce interleaved output, so ignore /showIncludes in such cases.
5605 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5606 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5607 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005608
David Majnemerf6072342014-07-01 22:24:56 +00005609 // This controls whether or not we emit RTTI data for polymorphic types.
5610 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5611 /*default=*/false))
5612 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005613
Reid Kleckner124955a2015-08-05 18:51:13 +00005614 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005615 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005616 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5617 // If we are emitting CV but not DWARF, don't build information that LLVM
5618 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005619 if (*EmitCodeView && !EmitDwarf)
5620 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5621 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005622 CmdArgs.push_back("-gcodeview");
5623
Reid Klecknerc542d372014-06-27 17:02:02 +00005624 const Driver &D = getToolChain().getDriver();
5625 EHFlags EH = parseClangCLEHFlags(D, Args);
5626 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005627 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005628 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005629 CmdArgs.push_back("-fexceptions");
5630 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005631
Hans Wennborge50cec32014-06-13 20:59:54 +00005632 // /EP should expand to -E -P.
5633 if (Args.hasArg(options::OPT__SLASH_EP)) {
5634 CmdArgs.push_back("-E");
5635 CmdArgs.push_back("-P");
5636 }
5637
David Majnemera5b195a2015-02-14 01:35:12 +00005638 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005639 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5640 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005641 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5642 else
5643 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5644
5645 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5646 VolatileOptionID = A->getOption().getID();
5647
5648 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5649 CmdArgs.push_back("-fms-volatile");
5650
David Majnemer86c318f2014-02-11 21:05:00 +00005651 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5652 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5653 if (MostGeneralArg && BestCaseArg)
5654 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5655 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5656
5657 if (MostGeneralArg) {
5658 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5659 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5660 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5661
5662 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5663 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5664 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5665 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5666 << FirstConflict->getAsString(Args)
5667 << SecondConflict->getAsString(Args);
5668
5669 if (SingleArg)
5670 CmdArgs.push_back("-fms-memptr-rep=single");
5671 else if (MultipleArg)
5672 CmdArgs.push_back("-fms-memptr-rep=multiple");
5673 else
5674 CmdArgs.push_back("-fms-memptr-rep=virtual");
5675 }
5676
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005677 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5678 A->render(Args, CmdArgs);
5679
Hans Wennborg81f74482013-09-10 01:07:07 +00005680 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5681 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005682 if (Args.hasArg(options::OPT__SLASH_fallback))
5683 CmdArgs.push_back("msvc-fallback");
5684 else
5685 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005686 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005687}
5688
Douglas Katzman95354292015-06-23 20:42:09 +00005689visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005690 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005691 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005692 return CLFallback.get();
5693}
5694
Daniel Sanders7f933f42015-01-30 17:35:23 +00005695void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5696 ArgStringList &CmdArgs) const {
5697 StringRef CPUName;
5698 StringRef ABIName;
5699 const llvm::Triple &Triple = getToolChain().getTriple();
5700 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5701
5702 CmdArgs.push_back("-target-abi");
5703 CmdArgs.push_back(ABIName.data());
5704}
5705
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005706void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005707 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005708 const ArgList &Args,
5709 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005710 ArgStringList CmdArgs;
5711
5712 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5713 const InputInfo &Input = Inputs[0];
5714
James Y Knight2db38f32015-08-15 03:45:25 +00005715 std::string TripleStr =
5716 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5717 const llvm::Triple Triple(TripleStr);
5718
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005719 // Don't warn about "clang -w -c foo.s"
5720 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005721 // and "clang -emit-llvm -c foo.s"
5722 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005723
Rafael Espindola577637a2015-01-03 00:06:04 +00005724 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005725
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005726 // Invoke ourselves in -cc1as mode.
5727 //
5728 // FIXME: Implement custom jobs for internal actions.
5729 CmdArgs.push_back("-cc1as");
5730
5731 // Add the "effective" target triple.
5732 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005733 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5734
5735 // Set the output mode, we currently only expect to be used as a real
5736 // assembler.
5737 CmdArgs.push_back("-filetype");
5738 CmdArgs.push_back("obj");
5739
Eric Christopher45f2e712012-12-18 00:31:10 +00005740 // Set the main file name, so that debug info works even with
5741 // -save-temps or preprocessed assembly.
5742 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005743 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005744
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005745 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005746 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005747 if (!CPU.empty()) {
5748 CmdArgs.push_back("-target-cpu");
5749 CmdArgs.push_back(Args.MakeArgString(CPU));
5750 }
5751
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005752 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005753 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005754
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005755 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005756 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005757
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005758 // Pass along any -I options so we get proper .include search paths.
5759 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5760
Eric Christopherfc3ee562012-01-10 00:38:01 +00005761 // Determine the original source input.
5762 const Action *SourceAction = &JA;
5763 while (SourceAction->getKind() != Action::InputClass) {
5764 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5765 SourceAction = SourceAction->getInputs()[0];
5766 }
5767
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005768 // Forward -g and handle debug info related flags, assuming we are dealing
5769 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005770 if (SourceAction->getType() == types::TY_Asm ||
5771 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005772 bool WantDebug = false;
5773 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005774 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005775 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5776 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005777 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005778 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005779 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005780 if (DwarfVersion == 0)
5781 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005782 RenderDebugEnablingArgs(Args, CmdArgs,
5783 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5784 : CodeGenOptions::NoDebugInfo),
5785 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005786
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005787 // Add the -fdebug-compilation-dir flag if needed.
5788 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005789
5790 // Set the AT_producer to the clang version when using the integrated
5791 // assembler on assembly source files.
5792 CmdArgs.push_back("-dwarf-debug-producer");
5793 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005794
5795 // And pass along -I options
5796 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005797 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005798
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005799 // Handle -fPIC et al -- the relocation-model affects the assembler
5800 // for some targets.
5801 llvm::Reloc::Model RelocationModel;
5802 unsigned PICLevel;
5803 bool IsPIE;
5804 std::tie(RelocationModel, PICLevel, IsPIE) =
5805 ParsePICArgs(getToolChain(), Triple, Args);
5806
5807 const char *RMName = RelocationModelName(RelocationModel);
5808 if (RMName) {
5809 CmdArgs.push_back("-mrelocation-model");
5810 CmdArgs.push_back(RMName);
5811 }
5812
Kevin Enderby292dc082011-12-22 19:31:58 +00005813 // Optionally embed the -cc1as level arguments into the debug info, for build
5814 // analysis.
5815 if (getToolChain().UseDwarfDebugFlags()) {
5816 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005817 for (const auto &Arg : Args)
5818 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005819
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005820 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005821 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5822 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005823 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005824 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005825 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005826 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005827 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005828 }
5829 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005830 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005831 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005832
5833 // FIXME: Add -static support, once we have it.
5834
Daniel Sanders7f933f42015-01-30 17:35:23 +00005835 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005836 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005837 default:
5838 break;
5839
5840 case llvm::Triple::mips:
5841 case llvm::Triple::mipsel:
5842 case llvm::Triple::mips64:
5843 case llvm::Triple::mips64el:
5844 AddMIPSTargetArgs(Args, CmdArgs);
5845 break;
5846 }
5847
David Blaikie372d9502014-01-17 03:17:40 +00005848 // Consume all the warning flags. Usually this would be handled more
5849 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5850 // doesn't handle that so rather than warning about unused flags that are
5851 // actually used, we'll lie by omission instead.
5852 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005853 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5854 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005855
David Blaikie9260ed62013-07-25 21:19:01 +00005856 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5857 getToolChain().getDriver());
5858
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005859 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005860
5861 assert(Output.isFilename() && "Unexpected lipo output.");
5862 CmdArgs.push_back("-o");
5863 CmdArgs.push_back(Output.getFilename());
5864
Daniel Dunbarb440f562010-08-02 02:38:21 +00005865 assert(Input.isFilename() && "Invalid input.");
5866 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005867
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005868 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005869 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005870
5871 // Handle the debug info splitting at object creation time if we're
5872 // creating an object.
5873 // TODO: Currently only works on linux with newer objcopy.
5874 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005875 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005876 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005877 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005878}
5879
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005880void GnuTool::anchor() {}
5881
Daniel Dunbara3246a02009-03-18 08:07:30 +00005882void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005883 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005884 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005885 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005886 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005887 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005888
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005889 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005890 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005891 // Don't forward any -g arguments to assembly steps.
5892 if (isa<AssembleJobAction>(JA) &&
5893 A->getOption().matches(options::OPT_g_Group))
5894 continue;
5895
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005896 // Don't forward any -W arguments to assembly and link steps.
5897 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5898 A->getOption().matches(options::OPT_W_Group))
5899 continue;
5900
Daniel Dunbar2da02722009-03-19 07:55:12 +00005901 // It is unfortunate that we have to claim here, as this means
5902 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005903 // platforms using a generic gcc, even if we are just using gcc
5904 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005905 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005906 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005907 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005908 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005909
Daniel Dunbar4e295052010-01-25 22:35:08 +00005910 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005911
5912 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005913 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005914 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005915 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005916 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005917 }
5918
Daniel Dunbar5716d872009-05-02 21:41:52 +00005919 // Try to force gcc to match the tool chain we want, if we recognize
5920 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005921 //
5922 // FIXME: The triple class should directly provide the information we want
5923 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005924 switch (getToolChain().getArch()) {
5925 default:
5926 break;
5927 case llvm::Triple::x86:
5928 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005929 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005930 break;
5931 case llvm::Triple::x86_64:
5932 case llvm::Triple::ppc64:
5933 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005934 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005935 break;
5936 case llvm::Triple::sparcel:
5937 CmdArgs.push_back("-EL");
5938 break;
5939 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005940
Daniel Dunbarb440f562010-08-02 02:38:21 +00005941 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005942 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005943 CmdArgs.push_back(Output.getFilename());
5944 } else {
5945 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005946 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005947 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005948
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005949 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005950
5951 // Only pass -x if gcc will understand it; otherwise hope gcc
5952 // understands the suffix correctly. The main use case this would go
5953 // wrong in is for linker inputs if they happened to have an odd
5954 // suffix; really the only way to get this to happen is a command
5955 // like '-x foobar a.c' which will treat a.c like a linker input.
5956 //
5957 // FIXME: For the linker case specifically, can we safely convert
5958 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005959 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005960 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005961 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5962 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005963 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005964 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005965 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005966 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005967 else if (II.getType() == types::TY_ModuleFile)
5968 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005969 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005970
Daniel Dunbara3246a02009-03-18 08:07:30 +00005971 if (types::canTypeBeUserSpecified(II.getType())) {
5972 CmdArgs.push_back("-x");
5973 CmdArgs.push_back(types::getTypeName(II.getType()));
5974 }
5975
Daniel Dunbarb440f562010-08-02 02:38:21 +00005976 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005977 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005978 else {
5979 const Arg &A = II.getInputArg();
5980
5981 // Reverse translate some rewritten options.
5982 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5983 CmdArgs.push_back("-lstdc++");
5984 continue;
5985 }
5986
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005987 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005988 A.render(Args, CmdArgs);
5989 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005990 }
5991
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005992 const std::string customGCCName = D.getCCCGenericGCCName();
5993 const char *GCCName;
5994 if (!customGCCName.empty())
5995 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005996 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005997 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005998 } else
5999 GCCName = "gcc";
6000
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006001 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006002 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006003}
6004
Douglas Katzman95354292015-06-23 20:42:09 +00006005void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6006 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006007 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006008}
6009
Douglas Katzman95354292015-06-23 20:42:09 +00006010void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6011 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006012 const Driver &D = getToolChain().getDriver();
6013
Eric Christophercc7ff502015-01-29 00:56:17 +00006014 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006015 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006016 case types::TY_LLVM_IR:
6017 case types::TY_LTO_IR:
6018 case types::TY_LLVM_BC:
6019 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006020 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006021 break;
6022 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006023 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006024 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006025 case types::TY_Nothing:
6026 CmdArgs.push_back("-fsyntax-only");
6027 break;
6028 default:
6029 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006030 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006031}
6032
Douglas Katzman95354292015-06-23 20:42:09 +00006033void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6034 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006035 // The types are (hopefully) good enough.
6036}
6037
Tony Linthicum76329bf2011-12-12 21:14:55 +00006038// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006039void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
6040 ArgStringList &CmdArgs) const {}
6041void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6042 const InputInfo &Output,
6043 const InputInfoList &Inputs,
6044 const ArgList &Args,
6045 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006046 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006047
6048 const Driver &D = getToolChain().getDriver();
6049 ArgStringList CmdArgs;
6050
6051 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00006052 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006053 CmdArgs.push_back(Args.MakeArgString(MarchString));
6054
6055 RenderExtraToolArgs(JA, CmdArgs);
6056
6057 if (Output.isFilename()) {
6058 CmdArgs.push_back("-o");
6059 CmdArgs.push_back(Output.getFilename());
6060 } else {
6061 assert(Output.isNothing() && "Unexpected output");
6062 CmdArgs.push_back("-fsyntax-only");
6063 }
6064
Douglas Katzman54366072015-07-27 16:53:08 +00006065 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006066 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006067
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006068 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006069
Tony Linthicum76329bf2011-12-12 21:14:55 +00006070 // Only pass -x if gcc will understand it; otherwise hope gcc
6071 // understands the suffix correctly. The main use case this would go
6072 // wrong in is for linker inputs if they happened to have an odd
6073 // suffix; really the only way to get this to happen is a command
6074 // like '-x foobar a.c' which will treat a.c like a linker input.
6075 //
6076 // FIXME: For the linker case specifically, can we safely convert
6077 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006078 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006079 // Don't try to pass LLVM or AST inputs to a generic gcc.
6080 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
6081 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
6082 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006083 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006084 else if (II.getType() == types::TY_AST)
6085 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006086 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006087 else if (II.getType() == types::TY_ModuleFile)
6088 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006089 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006090
6091 if (II.isFilename())
6092 CmdArgs.push_back(II.getFilename());
6093 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006094 // Don't render as input, we need gcc to do the translations.
6095 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006096 II.getInputArg().render(Args, CmdArgs);
6097 }
6098
6099 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006100 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006101 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006102}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006103
Douglas Katzman95354292015-06-23 20:42:09 +00006104void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6105 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006106 // The types are (hopefully) good enough.
6107}
6108
Douglas Katzman54366072015-07-27 16:53:08 +00006109static void
6110constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
6111 const toolchains::HexagonToolChain &ToolChain,
6112 const InputInfo &Output, const InputInfoList &Inputs,
6113 const ArgList &Args, ArgStringList &CmdArgs,
6114 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006115
Matthew Curtise689b052012-12-06 15:46:07 +00006116 const Driver &D = ToolChain.getDriver();
6117
Matthew Curtise689b052012-12-06 15:46:07 +00006118 //----------------------------------------------------------------------------
6119 //
6120 //----------------------------------------------------------------------------
6121 bool hasStaticArg = Args.hasArg(options::OPT_static);
6122 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006123 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00006124 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
6125 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6126 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006127 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006128 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006129
Matthew Curtise689b052012-12-06 15:46:07 +00006130 //----------------------------------------------------------------------------
6131 // Silence warnings for various options
6132 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00006133
Matthew Curtise689b052012-12-06 15:46:07 +00006134 Args.ClaimAllArgs(options::OPT_g_Group);
6135 Args.ClaimAllArgs(options::OPT_emit_llvm);
6136 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6137 // handled somewhere else.
6138 Args.ClaimAllArgs(options::OPT_static_libgcc);
6139
6140 //----------------------------------------------------------------------------
6141 //
6142 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006143 for (const auto &Opt : ToolChain.ExtraOpts)
6144 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006145
Douglas Katzman54366072015-07-27 16:53:08 +00006146 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00006147 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00006148
Matthew Curtise689b052012-12-06 15:46:07 +00006149 if (buildingLib) {
6150 CmdArgs.push_back("-shared");
6151 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
6152 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00006153 }
6154
Matthew Curtise689b052012-12-06 15:46:07 +00006155 if (hasStaticArg)
6156 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006157
Matthew Curtise8f80a12012-12-06 17:49:03 +00006158 if (buildPIE && !buildingLib)
6159 CmdArgs.push_back("-pie");
6160
Douglas Katzman54366072015-07-27 16:53:08 +00006161 if (const char *v =
6162 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006163 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00006164 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006165 }
6166
Matthew Curtise689b052012-12-06 15:46:07 +00006167 //----------------------------------------------------------------------------
6168 //
6169 //----------------------------------------------------------------------------
6170 CmdArgs.push_back("-o");
6171 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006172
Matthew Curtise689b052012-12-06 15:46:07 +00006173 const std::string MarchSuffix = "/" + MarchString;
6174 const std::string G0Suffix = "/G0";
6175 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00006176 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006177 const std::string StartFilesDir =
6178 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006179
6180 //----------------------------------------------------------------------------
6181 // moslib
6182 //----------------------------------------------------------------------------
6183 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006184 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006185
Sean Silva14facf32015-06-09 01:57:17 +00006186 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6187 A->claim();
6188 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00006189 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006190 }
Matthew Curtise689b052012-12-06 15:46:07 +00006191 if (oslibs.empty()) {
6192 oslibs.push_back("standalone");
6193 hasStandalone = true;
6194 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006195
Matthew Curtise689b052012-12-06 15:46:07 +00006196 //----------------------------------------------------------------------------
6197 // Start Files
6198 //----------------------------------------------------------------------------
6199 if (incStdLib && incStartFiles) {
6200
6201 if (!buildingLib) {
6202 if (hasStandalone) {
6203 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006204 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00006205 }
6206 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
6207 }
6208 std::string initObj = useShared ? "/initS.o" : "/init.o";
6209 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
6210 }
6211
6212 //----------------------------------------------------------------------------
6213 // Library Search Paths
6214 //----------------------------------------------------------------------------
Douglas Katzman6059ef92015-11-17 17:41:23 +00006215 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006216
6217 //----------------------------------------------------------------------------
6218 //
6219 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006220 Args.AddAllArgs(CmdArgs,
6221 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6222 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006223
6224 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6225
6226 //----------------------------------------------------------------------------
6227 // Libraries
6228 //----------------------------------------------------------------------------
6229 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006230 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006231 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6232 CmdArgs.push_back("-lm");
6233 }
6234
6235 CmdArgs.push_back("--start-group");
6236
6237 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006238 for (const std::string &Lib : oslibs)
6239 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006240 CmdArgs.push_back("-lc");
6241 }
6242 CmdArgs.push_back("-lgcc");
6243
6244 CmdArgs.push_back("--end-group");
6245 }
6246
6247 //----------------------------------------------------------------------------
6248 // End files
6249 //----------------------------------------------------------------------------
6250 if (incStdLib && incStartFiles) {
6251 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6252 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6253 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006254}
6255
Douglas Katzman95354292015-06-23 20:42:09 +00006256void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6257 const InputInfo &Output,
6258 const InputInfoList &Inputs,
6259 const ArgList &Args,
6260 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006261
Douglas Katzman54366072015-07-27 16:53:08 +00006262 const toolchains::HexagonToolChain &ToolChain =
6263 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006264
6265 ArgStringList CmdArgs;
6266 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6267 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006268
6269 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006270 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006271 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006272}
6273// Hexagon tools end.
6274
Tom Stellard8fa33092015-07-18 01:49:05 +00006275void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6276 const InputInfo &Output,
6277 const InputInfoList &Inputs,
6278 const ArgList &Args,
6279 const char *LinkingOutput) const {
6280
6281 std::string Linker = getToolChain().GetProgramPath(getShortName());
6282 ArgStringList CmdArgs;
6283 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006284 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006285 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006286 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006287 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6288 CmdArgs.push_back("-o");
6289 CmdArgs.push_back(Output.getFilename());
6290 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6291 CmdArgs, Inputs));
6292}
6293// AMDGPU tools end.
6294
Renato Golin7c542b42015-07-27 23:44:45 +00006295const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006296 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006297 if (!Arch.empty())
6298 MArch = Arch;
6299 else
Bernard Ogden31561762013-12-12 13:27:11 +00006300 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006301 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006302
6303 // Handle -march=native.
6304 if (MArch == "native") {
6305 std::string CPU = llvm::sys::getHostCPUName();
6306 if (CPU != "generic") {
6307 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006308 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006309 // If there is no valid architecture suffix for this CPU we don't know how
6310 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006311 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006312 MArch = "";
6313 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006314 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006315 }
6316 }
6317
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006318 return MArch;
6319}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006320
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006321/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006322StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006323 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006324 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6325 // here means an -march=native that we can't handle, so instead return no CPU.
6326 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006327 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006328
John Brawna95c1a82015-05-08 12:52:18 +00006329 // We need to return an empty string here on invalid MArch values as the
6330 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006331 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006332}
6333
6334/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006335std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006336 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006337 // FIXME: Warn on inconsistent use of -mcpu and -march.
6338 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006339 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006340 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006341 // Handle -mcpu=native.
6342 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006343 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006344 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006345 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006346 }
6347
Renato Goline17c5802015-07-27 23:44:42 +00006348 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006349}
6350
6351/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006352/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006353// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006354StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6355 const llvm::Triple &Triple) {
6356 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006357 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006358 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006359 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006360 if (ArchKind == llvm::ARM::AK_INVALID)
6361 // In case of generic Arch, i.e. "arm",
6362 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006363 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006364 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006365 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6366 // armv7k triple if it's actually been specified via "-arch armv7k".
6367 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006368 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006369 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006370 }
Renato Golin3c007252015-05-28 15:05:53 +00006371 if (ArchKind == llvm::ARM::AK_INVALID)
6372 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006373 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006374}
6375
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006376void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006377 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006378 if (Args.hasArg(options::OPT_r))
6379 return;
6380
John Brawn94fd9632015-05-21 12:19:49 +00006381 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6382 // to generate BE-8 executables.
6383 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6384 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006385}
6386
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006387mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006388 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6389 // was first introduced in Release 3. However, other compilers have
6390 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006391 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6392 .Case("mips1", NanLegacy)
6393 .Case("mips2", NanLegacy)
6394 .Case("mips3", NanLegacy)
6395 .Case("mips4", NanLegacy)
6396 .Case("mips5", NanLegacy)
6397 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006398 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006399 .Case("mips32r3", NanLegacy | Nan2008)
6400 .Case("mips32r5", NanLegacy | Nan2008)
6401 .Case("mips32r6", Nan2008)
6402 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006403 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006404 .Case("mips64r3", NanLegacy | Nan2008)
6405 .Case("mips64r5", NanLegacy | Nan2008)
6406 .Case("mips64r6", Nan2008)
6407 .Default(NanLegacy);
6408}
6409
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006410bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6411 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6412 return A && (A->getValue() == StringRef(Value));
6413}
6414
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006415bool mips::isUCLibc(const ArgList &Args) {
6416 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006417 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006418}
6419
Daniel Sanders2bf13662014-07-10 14:40:57 +00006420bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006421 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6422 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006423 .Case("2008", true)
6424 .Case("legacy", false)
6425 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006426
6427 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006428 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006429 .Cases("mips32r6", "mips64r6", true)
6430 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006431
6432 return false;
6433}
6434
Daniel Sanders379d44b2014-07-16 11:52:23 +00006435bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006436 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006437 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006438 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006439 return false;
6440
6441 if (ABIName != "32")
6442 return false;
6443
Toma Tabacu94ea6862015-06-16 13:54:13 +00006444 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6445 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006446 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006447 return false;
6448
Daniel Sanders379d44b2014-07-16 11:52:23 +00006449 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006450 .Cases("mips2", "mips3", "mips4", "mips5", true)
6451 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6452 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6453 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006454}
6455
Toma Tabacu94ea6862015-06-16 13:54:13 +00006456bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6457 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006458 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006459 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6460
6461 // FPXX shouldn't be used if -msingle-float is present.
6462 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6463 options::OPT_mdouble_float))
6464 if (A->getOption().matches(options::OPT_msingle_float))
6465 UseFPXX = false;
6466
6467 return UseFPXX;
6468}
6469
Tim Northover157d9112014-01-16 08:48:16 +00006470llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006471 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6472 // archs which Darwin doesn't use.
6473
6474 // The matching this routine does is fairly pointless, since it is neither the
6475 // complete architecture list, nor a reasonable subset. The problem is that
6476 // historically the driver driver accepts this and also ties its -march=
6477 // handling to the architecture name, so we need to be careful before removing
6478 // support for it.
6479
6480 // This code must be kept in sync with Clang's Darwin specific argument
6481 // translation.
6482
6483 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006484 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6485 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6486 .Case("ppc64", llvm::Triple::ppc64)
6487 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6488 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6489 llvm::Triple::x86)
6490 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6491 // This is derived from the driver driver.
6492 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6493 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6494 .Cases("armv7s", "xscale", llvm::Triple::arm)
6495 .Case("arm64", llvm::Triple::aarch64)
6496 .Case("r600", llvm::Triple::r600)
6497 .Case("amdgcn", llvm::Triple::amdgcn)
6498 .Case("nvptx", llvm::Triple::nvptx)
6499 .Case("nvptx64", llvm::Triple::nvptx64)
6500 .Case("amdil", llvm::Triple::amdil)
6501 .Case("spir", llvm::Triple::spir)
6502 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006503}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006504
Tim Northover157d9112014-01-16 08:48:16 +00006505void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006506 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006507 T.setArch(Arch);
6508
6509 if (Str == "x86_64h")
6510 T.setArchName(Str);
6511 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6512 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006513 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006514 }
6515}
6516
Bob Wilsondecc03e2012-11-23 06:14:39 +00006517const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006518 const InputInfo &Input) {
6519 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006520}
6521
Bob Wilsondecc03e2012-11-23 06:14:39 +00006522const char *Clang::getBaseInputStem(const ArgList &Args,
6523 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006524 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006525
Chris Lattner906bb902011-01-16 08:14:11 +00006526 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006527 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006528
6529 return Str;
6530}
6531
Bob Wilsondecc03e2012-11-23 06:14:39 +00006532const char *Clang::getDependencyFileName(const ArgList &Args,
6533 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006534 // FIXME: Think about this more.
6535 std::string Res;
6536
6537 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006538 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006539 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006540 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006541 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006542 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006543 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006544}
6545
Douglas Katzman95354292015-06-23 20:42:09 +00006546void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6547 const InputInfo &Output,
6548 const InputInfoList &Inputs,
6549 const ArgList &Args,
6550 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006551 const ToolChain &ToolChain = getToolChain();
6552 const Driver &D = ToolChain.getDriver();
6553 ArgStringList CmdArgs;
6554
6555 // Silence warning for "clang -g foo.o -o foo"
6556 Args.ClaimAllArgs(options::OPT_g_Group);
6557 // and "clang -emit-llvm foo.o -o foo"
6558 Args.ClaimAllArgs(options::OPT_emit_llvm);
6559 // and for "clang -w foo.o -o foo". Other warning options are already
6560 // handled somewhere else.
6561 Args.ClaimAllArgs(options::OPT_w);
6562
6563 if (!D.SysRoot.empty())
6564 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6565
6566 // CloudABI only supports static linkage.
6567 CmdArgs.push_back("-Bstatic");
6568 CmdArgs.push_back("--eh-frame-hdr");
6569 CmdArgs.push_back("--gc-sections");
6570
6571 if (Output.isFilename()) {
6572 CmdArgs.push_back("-o");
6573 CmdArgs.push_back(Output.getFilename());
6574 } else {
6575 assert(Output.isNothing() && "Invalid output.");
6576 }
6577
Douglas Katzman78b37b02015-11-17 20:28:07 +00006578 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006579 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6580 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6581 }
6582
6583 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006584 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006585 Args.AddAllArgs(CmdArgs,
6586 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6587 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006588
Teresa Johnson945bc502015-10-15 20:35:53 +00006589 if (D.isUsingLTO())
6590 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006591
6592 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6593
Douglas Katzman78b37b02015-11-17 20:28:07 +00006594 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006595 if (D.CCCIsCXX())
6596 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6597 CmdArgs.push_back("-lc");
6598 CmdArgs.push_back("-lcompiler_rt");
6599 }
6600
Douglas Katzman78b37b02015-11-17 20:28:07 +00006601 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006602 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6603
6604 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006605 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006606}
6607
Douglas Katzman95354292015-06-23 20:42:09 +00006608void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6609 const InputInfo &Output,
6610 const InputInfoList &Inputs,
6611 const ArgList &Args,
6612 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006613 ArgStringList CmdArgs;
6614
6615 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6616 const InputInfo &Input = Inputs[0];
6617
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006618 // Determine the original source input.
6619 const Action *SourceAction = &JA;
6620 while (SourceAction->getKind() != Action::InputClass) {
6621 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6622 SourceAction = SourceAction->getInputs()[0];
6623 }
6624
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006625 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006626 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006627 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6628 // FIXME: at run-time detect assembler capabilities or rely on version
6629 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006630 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006631 const llvm::Triple &T(getToolChain().getTriple());
6632 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006633 CmdArgs.push_back("-Q");
6634 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006635
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006636 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006637 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006638 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006639 if (Args.hasArg(options::OPT_gstabs))
6640 CmdArgs.push_back("--gstabs");
6641 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006642 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006643 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006644
Daniel Dunbarbe220842009-03-20 16:06:39 +00006645 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006646 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006647
Daniel Dunbar6d484762010-07-22 01:47:22 +00006648 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006649 if (getToolChain().getArch() == llvm::Triple::x86 ||
6650 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006651 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6652 CmdArgs.push_back("-force_cpusubtype_ALL");
6653
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006654 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006655 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006656 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006657 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006658 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006659 CmdArgs.push_back("-static");
6660
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006661 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006662
6663 assert(Output.isFilename() && "Unexpected lipo output.");
6664 CmdArgs.push_back("-o");
6665 CmdArgs.push_back(Output.getFilename());
6666
Daniel Dunbarb440f562010-08-02 02:38:21 +00006667 assert(Input.isFilename() && "Invalid input.");
6668 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006669
6670 // asm_final spec is empty.
6671
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006672 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006673 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006674}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006675
Tim Northover157d9112014-01-16 08:48:16 +00006676void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006677
Tim Northover157d9112014-01-16 08:48:16 +00006678void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6679 ArgStringList &CmdArgs) const {
6680 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006681
Daniel Dunbarc1964212009-03-26 16:23:12 +00006682 // Derived from darwin_arch spec.
6683 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006684 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006685
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006686 // FIXME: Is this needed anymore?
6687 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006688 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006689}
6690
Douglas Katzman95354292015-06-23 20:42:09 +00006691bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006692 // We only need to generate a temp path for LTO if we aren't compiling object
6693 // files. When compiling source files, we run 'dsymutil' after linking. We
6694 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006695 for (const auto &Input : Inputs)
6696 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006697 return true;
6698
6699 return false;
6700}
6701
Douglas Katzman95354292015-06-23 20:42:09 +00006702void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6703 ArgStringList &CmdArgs,
6704 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006705 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006706 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006707
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006708 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006709 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6710 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006711 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6712 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006713 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006714 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006715 }
6716
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006717 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006718 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006719 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6720 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006721
Bob Wilson3d27dad2013-08-02 22:25:34 +00006722 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6723 CmdArgs.push_back("-export_dynamic");
6724
Bob Wilsonb111ec92015-03-02 19:01:14 +00006725 // If we are using App Extension restrictions, pass a flag to the linker
6726 // telling it that the compiled code has been audited.
6727 if (Args.hasFlag(options::OPT_fapplication_extension,
6728 options::OPT_fno_application_extension, false))
6729 CmdArgs.push_back("-application_extension");
6730
Teresa Johnson945bc502015-10-15 20:35:53 +00006731 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006732 // If we are using LTO, then automatically create a temporary file path for
6733 // the linker to use, so that it's lifetime will extend past a possible
6734 // dsymutil step.
6735 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6736 const char *TmpPath = C.getArgs().MakeArgString(
6737 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6738 C.addTempFile(TmpPath);
6739 CmdArgs.push_back("-object_path_lto");
6740 CmdArgs.push_back(TmpPath);
6741 }
6742
6743 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6744 // it in clang installed libraries. If not found, the option is not used
6745 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6746 if (Version[0] >= 133) {
6747 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6748 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6749 SmallString<128> LibLTOPath(P);
6750 llvm::sys::path::append(LibLTOPath, "lib");
6751 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6752 if (llvm::sys::fs::exists(LibLTOPath)) {
6753 CmdArgs.push_back("-lto_library");
6754 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6755 } else {
6756 D.Diag(diag::warn_drv_lto_libpath);
6757 }
6758 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006759 }
6760
Daniel Dunbarc1964212009-03-26 16:23:12 +00006761 // Derived from the "link" spec.
6762 Args.AddAllArgs(CmdArgs, options::OPT_static);
6763 if (!Args.hasArg(options::OPT_static))
6764 CmdArgs.push_back("-dynamic");
6765 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6766 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6767 // here. How do we wish to handle such things?
6768 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006769
Daniel Dunbarc1964212009-03-26 16:23:12 +00006770 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006771 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006772 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006773 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006774
6775 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6776 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6777 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6778
6779 Arg *A;
6780 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6781 (A = Args.getLastArg(options::OPT_current__version)) ||
6782 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006783 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6784 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006785
6786 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6787 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6788 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6789 } else {
6790 CmdArgs.push_back("-dylib");
6791
6792 Arg *A;
6793 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6794 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6795 (A = Args.getLastArg(options::OPT_client__name)) ||
6796 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6797 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6798 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006799 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6800 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006801
Daniel Dunbarc1964212009-03-26 16:23:12 +00006802 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6803 "-dylib_compatibility_version");
6804 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6805 "-dylib_current_version");
6806
Tim Northover157d9112014-01-16 08:48:16 +00006807 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006808
6809 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6810 "-dylib_install_name");
6811 }
6812
6813 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6814 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6815 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006816 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006817 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006818 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6819 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6820 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6821 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6822 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6823 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006824 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006825 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6826 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6827 Args.AddAllArgs(CmdArgs, options::OPT_init);
6828
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006829 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006830 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006831
Daniel Dunbarc1964212009-03-26 16:23:12 +00006832 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6833 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6834 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6835 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6836 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006837
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006838 if (const Arg *A =
6839 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6840 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006841 if (A->getOption().matches(options::OPT_fpie) ||
6842 A->getOption().matches(options::OPT_fPIE))
6843 CmdArgs.push_back("-pie");
6844 else
6845 CmdArgs.push_back("-no_pie");
6846 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006847
6848 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6849 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6850 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6851 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6852 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6853 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6854 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6855 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6856 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6857 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6858 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6859 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6860 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6861 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6862 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6863 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006864
Daniel Dunbar84384642011-05-02 21:03:47 +00006865 // Give --sysroot= preference, over the Apple specific behavior to also use
6866 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006867 StringRef sysroot = C.getSysRoot();
6868 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006869 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006870 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006871 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6872 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006873 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006874 }
6875
Daniel Dunbarc1964212009-03-26 16:23:12 +00006876 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6877 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6878 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6879 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6880 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006881 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006882 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6883 Args.AddAllArgs(CmdArgs, options::OPT_y);
6884 Args.AddLastArg(CmdArgs, options::OPT_w);
6885 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6886 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6887 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6888 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6889 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6890 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6891 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6892 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6893 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6894 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6895 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6896 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6897}
6898
Douglas Katzman95354292015-06-23 20:42:09 +00006899void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6900 const InputInfo &Output,
6901 const InputInfoList &Inputs,
6902 const ArgList &Args,
6903 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006904 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006905
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006906 // If the number of arguments surpasses the system limits, we will encode the
6907 // input files in a separate file, shortening the command line. To this end,
6908 // build a list of input file names that can be passed via a file with the
6909 // -filelist linker option.
6910 llvm::opt::ArgStringList InputFileList;
6911
Daniel Dunbarc1964212009-03-26 16:23:12 +00006912 // The logic here is derived from gcc's behavior; most of which
6913 // comes from specs (starting with link_command). Consult gcc for
6914 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006915 ArgStringList CmdArgs;
6916
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006917 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6918 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6919 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006920 for (const auto &Arg : Args)
6921 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006922 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006923 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006924 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006925 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006926 return;
6927 }
6928
Daniel Dunbarc1964212009-03-26 16:23:12 +00006929 // I'm not sure why this particular decomposition exists in gcc, but
6930 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006931 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006932
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006933 // It seems that the 'e' option is completely ignored for dynamic executables
6934 // (the default), and with static executables, the last one wins, as expected.
6935 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6936 options::OPT_Z_Flag, options::OPT_u_Group,
6937 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006938
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006939 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6940 // members of static archive libraries which implement Objective-C classes or
6941 // categories.
6942 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6943 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006944
Daniel Dunbarc1964212009-03-26 16:23:12 +00006945 CmdArgs.push_back("-o");
6946 CmdArgs.push_back(Output.getFilename());
6947
Douglas Katzman78b37b02015-11-17 20:28:07 +00006948 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00006949 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006950
Peter Collingbournec4122c12015-06-15 21:08:13 +00006951 // SafeStack requires its own runtime libraries
6952 // These libraries should be linked first, to make sure the
6953 // __safestack_init constructor executes before everything else
6954 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6955 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6956 "libclang_rt.safestack_osx.a",
6957 /*AlwaysLink=*/true);
6958 }
6959
Daniel Dunbarc1964212009-03-26 16:23:12 +00006960 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006961
Douglas Gregor9295df02012-05-15 21:00:27 +00006962 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006963 // Build the input file for -filelist (list of linker input files) in case we
6964 // need it later
6965 for (const auto &II : Inputs) {
6966 if (!II.isFilename()) {
6967 // This is a linker input argument.
6968 // We cannot mix input arguments and file names in a -filelist input, thus
6969 // we prematurely stop our list (remaining files shall be passed as
6970 // arguments).
6971 if (InputFileList.size() > 0)
6972 break;
6973
6974 continue;
6975 }
6976
6977 InputFileList.push_back(II.getFilename());
6978 }
6979
Douglas Katzman78b37b02015-11-17 20:28:07 +00006980 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006981 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6982
Douglas Katzman78b37b02015-11-17 20:28:07 +00006983 if (isObjCRuntimeLinked(Args) &&
6984 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006985 // We use arclite library for both ARC and subscripting support.
6986 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6987
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006988 CmdArgs.push_back("-framework");
6989 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006990 // Link libobj.
6991 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006992 }
John McCall31168b02011-06-15 23:02:42 +00006993
Daniel Dunbarc1964212009-03-26 16:23:12 +00006994 if (LinkingOutput) {
6995 CmdArgs.push_back("-arch_multiple");
6996 CmdArgs.push_back("-final_output");
6997 CmdArgs.push_back(LinkingOutput);
6998 }
6999
Daniel Dunbarc1964212009-03-26 16:23:12 +00007000 if (Args.hasArg(options::OPT_fnested_functions))
7001 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007002
Justin Bognerc7701242015-05-12 05:44:36 +00007003 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7004
Douglas Katzman78b37b02015-11-17 20:28:07 +00007005 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007006 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007007 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007008
Daniel Dunbarc1964212009-03-26 16:23:12 +00007009 // link_ssp spec is empty.
7010
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007011 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007012 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007013 }
7014
Douglas Katzman78b37b02015-11-17 20:28:07 +00007015 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007016 // endfile_spec is empty.
7017 }
7018
7019 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7020 Args.AddAllArgs(CmdArgs, options::OPT_F);
7021
Steven Wu3ffb61b2015-02-06 18:08:29 +00007022 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007023 for (const Arg *A : Args.filtered(options::OPT_iframework))
7024 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007025
Douglas Katzman78b37b02015-11-17 20:28:07 +00007026 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007027 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7028 if (A->getValue() == StringRef("Accelerate")) {
7029 CmdArgs.push_back("-framework");
7030 CmdArgs.push_back("Accelerate");
7031 }
7032 }
7033 }
7034
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007035 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007036 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007037 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007038 Cmd->setInputFileList(std::move(InputFileList));
7039 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007040}
7041
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007042void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007043 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007044 const InputInfoList &Inputs,
7045 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007046 const char *LinkingOutput) const {
7047 ArgStringList CmdArgs;
7048
7049 CmdArgs.push_back("-create");
7050 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007051
7052 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007053 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007054
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007055 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007056 assert(II.isFilename() && "Unexpected lipo input.");
7057 CmdArgs.push_back(II.getFilename());
7058 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007059
7060 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007061 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007062}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007063
Daniel Dunbar88299622010-06-04 18:28:36 +00007064void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007065 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007066 const InputInfoList &Inputs,
7067 const ArgList &Args,
7068 const char *LinkingOutput) const {
7069 ArgStringList CmdArgs;
7070
Daniel Dunbareb86b042011-05-09 17:23:16 +00007071 CmdArgs.push_back("-o");
7072 CmdArgs.push_back(Output.getFilename());
7073
Daniel Dunbar88299622010-06-04 18:28:36 +00007074 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7075 const InputInfo &Input = Inputs[0];
7076 assert(Input.isFilename() && "Unexpected dsymutil input.");
7077 CmdArgs.push_back(Input.getFilename());
7078
Daniel Dunbar88299622010-06-04 18:28:36 +00007079 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007080 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007081 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007082}
7083
Eric Christopher551ef452011-08-23 17:56:55 +00007084void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007085 const InputInfo &Output,
7086 const InputInfoList &Inputs,
7087 const ArgList &Args,
7088 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007089 ArgStringList CmdArgs;
7090 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007091 CmdArgs.push_back("--debug-info");
7092 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007093 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007094
7095 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7096 const InputInfo &Input = Inputs[0];
7097 assert(Input.isFilename() && "Unexpected verify input");
7098
7099 // Grabbing the output of the earlier dsymutil run.
7100 CmdArgs.push_back(Input.getFilename());
7101
7102 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007103 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007104 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007105}
7106
Douglas Katzman95354292015-06-23 20:42:09 +00007107void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007108 const InputInfo &Output,
7109 const InputInfoList &Inputs,
7110 const ArgList &Args,
7111 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007112 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007113 ArgStringList CmdArgs;
7114
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007115 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007116
7117 CmdArgs.push_back("-o");
7118 CmdArgs.push_back(Output.getFilename());
7119
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007120 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007121 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007122
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007123 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007124 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007125}
7126
Douglas Katzman95354292015-06-23 20:42:09 +00007127void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7128 const InputInfo &Output,
7129 const InputInfoList &Inputs,
7130 const ArgList &Args,
7131 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007132 ArgStringList CmdArgs;
7133
David Chisnall272a0712012-02-29 15:06:12 +00007134 // Demangle C++ names in errors
7135 CmdArgs.push_back("-C");
7136
Douglas Katzman78b37b02015-11-17 20:28:07 +00007137 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007138 CmdArgs.push_back("-e");
7139 CmdArgs.push_back("_start");
7140 }
7141
7142 if (Args.hasArg(options::OPT_static)) {
7143 CmdArgs.push_back("-Bstatic");
7144 CmdArgs.push_back("-dn");
7145 } else {
7146 CmdArgs.push_back("-Bdynamic");
7147 if (Args.hasArg(options::OPT_shared)) {
7148 CmdArgs.push_back("-shared");
7149 } else {
7150 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007151 CmdArgs.push_back(
7152 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007153 }
7154 }
7155
7156 if (Output.isFilename()) {
7157 CmdArgs.push_back("-o");
7158 CmdArgs.push_back(Output.getFilename());
7159 } else {
7160 assert(Output.isNothing() && "Invalid output.");
7161 }
7162
Douglas Katzman78b37b02015-11-17 20:28:07 +00007163 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007164 if (!Args.hasArg(options::OPT_shared))
7165 CmdArgs.push_back(
7166 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7167
7168 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7169 CmdArgs.push_back(
7170 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7171 CmdArgs.push_back(
7172 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007173 }
7174
Douglas Katzman6059ef92015-11-17 17:41:23 +00007175 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007176
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007177 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7178 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007179
7180 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7181
Douglas Katzman78b37b02015-11-17 20:28:07 +00007182 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007183 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007184 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007185 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007186 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007187 if (!Args.hasArg(options::OPT_shared)) {
7188 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007189 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007190 }
David Chisnallf571cde2012-02-15 13:39:01 +00007191 }
7192
Douglas Katzman78b37b02015-11-17 20:28:07 +00007193 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007194 CmdArgs.push_back(
7195 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007196 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007197 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007198
Xinliang David Li69306c02015-10-22 06:15:31 +00007199 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007200
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007201 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007202 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007203}
7204
Douglas Katzman95354292015-06-23 20:42:09 +00007205void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7206 const InputInfo &Output,
7207 const InputInfoList &Inputs,
7208 const ArgList &Args,
7209 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007210 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007211 ArgStringList CmdArgs;
7212
Rafael Espindolacc126272014-02-28 01:55:21 +00007213 switch (getToolChain().getArch()) {
7214 case llvm::Triple::x86:
7215 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7216 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007217 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007218 break;
7219
7220 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007221 CmdArgs.push_back("-mppc");
7222 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007223 break;
7224
7225 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007226 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007227 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007228 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7229 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7230 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007231 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007232 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007233
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007234 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007235 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007236 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7237 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7238 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007239 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007240 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007241
7242 case llvm::Triple::mips64:
7243 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007244 StringRef CPUName;
7245 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007246 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007247
7248 CmdArgs.push_back("-mabi");
7249 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7250
7251 if (getToolChain().getArch() == llvm::Triple::mips64)
7252 CmdArgs.push_back("-EB");
7253 else
7254 CmdArgs.push_back("-EL");
7255
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007256 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007257 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007258 }
7259
Rafael Espindolacc126272014-02-28 01:55:21 +00007260 default:
7261 break;
7262 }
7263
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007264 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007265
7266 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007267 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007268
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007269 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007270 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007271
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007272 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007273 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007274}
7275
Douglas Katzman95354292015-06-23 20:42:09 +00007276void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7277 const InputInfo &Output,
7278 const InputInfoList &Inputs,
7279 const ArgList &Args,
7280 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007281 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007282 ArgStringList CmdArgs;
7283
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007284 // Silence warning for "clang -g foo.o -o foo"
7285 Args.ClaimAllArgs(options::OPT_g_Group);
7286 // and "clang -emit-llvm foo.o -o foo"
7287 Args.ClaimAllArgs(options::OPT_emit_llvm);
7288 // and for "clang -w foo.o -o foo". Other warning options are already
7289 // handled somewhere else.
7290 Args.ClaimAllArgs(options::OPT_w);
7291
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007292 if (getToolChain().getArch() == llvm::Triple::mips64)
7293 CmdArgs.push_back("-EB");
7294 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7295 CmdArgs.push_back("-EL");
7296
Douglas Katzman78b37b02015-11-17 20:28:07 +00007297 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007298 CmdArgs.push_back("-e");
7299 CmdArgs.push_back("__start");
7300 }
7301
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007302 if (Args.hasArg(options::OPT_static)) {
7303 CmdArgs.push_back("-Bstatic");
7304 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007305 if (Args.hasArg(options::OPT_rdynamic))
7306 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007307 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007308 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007309 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007310 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007311 } else {
7312 CmdArgs.push_back("-dynamic-linker");
7313 CmdArgs.push_back("/usr/libexec/ld.so");
7314 }
7315 }
7316
Rafael Espindola044f7832013-06-05 04:28:55 +00007317 if (Args.hasArg(options::OPT_nopie))
7318 CmdArgs.push_back("-nopie");
7319
Daniel Dunbarb440f562010-08-02 02:38:21 +00007320 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007321 CmdArgs.push_back("-o");
7322 CmdArgs.push_back(Output.getFilename());
7323 } else {
7324 assert(Output.isNothing() && "Invalid output.");
7325 }
7326
Douglas Katzman78b37b02015-11-17 20:28:07 +00007327 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007328 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007329 if (Args.hasArg(options::OPT_pg))
7330 CmdArgs.push_back(
7331 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007332 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007333 CmdArgs.push_back(
7334 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7335 CmdArgs.push_back(
7336 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007337 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007338 CmdArgs.push_back(
7339 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007340 }
7341 }
7342
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007343 std::string Triple = getToolChain().getTripleString();
7344 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007345 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007346 CmdArgs.push_back(
7347 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007348
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007349 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7350 options::OPT_e, options::OPT_s, options::OPT_t,
7351 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007352
Daniel Dunbar54423b22010-09-17 00:24:54 +00007353 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007354
Douglas Katzman78b37b02015-11-17 20:28:07 +00007355 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007356 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007357 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007358 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007359 CmdArgs.push_back("-lm_p");
7360 else
7361 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007362 }
7363
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007364 // FIXME: For some reason GCC passes -lgcc before adding
7365 // the default system libraries. Just mimic this for now.
7366 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007367
Eric Christopher17674ec2012-09-13 06:32:34 +00007368 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007369 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7370 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007371 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007372 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007373 }
7374
Chandler Carruth45661652011-12-17 22:32:42 +00007375 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007376 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007377 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007378 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007379 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007380 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007381
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007382 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007383 }
7384
Douglas Katzman78b37b02015-11-17 20:28:07 +00007385 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007386 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007387 CmdArgs.push_back(
7388 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007389 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007390 CmdArgs.push_back(
7391 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007392 }
7393
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007394 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007395 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007396}
Ed Schoutene33194b2009-04-02 19:13:12 +00007397
Douglas Katzman95354292015-06-23 20:42:09 +00007398void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7399 const InputInfo &Output,
7400 const InputInfoList &Inputs,
7401 const ArgList &Args,
7402 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007403 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007404 ArgStringList CmdArgs;
7405
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007406 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007407
7408 CmdArgs.push_back("-o");
7409 CmdArgs.push_back(Output.getFilename());
7410
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007411 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007412 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007413
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007414 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007415 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007416}
7417
Douglas Katzman95354292015-06-23 20:42:09 +00007418void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7419 const InputInfo &Output,
7420 const InputInfoList &Inputs,
7421 const ArgList &Args,
7422 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007423 const Driver &D = getToolChain().getDriver();
7424 ArgStringList CmdArgs;
7425
Douglas Katzman78b37b02015-11-17 20:28:07 +00007426 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007427 CmdArgs.push_back("-e");
7428 CmdArgs.push_back("__start");
7429 }
7430
7431 if (Args.hasArg(options::OPT_static)) {
7432 CmdArgs.push_back("-Bstatic");
7433 } else {
7434 if (Args.hasArg(options::OPT_rdynamic))
7435 CmdArgs.push_back("-export-dynamic");
7436 CmdArgs.push_back("--eh-frame-hdr");
7437 CmdArgs.push_back("-Bdynamic");
7438 if (Args.hasArg(options::OPT_shared)) {
7439 CmdArgs.push_back("-shared");
7440 } else {
7441 CmdArgs.push_back("-dynamic-linker");
7442 CmdArgs.push_back("/usr/libexec/ld.so");
7443 }
7444 }
7445
7446 if (Output.isFilename()) {
7447 CmdArgs.push_back("-o");
7448 CmdArgs.push_back(Output.getFilename());
7449 } else {
7450 assert(Output.isNothing() && "Invalid output.");
7451 }
7452
Douglas Katzman78b37b02015-11-17 20:28:07 +00007453 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007454 if (!Args.hasArg(options::OPT_shared)) {
7455 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007456 CmdArgs.push_back(
7457 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007458 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007459 CmdArgs.push_back(
7460 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7461 CmdArgs.push_back(
7462 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007463 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007464 CmdArgs.push_back(
7465 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007466 }
7467 }
7468
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007469 Args.AddAllArgs(CmdArgs,
7470 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007471
7472 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7473
Douglas Katzman78b37b02015-11-17 20:28:07 +00007474 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007475 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007476 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7477 if (Args.hasArg(options::OPT_pg))
7478 CmdArgs.push_back("-lm_p");
7479 else
7480 CmdArgs.push_back("-lm");
7481 }
7482
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007483 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007484 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007485 CmdArgs.push_back("-lpthread_p");
7486 else
7487 CmdArgs.push_back("-lpthread");
7488 }
7489
Eli Friedman9fa28852012-08-08 23:57:20 +00007490 if (!Args.hasArg(options::OPT_shared)) {
7491 if (Args.hasArg(options::OPT_pg))
7492 CmdArgs.push_back("-lc_p");
7493 else
7494 CmdArgs.push_back("-lc");
7495 }
7496
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007497 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007498 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007499 case llvm::Triple::arm:
7500 MyArch = "arm";
7501 break;
7502 case llvm::Triple::x86:
7503 MyArch = "i386";
7504 break;
7505 case llvm::Triple::x86_64:
7506 MyArch = "amd64";
7507 break;
7508 default:
7509 llvm_unreachable("Unsupported architecture");
7510 }
7511 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007512 }
7513
Douglas Katzman78b37b02015-11-17 20:28:07 +00007514 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007515 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007516 CmdArgs.push_back(
7517 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007518 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007519 CmdArgs.push_back(
7520 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007521 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007522
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007523 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007524 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007525}
7526
Douglas Katzman95354292015-06-23 20:42:09 +00007527void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7528 const InputInfo &Output,
7529 const InputInfoList &Inputs,
7530 const ArgList &Args,
7531 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007532 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007533 ArgStringList CmdArgs;
7534
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007535 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7536 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007537 switch (getToolChain().getArch()) {
7538 default:
7539 break;
7540 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007541 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007542 break;
7543 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007544 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007545 break;
7546 case llvm::Triple::mips:
7547 case llvm::Triple::mipsel:
7548 case llvm::Triple::mips64:
7549 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007550 StringRef CPUName;
7551 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007552 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007553
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007554 CmdArgs.push_back("-march");
7555 CmdArgs.push_back(CPUName.data());
7556
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007557 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007558 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007559
7560 if (getToolChain().getArch() == llvm::Triple::mips ||
7561 getToolChain().getArch() == llvm::Triple::mips64)
7562 CmdArgs.push_back("-EB");
7563 else
7564 CmdArgs.push_back("-EL");
7565
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007566 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007567 break;
7568 }
7569 case llvm::Triple::arm:
7570 case llvm::Triple::armeb:
7571 case llvm::Triple::thumb:
7572 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007573 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007574
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007575 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007576 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007577 else
Renato Golinf4421f72014-02-19 10:44:07 +00007578 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007580 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007581 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007582 case llvm::Triple::GNUEABI:
7583 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007584 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007585 break;
7586
7587 default:
7588 CmdArgs.push_back("-matpcs");
7589 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007590 break;
7591 }
7592 case llvm::Triple::sparc:
7593 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007594 case llvm::Triple::sparcv9: {
7595 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7596 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007597 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007598 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007599 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007600 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007601
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007602 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007603
7604 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007605 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007606
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007607 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007608 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007609
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007610 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007611 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007612}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007613
Douglas Katzman95354292015-06-23 20:42:09 +00007614void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7615 const InputInfo &Output,
7616 const InputInfoList &Inputs,
7617 const ArgList &Args,
7618 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007619 const toolchains::FreeBSD &ToolChain =
7620 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007621 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007622 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007623 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007624 !Args.hasArg(options::OPT_shared) &&
7625 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007626 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007627
7628 // Silence warning for "clang -g foo.o -o foo"
7629 Args.ClaimAllArgs(options::OPT_g_Group);
7630 // and "clang -emit-llvm foo.o -o foo"
7631 Args.ClaimAllArgs(options::OPT_emit_llvm);
7632 // and for "clang -w foo.o -o foo". Other warning options are already
7633 // handled somewhere else.
7634 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007635
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007636 if (!D.SysRoot.empty())
7637 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7638
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007639 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007640 CmdArgs.push_back("-pie");
7641
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007642 if (Args.hasArg(options::OPT_static)) {
7643 CmdArgs.push_back("-Bstatic");
7644 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007645 if (Args.hasArg(options::OPT_rdynamic))
7646 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007647 CmdArgs.push_back("--eh-frame-hdr");
7648 if (Args.hasArg(options::OPT_shared)) {
7649 CmdArgs.push_back("-Bshareable");
7650 } else {
7651 CmdArgs.push_back("-dynamic-linker");
7652 CmdArgs.push_back("/libexec/ld-elf.so.1");
7653 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007654 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007655 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7656 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7657 CmdArgs.push_back("--hash-style=both");
7658 }
7659 }
7660 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007661 }
7662
7663 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7664 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007665 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007666 CmdArgs.push_back("-m");
7667 CmdArgs.push_back("elf_i386_fbsd");
7668 }
7669
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007670 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007671 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007672 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007673 }
7674
Daniel Dunbarb440f562010-08-02 02:38:21 +00007675 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007676 CmdArgs.push_back("-o");
7677 CmdArgs.push_back(Output.getFilename());
7678 } else {
7679 assert(Output.isNothing() && "Invalid output.");
7680 }
7681
Douglas Katzman78b37b02015-11-17 20:28:07 +00007682 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007683 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007684 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007685 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007686 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007687 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007688 crt1 = "Scrt1.o";
7689 else
7690 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007691 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007692 if (crt1)
7693 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7694
7695 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7696
Craig Topper92fc2df2014-05-17 16:56:41 +00007697 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007698 if (Args.hasArg(options::OPT_static))
7699 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007700 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007701 crtbegin = "crtbeginS.o";
7702 else
7703 crtbegin = "crtbegin.o";
7704
7705 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007706 }
7707
7708 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007709 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007710 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7711 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007712 Args.AddAllArgs(CmdArgs, options::OPT_s);
7713 Args.AddAllArgs(CmdArgs, options::OPT_t);
7714 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7715 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007716
Teresa Johnson945bc502015-10-15 20:35:53 +00007717 if (D.isUsingLTO())
7718 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007719
Alexey Samsonov52550342014-09-15 19:58:40 +00007720 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007721 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007722
Douglas Katzman78b37b02015-11-17 20:28:07 +00007723 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007724 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007725 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007726 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007727 if (Args.hasArg(options::OPT_pg))
7728 CmdArgs.push_back("-lm_p");
7729 else
7730 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007731 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007732 if (NeedsSanitizerDeps)
7733 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007734 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7735 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007736 if (Args.hasArg(options::OPT_pg))
7737 CmdArgs.push_back("-lgcc_p");
7738 else
7739 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007740 if (Args.hasArg(options::OPT_static)) {
7741 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007742 } else if (Args.hasArg(options::OPT_pg)) {
7743 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007744 } else {
7745 CmdArgs.push_back("--as-needed");
7746 CmdArgs.push_back("-lgcc_s");
7747 CmdArgs.push_back("--no-as-needed");
7748 }
7749
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007750 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007751 if (Args.hasArg(options::OPT_pg))
7752 CmdArgs.push_back("-lpthread_p");
7753 else
7754 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007755 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007756
Roman Divacky66f22762011-02-10 16:59:40 +00007757 if (Args.hasArg(options::OPT_pg)) {
7758 if (Args.hasArg(options::OPT_shared))
7759 CmdArgs.push_back("-lc");
7760 else
7761 CmdArgs.push_back("-lc_p");
7762 CmdArgs.push_back("-lgcc_p");
7763 } else {
7764 CmdArgs.push_back("-lc");
7765 CmdArgs.push_back("-lgcc");
7766 }
7767
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007768 if (Args.hasArg(options::OPT_static)) {
7769 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007770 } else if (Args.hasArg(options::OPT_pg)) {
7771 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007772 } else {
7773 CmdArgs.push_back("--as-needed");
7774 CmdArgs.push_back("-lgcc_s");
7775 CmdArgs.push_back("--no-as-needed");
7776 }
7777 }
7778
Douglas Katzman78b37b02015-11-17 20:28:07 +00007779 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007780 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007781 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007782 else
7783 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007784 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007785 }
7786
Xinliang David Li69306c02015-10-22 06:15:31 +00007787 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007788
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007789 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007790 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007791}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007792
Douglas Katzman95354292015-06-23 20:42:09 +00007793void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007794 const InputInfo &Output,
7795 const InputInfoList &Inputs,
7796 const ArgList &Args,
7797 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007798 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007799 ArgStringList CmdArgs;
7800
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007801 // GNU as needs different flags for creating the correct output format
7802 // on architectures with different ABIs or optional feature sets.
7803 switch (getToolChain().getArch()) {
7804 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007805 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007806 break;
7807 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007808 case llvm::Triple::armeb:
7809 case llvm::Triple::thumb:
7810 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007811 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007812 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7813 std::string Arch =
7814 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007815 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007816 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007817 }
7818
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007819 case llvm::Triple::mips:
7820 case llvm::Triple::mipsel:
7821 case llvm::Triple::mips64:
7822 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007823 StringRef CPUName;
7824 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007825 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007826
7827 CmdArgs.push_back("-march");
7828 CmdArgs.push_back(CPUName.data());
7829
7830 CmdArgs.push_back("-mabi");
7831 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7832
7833 if (getToolChain().getArch() == llvm::Triple::mips ||
7834 getToolChain().getArch() == llvm::Triple::mips64)
7835 CmdArgs.push_back("-EB");
7836 else
7837 CmdArgs.push_back("-EL");
7838
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007839 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007840 break;
7841 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007842
7843 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007844 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007845 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007846 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7847 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007848 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007849 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007850 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007851
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007852 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007853 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007854 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7855 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007856 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007857 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007858 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007859
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007860 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007861 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007862 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007863
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007864 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007865
7866 CmdArgs.push_back("-o");
7867 CmdArgs.push_back(Output.getFilename());
7868
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007869 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007870 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007871
David Chisnallddbd68f2011-09-27 22:03:18 +00007872 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007873 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007874}
7875
Douglas Katzman95354292015-06-23 20:42:09 +00007876void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7877 const InputInfo &Output,
7878 const InputInfoList &Inputs,
7879 const ArgList &Args,
7880 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007881 const Driver &D = getToolChain().getDriver();
7882 ArgStringList CmdArgs;
7883
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007884 if (!D.SysRoot.empty())
7885 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7886
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007887 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007888 if (Args.hasArg(options::OPT_static)) {
7889 CmdArgs.push_back("-Bstatic");
7890 } else {
7891 if (Args.hasArg(options::OPT_rdynamic))
7892 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007893 if (Args.hasArg(options::OPT_shared)) {
7894 CmdArgs.push_back("-Bshareable");
7895 } else {
7896 CmdArgs.push_back("-dynamic-linker");
7897 CmdArgs.push_back("/libexec/ld.elf_so");
7898 }
7899 }
7900
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007901 // Many NetBSD architectures support more than one ABI.
7902 // Determine the correct emulation for ld.
7903 switch (getToolChain().getArch()) {
7904 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007905 CmdArgs.push_back("-m");
7906 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007907 break;
7908 case llvm::Triple::arm:
7909 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007910 CmdArgs.push_back("-m");
7911 switch (getToolChain().getTriple().getEnvironment()) {
7912 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007913 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007914 CmdArgs.push_back("armelf_nbsd_eabi");
7915 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007916 case llvm::Triple::EABIHF:
7917 case llvm::Triple::GNUEABIHF:
7918 CmdArgs.push_back("armelf_nbsd_eabihf");
7919 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007920 default:
7921 CmdArgs.push_back("armelf_nbsd");
7922 break;
7923 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007924 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007925 case llvm::Triple::armeb:
7926 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007927 arm::appendEBLinkFlags(
7928 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007929 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007930 CmdArgs.push_back("-m");
7931 switch (getToolChain().getTriple().getEnvironment()) {
7932 case llvm::Triple::EABI:
7933 case llvm::Triple::GNUEABI:
7934 CmdArgs.push_back("armelfb_nbsd_eabi");
7935 break;
7936 case llvm::Triple::EABIHF:
7937 case llvm::Triple::GNUEABIHF:
7938 CmdArgs.push_back("armelfb_nbsd_eabihf");
7939 break;
7940 default:
7941 CmdArgs.push_back("armelfb_nbsd");
7942 break;
7943 }
7944 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007945 case llvm::Triple::mips64:
7946 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007947 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007948 CmdArgs.push_back("-m");
7949 if (getToolChain().getArch() == llvm::Triple::mips64)
7950 CmdArgs.push_back("elf32btsmip");
7951 else
7952 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007953 } else if (mips::hasMipsAbiArg(Args, "64")) {
7954 CmdArgs.push_back("-m");
7955 if (getToolChain().getArch() == llvm::Triple::mips64)
7956 CmdArgs.push_back("elf64btsmip");
7957 else
7958 CmdArgs.push_back("elf64ltsmip");
7959 }
7960 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007961 case llvm::Triple::ppc:
7962 CmdArgs.push_back("-m");
7963 CmdArgs.push_back("elf32ppc_nbsd");
7964 break;
7965
7966 case llvm::Triple::ppc64:
7967 case llvm::Triple::ppc64le:
7968 CmdArgs.push_back("-m");
7969 CmdArgs.push_back("elf64ppc");
7970 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007971
7972 case llvm::Triple::sparc:
7973 CmdArgs.push_back("-m");
7974 CmdArgs.push_back("elf32_sparc");
7975 break;
7976
7977 case llvm::Triple::sparcv9:
7978 CmdArgs.push_back("-m");
7979 CmdArgs.push_back("elf64_sparc");
7980 break;
7981
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007982 default:
7983 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007984 }
7985
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007986 if (Output.isFilename()) {
7987 CmdArgs.push_back("-o");
7988 CmdArgs.push_back(Output.getFilename());
7989 } else {
7990 assert(Output.isNothing() && "Invalid output.");
7991 }
7992
Douglas Katzman78b37b02015-11-17 20:28:07 +00007993 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007994 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007995 CmdArgs.push_back(
7996 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7997 CmdArgs.push_back(
7998 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7999 CmdArgs.push_back(
8000 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008001 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008002 CmdArgs.push_back(
8003 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8004 CmdArgs.push_back(
8005 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008006 }
8007 }
8008
8009 Args.AddAllArgs(CmdArgs, options::OPT_L);
8010 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8011 Args.AddAllArgs(CmdArgs, options::OPT_e);
8012 Args.AddAllArgs(CmdArgs, options::OPT_s);
8013 Args.AddAllArgs(CmdArgs, options::OPT_t);
8014 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8015 Args.AddAllArgs(CmdArgs, options::OPT_r);
8016
8017 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8018
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008019 unsigned Major, Minor, Micro;
8020 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8021 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008022 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008023 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008024 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008025 case llvm::Triple::arm:
8026 case llvm::Triple::armeb:
8027 case llvm::Triple::thumb:
8028 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008029 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008030 case llvm::Triple::ppc64:
8031 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008032 case llvm::Triple::x86:
8033 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008034 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008035 break;
8036 default:
8037 break;
8038 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008039 }
8040
Douglas Katzman78b37b02015-11-17 20:28:07 +00008041 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008042 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008043 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008044 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8045 CmdArgs.push_back("-lm");
8046 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008047 if (Args.hasArg(options::OPT_pthread))
8048 CmdArgs.push_back("-lpthread");
8049 CmdArgs.push_back("-lc");
8050
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008051 if (useLibgcc) {
8052 if (Args.hasArg(options::OPT_static)) {
8053 // libgcc_eh depends on libc, so resolve as much as possible,
8054 // pull in any new requirements from libc and then get the rest
8055 // of libgcc.
8056 CmdArgs.push_back("-lgcc_eh");
8057 CmdArgs.push_back("-lc");
8058 CmdArgs.push_back("-lgcc");
8059 } else {
8060 CmdArgs.push_back("-lgcc");
8061 CmdArgs.push_back("--as-needed");
8062 CmdArgs.push_back("-lgcc_s");
8063 CmdArgs.push_back("--no-as-needed");
8064 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008065 }
8066 }
8067
Douglas Katzman78b37b02015-11-17 20:28:07 +00008068 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008069 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008070 CmdArgs.push_back(
8071 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008072 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008073 CmdArgs.push_back(
8074 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8075 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008076 }
8077
Xinliang David Li69306c02015-10-22 06:15:31 +00008078 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008079
Logan Chieneb9162f2014-06-26 14:23:45 +00008080 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008081 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008082}
8083
Douglas Katzman95354292015-06-23 20:42:09 +00008084void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8085 const InputInfo &Output,
8086 const InputInfoList &Inputs,
8087 const ArgList &Args,
8088 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008089 claimNoWarnArgs(Args);
8090
James Y Knight2db38f32015-08-15 03:45:25 +00008091 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8092 llvm::Triple Triple = llvm::Triple(TripleStr);
8093
Rafael Espindola92b00932010-08-10 00:25:48 +00008094 ArgStringList CmdArgs;
8095
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008096 llvm::Reloc::Model RelocationModel;
8097 unsigned PICLevel;
8098 bool IsPIE;
8099 std::tie(RelocationModel, PICLevel, IsPIE) =
8100 ParsePICArgs(getToolChain(), Triple, Args);
8101
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008102 switch (getToolChain().getArch()) {
8103 default:
8104 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008105 // Add --32/--64 to make sure we get the format we want.
8106 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008107 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008108 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008109 break;
8110 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008111 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8112 CmdArgs.push_back("--x32");
8113 else
8114 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008115 break;
8116 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008117 CmdArgs.push_back("-a32");
8118 CmdArgs.push_back("-mppc");
8119 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008120 break;
8121 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008122 CmdArgs.push_back("-a64");
8123 CmdArgs.push_back("-mppc64");
8124 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008125 break;
8126 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008127 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008128 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008129 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008130 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008131 break;
8132 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008133 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008134 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008135 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8136 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8137 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008138 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008139 }
8140 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008141 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008142 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8143 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8144 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008145 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008146 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008147 case llvm::Triple::arm:
8148 case llvm::Triple::armeb:
8149 case llvm::Triple::thumb:
8150 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008151 const llvm::Triple &Triple2 = getToolChain().getTriple();
8152 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008153 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008154 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008155 break;
8156 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008157 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008158 break;
8159 default:
8160 break;
8161 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008162
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008163 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008164 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8165 case arm::FloatABI::Soft:
8166 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8167 break;
8168 case arm::FloatABI::SoftFP:
8169 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8170 break;
8171 case arm::FloatABI::Hard:
8172 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8173 break;
8174 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008175
8176 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008177
8178 // FIXME: remove krait check when GNU tools support krait cpu
8179 // for now replace it with -march=armv7-a to avoid a lower
8180 // march from being picked in the absence of a cpu flag.
8181 Arg *A;
8182 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008183 StringRef(A->getValue()).lower() == "krait")
8184 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008185 else
8186 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008187 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008188 break;
8189 }
8190 case llvm::Triple::mips:
8191 case llvm::Triple::mipsel:
8192 case llvm::Triple::mips64:
8193 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008194 StringRef CPUName;
8195 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008196 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008197 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008198
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008199 CmdArgs.push_back("-march");
8200 CmdArgs.push_back(CPUName.data());
8201
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008202 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008203 CmdArgs.push_back(ABIName.data());
8204
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008205 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8206 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008207 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008208 CmdArgs.push_back("-mno-shared");
8209
Daniel Sanders379d44b2014-07-16 11:52:23 +00008210 // LLVM doesn't support -mplt yet and acts as if it is always given.
8211 // However, -mplt has no effect with the N64 ABI.
8212 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008213
8214 if (getToolChain().getArch() == llvm::Triple::mips ||
8215 getToolChain().getArch() == llvm::Triple::mips64)
8216 CmdArgs.push_back("-EB");
8217 else
8218 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008219
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008220 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8221 if (StringRef(A->getValue()) == "2008")
8222 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8223 }
8224
Daniel Sanders379d44b2014-07-16 11:52:23 +00008225 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8226 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8227 options::OPT_mfp64)) {
8228 A->claim();
8229 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008230 } else if (mips::shouldUseFPXX(
8231 Args, getToolChain().getTriple(), CPUName, ABIName,
8232 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008233 CmdArgs.push_back("-mfpxx");
8234
8235 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8236 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008237 if (Arg *A =
8238 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008239 if (A->getOption().matches(options::OPT_mips16)) {
8240 A->claim();
8241 A->render(Args, CmdArgs);
8242 } else {
8243 A->claim();
8244 CmdArgs.push_back("-no-mips16");
8245 }
8246 }
8247
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008248 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8249 options::OPT_mno_micromips);
8250 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8251 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8252
Simon Atanasyanbd986632013-11-26 11:58:04 +00008253 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8254 // Do not use AddLastArg because not all versions of MIPS assembler
8255 // support -mmsa / -mno-msa options.
8256 if (A->getOption().matches(options::OPT_mmsa))
8257 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8258 }
8259
Daniel Sanders379d44b2014-07-16 11:52:23 +00008260 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8261 options::OPT_msoft_float);
8262
Toma Tabacub36d6102015-06-11 12:13:18 +00008263 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8264 options::OPT_msingle_float);
8265
Daniel Sanders379d44b2014-07-16 11:52:23 +00008266 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8267 options::OPT_mno_odd_spreg);
8268
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008269 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008270 break;
8271 }
8272 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008273 // Always pass an -march option, since our default of z10 is later
8274 // than the GNU assembler's default.
8275 StringRef CPUName = getSystemZTargetCPU(Args);
8276 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008277 break;
8278 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008279 }
8280
Renato Golina74bbc72015-07-22 15:32:36 +00008281 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008282 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008283
8284 CmdArgs.push_back("-o");
8285 CmdArgs.push_back(Output.getFilename());
8286
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008287 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008288 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008289
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008290 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008291 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008292
8293 // Handle the debug info splitting at object creation time if we're
8294 // creating an object.
8295 // TODO: Currently only works on linux with newer objcopy.
8296 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008297 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008298 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008299 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008300}
8301
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008302static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008303 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008304 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008305 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008306 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8307 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008308 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008309 CmdArgs.push_back("-lgcc");
8310
Logan Chien3d3373c2012-11-19 12:04:11 +00008311 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008312 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008313 CmdArgs.push_back("-lgcc");
8314 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008315 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008316 CmdArgs.push_back("--as-needed");
8317 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008318 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008319 CmdArgs.push_back("--no-as-needed");
8320 }
8321
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008322 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008323 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008324 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008325 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008326
8327 // According to Android ABI, we have to link with libdl if we are
8328 // linking with non-static libgcc.
8329 //
8330 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8331 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8332 if (isAndroid && !StaticLibgcc)
8333 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008334}
8335
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008336static std::string getLinuxDynamicLinker(const ArgList &Args,
8337 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008338 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8339
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008340 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008341 if (ToolChain.getTriple().isArch64Bit())
8342 return "/system/bin/linker64";
8343 else
8344 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008345 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8346 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008347 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008348 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008349 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008350 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008351 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008352 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008353 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008354 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008355 return "/lib/ld-linux-armhf.so.3";
8356 else
8357 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008358 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8359 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008360 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008361 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008362 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008363 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008364 return "/lib/ld-linux.so.3";
8365 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8366 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008367 std::string LibDir =
8368 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008369 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008370 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008371 if (mips::isUCLibc(Args))
8372 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008373 else if (!ToolChain.getTriple().hasEnvironment()) {
8374 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8375 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8376 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8377 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008378 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008379
8380 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008381 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008382 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008383 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008384 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8385 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008386 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008387 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008388 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8389 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008390 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008391 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008392 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008393 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008394 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008395 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008396 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8397 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008398 else
8399 return "/lib64/ld-linux-x86-64.so.2";
8400}
8401
Renato Golinc4b49242014-02-13 10:01:16 +00008402static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008403 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008404 // Make use of compiler-rt if --rtlib option is used
8405 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8406
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008407 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008408 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008409 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008410 default:
8411 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008412 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008413 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008414 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008415 break;
8416 }
Renato Golinc4b49242014-02-13 10:01:16 +00008417 break;
8418 case ToolChain::RLT_Libgcc:
8419 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8420 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008421 }
8422}
8423
Rafael Espindola1e085772014-08-15 17:14:35 +00008424static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8425 switch (T.getArch()) {
8426 case llvm::Triple::x86:
8427 return "elf_i386";
8428 case llvm::Triple::aarch64:
8429 return "aarch64linux";
8430 case llvm::Triple::aarch64_be:
8431 return "aarch64_be_linux";
8432 case llvm::Triple::arm:
8433 case llvm::Triple::thumb:
8434 return "armelf_linux_eabi";
8435 case llvm::Triple::armeb:
8436 case llvm::Triple::thumbeb:
8437 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8438 case llvm::Triple::ppc:
8439 return "elf32ppclinux";
8440 case llvm::Triple::ppc64:
8441 return "elf64ppc";
8442 case llvm::Triple::ppc64le:
8443 return "elf64lppc";
8444 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008445 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008446 return "elf32_sparc";
8447 case llvm::Triple::sparcv9:
8448 return "elf64_sparc";
8449 case llvm::Triple::mips:
8450 return "elf32btsmip";
8451 case llvm::Triple::mipsel:
8452 return "elf32ltsmip";
8453 case llvm::Triple::mips64:
8454 if (mips::hasMipsAbiArg(Args, "n32"))
8455 return "elf32btsmipn32";
8456 return "elf64btsmip";
8457 case llvm::Triple::mips64el:
8458 if (mips::hasMipsAbiArg(Args, "n32"))
8459 return "elf32ltsmipn32";
8460 return "elf64ltsmip";
8461 case llvm::Triple::systemz:
8462 return "elf64_s390";
8463 case llvm::Triple::x86_64:
8464 if (T.getEnvironment() == llvm::Triple::GNUX32)
8465 return "elf32_x86_64";
8466 return "elf_x86_64";
8467 default:
8468 llvm_unreachable("Unexpected arch");
8469 }
8470}
8471
Douglas Katzman95354292015-06-23 20:42:09 +00008472void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8473 const InputInfo &Output,
8474 const InputInfoList &Inputs,
8475 const ArgList &Args,
8476 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008477 const toolchains::Linux &ToolChain =
8478 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008479 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008480
8481 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8482 llvm::Triple Triple = llvm::Triple(TripleStr);
8483
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008484 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008485 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008486 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008487 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8488 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008489 const bool HasCRTBeginEndFiles =
8490 ToolChain.getTriple().hasEnvironment() ||
8491 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008492
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008493 ArgStringList CmdArgs;
8494
Rafael Espindolad1002f62010-11-15 18:28:16 +00008495 // Silence warning for "clang -g foo.o -o foo"
8496 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008497 // and "clang -emit-llvm foo.o -o foo"
8498 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008499 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008500 // handled somewhere else.
8501 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008502
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008503 if (llvm::sys::path::filename(ToolChain.Linker) == "lld") {
8504 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008505 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008506 CmdArgs.push_back("-target");
8507 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8508 }
8509
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008510 if (!D.SysRoot.empty())
8511 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008512
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008513 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008514 CmdArgs.push_back("-pie");
8515
Rafael Espindola1c76c592010-11-07 22:57:16 +00008516 if (Args.hasArg(options::OPT_rdynamic))
8517 CmdArgs.push_back("-export-dynamic");
8518
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008519 if (Args.hasArg(options::OPT_s))
8520 CmdArgs.push_back("-s");
8521
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008522 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008523 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008524
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008525 for (const auto &Opt : ToolChain.ExtraOpts)
8526 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008527
8528 if (!Args.hasArg(options::OPT_static)) {
8529 CmdArgs.push_back("--eh-frame-hdr");
8530 }
8531
8532 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008533 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008534
8535 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008536 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8537 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008538 CmdArgs.push_back("-Bstatic");
8539 else
8540 CmdArgs.push_back("-static");
8541 } else if (Args.hasArg(options::OPT_shared)) {
8542 CmdArgs.push_back("-shared");
8543 }
8544
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008545 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8546 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008547 (!Args.hasArg(options::OPT_static) &&
8548 !Args.hasArg(options::OPT_shared))) {
8549 CmdArgs.push_back("-dynamic-linker");
8550 CmdArgs.push_back(Args.MakeArgString(
8551 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8552 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008553
8554 CmdArgs.push_back("-o");
8555 CmdArgs.push_back(Output.getFilename());
8556
Douglas Katzman78b37b02015-11-17 20:28:07 +00008557 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008558 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008559 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008560 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008561 if (Args.hasArg(options::OPT_pg))
8562 crt1 = "gcrt1.o";
8563 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008564 crt1 = "Scrt1.o";
8565 else
8566 crt1 = "crt1.o";
8567 }
8568 if (crt1)
8569 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008570
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008571 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8572 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008573
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008574 const char *crtbegin;
8575 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008576 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008577 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008578 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008579 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008580 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008581 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008582 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008583
8584 if (HasCRTBeginEndFiles)
8585 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008586
8587 // Add crtfastmath.o if available and fast math is enabled.
8588 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008589 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008590
8591 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008592 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008593
Douglas Katzman6059ef92015-11-17 17:41:23 +00008594 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008595
Teresa Johnson945bc502015-10-15 20:35:53 +00008596 if (D.isUsingLTO())
8597 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008598
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008599 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8600 CmdArgs.push_back("--no-demangle");
8601
Alexey Samsonov52550342014-09-15 19:58:40 +00008602 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008603 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008604 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008605 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008606
Douglas Katzman78b37b02015-11-17 20:28:07 +00008607 if (D.CCCIsCXX() &&
8608 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008609 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008610 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008611 if (OnlyLibstdcxxStatic)
8612 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008613 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008614 if (OnlyLibstdcxxStatic)
8615 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008616 CmdArgs.push_back("-lm");
8617 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008618 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8619 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008620
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008621 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008622 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8623 if (Args.hasArg(options::OPT_static))
8624 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008625
Alexey Samsonov52550342014-09-15 19:58:40 +00008626 if (NeedsSanitizerDeps)
8627 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8628
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008629 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8630 Args.hasArg(options::OPT_pthreads);
8631
8632 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8633 options::OPT_fno_openmp, false)) {
8634 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8635 // FIXME: Does this really make sense for all GNU toolchains?
8636 WantPthread = true;
8637
8638 // Also link the particular OpenMP runtimes.
8639 switch (getOpenMPRuntime(ToolChain, Args)) {
8640 case OMPRT_OMP:
8641 CmdArgs.push_back("-lomp");
8642 break;
8643 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008644 CmdArgs.push_back("-lgomp");
8645
8646 // FIXME: Exclude this for platforms with libgomp that don't require
8647 // librt. Most modern Linux platforms require it, but some may not.
8648 CmdArgs.push_back("-lrt");
8649 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008650 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008651 CmdArgs.push_back("-liomp5");
8652 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008653 case OMPRT_Unknown:
8654 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008655 break;
8656 }
Chandler Carruth01538002013-01-17 13:19:29 +00008657 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008658
Renato Golinc4b49242014-02-13 10:01:16 +00008659 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008660
Richard Smith31d1de22015-05-20 22:48:44 +00008661 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008662 CmdArgs.push_back("-lpthread");
8663
8664 CmdArgs.push_back("-lc");
8665
8666 if (Args.hasArg(options::OPT_static))
8667 CmdArgs.push_back("--end-group");
8668 else
Renato Golinc4b49242014-02-13 10:01:16 +00008669 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008670 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008671
Rafael Espindola81937ec2010-12-01 01:52:43 +00008672 if (!Args.hasArg(options::OPT_nostartfiles)) {
8673 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008674 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008675 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008676 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008677 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008678 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008679 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008680
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008681 if (HasCRTBeginEndFiles)
8682 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008683 if (!isAndroid)
8684 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008685 }
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008686 } else if (Args.hasArg(options::OPT_rtlib_EQ))
8687 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008688
Justin Bognerd3371d82015-07-17 03:35:54 +00008689 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8690 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008691}
8692
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008693// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8694// for the various SFI requirements like register masking. The assembly tool
8695// inserts the file containing the macros as an input into all the assembly
8696// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008697void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8698 const InputInfo &Output,
8699 const InputInfoList &Inputs,
8700 const ArgList &Args,
8701 const char *LinkingOutput) const {
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 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8705 "nacl-arm-macros.s");
8706 InputInfoList NewInputs;
8707 NewInputs.push_back(NaClMacros);
8708 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008709 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8710 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008711}
8712
Douglas Katzman750cfc52015-06-29 18:42:16 +00008713// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008714// we use static by default, do not yet support sanitizers or LTO, and a few
8715// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008716// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008717void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8718 const InputInfo &Output,
8719 const InputInfoList &Inputs,
8720 const ArgList &Args,
8721 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008722
Douglas Katzman54366072015-07-27 16:53:08 +00008723 const toolchains::NaClToolChain &ToolChain =
8724 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008725 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008726 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008727 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008728 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008729
8730 ArgStringList CmdArgs;
8731
8732 // Silence warning for "clang -g foo.o -o foo"
8733 Args.ClaimAllArgs(options::OPT_g_Group);
8734 // and "clang -emit-llvm foo.o -o foo"
8735 Args.ClaimAllArgs(options::OPT_emit_llvm);
8736 // and for "clang -w foo.o -o foo". Other warning options are already
8737 // handled somewhere else.
8738 Args.ClaimAllArgs(options::OPT_w);
8739
8740 if (!D.SysRoot.empty())
8741 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8742
8743 if (Args.hasArg(options::OPT_rdynamic))
8744 CmdArgs.push_back("-export-dynamic");
8745
8746 if (Args.hasArg(options::OPT_s))
8747 CmdArgs.push_back("-s");
8748
Douglas Katzman54366072015-07-27 16:53:08 +00008749 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8750 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008751 CmdArgs.push_back("--build-id");
8752
8753 if (!IsStatic)
8754 CmdArgs.push_back("--eh-frame-hdr");
8755
8756 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008757 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008758 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008759 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008760 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008761 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008762 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008763 else if (Arch == llvm::Triple::mipsel)
8764 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008765 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008766 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8767 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008768
8769 if (IsStatic)
8770 CmdArgs.push_back("-static");
8771 else if (Args.hasArg(options::OPT_shared))
8772 CmdArgs.push_back("-shared");
8773
8774 CmdArgs.push_back("-o");
8775 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00008776 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008777 if (!Args.hasArg(options::OPT_shared))
8778 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8779 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8780
8781 const char *crtbegin;
8782 if (IsStatic)
8783 crtbegin = "crtbeginT.o";
8784 else if (Args.hasArg(options::OPT_shared))
8785 crtbegin = "crtbeginS.o";
8786 else
8787 crtbegin = "crtbegin.o";
8788 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8789 }
8790
8791 Args.AddAllArgs(CmdArgs, options::OPT_L);
8792 Args.AddAllArgs(CmdArgs, options::OPT_u);
8793
Douglas Katzman6059ef92015-11-17 17:41:23 +00008794 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008795
8796 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8797 CmdArgs.push_back("--no-demangle");
8798
8799 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8800
Douglas Katzman78b37b02015-11-17 20:28:07 +00008801 if (D.CCCIsCXX() &&
8802 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008803 bool OnlyLibstdcxxStatic =
8804 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008805 if (OnlyLibstdcxxStatic)
8806 CmdArgs.push_back("-Bstatic");
8807 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8808 if (OnlyLibstdcxxStatic)
8809 CmdArgs.push_back("-Bdynamic");
8810 CmdArgs.push_back("-lm");
8811 }
8812
8813 if (!Args.hasArg(options::OPT_nostdlib)) {
8814 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8815 // Always use groups, since it has no effect on dynamic libraries.
8816 CmdArgs.push_back("--start-group");
8817 CmdArgs.push_back("-lc");
8818 // NaCl's libc++ currently requires libpthread, so just always include it
8819 // in the group for C++.
8820 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008821 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008822 // Gold, used by Mips, handles nested groups differently than ld, and
8823 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8824 // which is not a desired behaviour here.
8825 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8826 if (getToolChain().getArch() == llvm::Triple::mipsel)
8827 CmdArgs.push_back("-lnacl");
8828
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008829 CmdArgs.push_back("-lpthread");
8830 }
8831
8832 CmdArgs.push_back("-lgcc");
8833 CmdArgs.push_back("--as-needed");
8834 if (IsStatic)
8835 CmdArgs.push_back("-lgcc_eh");
8836 else
8837 CmdArgs.push_back("-lgcc_s");
8838 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008839
8840 // Mips needs to create and use pnacl_legacy library that contains
8841 // definitions from bitcode/pnaclmm.c and definitions for
8842 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8843 if (getToolChain().getArch() == llvm::Triple::mipsel)
8844 CmdArgs.push_back("-lpnacl_legacy");
8845
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008846 CmdArgs.push_back("--end-group");
8847 }
8848
8849 if (!Args.hasArg(options::OPT_nostartfiles)) {
8850 const char *crtend;
8851 if (Args.hasArg(options::OPT_shared))
8852 crtend = "crtendS.o";
8853 else
8854 crtend = "crtend.o";
8855
8856 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8857 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8858 }
8859 }
8860
Justin Bognerd3371d82015-07-17 03:35:54 +00008861 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8862 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008863}
8864
Douglas Katzman95354292015-06-23 20:42:09 +00008865void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8866 const InputInfo &Output,
8867 const InputInfoList &Inputs,
8868 const ArgList &Args,
8869 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008870 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008871 ArgStringList CmdArgs;
8872
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008873 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008874
8875 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008876 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008877
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008878 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008879 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008880
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008881 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008882 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008883}
8884
Douglas Katzman95354292015-06-23 20:42:09 +00008885void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8886 const InputInfo &Output,
8887 const InputInfoList &Inputs,
8888 const ArgList &Args,
8889 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008890 const Driver &D = getToolChain().getDriver();
8891 ArgStringList CmdArgs;
8892
Daniel Dunbarb440f562010-08-02 02:38:21 +00008893 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008894 CmdArgs.push_back("-o");
8895 CmdArgs.push_back(Output.getFilename());
8896 } else {
8897 assert(Output.isNothing() && "Invalid output.");
8898 }
8899
Douglas Katzman78b37b02015-11-17 20:28:07 +00008900 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008901 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8902 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8903 CmdArgs.push_back(
8904 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8905 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008906 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008907
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008908 Args.AddAllArgs(CmdArgs,
8909 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008910
Daniel Dunbar54423b22010-09-17 00:24:54 +00008911 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008912
Xinliang David Li69306c02015-10-22 06:15:31 +00008913 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008914
Douglas Katzman78b37b02015-11-17 20:28:07 +00008915 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008916 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008917 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008918 CmdArgs.push_back("-lm");
8919 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008920 }
8921
Douglas Katzman78b37b02015-11-17 20:28:07 +00008922 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008923 if (Args.hasArg(options::OPT_pthread))
8924 CmdArgs.push_back("-lpthread");
8925 CmdArgs.push_back("-lc");
8926 CmdArgs.push_back("-lCompilerRT-Generic");
8927 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8928 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008929 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008930 }
8931
Logan Chieneb9162f2014-06-26 14:23:45 +00008932 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008933 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008934}
8935
Daniel Dunbarcc912342009-05-02 18:28:39 +00008936/// DragonFly Tools
8937
8938// For now, DragonFly Assemble does just about the same as for
8939// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008940void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8941 const InputInfo &Output,
8942 const InputInfoList &Inputs,
8943 const ArgList &Args,
8944 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008945 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008946 ArgStringList CmdArgs;
8947
8948 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8949 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008950 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008951 CmdArgs.push_back("--32");
8952
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008953 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008954
8955 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008956 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008957
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008958 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008959 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008960
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008961 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008962 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008963}
8964
Douglas Katzman95354292015-06-23 20:42:09 +00008965void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8966 const InputInfo &Output,
8967 const InputInfoList &Inputs,
8968 const ArgList &Args,
8969 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008970 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008971 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008972 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008973
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008974 if (!D.SysRoot.empty())
8975 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8976
John McCall65b8da02013-04-11 22:55:55 +00008977 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008978 if (Args.hasArg(options::OPT_static)) {
8979 CmdArgs.push_back("-Bstatic");
8980 } else {
John McCall65b8da02013-04-11 22:55:55 +00008981 if (Args.hasArg(options::OPT_rdynamic))
8982 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008983 if (Args.hasArg(options::OPT_shared))
8984 CmdArgs.push_back("-Bshareable");
8985 else {
8986 CmdArgs.push_back("-dynamic-linker");
8987 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8988 }
John McCall65b8da02013-04-11 22:55:55 +00008989 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008990 }
8991
8992 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8993 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008994 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008995 CmdArgs.push_back("-m");
8996 CmdArgs.push_back("elf_i386");
8997 }
8998
Daniel Dunbarb440f562010-08-02 02:38:21 +00008999 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009000 CmdArgs.push_back("-o");
9001 CmdArgs.push_back(Output.getFilename());
9002 } else {
9003 assert(Output.isNothing() && "Invalid output.");
9004 }
9005
Douglas Katzman78b37b02015-11-17 20:28:07 +00009006 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009007 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009008 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009009 CmdArgs.push_back(
9010 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009011 else {
9012 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009013 CmdArgs.push_back(
9014 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009015 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009016 CmdArgs.push_back(
9017 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009018 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009019 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009020 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009021 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009022 CmdArgs.push_back(
9023 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009024 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009025 CmdArgs.push_back(
9026 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009027 }
9028
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009029 Args.AddAllArgs(CmdArgs,
9030 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009031
Daniel Dunbar54423b22010-09-17 00:24:54 +00009032 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009033
Douglas Katzman78b37b02015-11-17 20:28:07 +00009034 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009035 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9036 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009037 if (UseGCC47)
9038 CmdArgs.push_back("-L/usr/lib/gcc47");
9039 else
9040 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009041
9042 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009043 if (UseGCC47) {
9044 CmdArgs.push_back("-rpath");
9045 CmdArgs.push_back("/usr/lib/gcc47");
9046 } else {
9047 CmdArgs.push_back("-rpath");
9048 CmdArgs.push_back("/usr/lib/gcc44");
9049 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009050 }
9051
Hans Wennborg70850d82013-07-18 20:29:38 +00009052 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009053 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009054 CmdArgs.push_back("-lm");
9055 }
9056
Daniel Dunbarcc912342009-05-02 18:28:39 +00009057 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009058 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009059
9060 if (!Args.hasArg(options::OPT_nolibc)) {
9061 CmdArgs.push_back("-lc");
9062 }
9063
John McCall65b8da02013-04-11 22:55:55 +00009064 if (UseGCC47) {
9065 if (Args.hasArg(options::OPT_static) ||
9066 Args.hasArg(options::OPT_static_libgcc)) {
9067 CmdArgs.push_back("-lgcc");
9068 CmdArgs.push_back("-lgcc_eh");
9069 } else {
9070 if (Args.hasArg(options::OPT_shared_libgcc)) {
9071 CmdArgs.push_back("-lgcc_pic");
9072 if (!Args.hasArg(options::OPT_shared))
9073 CmdArgs.push_back("-lgcc");
9074 } else {
9075 CmdArgs.push_back("-lgcc");
9076 CmdArgs.push_back("--as-needed");
9077 CmdArgs.push_back("-lgcc_pic");
9078 CmdArgs.push_back("--no-as-needed");
9079 }
9080 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009081 } else {
John McCall65b8da02013-04-11 22:55:55 +00009082 if (Args.hasArg(options::OPT_shared)) {
9083 CmdArgs.push_back("-lgcc_pic");
9084 } else {
9085 CmdArgs.push_back("-lgcc");
9086 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009087 }
9088 }
9089
Douglas Katzman78b37b02015-11-17 20:28:07 +00009090 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009091 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009092 CmdArgs.push_back(
9093 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009094 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009095 CmdArgs.push_back(
9096 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9097 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009098 }
9099
Xinliang David Li69306c02015-10-22 06:15:31 +00009100 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009101
Logan Chieneb9162f2014-06-26 14:23:45 +00009102 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009103 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009104}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009105
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009106// Try to find Exe from a Visual Studio distribution. This first tries to find
9107// an installed copy of Visual Studio and, failing that, looks in the PATH,
9108// making sure that whatever executable that's found is not a same-named exe
9109// from clang itself to prevent clang from falling back to itself.
9110static std::string FindVisualStudioExecutable(const ToolChain &TC,
9111 const char *Exe,
9112 const char *ClangProgramPath) {
9113 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9114 std::string visualStudioBinDir;
9115 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9116 visualStudioBinDir)) {
9117 SmallString<128> FilePath(visualStudioBinDir);
9118 llvm::sys::path::append(FilePath, Exe);
9119 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9120 return FilePath.str();
9121 }
9122
9123 return Exe;
9124}
9125
Douglas Katzman95354292015-06-23 20:42:09 +00009126void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9127 const InputInfo &Output,
9128 const InputInfoList &Inputs,
9129 const ArgList &Args,
9130 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009131 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009132 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009133
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009134 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9135 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009136 CmdArgs.push_back(
9137 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009138
Douglas Katzman78b37b02015-11-17 20:28:07 +00009139 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9140 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009141 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009142
Zachary Turner10d75b22014-10-22 20:40:43 +00009143 if (!llvm::sys::Process::GetEnv("LIB")) {
9144 // If the VC environment hasn't been configured (perhaps because the user
9145 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009146 // the environment variable is set however, assume the user knows what
9147 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009148 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009149 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009150 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9151 SmallString<128> LibDir(VisualStudioDir);
9152 llvm::sys::path::append(LibDir, "VC", "lib");
9153 switch (MSVC.getArch()) {
9154 case llvm::Triple::x86:
9155 // x86 just puts the libraries directly in lib
9156 break;
9157 case llvm::Triple::x86_64:
9158 llvm::sys::path::append(LibDir, "amd64");
9159 break;
9160 case llvm::Triple::arm:
9161 llvm::sys::path::append(LibDir, "arm");
9162 break;
9163 default:
9164 break;
9165 }
9166 CmdArgs.push_back(
9167 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009168
9169 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9170 std::string UniversalCRTLibPath;
9171 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9172 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9173 UniversalCRTLibPath.c_str()));
9174 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009175 }
9176
9177 std::string WindowsSdkLibPath;
9178 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9179 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9180 WindowsSdkLibPath.c_str()));
9181 }
9182
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009183 CmdArgs.push_back("-nologo");
9184
Reid Kleckner124955a2015-08-05 18:51:13 +00009185 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009186 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009187
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009188 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009189 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009190 if (DLL) {
9191 CmdArgs.push_back(Args.MakeArgString("-dll"));
9192
9193 SmallString<128> ImplibName(Output.getFilename());
9194 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009195 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009196 }
9197
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009198 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009199 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009200 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009201 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009202 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9203 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009204 // Make sure the dynamic runtime thunk is not optimized out at link time
9205 // to ensure proper SEH handling.
9206 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009207 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009208 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009209 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009210 for (const auto &Lib : {"asan", "asan_cxx"})
9211 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009212 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009213 }
9214
Hans Wennborg2e274592013-08-13 23:38:57 +00009215 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009216
Alexey Bataevc7e84352015-08-19 04:49:01 +00009217 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9218 options::OPT_fno_openmp, false)) {
9219 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9220 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9221 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9222 TC.getDriver().Dir + "/../lib"));
9223 switch (getOpenMPRuntime(getToolChain(), Args)) {
9224 case OMPRT_OMP:
9225 CmdArgs.push_back("-defaultlib:libomp.lib");
9226 break;
9227 case OMPRT_IOMP5:
9228 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9229 break;
9230 case OMPRT_GOMP:
9231 break;
9232 case OMPRT_Unknown:
9233 // Already diagnosed.
9234 break;
9235 }
9236 }
9237
Reid Kleckner337188f2014-09-16 19:22:00 +00009238 // Add filenames, libraries, and other linker inputs.
9239 for (const auto &Input : Inputs) {
9240 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009241 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009242 continue;
9243 }
9244
9245 const Arg &A = Input.getInputArg();
9246
9247 // Render -l options differently for the MSVC linker.
9248 if (A.getOption().matches(options::OPT_l)) {
9249 StringRef Lib = A.getValue();
9250 const char *LinkLibArg;
9251 if (Lib.endswith(".lib"))
9252 LinkLibArg = Args.MakeArgString(Lib);
9253 else
9254 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9255 CmdArgs.push_back(LinkLibArg);
9256 continue;
9257 }
9258
9259 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9260 // or -L. Render it, even if MSVC doesn't understand it.
9261 A.renderAsInput(Args, CmdArgs);
9262 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009263
Zachary Turner719f58c2014-12-01 23:06:47 +00009264 // We need to special case some linker paths. In the case of lld, we need to
9265 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9266 // linker, we need to use a special search algorithm.
9267 llvm::SmallString<128> linkPath;
9268 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9269 if (Linker.equals_lower("lld"))
9270 Linker = "lld-link";
9271
9272 if (Linker.equals_lower("link")) {
9273 // If we're using the MSVC linker, it's not sufficient to just use link
9274 // from the program PATH, because other environments like GnuWin32 install
9275 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009276 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009277 C.getDriver().getClangProgramPath());
9278 } else {
9279 linkPath = Linker;
9280 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009281 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009282 }
9283
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009284 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009285 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009286}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009287
Douglas Katzman95354292015-06-23 20:42:09 +00009288void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9289 const InputInfo &Output,
9290 const InputInfoList &Inputs,
9291 const ArgList &Args,
9292 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009293 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9294}
9295
Douglas Katzman95354292015-06-23 20:42:09 +00009296std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009297 Compilation &C, const JobAction &JA, const InputInfo &Output,
9298 const InputInfoList &Inputs, const ArgList &Args,
9299 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009300 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009301 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009302 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009303 CmdArgs.push_back("/W0"); // No warnings.
9304
9305 // The goal is to be able to invoke this tool correctly based on
9306 // any flag accepted by clang-cl.
9307
9308 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009309 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009310
9311 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009312 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9313 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9314 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009315 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9316 if (A->getOption().getID() == options::OPT_O0) {
9317 CmdArgs.push_back("/Od");
9318 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009319 CmdArgs.push_back("/Og");
9320
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009321 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009322 if (OptLevel == "s" || OptLevel == "z")
9323 CmdArgs.push_back("/Os");
9324 else
9325 CmdArgs.push_back("/Ot");
9326
9327 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009328 }
9329 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009330 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9331 options::OPT_fno_omit_frame_pointer))
9332 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9333 ? "/Oy"
9334 : "/Oy-");
9335 if (!Args.hasArg(options::OPT_fwritable_strings))
9336 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009337
Nico Weber3f8dafb2015-03-12 19:37:10 +00009338 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009339 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9340
David Majnemerf6072342014-07-01 22:24:56 +00009341 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9342 /*default=*/false))
9343 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009344 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9345 options::OPT_fno_function_sections))
9346 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9347 ? "/Gy"
9348 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009349 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9350 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009351 CmdArgs.push_back(
9352 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009353 if (Args.hasArg(options::OPT_fsyntax_only))
9354 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009355 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9356 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009357 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009358
Nico Weber3f8dafb2015-03-12 19:37:10 +00009359 std::vector<std::string> Includes =
9360 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009361 for (const auto &Include : Includes)
9362 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009363
Hans Wennborg87cfa712013-09-19 20:32:16 +00009364 // Flags that can simply be passed through.
9365 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9366 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009367 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009368 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009369
9370 // The order of these flags is relevant, so pick the last one.
9371 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9372 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9373 A->render(Args, CmdArgs);
9374
Hans Wennborg87cfa712013-09-19 20:32:16 +00009375 // Input filename.
9376 assert(Inputs.size() == 1);
9377 const InputInfo &II = Inputs[0];
9378 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9379 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9380 if (II.isFilename())
9381 CmdArgs.push_back(II.getFilename());
9382 else
9383 II.getInputArg().renderAsInput(Args, CmdArgs);
9384
9385 // Output filename.
9386 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009387 const char *Fo =
9388 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009389 CmdArgs.push_back(Fo);
9390
Hans Wennborg188382e2013-09-20 18:16:35 +00009391 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009392 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9393 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009394 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009395 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009396}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009397
Yaron Keren1c0070c2015-07-02 04:45:27 +00009398/// MinGW Tools
9399void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9400 const InputInfo &Output,
9401 const InputInfoList &Inputs,
9402 const ArgList &Args,
9403 const char *LinkingOutput) const {
9404 claimNoWarnArgs(Args);
9405 ArgStringList CmdArgs;
9406
9407 if (getToolChain().getArch() == llvm::Triple::x86) {
9408 CmdArgs.push_back("--32");
9409 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9410 CmdArgs.push_back("--64");
9411 }
9412
9413 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9414
9415 CmdArgs.push_back("-o");
9416 CmdArgs.push_back(Output.getFilename());
9417
9418 for (const auto &II : Inputs)
9419 CmdArgs.push_back(II.getFilename());
9420
9421 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009422 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009423
9424 if (Args.hasArg(options::OPT_gsplit_dwarf))
9425 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9426 SplitDebugName(Args, Inputs[0]));
9427}
9428
9429void MinGW::Linker::AddLibGCC(const ArgList &Args,
9430 ArgStringList &CmdArgs) const {
9431 if (Args.hasArg(options::OPT_mthreads))
9432 CmdArgs.push_back("-lmingwthrd");
9433 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009434
Yaron Kerenaa281332015-08-09 00:24:07 +00009435 // Make use of compiler-rt if --rtlib option is used
9436 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9437 if (RLT == ToolChain::RLT_Libgcc) {
9438 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9439 Args.hasArg(options::OPT_static);
9440 bool Shared = Args.hasArg(options::OPT_shared);
9441 bool CXX = getToolChain().getDriver().CCCIsCXX();
9442
9443 if (Static || (!CXX && !Shared)) {
9444 CmdArgs.push_back("-lgcc");
9445 CmdArgs.push_back("-lgcc_eh");
9446 } else {
9447 CmdArgs.push_back("-lgcc_s");
9448 CmdArgs.push_back("-lgcc");
9449 }
9450 } else {
9451 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9452 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009453
Yaron Keren1c0070c2015-07-02 04:45:27 +00009454 CmdArgs.push_back("-lmoldname");
9455 CmdArgs.push_back("-lmingwex");
9456 CmdArgs.push_back("-lmsvcrt");
9457}
9458
9459void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9460 const InputInfo &Output,
9461 const InputInfoList &Inputs,
9462 const ArgList &Args,
9463 const char *LinkingOutput) const {
9464 const ToolChain &TC = getToolChain();
9465 const Driver &D = TC.getDriver();
9466 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9467
9468 ArgStringList CmdArgs;
9469
9470 // Silence warning for "clang -g foo.o -o foo"
9471 Args.ClaimAllArgs(options::OPT_g_Group);
9472 // and "clang -emit-llvm foo.o -o foo"
9473 Args.ClaimAllArgs(options::OPT_emit_llvm);
9474 // and for "clang -w foo.o -o foo". Other warning options are already
9475 // handled somewhere else.
9476 Args.ClaimAllArgs(options::OPT_w);
9477
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009478 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9479 if (LinkerName.equals_lower("lld")) {
9480 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009481 CmdArgs.push_back("old-gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009482 } else if (!LinkerName.equals_lower("ld")) {
9483 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009484 }
9485
Yaron Keren1c0070c2015-07-02 04:45:27 +00009486 if (!D.SysRoot.empty())
9487 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9488
9489 if (Args.hasArg(options::OPT_s))
9490 CmdArgs.push_back("-s");
9491
9492 CmdArgs.push_back("-m");
9493 if (TC.getArch() == llvm::Triple::x86)
9494 CmdArgs.push_back("i386pe");
9495 if (TC.getArch() == llvm::Triple::x86_64)
9496 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009497 if (TC.getArch() == llvm::Triple::arm)
9498 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009499
9500 if (Args.hasArg(options::OPT_mwindows)) {
9501 CmdArgs.push_back("--subsystem");
9502 CmdArgs.push_back("windows");
9503 } else if (Args.hasArg(options::OPT_mconsole)) {
9504 CmdArgs.push_back("--subsystem");
9505 CmdArgs.push_back("console");
9506 }
9507
9508 if (Args.hasArg(options::OPT_static))
9509 CmdArgs.push_back("-Bstatic");
9510 else {
9511 if (Args.hasArg(options::OPT_mdll))
9512 CmdArgs.push_back("--dll");
9513 else if (Args.hasArg(options::OPT_shared))
9514 CmdArgs.push_back("--shared");
9515 CmdArgs.push_back("-Bdynamic");
9516 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9517 CmdArgs.push_back("-e");
9518 if (TC.getArch() == llvm::Triple::x86)
9519 CmdArgs.push_back("_DllMainCRTStartup@12");
9520 else
9521 CmdArgs.push_back("DllMainCRTStartup");
9522 CmdArgs.push_back("--enable-auto-image-base");
9523 }
9524 }
9525
9526 CmdArgs.push_back("-o");
9527 CmdArgs.push_back(Output.getFilename());
9528
9529 Args.AddAllArgs(CmdArgs, options::OPT_e);
9530 // FIXME: add -N, -n flags
9531 Args.AddLastArg(CmdArgs, options::OPT_r);
9532 Args.AddLastArg(CmdArgs, options::OPT_s);
9533 Args.AddLastArg(CmdArgs, options::OPT_t);
9534 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9535 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9536
Douglas Katzman78b37b02015-11-17 20:28:07 +00009537 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009538 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9539 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9540 } else {
9541 if (Args.hasArg(options::OPT_municode))
9542 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9543 else
9544 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9545 }
9546 if (Args.hasArg(options::OPT_pg))
9547 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9548 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9549 }
9550
9551 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009552 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009553 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9554
9555 // TODO: Add ASan stuff here
9556
9557 // TODO: Add profile stuff here
9558
Douglas Katzman78b37b02015-11-17 20:28:07 +00009559 if (D.CCCIsCXX() &&
9560 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009561 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9562 !Args.hasArg(options::OPT_static);
9563 if (OnlyLibstdcxxStatic)
9564 CmdArgs.push_back("-Bstatic");
9565 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9566 if (OnlyLibstdcxxStatic)
9567 CmdArgs.push_back("-Bdynamic");
9568 }
9569
9570 if (!Args.hasArg(options::OPT_nostdlib)) {
9571 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9572 if (Args.hasArg(options::OPT_static))
9573 CmdArgs.push_back("--start-group");
9574
9575 if (Args.hasArg(options::OPT_fstack_protector) ||
9576 Args.hasArg(options::OPT_fstack_protector_strong) ||
9577 Args.hasArg(options::OPT_fstack_protector_all)) {
9578 CmdArgs.push_back("-lssp_nonshared");
9579 CmdArgs.push_back("-lssp");
9580 }
9581 if (Args.hasArg(options::OPT_fopenmp))
9582 CmdArgs.push_back("-lgomp");
9583
9584 AddLibGCC(Args, CmdArgs);
9585
9586 if (Args.hasArg(options::OPT_pg))
9587 CmdArgs.push_back("-lgmon");
9588
Yaron Kerenadce68e2015-07-06 18:52:19 +00009589 if (Args.hasArg(options::OPT_pthread))
9590 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009591
9592 // add system libraries
9593 if (Args.hasArg(options::OPT_mwindows)) {
9594 CmdArgs.push_back("-lgdi32");
9595 CmdArgs.push_back("-lcomdlg32");
9596 }
9597 CmdArgs.push_back("-ladvapi32");
9598 CmdArgs.push_back("-lshell32");
9599 CmdArgs.push_back("-luser32");
9600 CmdArgs.push_back("-lkernel32");
9601
9602 if (Args.hasArg(options::OPT_static))
9603 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009604 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009605 AddLibGCC(Args, CmdArgs);
9606 }
9607
9608 if (!Args.hasArg(options::OPT_nostartfiles)) {
9609 // Add crtfastmath.o if available and fast math is enabled.
9610 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9611
9612 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9613 }
9614 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009615 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009616 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009617}
9618
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009619/// XCore Tools
9620// We pass assemble and link construction to the xcc tool.
9621
Douglas Katzman95354292015-06-23 20:42:09 +00009622void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9623 const InputInfo &Output,
9624 const InputInfoList &Inputs,
9625 const ArgList &Args,
9626 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009627 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009628 ArgStringList CmdArgs;
9629
9630 CmdArgs.push_back("-o");
9631 CmdArgs.push_back(Output.getFilename());
9632
9633 CmdArgs.push_back("-c");
9634
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009635 if (Args.hasArg(options::OPT_v))
9636 CmdArgs.push_back("-v");
9637
Robert Lytton894d25c2014-05-02 09:33:25 +00009638 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9639 if (!A->getOption().matches(options::OPT_g0))
9640 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009641
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009642 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9643 false))
9644 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009645
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009646 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009647
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009648 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009649 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009650
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009651 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009652 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009653}
9654
Douglas Katzman95354292015-06-23 20:42:09 +00009655void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9656 const InputInfo &Output,
9657 const InputInfoList &Inputs,
9658 const ArgList &Args,
9659 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009660 ArgStringList CmdArgs;
9661
9662 if (Output.isFilename()) {
9663 CmdArgs.push_back("-o");
9664 CmdArgs.push_back(Output.getFilename());
9665 } else {
9666 assert(Output.isNothing() && "Invalid output.");
9667 }
9668
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009669 if (Args.hasArg(options::OPT_v))
9670 CmdArgs.push_back("-v");
9671
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009672 // Pass -fexceptions through to the linker if it was present.
9673 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9674 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009675 CmdArgs.push_back("-fexceptions");
9676
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009677 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9678
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009679 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009680 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009681}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009682
Douglas Katzman95354292015-06-23 20:42:09 +00009683void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9684 const InputInfo &Output,
9685 const InputInfoList &Inputs,
9686 const ArgList &Args,
9687 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009688 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009689 const auto &TC =
9690 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9691 ArgStringList CmdArgs;
9692 const char *Exec;
9693
9694 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009695 default:
9696 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009697 case llvm::Triple::arm:
9698 case llvm::Triple::thumb:
9699 break;
9700 case llvm::Triple::x86:
9701 CmdArgs.push_back("--32");
9702 break;
9703 case llvm::Triple::x86_64:
9704 CmdArgs.push_back("--64");
9705 break;
9706 }
9707
9708 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9709
9710 CmdArgs.push_back("-o");
9711 CmdArgs.push_back(Output.getFilename());
9712
9713 for (const auto &Input : Inputs)
9714 CmdArgs.push_back(Input.getFilename());
9715
9716 const std::string Assembler = TC.GetProgramPath("as");
9717 Exec = Args.MakeArgString(Assembler);
9718
Justin Bognerd3371d82015-07-17 03:35:54 +00009719 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009720}
9721
Douglas Katzman95354292015-06-23 20:42:09 +00009722void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9723 const InputInfo &Output,
9724 const InputInfoList &Inputs,
9725 const ArgList &Args,
9726 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009727 const auto &TC =
9728 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9729 const llvm::Triple &T = TC.getTriple();
9730 const Driver &D = TC.getDriver();
9731 SmallString<128> EntryPoint;
9732 ArgStringList CmdArgs;
9733 const char *Exec;
9734
9735 // Silence warning for "clang -g foo.o -o foo"
9736 Args.ClaimAllArgs(options::OPT_g_Group);
9737 // and "clang -emit-llvm foo.o -o foo"
9738 Args.ClaimAllArgs(options::OPT_emit_llvm);
9739 // and for "clang -w foo.o -o foo"
9740 Args.ClaimAllArgs(options::OPT_w);
9741 // Other warning options are already handled somewhere else.
9742
9743 if (!D.SysRoot.empty())
9744 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9745
9746 if (Args.hasArg(options::OPT_pie))
9747 CmdArgs.push_back("-pie");
9748 if (Args.hasArg(options::OPT_rdynamic))
9749 CmdArgs.push_back("-export-dynamic");
9750 if (Args.hasArg(options::OPT_s))
9751 CmdArgs.push_back("--strip-all");
9752
9753 CmdArgs.push_back("-m");
9754 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009755 default:
9756 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009757 case llvm::Triple::arm:
9758 case llvm::Triple::thumb:
9759 // FIXME: this is incorrect for WinCE
9760 CmdArgs.push_back("thumb2pe");
9761 break;
9762 case llvm::Triple::x86:
9763 CmdArgs.push_back("i386pe");
9764 EntryPoint.append("_");
9765 break;
9766 case llvm::Triple::x86_64:
9767 CmdArgs.push_back("i386pep");
9768 break;
9769 }
9770
9771 if (Args.hasArg(options::OPT_shared)) {
9772 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009773 default:
9774 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009775 case llvm::Triple::arm:
9776 case llvm::Triple::thumb:
9777 case llvm::Triple::x86_64:
9778 EntryPoint.append("_DllMainCRTStartup");
9779 break;
9780 case llvm::Triple::x86:
9781 EntryPoint.append("_DllMainCRTStartup@12");
9782 break;
9783 }
9784
9785 CmdArgs.push_back("-shared");
9786 CmdArgs.push_back("-Bdynamic");
9787
9788 CmdArgs.push_back("--enable-auto-image-base");
9789
9790 CmdArgs.push_back("--entry");
9791 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9792 } else {
9793 EntryPoint.append("mainCRTStartup");
9794
9795 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9796 : "-Bdynamic");
9797
Douglas Katzman78b37b02015-11-17 20:28:07 +00009798 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009799 CmdArgs.push_back("--entry");
9800 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9801 }
9802
9803 // FIXME: handle subsystem
9804 }
9805
9806 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009807 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009808
9809 CmdArgs.push_back("-o");
9810 CmdArgs.push_back(Output.getFilename());
9811
9812 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9813 SmallString<261> ImpLib(Output.getFilename());
9814 llvm::sys::path::replace_extension(ImpLib, ".lib");
9815
9816 CmdArgs.push_back("--out-implib");
9817 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9818 }
9819
Douglas Katzman78b37b02015-11-17 20:28:07 +00009820 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009821 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9822 const char *CRTBegin;
9823
9824 CRTBegin =
9825 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9826 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9827 }
9828
9829 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009830 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009831 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9832
9833 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9834 !Args.hasArg(options::OPT_nodefaultlibs)) {
9835 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9836 !Args.hasArg(options::OPT_static);
9837 if (StaticCXX)
9838 CmdArgs.push_back("-Bstatic");
9839 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9840 if (StaticCXX)
9841 CmdArgs.push_back("-Bdynamic");
9842 }
9843
9844 if (!Args.hasArg(options::OPT_nostdlib)) {
9845 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9846 // TODO handle /MT[d] /MD[d]
9847 CmdArgs.push_back("-lmsvcrt");
9848 AddRunTimeLibs(TC, D, CmdArgs, Args);
9849 }
9850 }
9851
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009852 if (TC.getSanitizerArgs().needsAsanRt()) {
9853 // TODO handle /MT[d] /MD[d]
9854 if (Args.hasArg(options::OPT_shared)) {
9855 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9856 } else {
9857 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9858 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9859 // Make sure the dynamic runtime thunk is not optimized out at link time
9860 // to ensure proper SEH handling.
9861 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9862 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9863 ? "___asan_seh_interceptor"
9864 : "__asan_seh_interceptor"));
9865 }
9866 }
9867
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009868 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009869
Justin Bognerd3371d82015-07-17 03:35:54 +00009870 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009871}
Douglas Katzman84a75642015-06-19 14:55:19 +00009872
Douglas Katzman95354292015-06-23 20:42:09 +00009873void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9874 const InputInfo &Output,
9875 const InputInfoList &Inputs,
9876 const ArgList &Args,
9877 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009878
9879 ArgStringList CmdArgs;
9880
9881 assert(Inputs.size() == 1);
9882 const InputInfo &II = Inputs[0];
9883 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9884 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9885
Douglas Katzman84a75642015-06-19 14:55:19 +00009886 CmdArgs.push_back("-DMYRIAD2");
9887 CmdArgs.push_back("-mcpu=myriad2");
9888 CmdArgs.push_back("-S");
9889
Douglas Katzmanf6071112015-08-03 14:34:22 +00009890 // Append all -I, -iquote, -isystem paths, defines/undefines,
9891 // 'f' flags, optimize flags, and warning options.
9892 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009893 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +00009894 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +00009895 options::OPT_f_Group, options::OPT_f_clang_Group,
9896 options::OPT_g_Group, options::OPT_M_Group,
9897 options::OPT_O_Group, options::OPT_W_Group});
9898
9899 // If we're producing a dependency file, and assembly is the final action,
9900 // then the name of the target in the dependency file should be the '.o'
9901 // file, not the '.s' file produced by this step. For example, instead of
9902 // /tmp/mumble.s: mumble.c .../someheader.h
9903 // the filename on the lefthand side should be "mumble.o"
9904 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9905 C.getActions().size() == 1 &&
9906 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9907 Arg *A = Args.getLastArg(options::OPT_o);
9908 if (A) {
9909 CmdArgs.push_back("-MT");
9910 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9911 }
9912 }
9913
Douglas Katzman84a75642015-06-19 14:55:19 +00009914 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9915
9916 CmdArgs.push_back(II.getFilename());
9917 CmdArgs.push_back("-o");
9918 CmdArgs.push_back(Output.getFilename());
9919
9920 std::string Exec =
9921 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009922 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9923 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009924}
9925
Douglas Katzman95354292015-06-23 20:42:09 +00009926void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9927 const InputInfo &Output,
9928 const InputInfoList &Inputs,
9929 const ArgList &Args,
9930 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009931 ArgStringList CmdArgs;
9932
9933 assert(Inputs.size() == 1);
9934 const InputInfo &II = Inputs[0];
9935 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9936 assert(Output.getType() == types::TY_Object);
9937
9938 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009939 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009940 CmdArgs.push_back("-noSPrefixing");
9941 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009942 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9943 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9944 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009945 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009946 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009947 }
9948 CmdArgs.push_back("-elf"); // Output format.
9949 CmdArgs.push_back(II.getFilename());
9950 CmdArgs.push_back(
9951 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9952
9953 std::string Exec =
9954 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009955 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9956 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009957}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009958
9959void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9960 const InputInfo &Output,
9961 const InputInfoList &Inputs,
9962 const ArgList &Args,
9963 const char *LinkingOutput) const {
9964 const auto &TC =
9965 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9966 const llvm::Triple &T = TC.getTriple();
9967 ArgStringList CmdArgs;
Douglas Katzman9d403742015-11-17 22:33:34 +00009968 bool UseStartfiles = !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +00009969 bool UseDefaultLibs =
9970 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009971
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009972 if (T.getArch() == llvm::Triple::sparc)
9973 CmdArgs.push_back("-EB");
9974 else // SHAVE assumes little-endian, and sparcel is expressly so.
9975 CmdArgs.push_back("-EL");
9976
9977 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9978 // but we never pass through a --sysroot option and various other bits.
9979 // For example, there are no sanitizers (yet) nor gold linker.
9980
9981 // Eat some arguments that may be present but have no effect.
9982 Args.ClaimAllArgs(options::OPT_g_Group);
9983 Args.ClaimAllArgs(options::OPT_w);
9984 Args.ClaimAllArgs(options::OPT_static_libgcc);
9985
9986 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9987 CmdArgs.push_back("-s");
9988
9989 CmdArgs.push_back("-o");
9990 CmdArgs.push_back(Output.getFilename());
9991
9992 if (UseStartfiles) {
9993 // If you want startfiles, it means you want the builtin crti and crtbegin,
9994 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +00009995 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
9996 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009997 }
9998
9999 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10000 options::OPT_e, options::OPT_s, options::OPT_t,
10001 options::OPT_Z_Flag, options::OPT_r});
10002
Douglas Katzman674a3122015-11-18 16:24:46 +000010003 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010004
10005 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10006
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010007 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010008 if (C.getDriver().CCCIsCXX())
10009 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010010 if (T.getOS() == llvm::Triple::RTEMS) {
10011 CmdArgs.push_back("--start-group");
10012 CmdArgs.push_back("-lc");
10013 // You must provide your own "-L" option to enable finding these.
10014 CmdArgs.push_back("-lrtemscpu");
10015 CmdArgs.push_back("-lrtemsbsp");
10016 CmdArgs.push_back("--end-group");
10017 } else {
10018 CmdArgs.push_back("-lc");
10019 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010020 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010021 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010022 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010023 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10024 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010025 }
10026
10027 std::string Exec =
10028 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10029 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10030 CmdArgs, Inputs));
10031}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010032
10033void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10034 const InputInfo &Output,
10035 const InputInfoList &Inputs,
10036 const ArgList &Args,
10037 const char *LinkingOutput) const {
10038 claimNoWarnArgs(Args);
10039 ArgStringList CmdArgs;
10040
10041 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10042
10043 CmdArgs.push_back("-o");
10044 CmdArgs.push_back(Output.getFilename());
10045
10046 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10047 const InputInfo &Input = Inputs[0];
10048 assert(Input.isFilename() && "Invalid input.");
10049 CmdArgs.push_back(Input.getFilename());
10050
10051 const char *Exec =
10052 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10053 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10054}
10055
10056static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
10057 ArgStringList &CmdArgs) {
10058 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
10059 false) ||
10060 Args.hasArg(options::OPT_fprofile_generate) ||
10061 Args.hasArg(options::OPT_fprofile_instr_generate) ||
10062 Args.hasArg(options::OPT_fcreate_profile) ||
10063 Args.hasArg(options::OPT_coverage)))
10064 return;
10065
10066 assert(TC.getTriple().isPS4CPU() &&
10067 "Profiling libraries are only implemented for the PS4 CPU");
10068 CmdArgs.push_back("-lclang_rt.profile-x86_64");
10069}
10070
10071static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10072 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10073 if (SanArgs.needsUbsanRt()) {
10074 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10075 }
10076 if (SanArgs.needsAsanRt()) {
10077 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10078 }
10079}
10080
10081static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10082 const JobAction &JA, const InputInfo &Output,
10083 const InputInfoList &Inputs,
10084 const ArgList &Args,
10085 const char *LinkingOutput) {
10086 const toolchains::FreeBSD &ToolChain =
10087 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10088 const Driver &D = ToolChain.getDriver();
10089 ArgStringList CmdArgs;
10090
10091 // Silence warning for "clang -g foo.o -o foo"
10092 Args.ClaimAllArgs(options::OPT_g_Group);
10093 // and "clang -emit-llvm foo.o -o foo"
10094 Args.ClaimAllArgs(options::OPT_emit_llvm);
10095 // and for "clang -w foo.o -o foo". Other warning options are already
10096 // handled somewhere else.
10097 Args.ClaimAllArgs(options::OPT_w);
10098
10099 if (!D.SysRoot.empty())
10100 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10101
10102 if (Args.hasArg(options::OPT_pie))
10103 CmdArgs.push_back("-pie");
10104
10105 if (Args.hasArg(options::OPT_rdynamic))
10106 CmdArgs.push_back("-export-dynamic");
10107 if (Args.hasArg(options::OPT_shared))
10108 CmdArgs.push_back("--oformat=so");
10109
10110 if (Output.isFilename()) {
10111 CmdArgs.push_back("-o");
10112 CmdArgs.push_back(Output.getFilename());
10113 } else {
10114 assert(Output.isNothing() && "Invalid output.");
10115 }
10116
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010117 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10118
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010119 Args.AddAllArgs(CmdArgs, options::OPT_L);
10120 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10121 Args.AddAllArgs(CmdArgs, options::OPT_e);
10122 Args.AddAllArgs(CmdArgs, options::OPT_s);
10123 Args.AddAllArgs(CmdArgs, options::OPT_t);
10124 Args.AddAllArgs(CmdArgs, options::OPT_r);
10125
10126 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10127 CmdArgs.push_back("--no-demangle");
10128
10129 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10130
10131 if (Args.hasArg(options::OPT_pthread)) {
10132 CmdArgs.push_back("-lpthread");
10133 }
10134
10135 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010136
10137 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10138
10139 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10140}
10141
10142static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10143 const JobAction &JA, const InputInfo &Output,
10144 const InputInfoList &Inputs,
10145 const ArgList &Args,
10146 const char *LinkingOutput) {
10147 const toolchains::FreeBSD &ToolChain =
10148 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10149 const Driver &D = ToolChain.getDriver();
10150 ArgStringList CmdArgs;
10151
10152 // Silence warning for "clang -g foo.o -o foo"
10153 Args.ClaimAllArgs(options::OPT_g_Group);
10154 // and "clang -emit-llvm foo.o -o foo"
10155 Args.ClaimAllArgs(options::OPT_emit_llvm);
10156 // and for "clang -w foo.o -o foo". Other warning options are already
10157 // handled somewhere else.
10158 Args.ClaimAllArgs(options::OPT_w);
10159
10160 if (!D.SysRoot.empty())
10161 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10162
10163 if (Args.hasArg(options::OPT_pie))
10164 CmdArgs.push_back("-pie");
10165
10166 if (Args.hasArg(options::OPT_static)) {
10167 CmdArgs.push_back("-Bstatic");
10168 } else {
10169 if (Args.hasArg(options::OPT_rdynamic))
10170 CmdArgs.push_back("-export-dynamic");
10171 CmdArgs.push_back("--eh-frame-hdr");
10172 if (Args.hasArg(options::OPT_shared)) {
10173 CmdArgs.push_back("-Bshareable");
10174 } else {
10175 CmdArgs.push_back("-dynamic-linker");
10176 CmdArgs.push_back("/libexec/ld-elf.so.1");
10177 }
10178 CmdArgs.push_back("--enable-new-dtags");
10179 }
10180
10181 if (Output.isFilename()) {
10182 CmdArgs.push_back("-o");
10183 CmdArgs.push_back(Output.getFilename());
10184 } else {
10185 assert(Output.isNothing() && "Invalid output.");
10186 }
10187
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010188 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10189
Douglas Katzman78b37b02015-11-17 20:28:07 +000010190 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010191 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010192 if (!Args.hasArg(options::OPT_shared)) {
10193 if (Args.hasArg(options::OPT_pg))
10194 crt1 = "gcrt1.o";
10195 else if (Args.hasArg(options::OPT_pie))
10196 crt1 = "Scrt1.o";
10197 else
10198 crt1 = "crt1.o";
10199 }
10200 if (crt1)
10201 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10202
10203 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10204
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010205 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010206 if (Args.hasArg(options::OPT_static))
10207 crtbegin = "crtbeginT.o";
10208 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10209 crtbegin = "crtbeginS.o";
10210 else
10211 crtbegin = "crtbegin.o";
10212
10213 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10214 }
10215
10216 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010217 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010218 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10219 Args.AddAllArgs(CmdArgs, options::OPT_e);
10220 Args.AddAllArgs(CmdArgs, options::OPT_s);
10221 Args.AddAllArgs(CmdArgs, options::OPT_t);
10222 Args.AddAllArgs(CmdArgs, options::OPT_r);
10223
10224 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10225 CmdArgs.push_back("--no-demangle");
10226
10227 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10228
Douglas Katzman78b37b02015-11-17 20:28:07 +000010229 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010230 // For PS4, we always want to pass libm, libstdc++ and libkernel
10231 // libraries for both C and C++ compilations.
10232 CmdArgs.push_back("-lkernel");
10233 if (D.CCCIsCXX()) {
10234 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10235 if (Args.hasArg(options::OPT_pg))
10236 CmdArgs.push_back("-lm_p");
10237 else
10238 CmdArgs.push_back("-lm");
10239 }
10240 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10241 // the default system libraries. Just mimic this for now.
10242 if (Args.hasArg(options::OPT_pg))
10243 CmdArgs.push_back("-lgcc_p");
10244 else
10245 CmdArgs.push_back("-lcompiler_rt");
10246 if (Args.hasArg(options::OPT_static)) {
10247 CmdArgs.push_back("-lstdc++");
10248 } else if (Args.hasArg(options::OPT_pg)) {
10249 CmdArgs.push_back("-lgcc_eh_p");
10250 } else {
10251 CmdArgs.push_back("--as-needed");
10252 CmdArgs.push_back("-lstdc++");
10253 CmdArgs.push_back("--no-as-needed");
10254 }
10255
10256 if (Args.hasArg(options::OPT_pthread)) {
10257 if (Args.hasArg(options::OPT_pg))
10258 CmdArgs.push_back("-lpthread_p");
10259 else
10260 CmdArgs.push_back("-lpthread");
10261 }
10262
10263 if (Args.hasArg(options::OPT_pg)) {
10264 if (Args.hasArg(options::OPT_shared))
10265 CmdArgs.push_back("-lc");
10266 else {
10267 if (Args.hasArg(options::OPT_static)) {
10268 CmdArgs.push_back("--start-group");
10269 CmdArgs.push_back("-lc_p");
10270 CmdArgs.push_back("-lpthread_p");
10271 CmdArgs.push_back("--end-group");
10272 } else {
10273 CmdArgs.push_back("-lc_p");
10274 }
10275 }
10276 CmdArgs.push_back("-lgcc_p");
10277 } else {
10278 if (Args.hasArg(options::OPT_static)) {
10279 CmdArgs.push_back("--start-group");
10280 CmdArgs.push_back("-lc");
10281 CmdArgs.push_back("-lpthread");
10282 CmdArgs.push_back("--end-group");
10283 } else {
10284 CmdArgs.push_back("-lc");
10285 }
10286 CmdArgs.push_back("-lcompiler_rt");
10287 }
10288
10289 if (Args.hasArg(options::OPT_static)) {
10290 CmdArgs.push_back("-lstdc++");
10291 } else if (Args.hasArg(options::OPT_pg)) {
10292 CmdArgs.push_back("-lgcc_eh_p");
10293 } else {
10294 CmdArgs.push_back("--as-needed");
10295 CmdArgs.push_back("-lstdc++");
10296 CmdArgs.push_back("--no-as-needed");
10297 }
10298 }
10299
Douglas Katzman78b37b02015-11-17 20:28:07 +000010300 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010301 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10302 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10303 else
10304 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10305 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10306 }
10307
10308 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010309
10310 const char *Exec =
10311#ifdef LLVM_ON_WIN32
10312 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10313#else
10314 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10315#endif
10316
10317 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10318}
10319
10320void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10321 const InputInfo &Output,
10322 const InputInfoList &Inputs,
10323 const ArgList &Args,
10324 const char *LinkingOutput) const {
10325 const toolchains::FreeBSD &ToolChain =
10326 static_cast<const toolchains::FreeBSD &>(getToolChain());
10327 const Driver &D = ToolChain.getDriver();
10328 bool PS4Linker;
10329 StringRef LinkerOptName;
10330 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10331 LinkerOptName = A->getValue();
10332 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10333 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10334 }
10335
10336 if (LinkerOptName == "gold")
10337 PS4Linker = false;
10338 else if (LinkerOptName == "ps4")
10339 PS4Linker = true;
10340 else
10341 PS4Linker = !Args.hasArg(options::OPT_shared);
10342
10343 if (PS4Linker)
10344 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10345 else
10346 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10347}