blob: eb19a65c64e17b9819b098ecf47b0ab950f88c25 [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")
Oliver Stannard76afca72015-11-26 15:36:42 +00002034 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002035 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002036 .Case("nofp", "-fp-armv8")
2037 .Case("nosimd", "-neon")
2038 .Case("nocrc", "-crc")
2039 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002040 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002041 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002042 .Default(nullptr);
2043 if (result)
2044 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002045 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002046 D.Diag(diag::err_drv_no_neon_modifier);
2047 else
2048 return false;
2049 }
2050 return true;
2051}
2052
2053// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2054// decode CPU and feature.
2055static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2056 std::vector<const char *> &Features) {
2057 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2058 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002059 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
Christof Doumaba13ad52015-12-02 12:03:42 +00002060 CPU == "cortex-a72" || CPU == "cortex-a35") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002061 Features.push_back("+neon");
2062 Features.push_back("+crc");
2063 Features.push_back("+crypto");
2064 } else if (CPU == "generic") {
2065 Features.push_back("+neon");
2066 } else {
2067 return false;
2068 }
2069
2070 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2071 return false;
2072
2073 return true;
2074}
2075
2076static bool
2077getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2078 const ArgList &Args,
2079 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002080 std::string MarchLowerCase = March.lower();
2081 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002082
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002083 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002084 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002085 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002086 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002087 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2088 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002089 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002090 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002091 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002092
2093 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2094 return false;
2095
2096 return true;
2097}
2098
2099static bool
2100getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2101 const ArgList &Args,
2102 std::vector<const char *> &Features) {
2103 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002104 std::string McpuLowerCase = Mcpu.lower();
2105 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002106 return false;
2107
2108 return true;
2109}
2110
2111static bool
2112getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2113 const ArgList &Args,
2114 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002115 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002116 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002117 if (MtuneLowerCase == "native")
2118 MtuneLowerCase = llvm::sys::getHostCPUName();
2119 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002120 Features.push_back("+zcm");
2121 Features.push_back("+zcz");
2122 }
2123 return true;
2124}
2125
2126static bool
2127getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2128 const ArgList &Args,
2129 std::vector<const char *> &Features) {
2130 StringRef CPU;
2131 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002132 std::string McpuLowerCase = Mcpu.lower();
2133 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002134 return false;
2135
2136 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2137}
2138
Justin Bognerf9052562015-11-13 23:07:31 +00002139static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002140 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002141 Arg *A;
2142 bool success = true;
2143 // Enable NEON by default.
2144 Features.push_back("+neon");
2145 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2146 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2147 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2148 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002149 else if (Args.hasArg(options::OPT_arch))
2150 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2151 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002152
2153 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2154 success =
2155 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2156 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2157 success =
2158 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002159 else if (Args.hasArg(options::OPT_arch))
2160 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2161 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002162
2163 if (!success)
2164 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002165
2166 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2167 Features.push_back("-fp-armv8");
2168 Features.push_back("-crypto");
2169 Features.push_back("-neon");
2170 }
Bradley Smith418c5932014-05-02 15:17:51 +00002171
2172 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002173 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002174 if (A->getOption().matches(options::OPT_mcrc))
2175 Features.push_back("+crc");
2176 else
2177 Features.push_back("-crc");
2178 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002179
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002180 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2181 options::OPT_munaligned_access))
2182 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2183 Features.push_back("+strict-align");
2184
Justin Bognerf9052562015-11-13 23:07:31 +00002185 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002186 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002187}
2188
Dan Gohmanc2853072015-09-03 22:51:53 +00002189static void getWebAssemblyTargetFeatures(const ArgList &Args,
2190 std::vector<const char *> &Features) {
2191 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2192 StringRef Name = A->getOption().getName();
2193 A->claim();
2194
2195 // Skip over "-m".
2196 assert(Name.startswith("m") && "Invalid feature name.");
2197 Name = Name.substr(1);
2198
2199 bool IsNegative = Name.startswith("no-");
2200 if (IsNegative)
2201 Name = Name.substr(3);
2202
2203 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2204 }
2205}
2206
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002207static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002208 const ArgList &Args, ArgStringList &CmdArgs,
2209 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002210 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002211 std::vector<const char *> Features;
2212 switch (Triple.getArch()) {
2213 default:
2214 break;
2215 case llvm::Triple::mips:
2216 case llvm::Triple::mipsel:
2217 case llvm::Triple::mips64:
2218 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002219 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002220 break;
2221
2222 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002223 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002224 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002225 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002226 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002227 break;
2228
2229 case llvm::Triple::ppc:
2230 case llvm::Triple::ppc64:
2231 case llvm::Triple::ppc64le:
2232 getPPCTargetFeatures(Args, Features);
2233 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002234 case llvm::Triple::systemz:
2235 getSystemZTargetFeatures(Args, Features);
2236 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002237 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002238 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002239 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002240 break;
2241 case llvm::Triple::x86:
2242 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002243 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002244 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002245 case llvm::Triple::wasm32:
2246 case llvm::Triple::wasm64:
2247 getWebAssemblyTargetFeatures(Args, Features);
2248 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002249 }
Rafael Espindola43964802013-08-21 17:34:32 +00002250
2251 // Find the last of each feature.
2252 llvm::StringMap<unsigned> LastOpt;
2253 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2254 const char *Name = Features[I];
2255 assert(Name[0] == '-' || Name[0] == '+');
2256 LastOpt[Name + 1] = I;
2257 }
2258
2259 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2260 // If this feature was overridden, ignore it.
2261 const char *Name = Features[I];
2262 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2263 assert(LastI != LastOpt.end());
2264 unsigned Last = LastI->second;
2265 if (Last != I)
2266 continue;
2267
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002268 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002269 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002270 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002271}
2272
David Majnemerae394812014-12-09 00:12:30 +00002273static bool
2274shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2275 const llvm::Triple &Triple) {
2276 // We use the zero-cost exception tables for Objective-C if the non-fragile
2277 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2278 // later.
2279 if (runtime.isNonFragile())
2280 return true;
2281
2282 if (!Triple.isMacOSX())
2283 return false;
2284
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002285 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002286 (Triple.getArch() == llvm::Triple::x86_64 ||
2287 Triple.getArch() == llvm::Triple::arm));
2288}
2289
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002290/// Adds exception related arguments to the driver command arguments. There's a
2291/// master flag, -fexceptions and also language specific flags to enable/disable
2292/// C++ and Objective-C exceptions. This makes it possible to for example
2293/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002294static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002295 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002296 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002297 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002298 const Driver &D = TC.getDriver();
2299 const llvm::Triple &Triple = TC.getTriple();
2300
Chad Rosier4fab82c2012-03-26 22:04:46 +00002301 if (KernelOrKext) {
2302 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2303 // arguments now to avoid warnings about unused arguments.
2304 Args.ClaimAllArgs(options::OPT_fexceptions);
2305 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2306 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2307 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2308 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2309 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002310 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002311 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002312
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002313 // See if the user explicitly enabled exceptions.
2314 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2315 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002316
David Majnemerae394812014-12-09 00:12:30 +00002317 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2318 // is not necessarily sensible, but follows GCC.
2319 if (types::isObjC(InputType) &&
2320 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002321 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002322 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002323
David Majnemerae394812014-12-09 00:12:30 +00002324 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002325 }
2326
2327 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002328 // Disable C++ EH by default on XCore, PS4, and MSVC.
2329 // FIXME: Remove MSVC from this list once things work.
2330 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2331 !Triple.isPS4CPU() &&
2332 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002333 Arg *ExceptionArg = Args.getLastArg(
2334 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2335 options::OPT_fexceptions, options::OPT_fno_exceptions);
2336 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002337 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002338 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2339 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002340
2341 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002342 if (Triple.isPS4CPU()) {
2343 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2344 assert(ExceptionArg &&
2345 "On the PS4 exceptions should only be enabled if passing "
2346 "an argument");
2347 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2348 const Arg *RTTIArg = TC.getRTTIArg();
2349 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2350 D.Diag(diag::err_drv_argument_not_allowed_with)
2351 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2352 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2353 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2354 } else
2355 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2356
Anders Carlssone96ab552011-02-28 02:27:16 +00002357 CmdArgs.push_back("-fcxx-exceptions");
2358
David Majnemer8de68642014-12-05 08:11:58 +00002359 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002360 }
2361 }
2362
David Majnemer8de68642014-12-05 08:11:58 +00002363 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002364 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002365}
2366
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002367static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002368 bool Default = true;
2369 if (TC.getTriple().isOSDarwin()) {
2370 // The native darwin assembler doesn't support the linker_option directives,
2371 // so we disable them if we think the .s file will be passed to it.
2372 Default = TC.useIntegratedAs();
2373 }
2374 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2375 Default);
2376}
2377
Ted Kremenek62093662013-03-12 17:02:12 +00002378static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2379 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002380 bool UseDwarfDirectory =
2381 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2382 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002383 return !UseDwarfDirectory;
2384}
2385
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002386/// \brief Check whether the given input tree contains any compilation actions.
2387static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002388 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002389 return true;
2390
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002391 for (const auto &Act : *A)
2392 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002393 return true;
2394
2395 return false;
2396}
2397
2398/// \brief Check if -relax-all should be passed to the internal assembler.
2399/// This is done by default when compiling non-assembler source with -O0.
2400static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2401 bool RelaxDefault = true;
2402
2403 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2404 RelaxDefault = A->getOption().matches(options::OPT_O0);
2405
2406 if (RelaxDefault) {
2407 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002408 for (const auto &Act : C.getActions()) {
2409 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002410 RelaxDefault = true;
2411 break;
2412 }
2413 }
2414 }
2415
2416 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002417 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002418}
2419
Douglas Katzman3459ce22015-10-08 04:24:12 +00002420// Extract the integer N from a string spelled "-dwarf-N", returning 0
2421// on mismatch. The StringRef input (rather than an Arg) allows
2422// for use by the "-Xassembler" option parser.
2423static unsigned DwarfVersionNum(StringRef ArgValue) {
2424 return llvm::StringSwitch<unsigned>(ArgValue)
2425 .Case("-gdwarf-2", 2)
2426 .Case("-gdwarf-3", 3)
2427 .Case("-gdwarf-4", 4)
2428 .Default(0);
2429}
2430
2431static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2432 CodeGenOptions::DebugInfoKind DebugInfoKind,
2433 unsigned DwarfVersion) {
2434 switch (DebugInfoKind) {
2435 case CodeGenOptions::DebugLineTablesOnly:
2436 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2437 break;
2438 case CodeGenOptions::LimitedDebugInfo:
2439 CmdArgs.push_back("-debug-info-kind=limited");
2440 break;
2441 case CodeGenOptions::FullDebugInfo:
2442 CmdArgs.push_back("-debug-info-kind=standalone");
2443 break;
2444 default:
2445 break;
2446 }
2447 if (DwarfVersion > 0)
2448 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002449 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002450}
2451
David Blaikie9260ed62013-07-25 21:19:01 +00002452static void CollectArgsForIntegratedAssembler(Compilation &C,
2453 const ArgList &Args,
2454 ArgStringList &CmdArgs,
2455 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002456 if (UseRelaxAll(C, Args))
2457 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002458
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002459 // When passing -I arguments to the assembler we sometimes need to
2460 // unconditionally take the next argument. For example, when parsing
2461 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2462 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2463 // arg after parsing the '-I' arg.
2464 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002465
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002466 // When using an integrated assembler, translate -Wa, and -Xassembler
2467 // options.
2468 bool CompressDebugSections = false;
2469 for (const Arg *A :
2470 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2471 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002472
Benjamin Kramer72e64312015-09-24 14:48:49 +00002473 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002474 if (TakeNextArg) {
2475 CmdArgs.push_back(Value.data());
2476 TakeNextArg = false;
2477 continue;
2478 }
David Blaikie9260ed62013-07-25 21:19:01 +00002479
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002480 switch (C.getDefaultToolChain().getArch()) {
2481 default:
2482 break;
2483 case llvm::Triple::mips:
2484 case llvm::Triple::mipsel:
2485 case llvm::Triple::mips64:
2486 case llvm::Triple::mips64el:
2487 if (Value == "--trap") {
2488 CmdArgs.push_back("-target-feature");
2489 CmdArgs.push_back("+use-tcc-in-div");
2490 continue;
2491 }
2492 if (Value == "--break") {
2493 CmdArgs.push_back("-target-feature");
2494 CmdArgs.push_back("-use-tcc-in-div");
2495 continue;
2496 }
2497 if (Value.startswith("-msoft-float")) {
2498 CmdArgs.push_back("-target-feature");
2499 CmdArgs.push_back("+soft-float");
2500 continue;
2501 }
2502 if (Value.startswith("-mhard-float")) {
2503 CmdArgs.push_back("-target-feature");
2504 CmdArgs.push_back("-soft-float");
2505 continue;
2506 }
2507 break;
2508 }
2509
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002510 if (Value == "-force_cpusubtype_ALL") {
2511 // Do nothing, this is the default and we don't support anything else.
2512 } else if (Value == "-L") {
2513 CmdArgs.push_back("-msave-temp-labels");
2514 } else if (Value == "--fatal-warnings") {
2515 CmdArgs.push_back("-massembler-fatal-warnings");
2516 } else if (Value == "--noexecstack") {
2517 CmdArgs.push_back("-mnoexecstack");
2518 } else if (Value == "-compress-debug-sections" ||
2519 Value == "--compress-debug-sections") {
2520 CompressDebugSections = true;
2521 } else if (Value == "-nocompress-debug-sections" ||
2522 Value == "--nocompress-debug-sections") {
2523 CompressDebugSections = false;
2524 } else if (Value.startswith("-I")) {
2525 CmdArgs.push_back(Value.data());
2526 // We need to consume the next argument if the current arg is a plain
2527 // -I. The next arg will be the include directory.
2528 if (Value == "-I")
2529 TakeNextArg = true;
2530 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002531 // "-gdwarf-N" options are not cc1as options.
2532 unsigned DwarfVersion = DwarfVersionNum(Value);
2533 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2534 CmdArgs.push_back(Value.data());
2535 } else {
2536 RenderDebugEnablingArgs(
2537 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2538 }
Renato Golin7c542b42015-07-27 23:44:45 +00002539 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2540 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2541 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002542 } else {
2543 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002544 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002545 }
2546 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002547 }
2548 if (CompressDebugSections) {
2549 if (llvm::zlib::isAvailable())
2550 CmdArgs.push_back("-compress-debug-sections");
2551 else
2552 D.Diag(diag::warn_debug_compression_unavailable);
2553 }
David Blaikie9260ed62013-07-25 21:19:01 +00002554}
2555
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002556// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002557// FIXME: Make sure we can also emit shared objects if they're requested
2558// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002559static void addClangRT(const ToolChain &TC, const ArgList &Args,
2560 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002561 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002562}
2563
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002564namespace {
2565enum OpenMPRuntimeKind {
2566 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2567 /// without knowing what runtime to target.
2568 OMPRT_Unknown,
2569
2570 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2571 /// the default for Clang.
2572 OMPRT_OMP,
2573
2574 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2575 /// this runtime but can swallow the pragmas, and find and link against the
2576 /// runtime library itself.
2577 OMPRT_GOMP,
2578
Chandler Carruthc6625c62015-05-28 21:10:31 +00002579 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002580 /// OpenMP runtime. We support this mode for users with existing dependencies
2581 /// on this runtime library name.
2582 OMPRT_IOMP5
2583};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002584}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002585
2586/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002587static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2588 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002589 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2590
2591 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2592 if (A)
2593 RuntimeName = A->getValue();
2594
2595 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002596 .Case("libomp", OMPRT_OMP)
2597 .Case("libgomp", OMPRT_GOMP)
2598 .Case("libiomp5", OMPRT_IOMP5)
2599 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002600
2601 if (RT == OMPRT_Unknown) {
2602 if (A)
2603 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002604 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002605 else
2606 // FIXME: We could use a nicer diagnostic here.
2607 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2608 }
2609
2610 return RT;
2611}
2612
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002613static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2614 const ArgList &Args) {
2615 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2616 options::OPT_fno_openmp, false))
2617 return;
2618
2619 switch (getOpenMPRuntime(TC, Args)) {
2620 case OMPRT_OMP:
2621 CmdArgs.push_back("-lomp");
2622 break;
2623 case OMPRT_GOMP:
2624 CmdArgs.push_back("-lgomp");
2625 break;
2626 case OMPRT_IOMP5:
2627 CmdArgs.push_back("-liomp5");
2628 break;
2629 case OMPRT_Unknown:
2630 // Already diagnosed.
2631 break;
2632 }
2633}
2634
Alexey Samsonov52550342014-09-15 19:58:40 +00002635static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2636 ArgStringList &CmdArgs, StringRef Sanitizer,
2637 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002638 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002639 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002640 if (!IsShared) CmdArgs.push_back("-whole-archive");
2641 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2642 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002643}
2644
Alexey Samsonov52550342014-09-15 19:58:40 +00002645// Tries to use a file with the list of dynamic symbols that need to be exported
2646// from the runtime library. Returns true if the file was found.
2647static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2648 ArgStringList &CmdArgs,
2649 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002650 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002651 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2652 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002653 return true;
2654 }
2655 return false;
2656}
2657
2658static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2659 ArgStringList &CmdArgs) {
2660 // Force linking against the system libraries sanitizers depends on
2661 // (see PR15823 why this is necessary).
2662 CmdArgs.push_back("--no-as-needed");
2663 CmdArgs.push_back("-lpthread");
2664 CmdArgs.push_back("-lrt");
2665 CmdArgs.push_back("-lm");
2666 // There's no libdl on FreeBSD.
2667 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2668 CmdArgs.push_back("-ldl");
2669}
2670
2671static void
2672collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2673 SmallVectorImpl<StringRef> &SharedRuntimes,
2674 SmallVectorImpl<StringRef> &StaticRuntimes,
2675 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2676 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2677 // Collect shared runtimes.
2678 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2679 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002680 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002681
Alexey Samsonov52550342014-09-15 19:58:40 +00002682 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002683 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002684 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002685 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002686 }
2687 if (SanArgs.needsAsanRt()) {
2688 if (SanArgs.needsSharedAsanRt()) {
2689 HelperStaticRuntimes.push_back("asan-preinit");
2690 } else {
2691 StaticRuntimes.push_back("asan");
2692 if (SanArgs.linkCXXRuntimes())
2693 StaticRuntimes.push_back("asan_cxx");
2694 }
2695 }
2696 if (SanArgs.needsDfsanRt())
2697 StaticRuntimes.push_back("dfsan");
2698 if (SanArgs.needsLsanRt())
2699 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002700 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002701 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002702 if (SanArgs.linkCXXRuntimes())
2703 StaticRuntimes.push_back("msan_cxx");
2704 }
2705 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002706 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002707 if (SanArgs.linkCXXRuntimes())
2708 StaticRuntimes.push_back("tsan_cxx");
2709 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002710 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002711 StaticRuntimes.push_back("ubsan_standalone");
2712 if (SanArgs.linkCXXRuntimes())
2713 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002714 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002715 if (SanArgs.needsSafeStackRt())
2716 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002717}
2718
Alexey Samsonov52550342014-09-15 19:58:40 +00002719// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2720// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2721static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002722 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002723 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2724 HelperStaticRuntimes;
2725 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2726 HelperStaticRuntimes);
2727 for (auto RT : SharedRuntimes)
2728 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2729 for (auto RT : HelperStaticRuntimes)
2730 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2731 bool AddExportDynamic = false;
2732 for (auto RT : StaticRuntimes) {
2733 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2734 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2735 }
2736 // If there is a static runtime with no dynamic list, force all the symbols
2737 // to be dynamic to be sure we export sanitizer interface functions.
2738 if (AddExportDynamic)
2739 CmdArgs.push_back("-export-dynamic");
2740 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002741}
2742
Reid Kleckner86ea7702015-02-04 23:45:07 +00002743static bool areOptimizationsEnabled(const ArgList &Args) {
2744 // Find the last -O arg and see if it is non-zero.
2745 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2746 return !A->getOption().matches(options::OPT_O0);
2747 // Defaults to -O0.
2748 return false;
2749}
2750
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002751static bool shouldUseFramePointerForTarget(const ArgList &Args,
2752 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002753 switch (Triple.getArch()) {
2754 case llvm::Triple::xcore:
2755 case llvm::Triple::wasm32:
2756 case llvm::Triple::wasm64:
2757 // XCore never wants frame pointers, regardless of OS.
2758 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002759 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002760 default:
2761 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002762 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002763
2764 if (Triple.isOSLinux()) {
2765 switch (Triple.getArch()) {
2766 // Don't use a frame pointer on linux if optimizing for certain targets.
2767 case llvm::Triple::mips64:
2768 case llvm::Triple::mips64el:
2769 case llvm::Triple::mips:
2770 case llvm::Triple::mipsel:
2771 case llvm::Triple::systemz:
2772 case llvm::Triple::x86:
2773 case llvm::Triple::x86_64:
2774 return !areOptimizationsEnabled(Args);
2775 default:
2776 return true;
2777 }
2778 }
2779
2780 if (Triple.isOSWindows()) {
2781 switch (Triple.getArch()) {
2782 case llvm::Triple::x86:
2783 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002784 case llvm::Triple::arm:
2785 case llvm::Triple::thumb:
2786 // Windows on ARM builds with FPO disabled to aid fast stack walking
2787 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002788 default:
2789 // All other supported Windows ISAs use xdata unwind information, so frame
2790 // pointers are not generally useful.
2791 return false;
2792 }
2793 }
2794
2795 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002796}
2797
Rafael Espindola224dd632011-12-14 21:02:23 +00002798static bool shouldUseFramePointer(const ArgList &Args,
2799 const llvm::Triple &Triple) {
2800 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2801 options::OPT_fomit_frame_pointer))
2802 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002803 if (Args.hasArg(options::OPT_pg))
2804 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002805
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002806 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002807}
2808
Eric Christopherb7d97e92013-04-03 01:58:53 +00002809static bool shouldUseLeafFramePointer(const ArgList &Args,
2810 const llvm::Triple &Triple) {
2811 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2812 options::OPT_momit_leaf_frame_pointer))
2813 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002814 if (Args.hasArg(options::OPT_pg))
2815 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002816
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002817 if (Triple.isPS4CPU())
2818 return false;
2819
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002820 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002821}
2822
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002823/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002824static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002825 SmallString<128> cwd;
2826 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002827 CmdArgs.push_back("-fdebug-compilation-dir");
2828 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002829 }
2830}
2831
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002832static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002833 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2834 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2835 SmallString<128> T(FinalOutput->getValue());
2836 llvm::sys::path::replace_extension(T, "dwo");
2837 return Args.MakeArgString(T);
2838 } else {
2839 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002840 SmallString<128> T(
2841 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002842 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002843 llvm::sys::path::replace_extension(F, "dwo");
2844 T += F;
2845 return Args.MakeArgString(F);
2846 }
2847}
2848
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002849static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2850 const JobAction &JA, const ArgList &Args,
2851 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002852 ArgStringList ExtractArgs;
2853 ExtractArgs.push_back("--extract-dwo");
2854
2855 ArgStringList StripArgs;
2856 StripArgs.push_back("--strip-dwo");
2857
2858 // Grabbing the output of the earlier compile step.
2859 StripArgs.push_back(Output.getFilename());
2860 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002861 ExtractArgs.push_back(OutFile);
2862
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002863 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002864 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002865
2866 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002867 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002868
2869 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002870 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002871}
2872
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002873/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002874/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2875static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002876 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002877 if (A->getOption().matches(options::OPT_O4) ||
2878 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002879 return true;
2880
2881 if (A->getOption().matches(options::OPT_O0))
2882 return false;
2883
2884 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2885
Rafael Espindola91780de2013-08-26 14:05:41 +00002886 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002887 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002888 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002889 return true;
2890
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002891 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002892 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002893 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002894
2895 unsigned OptLevel = 0;
2896 if (S.getAsInteger(10, OptLevel))
2897 return false;
2898
2899 return OptLevel > 1;
2900 }
2901
2902 return false;
2903}
2904
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002905/// Add -x lang to \p CmdArgs for \p Input.
2906static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2907 ArgStringList &CmdArgs) {
2908 // When using -verify-pch, we don't want to provide the type
2909 // 'precompiled-header' if it was inferred from the file extension
2910 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2911 return;
2912
2913 CmdArgs.push_back("-x");
2914 if (Args.hasArg(options::OPT_rewrite_objc))
2915 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2916 else
2917 CmdArgs.push_back(types::getTypeName(Input.getType()));
2918}
2919
David Majnemerc371ff02015-03-22 08:39:22 +00002920static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002921 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002922 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002923
2924 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002925 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002926
2927 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002928 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002929 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002930 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002931}
2932
Rafael Espindola577637a2015-01-03 00:06:04 +00002933// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002934// options that build systems might add but are unused when assembling or only
2935// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002936static void claimNoWarnArgs(const ArgList &Args) {
2937 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002938 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00002939 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00002940 Args.ClaimAllArgs(options::OPT_flto);
2941 Args.ClaimAllArgs(options::OPT_fno_lto);
2942}
2943
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002944static void appendUserToPath(SmallVectorImpl<char> &Result) {
2945#ifdef LLVM_ON_UNIX
2946 const char *Username = getenv("LOGNAME");
2947#else
2948 const char *Username = getenv("USERNAME");
2949#endif
2950 if (Username) {
2951 // Validate that LoginName can be used in a path, and get its length.
2952 size_t Len = 0;
2953 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002954 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002955 Username = nullptr;
2956 break;
2957 }
2958 }
2959
2960 if (Username && Len > 0) {
2961 Result.append(Username, Username + Len);
2962 return;
2963 }
2964 }
2965
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002966// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002967#ifdef LLVM_ON_UNIX
2968 std::string UID = llvm::utostr(getuid());
2969#else
2970 // FIXME: Windows seems to have an 'SID' that might work.
2971 std::string UID = "9999";
2972#endif
2973 Result.append(UID.begin(), UID.end());
2974}
2975
David Majnemere11d3732015-06-08 00:22:46 +00002976VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2977 const llvm::Triple &Triple,
2978 const llvm::opt::ArgList &Args,
2979 bool IsWindowsMSVC) {
2980 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2981 IsWindowsMSVC) ||
2982 Args.hasArg(options::OPT_fmsc_version) ||
2983 Args.hasArg(options::OPT_fms_compatibility_version)) {
2984 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2985 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002986 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002987
2988 if (MSCVersion && MSCompatibilityVersion) {
2989 if (D)
2990 D->Diag(diag::err_drv_argument_not_allowed_with)
2991 << MSCVersion->getAsString(Args)
2992 << MSCompatibilityVersion->getAsString(Args);
2993 return VersionTuple();
2994 }
2995
2996 if (MSCompatibilityVersion) {
2997 VersionTuple MSVT;
2998 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2999 D->Diag(diag::err_drv_invalid_value)
3000 << MSCompatibilityVersion->getAsString(Args)
3001 << MSCompatibilityVersion->getValue();
3002 return MSVT;
3003 }
3004
3005 if (MSCVersion) {
3006 unsigned Version = 0;
3007 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3008 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3009 << MSCVersion->getValue();
3010 return getMSCompatibilityVersion(Version);
3011 }
3012
3013 unsigned Major, Minor, Micro;
3014 Triple.getEnvironmentVersion(Major, Minor, Micro);
3015 if (Major || Minor || Micro)
3016 return VersionTuple(Major, Minor, Micro);
3017
3018 return VersionTuple(18);
3019 }
3020 return VersionTuple();
3021}
3022
Diego Novilloa0545962015-07-10 18:00:07 +00003023static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3024 const InputInfo &Output, const ArgList &Args,
3025 ArgStringList &CmdArgs) {
3026 auto *ProfileGenerateArg = Args.getLastArg(
3027 options::OPT_fprofile_instr_generate,
3028 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003029 options::OPT_fprofile_generate_EQ,
3030 options::OPT_fno_profile_instr_generate);
3031 if (ProfileGenerateArg &&
3032 ProfileGenerateArg->getOption().matches(
3033 options::OPT_fno_profile_instr_generate))
3034 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003035
3036 auto *ProfileUseArg = Args.getLastArg(
3037 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003038 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3039 options::OPT_fno_profile_instr_use);
3040 if (ProfileUseArg &&
3041 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3042 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003043
3044 if (ProfileGenerateArg && ProfileUseArg)
3045 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003046 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003047
Diego Novillo758f3f52015-08-05 21:49:51 +00003048 if (ProfileGenerateArg) {
3049 if (ProfileGenerateArg->getOption().matches(
3050 options::OPT_fprofile_instr_generate_EQ))
3051 ProfileGenerateArg->render(Args, CmdArgs);
3052 else if (ProfileGenerateArg->getOption().matches(
3053 options::OPT_fprofile_generate_EQ)) {
3054 SmallString<128> Path(ProfileGenerateArg->getValue());
3055 llvm::sys::path::append(Path, "default.profraw");
3056 CmdArgs.push_back(
3057 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3058 } else
3059 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3060 }
Diego Novilloa0545962015-07-10 18:00:07 +00003061
Diego Novillo758f3f52015-08-05 21:49:51 +00003062 if (ProfileUseArg) {
3063 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3064 ProfileUseArg->render(Args, CmdArgs);
3065 else if ((ProfileUseArg->getOption().matches(
3066 options::OPT_fprofile_use_EQ) ||
3067 ProfileUseArg->getOption().matches(
3068 options::OPT_fprofile_instr_use))) {
3069 SmallString<128> Path(
3070 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3071 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3072 llvm::sys::path::append(Path, "default.profdata");
3073 CmdArgs.push_back(
3074 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3075 }
Diego Novilloa0545962015-07-10 18:00:07 +00003076 }
3077
3078 if (Args.hasArg(options::OPT_ftest_coverage) ||
3079 Args.hasArg(options::OPT_coverage))
3080 CmdArgs.push_back("-femit-coverage-notes");
3081 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3082 false) ||
3083 Args.hasArg(options::OPT_coverage))
3084 CmdArgs.push_back("-femit-coverage-data");
3085
Diego Novilloc4b94da2015-08-05 23:27:40 +00003086 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3087 options::OPT_fno_coverage_mapping, false) &&
3088 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003089 D.Diag(diag::err_drv_argument_only_allowed_with)
3090 << "-fcoverage-mapping"
3091 << "-fprofile-instr-generate";
3092
Diego Novilloc4b94da2015-08-05 23:27:40 +00003093 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3094 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003095 CmdArgs.push_back("-fcoverage-mapping");
3096
3097 if (C.getArgs().hasArg(options::OPT_c) ||
3098 C.getArgs().hasArg(options::OPT_S)) {
3099 if (Output.isFilename()) {
3100 CmdArgs.push_back("-coverage-file");
3101 SmallString<128> CoverageFilename;
3102 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3103 CoverageFilename = FinalOutput->getValue();
3104 } else {
3105 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3106 }
3107 if (llvm::sys::path::is_relative(CoverageFilename)) {
3108 SmallString<128> Pwd;
3109 if (!llvm::sys::fs::current_path(Pwd)) {
3110 llvm::sys::path::append(Pwd, CoverageFilename);
3111 CoverageFilename.swap(Pwd);
3112 }
3113 }
3114 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3115 }
3116 }
3117}
3118
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003119/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3120/// smooshes them together with platform defaults, to decide whether
3121/// this compile should be using PIC mode or not. Returns a tuple of
3122/// (RelocationModel, PICLevel, IsPIE).
3123static std::tuple<llvm::Reloc::Model, unsigned, bool>
3124ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3125 const ArgList &Args) {
3126 // FIXME: why does this code...and so much everywhere else, use both
3127 // ToolChain.getTriple() and Triple?
3128 bool PIE = ToolChain.isPIEDefault();
3129 bool PIC = PIE || ToolChain.isPICDefault();
3130 bool IsPICLevelTwo = PIC;
3131
3132 bool KernelOrKext =
3133 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3134
3135 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003136 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003137 switch (ToolChain.getArch()) {
3138 case llvm::Triple::arm:
3139 case llvm::Triple::armeb:
3140 case llvm::Triple::thumb:
3141 case llvm::Triple::thumbeb:
3142 case llvm::Triple::aarch64:
3143 case llvm::Triple::mips:
3144 case llvm::Triple::mipsel:
3145 case llvm::Triple::mips64:
3146 case llvm::Triple::mips64el:
3147 PIC = true; // "-fpic"
3148 break;
3149
3150 case llvm::Triple::x86:
3151 case llvm::Triple::x86_64:
3152 PIC = true; // "-fPIC"
3153 IsPICLevelTwo = true;
3154 break;
3155
3156 default:
3157 break;
3158 }
3159 }
3160
3161 // OpenBSD-specific defaults for PIE
3162 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3163 switch (ToolChain.getArch()) {
3164 case llvm::Triple::mips64:
3165 case llvm::Triple::mips64el:
3166 case llvm::Triple::sparcel:
3167 case llvm::Triple::x86:
3168 case llvm::Triple::x86_64:
3169 IsPICLevelTwo = false; // "-fpie"
3170 break;
3171
3172 case llvm::Triple::ppc:
3173 case llvm::Triple::sparc:
3174 case llvm::Triple::sparcv9:
3175 IsPICLevelTwo = true; // "-fPIE"
3176 break;
3177
3178 default:
3179 break;
3180 }
3181 }
3182
3183 // The last argument relating to either PIC or PIE wins, and no
3184 // other argument is used. If the last argument is any flavor of the
3185 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3186 // option implicitly enables PIC at the same level.
3187 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3188 options::OPT_fpic, options::OPT_fno_pic,
3189 options::OPT_fPIE, options::OPT_fno_PIE,
3190 options::OPT_fpie, options::OPT_fno_pie);
3191 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3192 // is forced, then neither PIC nor PIE flags will have no effect.
3193 if (!ToolChain.isPICDefaultForced()) {
3194 if (LastPICArg) {
3195 Option O = LastPICArg->getOption();
3196 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3197 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3198 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3199 PIC =
3200 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3201 IsPICLevelTwo =
3202 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3203 } else {
3204 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003205 if (Triple.isPS4CPU()) {
3206 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3207 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3208 if (Model != "kernel") {
3209 PIC = true;
3210 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3211 << LastPICArg->getSpelling();
3212 }
3213 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003214 }
3215 }
3216 }
3217
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003218 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3219 // PIC level would've been set to level 1, force it back to level 2 PIC
3220 // instead.
3221 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003222 IsPICLevelTwo |= ToolChain.isPICDefault();
3223
James Y Knightc4015d32015-08-21 04:14:55 +00003224 // This kernel flags are a trump-card: they will disable PIC/PIE
3225 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003226 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3227 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003228 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003229
3230 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3231 // This is a very special mode. It trumps the other modes, almost no one
3232 // uses it, and it isn't even valid on any OS but Darwin.
3233 if (!ToolChain.getTriple().isOSDarwin())
3234 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3235 << A->getSpelling() << ToolChain.getTriple().str();
3236
3237 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3238
3239 // Only a forced PIC mode can cause the actual compile to have PIC defines
3240 // etc., no flags are sufficient. This behavior was selected to closely
3241 // match that of llvm-gcc and Apple GCC before that.
3242 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3243
3244 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3245 }
3246
3247 if (PIC)
3248 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3249
3250 return std::make_tuple(llvm::Reloc::Static, 0, false);
3251}
3252
3253static const char *RelocationModelName(llvm::Reloc::Model Model) {
3254 switch (Model) {
3255 case llvm::Reloc::Default:
3256 return nullptr;
3257 case llvm::Reloc::Static:
3258 return "static";
3259 case llvm::Reloc::PIC_:
3260 return "pic";
3261 case llvm::Reloc::DynamicNoPIC:
3262 return "dynamic-no-pic";
3263 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003264 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003265}
3266
3267static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3268 ArgStringList &CmdArgs) {
3269 llvm::Reloc::Model RelocationModel;
3270 unsigned PICLevel;
3271 bool IsPIE;
3272 std::tie(RelocationModel, PICLevel, IsPIE) =
3273 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3274
3275 if (RelocationModel != llvm::Reloc::Static)
3276 CmdArgs.push_back("-KPIC");
3277}
3278
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003279void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003280 const InputInfo &Output, const InputInfoList &Inputs,
3281 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003282 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3283 const llvm::Triple Triple(TripleStr);
3284
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003285 bool KernelOrKext =
3286 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003287 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003288 ArgStringList CmdArgs;
3289
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003290 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003291 bool IsWindowsCygnus =
3292 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003293 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003294 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003295
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003296 // Check number of inputs for sanity. We need at least one input.
3297 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003298 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003299 // CUDA compilation may have multiple inputs (source file + results of
3300 // device-side compilations). All other jobs are expected to have exactly one
3301 // input.
3302 bool IsCuda = types::isCuda(Input.getType());
3303 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003304
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003305 // Invoke ourselves in -cc1 mode.
3306 //
3307 // FIXME: Implement custom jobs for internal actions.
3308 CmdArgs.push_back("-cc1");
3309
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003310 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003311 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003312 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003313
Artem Belevichfa11ab52015-11-17 22:28:46 +00003314 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003315 if (IsCuda) {
3316 // FIXME: We need a (better) way to pass information about
3317 // particular compilation pass we're constructing here. For now we
3318 // can check which toolchain we're using and pick the other one to
3319 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003320 if (&getToolChain() == C.getCudaDeviceToolChain())
3321 AuxToolChain = C.getCudaHostToolChain();
3322 else if (&getToolChain() == C.getCudaHostToolChain())
3323 AuxToolChain = C.getCudaDeviceToolChain();
3324 else
3325 llvm_unreachable("Can't figure out CUDA compilation mode.");
3326 assert(AuxToolChain != nullptr && "No aux toolchain.");
3327 CmdArgs.push_back("-aux-triple");
3328 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003329 CmdArgs.push_back("-fcuda-target-overloads");
3330 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003331 }
3332
James Y Knight2db38f32015-08-15 03:45:25 +00003333 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3334 Triple.getArch() == llvm::Triple::thumb)) {
3335 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003336 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003337 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003338 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003339 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003340 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003341 }
3342
Tim Northover336f1892014-03-29 13:16:12 +00003343 // Push all default warning arguments that are specific to
3344 // the given target. These come before user provided warning options
3345 // are provided.
3346 getToolChain().addClangWarningOptions(CmdArgs);
3347
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003348 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003349 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003350
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003351 if (isa<AnalyzeJobAction>(JA)) {
3352 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3353 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003354 } else if (isa<MigrateJobAction>(JA)) {
3355 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003356 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003357 if (Output.getType() == types::TY_Dependencies)
3358 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003359 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003360 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003361 if (Args.hasArg(options::OPT_rewrite_objc) &&
3362 !Args.hasArg(options::OPT_g_Group))
3363 CmdArgs.push_back("-P");
3364 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003365 } else if (isa<AssembleJobAction>(JA)) {
3366 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003367
David Blaikie9260ed62013-07-25 21:19:01 +00003368 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003369
3370 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003371 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003372 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003373 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003374 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003375
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003376 if (JA.getType() == types::TY_Nothing)
3377 CmdArgs.push_back("-fsyntax-only");
3378 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003379 CmdArgs.push_back("-emit-pch");
3380 else
3381 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003382 } else if (isa<VerifyPCHJobAction>(JA)) {
3383 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003384 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003385 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3386 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003387 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003388 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003389 } else if (JA.getType() == types::TY_LLVM_IR ||
3390 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003391 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003392 } else if (JA.getType() == types::TY_LLVM_BC ||
3393 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003394 CmdArgs.push_back("-emit-llvm-bc");
3395 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003396 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003397 } else if (JA.getType() == types::TY_AST) {
3398 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003399 } else if (JA.getType() == types::TY_ModuleFile) {
3400 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003401 } else if (JA.getType() == types::TY_RewrittenObjC) {
3402 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003403 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003404 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3405 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003406 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003407 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003408 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003409 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003410
3411 // Preserve use-list order by default when emitting bitcode, so that
3412 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3413 // same result as running passes here. For LTO, we don't need to preserve
3414 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003415 if (JA.getType() == types::TY_LLVM_BC)
3416 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003417
3418 if (D.isUsingLTO())
3419 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003420 }
3421
Teresa Johnsonaff22322015-12-07 19:21:34 +00003422 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3423 if (!types::isLLVMIR(Input.getType()))
3424 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3425 << "-x ir";
3426 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3427 }
3428
Justin Bognera88f0122014-06-20 22:59:50 +00003429 // We normally speed up the clang process a bit by skipping destructors at
3430 // exit, but when we're generating diagnostics we can rely on some of the
3431 // cleanup.
3432 if (!C.isForDiagnostics())
3433 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003434
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003435// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003436#ifdef NDEBUG
3437 CmdArgs.push_back("-disable-llvm-verifier");
3438#endif
3439
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003440 // Set the main file name, so that debug info works even with
3441 // -save-temps.
3442 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003443 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003444
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003445 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003446 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003447 if (Args.hasArg(options::OPT_static))
3448 CmdArgs.push_back("-static-define");
3449
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003450 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003451 // Enable region store model by default.
3452 CmdArgs.push_back("-analyzer-store=region");
3453
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003454 // Treat blocks as analysis entry points.
3455 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3456
Ted Kremenek49c79792011-03-24 00:28:47 +00003457 CmdArgs.push_back("-analyzer-eagerly-assume");
3458
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003459 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003460 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003461 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003462
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003463 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003464 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003465
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003466 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003467 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003468
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003469 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003470
Artem Belevichba558952015-05-06 18:20:23 +00003471 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003472 CmdArgs.push_back("-analyzer-checker=cplusplus");
3473
Nico Webere8e53112014-05-11 01:04:02 +00003474 // Enable the following experimental checkers for testing.
3475 CmdArgs.push_back(
3476 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003477 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3478 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003479 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003480 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3481 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003482
3483 // Default nullability checks.
3484 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3485 CmdArgs.push_back(
3486 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003487 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003488
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003489 // Set the output format. The default is plist, for (lame) historical
3490 // reasons.
3491 CmdArgs.push_back("-analyzer-output");
3492 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003493 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003494 else
3495 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003496
Ted Kremenekfe449a22010-03-22 22:32:05 +00003497 // Disable the presentation of standard compiler warnings when
3498 // using --analyze. We only want to show static analyzer diagnostics
3499 // or frontend errors.
3500 CmdArgs.push_back("-w");
3501
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003502 // Add -Xanalyzer arguments when running as analyzer.
3503 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003504 }
3505
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003506 CheckCodeGenerationOptions(D, Args);
3507
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003508 llvm::Reloc::Model RelocationModel;
3509 unsigned PICLevel;
3510 bool IsPIE;
3511 std::tie(RelocationModel, PICLevel, IsPIE) =
3512 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003513
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003514 const char *RMName = RelocationModelName(RelocationModel);
3515 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003516 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003517 CmdArgs.push_back(RMName);
3518 }
3519 if (PICLevel > 0) {
3520 CmdArgs.push_back("-pic-level");
3521 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3522 if (IsPIE) {
3523 CmdArgs.push_back("-pie-level");
3524 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003525 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003526 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003527
Renato Golin4854d802015-11-09 12:40:41 +00003528 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3529 CmdArgs.push_back("-meabi");
3530 CmdArgs.push_back(A->getValue());
3531 }
3532
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003533 CmdArgs.push_back("-mthread-model");
3534 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3535 CmdArgs.push_back(A->getValue());
3536 else
3537 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3538
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003539 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3540
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003541 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3542 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003543 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003544
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003545 // LLVM Code Generator Options.
3546
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003547 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3548 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003549 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3550 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003551 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003552 CmdArgs.push_back(A->getValue());
3553 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003554 }
3555 }
3556
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003557 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3558 StringRef v = A->getValue();
3559 CmdArgs.push_back("-mllvm");
3560 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3561 A->claim();
3562 }
3563
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003564 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3565 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003566 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003567 }
3568
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003569 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3570 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003571 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003572 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003573 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003574 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3575 CmdArgs.push_back("-fpcc-struct-return");
3576 } else {
3577 assert(A->getOption().matches(options::OPT_freg_struct_return));
3578 CmdArgs.push_back("-freg-struct-return");
3579 }
3580 }
3581
Roman Divacky65b88cd2011-03-01 17:40:53 +00003582 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3583 CmdArgs.push_back("-mrtd");
3584
Rafael Espindola224dd632011-12-14 21:02:23 +00003585 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003586 CmdArgs.push_back("-mdisable-fp-elim");
3587 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3588 options::OPT_fno_zero_initialized_in_bss))
3589 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003590
3591 bool OFastEnabled = isOptimizationLevelFast(Args);
3592 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3593 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003594 OptSpecifier StrictAliasingAliasOption =
3595 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003596 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3597 // doesn't do any TBAA.
3598 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003599 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003600 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003601 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003602 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3603 options::OPT_fno_struct_path_tbaa))
3604 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003605 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3606 false))
3607 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003608 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3609 options::OPT_fno_strict_vtable_pointers,
3610 false))
3611 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003612 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3613 options::OPT_fno_optimize_sibling_calls))
3614 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003615
Eric Christopher006208c2013-04-04 06:29:47 +00003616 // Handle segmented stacks.
3617 if (Args.hasArg(options::OPT_fsplit_stack))
3618 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003619
3620 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3621 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003622 OptSpecifier FastMathAliasOption =
3623 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3624
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003625 // Handle various floating point optimization flags, mapping them to the
3626 // appropriate LLVM code generation flags. The pattern for all of these is to
3627 // default off the codegen optimizations, and if any flag enables them and no
3628 // flag disables them after the flag enabling them, enable the codegen
3629 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003630 if (Arg *A = Args.getLastArg(
3631 options::OPT_ffast_math, FastMathAliasOption,
3632 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3633 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3634 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003635 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3636 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003637 A->getOption().getID() != options::OPT_fhonor_infinities)
3638 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003639 if (Arg *A = Args.getLastArg(
3640 options::OPT_ffast_math, FastMathAliasOption,
3641 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3642 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3643 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003644 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3645 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003646 A->getOption().getID() != options::OPT_fhonor_nans)
3647 CmdArgs.push_back("-menable-no-nans");
3648
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003649 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3650 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003651 if (Arg *A =
3652 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3653 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3654 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003655 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3656 // However, turning *off* -ffast_math merely restores the toolchain default
3657 // (which may be false).
3658 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3659 A->getOption().getID() == options::OPT_ffast_math ||
3660 A->getOption().getID() == options::OPT_Ofast)
3661 MathErrno = false;
3662 else if (A->getOption().getID() == options::OPT_fmath_errno)
3663 MathErrno = true;
3664 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003665 if (MathErrno)
3666 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003667
3668 // There are several flags which require disabling very specific
3669 // optimizations. Any of these being disabled forces us to turn off the
3670 // entire set of LLVM optimizations, so collect them through all the flag
3671 // madness.
3672 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003673 if (Arg *A = Args.getLastArg(
3674 options::OPT_ffast_math, FastMathAliasOption,
3675 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3676 options::OPT_fno_unsafe_math_optimizations,
3677 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003678 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3679 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003680 A->getOption().getID() != options::OPT_fno_associative_math)
3681 AssociativeMath = true;
3682 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003683 if (Arg *A = Args.getLastArg(
3684 options::OPT_ffast_math, FastMathAliasOption,
3685 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3686 options::OPT_fno_unsafe_math_optimizations,
3687 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003688 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3689 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003690 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3691 ReciprocalMath = true;
3692 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003693 if (Arg *A = Args.getLastArg(
3694 options::OPT_ffast_math, FastMathAliasOption,
3695 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3696 options::OPT_fno_unsafe_math_optimizations,
3697 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003698 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3699 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003700 A->getOption().getID() != options::OPT_fsigned_zeros)
3701 SignedZeros = false;
3702 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003703 if (Arg *A = Args.getLastArg(
3704 options::OPT_ffast_math, FastMathAliasOption,
3705 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3706 options::OPT_fno_unsafe_math_optimizations,
3707 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003708 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3709 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003710 A->getOption().getID() != options::OPT_ftrapping_math)
3711 TrappingMath = false;
3712 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3713 !TrappingMath)
3714 CmdArgs.push_back("-menable-unsafe-fp-math");
3715
Sanjay Patel76c9e092015-01-23 16:40:50 +00003716 if (!SignedZeros)
3717 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003718
Sanjay Patel359b1052015-04-09 15:03:23 +00003719 if (ReciprocalMath)
3720 CmdArgs.push_back("-freciprocal-math");
3721
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003722 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003723 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003724 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003725 options::OPT_ffp_contract)) {
3726 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003727 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003728 if (Val == "fast" || Val == "on" || Val == "off") {
3729 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3730 } else {
3731 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003732 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003733 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003734 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3735 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003736 // If fast-math is set then set the fp-contract mode to fast.
3737 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3738 }
3739 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003740
Sanjay Patel2987c292015-06-11 14:53:41 +00003741 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003742
Bob Wilson6a039162012-07-19 03:52:53 +00003743 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3744 // and if we find them, tell the frontend to provide the appropriate
3745 // preprocessor macros. This is distinct from enabling any optimizations as
3746 // these options induce language changes which must survive serialization
3747 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003748 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3749 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003750 if (!A->getOption().matches(options::OPT_fno_fast_math))
3751 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003752 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3753 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003754 if (A->getOption().matches(options::OPT_ffinite_math_only))
3755 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003756
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003757 // Decide whether to use verbose asm. Verbose assembly is the default on
3758 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003759 bool IsIntegratedAssemblerDefault =
3760 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003761 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003762 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003763 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003764 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003765
Rafael Espindolab8a12932015-05-22 20:44:03 +00003766 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3767 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003768 CmdArgs.push_back("-no-integrated-as");
3769
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003770 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3771 CmdArgs.push_back("-mdebug-pass");
3772 CmdArgs.push_back("Structure");
3773 }
3774 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3775 CmdArgs.push_back("-mdebug-pass");
3776 CmdArgs.push_back("Arguments");
3777 }
3778
John McCall8517abc2010-02-19 02:45:38 +00003779 // Enable -mconstructor-aliases except on darwin, where we have to
3780 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003781 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003782 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003783
John McCall7ef5cb32011-03-18 02:56:14 +00003784 // Darwin's kernel doesn't support guard variables; just die if we
3785 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003786 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003787 CmdArgs.push_back("-fforbid-guard-variables");
3788
Akira Hatanaka02028482015-11-12 17:21:22 +00003789 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3790 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003791 CmdArgs.push_back("-mms-bitfields");
3792 }
John McCall8517abc2010-02-19 02:45:38 +00003793
Daniel Dunbar306945d2009-09-16 06:17:29 +00003794 // This is a coarse approximation of what llvm-gcc actually does, both
3795 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3796 // complicated ways.
3797 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003798 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3799 options::OPT_fno_asynchronous_unwind_tables,
3800 (getToolChain().IsUnwindTablesDefault() ||
3801 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3802 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003803 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3804 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003805 CmdArgs.push_back("-munwind-tables");
3806
Chandler Carruth05fb5852012-11-21 23:40:23 +00003807 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003808
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003809 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3810 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003811 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003812 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003813
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003814 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003815 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003816
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003817 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003818 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003819 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003820 }
3821
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003822 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003823 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003824 if (!CPU.empty()) {
3825 CmdArgs.push_back("-target-cpu");
3826 CmdArgs.push_back(Args.MakeArgString(CPU));
3827 }
3828
Rafael Espindolaeb265472013-08-21 21:59:03 +00003829 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3830 CmdArgs.push_back("-mfpmath");
3831 CmdArgs.push_back(A->getValue());
3832 }
3833
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003834 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003835 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003836
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003837 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003838 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003839 default:
3840 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003841
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003842 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003843 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003844 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003845 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003846 // Use the effective triple, which takes into account the deployment target.
3847 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003848 break;
3849
Tim Northover573cbee2014-05-24 12:52:07 +00003850 case llvm::Triple::aarch64:
3851 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003852 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003853 break;
3854
Eric Christopher0b26a612010-03-02 02:41:08 +00003855 case llvm::Triple::mips:
3856 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003857 case llvm::Triple::mips64:
3858 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003859 AddMIPSTargetArgs(Args, CmdArgs);
3860 break;
3861
Ulrich Weigand8afad612014-07-28 13:17:52 +00003862 case llvm::Triple::ppc:
3863 case llvm::Triple::ppc64:
3864 case llvm::Triple::ppc64le:
3865 AddPPCTargetArgs(Args, CmdArgs);
3866 break;
3867
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003868 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003869 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003870 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003871 AddSparcTargetArgs(Args, CmdArgs);
3872 break;
3873
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003874 case llvm::Triple::x86:
3875 case llvm::Triple::x86_64:
3876 AddX86TargetArgs(Args, CmdArgs);
3877 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003878
3879 case llvm::Triple::hexagon:
3880 AddHexagonTargetArgs(Args, CmdArgs);
3881 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003882 }
3883
Douglas Katzman3459ce22015-10-08 04:24:12 +00003884 // The 'g' groups options involve a somewhat intricate sequence of decisions
3885 // about what to pass from the driver to the frontend, but by the time they
3886 // reach cc1 they've been factored into two well-defined orthogonal choices:
3887 // * what level of debug info to generate
3888 // * what dwarf version to write
3889 // This avoids having to monkey around further in cc1 other than to disable
3890 // codeview if not running in a Windows environment. Perhaps even that
3891 // decision should be made in the driver as well though.
3892 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3893 CodeGenOptions::NoDebugInfo;
3894 // These two are potentially updated by AddClangCLArgs.
3895 unsigned DwarfVersion = 0;
3896 bool EmitCodeView = false;
3897
Hans Wennborg75958c42013-08-08 00:17:41 +00003898 // Add clang-cl arguments.
3899 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003900 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003901
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003902 // Pass the linker version in use.
3903 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3904 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003905 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003906 }
3907
Eric Christopherb7d97e92013-04-03 01:58:53 +00003908 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003909 CmdArgs.push_back("-momit-leaf-frame-pointer");
3910
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003911 // Explicitly error on some things we know we don't support and can't just
3912 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003913 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003914 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3915 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003916 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003917 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003918 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3919 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003920 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003921 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003922 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003923 }
3924
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003925 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003926 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003927 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003928 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003929 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3930 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003931 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003932 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003933 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003934
Chad Rosierbe10f982011-08-02 17:58:04 +00003935 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003936 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3938 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003939 }
3940
Rafael Espindola08a692a2010-03-07 04:46:18 +00003941 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003942 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003943 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003944 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
3945 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
3946 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003947 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003948 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003949 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00003950 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003951 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003952 // Some 'g' group option other than one expressly disabling debug info
3953 // must have been the final (winning) one. They're all equivalent.
3954 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00003955 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003956 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003957
Douglas Katzman3459ce22015-10-08 04:24:12 +00003958 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
3959 // (because that would mean that "-g0" was the rightmost 'g' group option).
3960 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
3961 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
3962 // exists of removing the gdwarf options from the g_group.
3963 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
3964 options::OPT_gdwarf_4))
3965 DwarfVersion = DwarfVersionNum(A->getSpelling());
3966
Reid Kleckner124955a2015-08-05 18:51:13 +00003967 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00003968 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
3969 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
3970 // DwarfVersion remains at 0 if no explicit choice was made.
3971 CmdArgs.push_back("-gcodeview");
3972 } else if (DwarfVersion == 0 &&
3973 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
3974 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
3975 }
Reid Kleckner124955a2015-08-05 18:51:13 +00003976
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003977 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3978 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003979
3980 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00003981 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003982 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003983 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003984
Eric Christopher138c32b2013-09-13 22:37:55 +00003985 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003986 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003987 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003988 CmdArgs.push_back("-dwarf-ext-refs");
3989 CmdArgs.push_back("-fmodule-format=obj");
3990 }
3991
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003992 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3993 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003994 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003995 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003996 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003997 CmdArgs.push_back("-backend-option");
3998 CmdArgs.push_back("-split-dwarf=Enable");
3999 }
4000
Douglas Katzman3459ce22015-10-08 04:24:12 +00004001 // After we've dealt with all combinations of things that could
4002 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4003 // figure out if we need to "upgrade" it to standalone debug info.
4004 // We parse these two '-f' options whether or not they will be used,
4005 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4006 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4007 options::OPT_fno_standalone_debug,
4008 getToolChain().GetDefaultStandaloneDebug());
4009 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4010 DebugInfoKind = CodeGenOptions::FullDebugInfo;
4011 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
4012
Eric Christopher138c32b2013-09-13 22:37:55 +00004013 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4014 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4015 CmdArgs.push_back("-backend-option");
4016 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4017 }
Eric Christophereec89c22013-06-18 00:03:50 +00004018
Eric Christopher0d403d22014-02-14 01:27:03 +00004019 // -gdwarf-aranges turns on the emission of the aranges section in the
4020 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004021 // Always enabled on the PS4.
4022 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004023 CmdArgs.push_back("-backend-option");
4024 CmdArgs.push_back("-generate-arange-section");
4025 }
4026
David Blaikief36d9ba2014-01-27 18:52:43 +00004027 if (Args.hasFlag(options::OPT_fdebug_types_section,
4028 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004029 CmdArgs.push_back("-backend-option");
4030 CmdArgs.push_back("-generate-type-units");
4031 }
Eric Christophereec89c22013-06-18 00:03:50 +00004032
Ed Schouten6e576152015-03-26 17:50:28 +00004033 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4034 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4035
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004036 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004037 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004038 CmdArgs.push_back("-ffunction-sections");
4039 }
4040
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004041 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4042 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004043 CmdArgs.push_back("-fdata-sections");
4044 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004045
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004046 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004047 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004048 CmdArgs.push_back("-fno-unique-section-names");
4049
Chris Lattner3c77a352010-06-22 00:03:40 +00004050 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4051
Diego Novilloa0545962015-07-10 18:00:07 +00004052 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004053
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004054 // Pass options for controlling the default header search paths.
4055 if (Args.hasArg(options::OPT_nostdinc)) {
4056 CmdArgs.push_back("-nostdsysteminc");
4057 CmdArgs.push_back("-nobuiltininc");
4058 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004059 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004060 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004061 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4062 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4063 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004064
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004065 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004066 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004067 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004068
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004069 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4070
Ted Kremenekf7639e12012-03-06 20:06:33 +00004071 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004072 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004073 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004074 options::OPT_ccc_arcmt_modify,
4075 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004076 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004077 switch (A->getOption().getID()) {
4078 default:
4079 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004080 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004081 CmdArgs.push_back("-arcmt-check");
4082 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004083 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004084 CmdArgs.push_back("-arcmt-modify");
4085 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004086 case options::OPT_ccc_arcmt_migrate:
4087 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004088 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004089 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004090
4091 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4092 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004093 break;
John McCalld70fb982011-06-15 23:25:17 +00004094 }
4095 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004096 } else {
4097 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4098 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4099 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004100 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004101
Ted Kremenekf7639e12012-03-06 20:06:33 +00004102 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4103 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004104 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4105 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004106 }
4107 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004108 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004109
4110 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004111 options::OPT_objcmt_migrate_subscripting,
4112 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004113 // None specified, means enable them all.
4114 CmdArgs.push_back("-objcmt-migrate-literals");
4115 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004116 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004117 } else {
4118 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4119 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004120 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004121 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004122 } else {
4123 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4124 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4125 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4126 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4127 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4128 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004129 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004130 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4131 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4132 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4133 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4134 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4135 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4136 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004137 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004138 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004139 }
4140
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004141 // Add preprocessing options like -I, -D, etc. if we are using the
4142 // preprocessor.
4143 //
4144 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004145 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004146 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4147 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004148
Rafael Espindolaa7431922011-07-21 23:40:37 +00004149 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4150 // that "The compiler can only warn and ignore the option if not recognized".
4151 // When building with ccache, it will pass -D options to clang even on
4152 // preprocessed inputs and configure concludes that -fPIC is not supported.
4153 Args.ClaimAllArgs(options::OPT_D);
4154
Alp Toker7874bdc2013-11-15 20:40:58 +00004155 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004156 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4157 if (A->getOption().matches(options::OPT_O4)) {
4158 CmdArgs.push_back("-O3");
4159 D.Diag(diag::warn_O4_is_O3);
4160 } else {
4161 A->render(Args, CmdArgs);
4162 }
4163 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004164
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004165 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004166 for (const Arg *A :
4167 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4168 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004169 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004170 }
4171
Rafael Espindola577637a2015-01-03 00:06:04 +00004172 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004173
Richard Smith3be1cb22014-08-07 00:24:21 +00004174 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004175 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004176 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4177 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004178 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004179 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004180
4181 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004182 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004183 //
4184 // If a std is supplied, only add -trigraphs if it follows the
4185 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004186 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004187 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4188 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004189 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004190 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004191 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004192 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004193 else
4194 Std->render(Args, CmdArgs);
4195
Nico Weber00721502014-12-23 22:32:37 +00004196 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004197 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004198 options::OPT_ftrigraphs,
4199 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004200 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004201 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004202 } else {
4203 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004204 //
4205 // FIXME: Clang doesn't correctly handle -std= when the input language
4206 // doesn't match. For the time being just ignore this for C++ inputs;
4207 // eventually we want to do all the standard defaulting here instead of
4208 // splitting it between the driver and clang -cc1.
4209 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004210 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4211 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004212 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004213 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004214
Nico Weber00721502014-12-23 22:32:37 +00004215 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4216 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004217 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004218
Richard Smith282b4492013-09-04 22:50:31 +00004219 // GCC's behavior for -Wwrite-strings is a bit strange:
4220 // * In C, this "warning flag" changes the types of string literals from
4221 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4222 // for the discarded qualifier.
4223 // * In C++, this is just a normal warning flag.
4224 //
4225 // Implementing this warning correctly in C is hard, so we follow GCC's
4226 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4227 // a non-const char* in C, rather than using this crude hack.
4228 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004229 // FIXME: This should behave just like a warning flag, and thus should also
4230 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4231 Arg *WriteStrings =
4232 Args.getLastArg(options::OPT_Wwrite_strings,
4233 options::OPT_Wno_write_strings, options::OPT_w);
4234 if (WriteStrings &&
4235 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004236 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004237 }
4238
Chandler Carruth61fbf622011-04-23 09:27:53 +00004239 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004240 // during C++ compilation, which it is by default. GCC keeps this define even
4241 // in the presence of '-w', match this behavior bug-for-bug.
4242 if (types::isCXX(InputType) &&
4243 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4244 true)) {
4245 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004246 }
4247
Chandler Carruthe0391482010-05-22 02:21:53 +00004248 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4249 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4250 if (Asm->getOption().matches(options::OPT_fasm))
4251 CmdArgs.push_back("-fgnu-keywords");
4252 else
4253 CmdArgs.push_back("-fno-gnu-keywords");
4254 }
4255
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004256 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4257 CmdArgs.push_back("-fno-dwarf-directory-asm");
4258
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004259 if (ShouldDisableAutolink(Args, getToolChain()))
4260 CmdArgs.push_back("-fno-autolink");
4261
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004262 // Add in -fdebug-compilation-dir if necessary.
4263 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004264
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004265 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4266 StringRef Map = A->getValue();
4267 if (Map.find('=') == StringRef::npos)
4268 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4269 else
4270 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4271 A->claim();
4272 }
4273
Richard Smith9a568822011-11-21 19:36:32 +00004274 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4275 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004276 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004277 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004278 }
4279
Richard Smith79c927b2013-11-06 19:31:51 +00004280 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4281 CmdArgs.push_back("-foperator-arrow-depth");
4282 CmdArgs.push_back(A->getValue());
4283 }
4284
Richard Smith9a568822011-11-21 19:36:32 +00004285 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4286 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004287 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004288 }
4289
Richard Smitha3d3bd22013-05-08 02:12:03 +00004290 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4291 CmdArgs.push_back("-fconstexpr-steps");
4292 CmdArgs.push_back(A->getValue());
4293 }
4294
Richard Smithb3a14522013-02-22 01:59:51 +00004295 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4296 CmdArgs.push_back("-fbracket-depth");
4297 CmdArgs.push_back(A->getValue());
4298 }
4299
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004300 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4301 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004302 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004303 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004304 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4305 } else
4306 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004307 }
4308
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004309 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004310 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004311
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004312 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4313 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004314 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004315 }
David Chisnall5778fce2009-08-31 16:41:57 +00004316
Chris Lattnere23003d2010-01-09 21:54:33 +00004317 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4318 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004319 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004320 }
4321
Chris Lattnerb35583d2010-04-07 20:49:23 +00004322 CmdArgs.push_back("-ferror-limit");
4323 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004324 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004325 else
4326 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004327
Chandler Carrutha77a7272010-05-06 04:55:18 +00004328 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4329 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004330 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004331 }
4332
4333 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4334 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004335 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004336 }
4337
Richard Smithf6f003a2011-12-16 19:06:07 +00004338 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4339 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004340 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004341 }
4342
Nick Lewycky24653262014-12-16 21:39:02 +00004343 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4344 CmdArgs.push_back("-fspell-checking-limit");
4345 CmdArgs.push_back(A->getValue());
4346 }
4347
Daniel Dunbar2c978472009-11-04 06:24:47 +00004348 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004349 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004350 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004351 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004352 } else {
4353 // If -fmessage-length=N was not specified, determine whether this is a
4354 // terminal and, if so, implicitly define -fmessage-length appropriately.
4355 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004356 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004357 }
4358
John McCallb4a99d32013-02-19 01:57:35 +00004359 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4360 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4361 options::OPT_fvisibility_ms_compat)) {
4362 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4363 CmdArgs.push_back("-fvisibility");
4364 CmdArgs.push_back(A->getValue());
4365 } else {
4366 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4367 CmdArgs.push_back("-fvisibility");
4368 CmdArgs.push_back("hidden");
4369 CmdArgs.push_back("-ftype-visibility");
4370 CmdArgs.push_back("default");
4371 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004372 }
4373
Douglas Gregor08329632010-06-15 17:05:35 +00004374 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004375
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004376 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4377
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004378 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004379 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4380 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004381 CmdArgs.push_back("-ffreestanding");
4382
Daniel Dunbare357d562009-12-03 18:42:11 +00004383 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004384 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004385 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004386 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004387 // Emulated TLS is enabled by default on Android, and can be enabled manually
4388 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004389 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004390 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4391 EmulatedTLSDefault))
4392 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004393 // AltiVec-like language extensions aren't relevant for assembling.
4394 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004395 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004396 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4397 }
Richard Trieu91844232012-06-26 18:18:47 +00004398 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4399 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004400
Alexey Bataevdb390212015-05-20 04:24:19 +00004401 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004402 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4403 options::OPT_fno_openmp, false))
4404 switch (getOpenMPRuntime(getToolChain(), Args)) {
4405 case OMPRT_OMP:
4406 case OMPRT_IOMP5:
4407 // Clang can generate useful OpenMP code for these two runtime libraries.
4408 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004409
4410 // If no option regarding the use of TLS in OpenMP codegeneration is
4411 // given, decide a default based on the target. Otherwise rely on the
4412 // options and pass the right information to the frontend.
4413 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004414 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004415 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004416 break;
4417 default:
4418 // By default, if Clang doesn't know how to generate useful OpenMP code
4419 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4420 // down to the actual compilation.
4421 // FIXME: It would be better to have a mode which *only* omits IR
4422 // generation based on the OpenMP support so that we get consistent
4423 // semantic analysis, etc.
4424 break;
4425 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004426
Peter Collingbourne32701642013-11-01 18:16:25 +00004427 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004428 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004429
Eric Christopher459d2712013-02-19 06:16:53 +00004430 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004431 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4432 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4433 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4434 Arch == llvm::Triple::ppc64le))
4435 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4436 << "ppc/ppc64/ppc64le";
4437 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004438
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004439 // -fzvector is incompatible with -faltivec.
4440 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4441 if (Args.hasArg(options::OPT_faltivec))
4442 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4443 << "-faltivec";
4444
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004445 if (getToolChain().SupportsProfiling())
4446 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004447
4448 // -flax-vector-conversions is default.
4449 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4450 options::OPT_fno_lax_vector_conversions))
4451 CmdArgs.push_back("-fno-lax-vector-conversions");
4452
John Brawna7b4ec02015-08-10 11:11:28 +00004453 if (Args.getLastArg(options::OPT_fapple_kext) ||
4454 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004455 CmdArgs.push_back("-fapple-kext");
4456
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004457 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004458 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004459 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004460 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4461 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004462
4463 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4464 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004465 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004466 }
4467
Bob Wilson14adb362012-02-03 06:27:22 +00004468 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004469
Chandler Carruth6e501032011-03-27 00:04:55 +00004470 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4471 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004472 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004473 if (A->getOption().matches(options::OPT_fwrapv))
4474 CmdArgs.push_back("-fwrapv");
4475 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4476 options::OPT_fno_strict_overflow)) {
4477 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4478 CmdArgs.push_back("-fwrapv");
4479 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004480
4481 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4482 options::OPT_fno_reroll_loops))
4483 if (A->getOption().matches(options::OPT_freroll_loops))
4484 CmdArgs.push_back("-freroll-loops");
4485
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004486 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004487 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4488 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004489
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004490 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4491
Daniel Dunbar4930e332009-11-17 08:07:36 +00004492 // -stack-protector=0 is default.
4493 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004494 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4495 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4496 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4497 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4498 Args.ClaimAllArgs(options::OPT_fstack_protector);
4499 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004500 options::OPT_fstack_protector_all,
4501 options::OPT_fstack_protector_strong,
4502 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004503 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004504 StackProtectorLevel = std::max<unsigned>(
4505 LangOptions::SSPOn,
4506 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004507 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004508 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004509 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004510 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004511 } else {
4512 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004513 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004514 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004515 if (StackProtectorLevel) {
4516 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004517 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004518 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004519
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004520 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004521 for (const Arg *A : Args.filtered(options::OPT__param)) {
4522 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004523 if (Str.startswith("ssp-buffer-size=")) {
4524 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004525 CmdArgs.push_back("-stack-protector-buffer-size");
4526 // FIXME: Verify the argument is a valid integer.
4527 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004528 }
Sean Silva14facf32015-06-09 01:57:17 +00004529 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004530 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004531 }
4532
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004533 // Translate -mstackrealign
4534 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004535 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004536 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004537
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004538 if (Args.hasArg(options::OPT_mstack_alignment)) {
4539 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4540 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004541 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004542
Hans Wennborg77dc2362015-01-20 19:45:50 +00004543 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4544 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4545
4546 if (!Size.empty())
4547 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4548 else
4549 CmdArgs.push_back("-mstack-probe-size=0");
4550 }
4551
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004552 switch (getToolChain().getArch()) {
4553 case llvm::Triple::aarch64:
4554 case llvm::Triple::aarch64_be:
4555 case llvm::Triple::arm:
4556 case llvm::Triple::armeb:
4557 case llvm::Triple::thumb:
4558 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004559 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004560 break;
4561
4562 default:
4563 break;
4564 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004565
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004566 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4567 options::OPT_mno_restrict_it)) {
4568 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4569 CmdArgs.push_back("-backend-option");
4570 CmdArgs.push_back("-arm-restrict-it");
4571 } else {
4572 CmdArgs.push_back("-backend-option");
4573 CmdArgs.push_back("-arm-no-restrict-it");
4574 }
James Y Knight2db38f32015-08-15 03:45:25 +00004575 } else if (Triple.isOSWindows() &&
4576 (Triple.getArch() == llvm::Triple::arm ||
4577 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004578 // Windows on ARM expects restricted IT blocks
4579 CmdArgs.push_back("-backend-option");
4580 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004581 }
4582
Daniel Dunbard18049a2009-04-07 21:16:11 +00004583 // Forward -f options with positive and negative forms; we translate
4584 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004585 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4586 StringRef fname = A->getValue();
4587 if (!llvm::sys::fs::exists(fname))
4588 D.Diag(diag::err_drv_no_such_file) << fname;
4589 else
4590 A->render(Args, CmdArgs);
4591 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004592
John Brawna7b4ec02015-08-10 11:11:28 +00004593 // -fbuiltin is default unless -mkernel is used
4594 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4595 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004596 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004597
Nuno Lopes13c88c72009-12-16 16:59:22 +00004598 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4599 options::OPT_fno_assume_sane_operator_new))
4600 CmdArgs.push_back("-fno-assume-sane-operator-new");
4601
Daniel Dunbar4930e332009-11-17 08:07:36 +00004602 // -fblocks=0 is default.
4603 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004604 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004605 (Args.hasArg(options::OPT_fgnu_runtime) &&
4606 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4607 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004608 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004609
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004610 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004611 !getToolChain().hasBlocksRuntime())
4612 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004613 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004614
Richard Smith47972af2015-06-16 00:08:24 +00004615 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004616 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004617 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004618 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004619 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004620 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4621 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004622 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004623 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004624 HaveModules = true;
4625 }
4626 }
4627
Richard Smith47972af2015-06-16 00:08:24 +00004628 // -fmodule-maps enables implicit reading of module map files. By default,
4629 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004630 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4631 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004632 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004633 }
4634
Daniel Jasperac42b752013-10-21 06:34:34 +00004635 // -fmodules-decluse checks that modules used are declared so (off by
4636 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004637 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004638 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004639 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004640 }
4641
Daniel Jasper962b38e2014-04-11 11:47:45 +00004642 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4643 // all #included headers are part of modules.
4644 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004645 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004646 CmdArgs.push_back("-fmodules-strict-decluse");
4647 }
4648
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004649 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4650 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4651 options::OPT_fno_implicit_modules)) {
4652 CmdArgs.push_back("-fno-implicit-modules");
4653 }
4654
Daniel Jasperac42b752013-10-21 06:34:34 +00004655 // -fmodule-name specifies the module that is currently being built (or
4656 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004657 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004658
Richard Smith9887d792014-10-17 01:42:53 +00004659 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004660 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004661 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004662
Richard Smithe842a472014-10-22 02:05:46 +00004663 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004664 if (HaveModules)
4665 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4666 else
4667 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004668
4669 // -fmodule-cache-path specifies where our implicitly-built module files
4670 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004671 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004672 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004673 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004674 if (HaveModules) {
4675 if (C.isForDiagnostics()) {
4676 // When generating crash reports, we want to emit the modules along with
4677 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004678 Path = Output.getFilename();
4679 llvm::sys::path::replace_extension(Path, ".cache");
4680 llvm::sys::path::append(Path, "modules");
4681 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004682 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004683 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004684 llvm::sys::path::append(Path, "org.llvm.clang.");
4685 appendUserToPath(Path);
4686 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004687 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004688 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004689 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4690 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004691 }
4692
4693 // When building modules and generating crashdumps, we need to dump a module
4694 // dependency VFS alongside the output.
4695 if (HaveModules && C.isForDiagnostics()) {
4696 SmallString<128> VFSDir(Output.getFilename());
4697 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004698 // Add the cache directory as a temp so the crash diagnostics pick it up.
4699 C.addTempFile(Args.MakeArgString(VFSDir));
4700
Justin Bognera88f0122014-06-20 22:59:50 +00004701 llvm::sys::path::append(VFSDir, "vfs");
4702 CmdArgs.push_back("-module-dependency-dir");
4703 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004704 }
4705
Richard Smith9887d792014-10-17 01:42:53 +00004706 if (HaveModules)
4707 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004708
Douglas Gregor35b04d62013-02-07 19:01:24 +00004709 // Pass through all -fmodules-ignore-macro arguments.
4710 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004711 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4712 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004713
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004714 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4715
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004716 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4717 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4718 D.Diag(diag::err_drv_argument_not_allowed_with)
4719 << A->getAsString(Args) << "-fbuild-session-timestamp";
4720
4721 llvm::sys::fs::file_status Status;
4722 if (llvm::sys::fs::status(A->getValue(), Status))
4723 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004724 CmdArgs.push_back(Args.MakeArgString(
4725 "-fbuild-session-timestamp=" +
4726 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004727 }
4728
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004729 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004730 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4731 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004732 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4733
4734 Args.AddLastArg(CmdArgs,
4735 options::OPT_fmodules_validate_once_per_build_session);
4736 }
4737
Ben Langmuirdcf73862014-03-12 00:06:17 +00004738 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4739
John McCalldfea9982010-04-09 19:12:06 +00004740 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004741 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004742 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004743 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004744
Anders Carlssond470fef2010-11-21 00:09:52 +00004745 // -felide-constructors is the default.
4746 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004747 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004748 CmdArgs.push_back("-fno-elide-constructors");
4749
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004750 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004751
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004752 if (KernelOrKext || (types::isCXX(InputType) &&
4753 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4754 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004755 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004756
Tony Linthicum76329bf2011-12-12 21:14:55 +00004757 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004758 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4759 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004760 CmdArgs.push_back("-fshort-enums");
4761
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004762 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004763 if (Arg *A = Args.getLastArg(
4764 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4765 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4766 if (A->getOption().matches(options::OPT_funsigned_char) ||
4767 A->getOption().matches(options::OPT_fno_signed_char)) {
4768 CmdArgs.push_back("-fno-signed-char");
4769 }
4770 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004771 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004772 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004773
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004774 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004775 if (!Args.hasFlag(
4776 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4777 !IsWindowsCygnus && !IsWindowsGNU &&
4778 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4779 getToolChain().getArch() != llvm::Triple::hexagon &&
4780 getToolChain().getArch() != llvm::Triple::xcore &&
4781 ((getToolChain().getTriple().getVendor() !=
4782 llvm::Triple::MipsTechnologies) ||
4783 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004784 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004785 CmdArgs.push_back("-fno-use-cxa-atexit");
4786
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004787 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004788 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004789 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004790 CmdArgs.push_back("-fms-extensions");
4791
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004792 // -fno-use-line-directives is default.
4793 if (Args.hasFlag(options::OPT_fuse_line_directives,
4794 options::OPT_fno_use_line_directives, false))
4795 CmdArgs.push_back("-fuse-line-directives");
4796
Francois Pichet1b4f1632011-09-17 04:32:15 +00004797 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004798 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004799 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004800 (IsWindowsMSVC &&
4801 Args.hasFlag(options::OPT_fms_extensions,
4802 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004803 CmdArgs.push_back("-fms-compatibility");
4804
David Majnemerc371ff02015-03-22 08:39:22 +00004805 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004806 VersionTuple MSVT = visualstudio::getMSVCVersion(
4807 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4808 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004809 CmdArgs.push_back(
4810 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004811
David Majnemer8db91762015-05-18 04:49:30 +00004812 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4813 if (ImplyVCPPCXXVer) {
4814 if (IsMSVC2015Compatible)
4815 CmdArgs.push_back("-std=c++14");
4816 else
4817 CmdArgs.push_back("-std=c++11");
4818 }
4819
Eric Christopher5ecce122013-02-18 00:38:31 +00004820 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004821 if (Args.hasFlag(options::OPT_fborland_extensions,
4822 options::OPT_fno_borland_extensions, false))
4823 CmdArgs.push_back("-fborland-extensions");
4824
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004825 // -fno-declspec is default, except for PS4.
4826 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4827 getToolChain().getTriple().isPS4()))
4828 CmdArgs.push_back("-fdeclspec");
4829 else if (Args.hasArg(options::OPT_fno_declspec))
4830 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4831
David Majnemerc371ff02015-03-22 08:39:22 +00004832 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4833 // than 19.
4834 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4835 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004836 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004837 CmdArgs.push_back("-fno-threadsafe-statics");
4838
Francois Pichet02744872011-09-01 16:38:08 +00004839 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4840 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004841 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004842 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004843 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004844
Chandler Carruthe03aa552010-04-17 20:17:31 +00004845 // -fgnu-keywords default varies depending on language; only pass if
4846 // specified.
4847 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004848 options::OPT_fno_gnu_keywords))
4849 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004850
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004851 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004852 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004853 CmdArgs.push_back("-fgnu89-inline");
4854
Chad Rosier9c76d242012-03-15 22:31:42 +00004855 if (Args.hasArg(options::OPT_fno_inline))
4856 CmdArgs.push_back("-fno-inline");
4857
Chad Rosier64d6be92012-03-06 21:17:19 +00004858 if (Args.hasArg(options::OPT_fno_inline_functions))
4859 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004860
John McCall5fb5df92012-06-20 06:18:46 +00004861 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004862
John McCall5fb5df92012-06-20 06:18:46 +00004863 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004864 // legacy is the default. Except for deployment taget of 10.5,
4865 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4866 // gets ignored silently.
4867 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004868 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4869 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004870 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004871 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004872 if (getToolChain().UseObjCMixedDispatch())
4873 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4874 else
4875 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4876 }
4877 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004878
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004879 // When ObjectiveC legacy runtime is in effect on MacOSX,
4880 // turn on the option to do Array/Dictionary subscripting
4881 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004882 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004883 getToolChain().getTriple().isMacOSX() &&
4884 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4885 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004886 objcRuntime.isNeXTFamily())
4887 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004888
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004889 // -fencode-extended-block-signature=1 is default.
4890 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4891 CmdArgs.push_back("-fencode-extended-block-signature");
4892 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004893
John McCall24fc0de2011-07-06 00:26:06 +00004894 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4895 // NOTE: This logic is duplicated in ToolChains.cpp.
4896 bool ARC = isObjCAutoRefCount(Args);
4897 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004898 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004899
John McCall24fc0de2011-07-06 00:26:06 +00004900 CmdArgs.push_back("-fobjc-arc");
4901
Chandler Carruth491db322011-11-04 07:34:47 +00004902 // FIXME: It seems like this entire block, and several around it should be
4903 // wrapped in isObjC, but for now we just use it here as this is where it
4904 // was being used previously.
4905 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4906 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4907 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4908 else
4909 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4910 }
4911
John McCall24fc0de2011-07-06 00:26:06 +00004912 // Allow the user to enable full exceptions code emission.
4913 // We define off for Objective-CC, on for Objective-C++.
4914 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4915 options::OPT_fno_objc_arc_exceptions,
4916 /*default*/ types::isCXX(InputType)))
4917 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00004918
John McCall24fc0de2011-07-06 00:26:06 +00004919 }
4920
4921 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4922 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004923 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004924 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004925
John McCall24fc0de2011-07-06 00:26:06 +00004926 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4927 // takes precedence.
4928 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4929 if (!GCArg)
4930 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4931 if (GCArg) {
4932 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004933 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004934 } else if (getToolChain().SupportsObjCGC()) {
4935 GCArg->render(Args, CmdArgs);
4936 } else {
4937 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004938 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004939 }
4940 }
4941
John McCallfbe5ed72015-11-05 19:19:56 +00004942 // Pass down -fobjc-weak or -fno-objc-weak if present.
4943 if (types::isObjC(InputType)) {
4944 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
4945 options::OPT_fno_objc_weak);
4946 if (!WeakArg) {
4947 // nothing to do
4948 } else if (GCArg) {
4949 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4950 D.Diag(diag::err_objc_weak_with_gc);
4951 } else if (!objcRuntime.allowsWeak()) {
4952 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4953 D.Diag(diag::err_objc_weak_unsupported);
4954 } else {
4955 WeakArg->render(Args, CmdArgs);
4956 }
4957 }
4958
Bob Wilsonb111ec92015-03-02 19:01:14 +00004959 if (Args.hasFlag(options::OPT_fapplication_extension,
4960 options::OPT_fno_application_extension, false))
4961 CmdArgs.push_back("-fapplication-extension");
4962
Reid Klecknerc542d372014-06-27 17:02:02 +00004963 // Handle GCC-style exception args.
4964 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004965 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4966 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004967
Tim Northovere931f9f2015-10-30 16:30:41 +00004968 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00004969 CmdArgs.push_back("-fsjlj-exceptions");
4970
4971 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004972 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4973 options::OPT_fno_assume_sane_operator_new))
4974 CmdArgs.push_back("-fno-assume-sane-operator-new");
4975
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004976 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4977 // most platforms.
4978 if (Args.hasFlag(options::OPT_fsized_deallocation,
4979 options::OPT_fno_sized_deallocation, false))
4980 CmdArgs.push_back("-fsized-deallocation");
4981
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004982 // -fconstant-cfstrings is default, and may be subject to argument translation
4983 // on Darwin.
4984 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4985 options::OPT_fno_constant_cfstrings) ||
4986 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4987 options::OPT_mno_constant_cfstrings))
4988 CmdArgs.push_back("-fno-constant-cfstrings");
4989
John Thompsoned4e2952009-11-05 20:14:16 +00004990 // -fshort-wchar default varies depending on platform; only
4991 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004992 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4993 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004994 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004995
Hans Wennborg28c96312013-07-31 23:39:13 +00004996 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004997 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004998 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004999 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005000
Daniel Dunbar096ed292011-10-05 21:04:55 +00005001 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5002 // -fno-pack-struct doesn't apply to -fpack-struct=.
5003 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005004 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005005 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005006 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005007 } else if (Args.hasFlag(options::OPT_fpack_struct,
5008 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005009 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005010 }
5011
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005012 // Handle -fmax-type-align=N and -fno-type-align
5013 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5014 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5015 if (!SkipMaxTypeAlign) {
5016 std::string MaxTypeAlignStr = "-fmax-type-align=";
5017 MaxTypeAlignStr += A->getValue();
5018 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5019 }
5020 } else if (getToolChain().getTriple().isOSDarwin()) {
5021 if (!SkipMaxTypeAlign) {
5022 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5023 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5024 }
5025 }
5026
John Brawna7b4ec02015-08-10 11:11:28 +00005027 // -fcommon is the default unless compiling kernel code or the target says so
5028 bool NoCommonDefault =
5029 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5030 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5031 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005032 CmdArgs.push_back("-fno-common");
5033
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005034 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005035 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005036 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005037 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005038 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005039 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005040
Daniel Dunbar6358d682010-10-15 22:30:42 +00005041 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005042 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005043 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005044 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005045
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005046 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005047 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5048 StringRef value = inputCharset->getValue();
5049 if (value != "UTF-8")
5050 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5051 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005052 }
5053
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005054 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005055 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5056 StringRef value = execCharset->getValue();
5057 if (value != "UTF-8")
5058 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5059 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005060 }
5061
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005062 // -fcaret-diagnostics is default.
5063 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5064 options::OPT_fno_caret_diagnostics, true))
5065 CmdArgs.push_back("-fno-caret-diagnostics");
5066
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005067 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005068 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005069 options::OPT_fno_diagnostics_fixit_info))
5070 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005071
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005072 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005073 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005074 options::OPT_fno_diagnostics_show_option))
5075 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005076
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005077 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005078 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005079 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005080 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005081 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005082
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005083 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005084 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005085 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005086 }
5087
Chandler Carruthb6766f02011-03-27 01:50:55 +00005088 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005089 options::OPT_fdiagnostics_show_note_include_stack,
5090 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005091 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005092 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005093 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5094 else
5095 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5096 }
5097
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005098 // Color diagnostics are the default, unless the terminal doesn't support
5099 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005100 // Support both clang's -f[no-]color-diagnostics and gcc's
5101 // -f[no-]diagnostics-colors[=never|always|auto].
5102 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005103 for (const auto &Arg : Args) {
5104 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005105 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5106 !O.matches(options::OPT_fdiagnostics_color) &&
5107 !O.matches(options::OPT_fno_color_diagnostics) &&
5108 !O.matches(options::OPT_fno_diagnostics_color) &&
5109 !O.matches(options::OPT_fdiagnostics_color_EQ))
5110 continue;
5111
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005112 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005113 if (O.matches(options::OPT_fcolor_diagnostics) ||
5114 O.matches(options::OPT_fdiagnostics_color)) {
5115 ShowColors = Colors_On;
5116 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5117 O.matches(options::OPT_fno_diagnostics_color)) {
5118 ShowColors = Colors_Off;
5119 } else {
5120 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005121 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005122 if (value == "always")
5123 ShowColors = Colors_On;
5124 else if (value == "never")
5125 ShowColors = Colors_Off;
5126 else if (value == "auto")
5127 ShowColors = Colors_Auto;
5128 else
5129 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005130 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005131 }
5132 }
5133 if (ShowColors == Colors_On ||
5134 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005135 CmdArgs.push_back("-fcolor-diagnostics");
5136
Nico Rieck7857d462013-09-11 00:38:02 +00005137 if (Args.hasArg(options::OPT_fansi_escape_codes))
5138 CmdArgs.push_back("-fansi-escape-codes");
5139
Daniel Dunbardb097022009-06-08 21:13:54 +00005140 if (!Args.hasFlag(options::OPT_fshow_source_location,
5141 options::OPT_fno_show_source_location))
5142 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005143
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005144 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005145 true))
5146 CmdArgs.push_back("-fno-show-column");
5147
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005148 if (!Args.hasFlag(options::OPT_fspell_checking,
5149 options::OPT_fno_spell_checking))
5150 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005151
Chad Rosierc8e56e82012-12-05 21:08:21 +00005152 // -fno-asm-blocks is default.
5153 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5154 false))
5155 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005156
Steven Wucb0d13f2015-01-16 23:05:28 +00005157 // -fgnu-inline-asm is default.
5158 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5159 options::OPT_fno_gnu_inline_asm, true))
5160 CmdArgs.push_back("-fno-gnu-inline-asm");
5161
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005162 // Enable vectorization per default according to the optimization level
5163 // selected. For optimization levels that want vectorization we use the alias
5164 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005165 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005166 OptSpecifier VectorizeAliasOption =
5167 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005168 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005169 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005170 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005171
Chad Rosier136d67d2014-04-28 19:30:57 +00005172 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005173 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005174 OptSpecifier SLPVectAliasOption =
5175 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005176 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005177 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005178 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005179
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005180 // -fno-slp-vectorize-aggressive is default.
5181 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005182 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005183 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005184
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005185 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5186 A->render(Args, CmdArgs);
5187
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005188 // -fdollars-in-identifiers default varies depending on platform and
5189 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005190 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005191 options::OPT_fno_dollars_in_identifiers)) {
5192 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005193 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005194 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005195 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005196 }
5197
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005198 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5199 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005200 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005201 options::OPT_fno_unit_at_a_time)) {
5202 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005203 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005204 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005205
Eli Friedman055c9702011-11-02 01:53:16 +00005206 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5207 options::OPT_fno_apple_pragma_pack, false))
5208 CmdArgs.push_back("-fapple-pragma-pack");
5209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005210 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005211 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5212 // by default.
5213 if (getToolChain().getArch() == llvm::Triple::le32) {
5214 CmdArgs.push_back("-fno-math-builtin");
5215 }
5216
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005217// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5218//
5219// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005220#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005221 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005222 (getToolChain().getArch() == llvm::Triple::arm ||
5223 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005224 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5225 CmdArgs.push_back("-fno-builtin-strcat");
5226 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5227 CmdArgs.push_back("-fno-builtin-strcpy");
5228 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005229#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005230
Justin Bognera88f0122014-06-20 22:59:50 +00005231 // Enable rewrite includes if the user's asked for it or if we're generating
5232 // diagnostics.
5233 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5234 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005235 if (Args.hasFlag(options::OPT_frewrite_includes,
5236 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005237 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005238 CmdArgs.push_back("-frewrite-includes");
5239
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005240 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005241 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005242 options::OPT_traditional_cpp)) {
5243 if (isa<PreprocessJobAction>(JA))
5244 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005245 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005246 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005247 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005248
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005249 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005250 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005251
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005252 // Handle serialized diagnostics.
5253 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5254 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005255 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005256 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005257
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005258 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5259 CmdArgs.push_back("-fretain-comments-from-system-headers");
5260
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005261 // Forward -fcomment-block-commands to -cc1.
5262 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005263 // Forward -fparse-all-comments to -cc1.
5264 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005265
John Brawnad31ace2015-09-23 13:55:40 +00005266 // Turn -fplugin=name.so into -load name.so
5267 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5268 CmdArgs.push_back("-load");
5269 CmdArgs.push_back(A->getValue());
5270 A->claim();
5271 }
5272
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005273 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5274 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005275 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005276 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5277 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005278
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005279 // We translate this by hand to the -cc1 argument, since nightly test uses
5280 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005281 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005282 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005283 } else
Sean Silva14facf32015-06-09 01:57:17 +00005284 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005285 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005286
Bob Wilson23a55f12014-12-21 07:00:00 +00005287 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005288 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5289 // by the frontend.
5290 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5291 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005292
Daniel Dunbard67a3222009-03-30 06:36:42 +00005293 if (Output.getType() == types::TY_Dependencies) {
5294 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005295 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005296 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005297 CmdArgs.push_back(Output.getFilename());
5298 } else {
5299 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005300 }
5301
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005302 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005303
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005304 if (Input.isFilename())
5305 CmdArgs.push_back(Input.getFilename());
5306 else
5307 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005308
Chris Lattnere9d7d782009-11-03 19:50:27 +00005309 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5310
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005311 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005312
5313 // Optionally embed the -cc1 level arguments into the debug info, for build
5314 // analysis.
5315 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005316 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005317 for (const auto &Arg : Args)
5318 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005319
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005320 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005321 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005322 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005323 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005324 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005325 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005326 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005327 }
5328 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005329 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005330 }
5331
Eric Christopherd3804002013-02-22 20:12:52 +00005332 // Add the split debug info name to the command lines here so we
5333 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005334 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005335 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5336 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005337 const char *SplitDwarfOut;
5338 if (SplitDwarf) {
5339 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005340 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005341 CmdArgs.push_back(SplitDwarfOut);
5342 }
5343
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005344 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5345 // Include them with -fcuda-include-gpubinary.
5346 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005347 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005348 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005349 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005350 }
5351
Eric Christopherd3804002013-02-22 20:12:52 +00005352 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005353 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005354 Output.getType() == types::TY_Object &&
5355 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005356 auto CLCommand =
5357 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005358 C.addCommand(llvm::make_unique<FallbackCommand>(
5359 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005360 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005361 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005362 }
5363
Eric Christopherf1545832013-02-22 23:50:16 +00005364 // Handle the debug info splitting at object creation time if we're
5365 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005366 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005367 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005368 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005369
Roman Divacky178e01602011-02-10 16:52:03 +00005370 if (Arg *A = Args.getLastArg(options::OPT_pg))
5371 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005372 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5373 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005374
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005375 // Claim some arguments which clang supports automatically.
5376
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005377 // -fpch-preprocess is used with gcc to add a special marker in the output to
5378 // include the PCH file. Clang's PTH solution is completely transparent, so we
5379 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005380 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005381
Daniel Dunbar17731772009-03-23 19:03:36 +00005382 // Claim some arguments which clang doesn't support, but we don't
5383 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005384 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5385 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005386
Rafael Espindolab0092d72013-09-04 19:37:35 +00005387 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005388 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005389}
5390
John McCall5fb5df92012-06-20 06:18:46 +00005391/// Add options related to the Objective-C runtime/ABI.
5392///
5393/// Returns true if the runtime is non-fragile.
5394ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5395 ArgStringList &cmdArgs,
5396 RewriteKind rewriteKind) const {
5397 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005398 Arg *runtimeArg =
5399 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5400 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005401
5402 // Just forward -fobjc-runtime= to the frontend. This supercedes
5403 // options about fragility.
5404 if (runtimeArg &&
5405 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5406 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005407 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005408 if (runtime.tryParse(value)) {
5409 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005410 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005411 }
5412
5413 runtimeArg->render(args, cmdArgs);
5414 return runtime;
5415 }
5416
5417 // Otherwise, we'll need the ABI "version". Version numbers are
5418 // slightly confusing for historical reasons:
5419 // 1 - Traditional "fragile" ABI
5420 // 2 - Non-fragile ABI, version 1
5421 // 3 - Non-fragile ABI, version 2
5422 unsigned objcABIVersion = 1;
5423 // If -fobjc-abi-version= is present, use that to set the version.
5424 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005425 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005426 if (value == "1")
5427 objcABIVersion = 1;
5428 else if (value == "2")
5429 objcABIVersion = 2;
5430 else if (value == "3")
5431 objcABIVersion = 3;
5432 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005433 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005434 } else {
5435 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005436 bool nonFragileABIIsDefault =
5437 (rewriteKind == RK_NonFragile ||
5438 (rewriteKind == RK_None &&
5439 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005440 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5441 options::OPT_fno_objc_nonfragile_abi,
5442 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005443// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005444#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5445 unsigned nonFragileABIVersion = 1;
5446#else
5447 unsigned nonFragileABIVersion = 2;
5448#endif
5449
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005450 if (Arg *abiArg =
5451 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005452 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005453 if (value == "1")
5454 nonFragileABIVersion = 1;
5455 else if (value == "2")
5456 nonFragileABIVersion = 2;
5457 else
5458 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005459 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005460 }
5461
5462 objcABIVersion = 1 + nonFragileABIVersion;
5463 } else {
5464 objcABIVersion = 1;
5465 }
5466 }
5467
5468 // We don't actually care about the ABI version other than whether
5469 // it's non-fragile.
5470 bool isNonFragile = objcABIVersion != 1;
5471
5472 // If we have no runtime argument, ask the toolchain for its default runtime.
5473 // However, the rewriter only really supports the Mac runtime, so assume that.
5474 ObjCRuntime runtime;
5475 if (!runtimeArg) {
5476 switch (rewriteKind) {
5477 case RK_None:
5478 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5479 break;
5480 case RK_Fragile:
5481 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5482 break;
5483 case RK_NonFragile:
5484 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5485 break;
5486 }
5487
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005488 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005489 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5490 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005491 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005492 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5493
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005494 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005495 } else {
5496 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5497 }
5498
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005499 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005500 } else {
5501 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005502 // Legacy behaviour is to target the gnustep runtime if we are i
5503 // non-fragile mode or the GCC runtime in fragile mode.
5504 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005505 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005506 else
5507 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005508 }
5509
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005510 cmdArgs.push_back(
5511 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005512 return runtime;
5513}
5514
Reid Klecknerc542d372014-06-27 17:02:02 +00005515static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5516 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5517 I += HaveDash;
5518 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005519}
Reid Klecknerc542d372014-06-27 17:02:02 +00005520
Benjamin Kramere003ca22015-10-28 13:54:16 +00005521namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005522struct EHFlags {
5523 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5524 bool Synch;
5525 bool Asynch;
5526 bool NoExceptC;
5527};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005528} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005529
5530/// /EH controls whether to run destructor cleanups when exceptions are
5531/// thrown. There are three modifiers:
5532/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5533/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5534/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5535/// - c: Assume that extern "C" functions are implicitly noexcept. This
5536/// modifier is an optimization, so we ignore it for now.
5537/// The default is /EHs-c-, meaning cleanups are disabled.
5538static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5539 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005540
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005541 std::vector<std::string> EHArgs =
5542 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005543 for (auto EHVal : EHArgs) {
5544 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5545 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005546 case 'a':
5547 EH.Asynch = maybeConsumeDash(EHVal, I);
5548 continue;
5549 case 'c':
5550 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5551 continue;
5552 case 's':
5553 EH.Synch = maybeConsumeDash(EHVal, I);
5554 continue;
5555 default:
5556 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005557 }
5558 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5559 break;
5560 }
5561 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005562
Reid Klecknerc542d372014-06-27 17:02:02 +00005563 return EH;
5564}
5565
Douglas Katzman3459ce22015-10-08 04:24:12 +00005566void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5567 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5568 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005569 unsigned RTOptionID = options::OPT__SLASH_MT;
5570
Hans Wennborgf1a74252013-09-10 20:18:04 +00005571 if (Args.hasArg(options::OPT__SLASH_LDd))
5572 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5573 // but defining _DEBUG is sticky.
5574 RTOptionID = options::OPT__SLASH_MTd;
5575
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005576 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005577 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005578
David Majnemere2afb472015-07-24 06:49:13 +00005579 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005580 switch (RTOptionID) {
5581 case options::OPT__SLASH_MD:
5582 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005583 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005584 CmdArgs.push_back("-D_MT");
5585 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005586 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005587 break;
5588 case options::OPT__SLASH_MDd:
5589 CmdArgs.push_back("-D_DEBUG");
5590 CmdArgs.push_back("-D_MT");
5591 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005592 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005593 break;
5594 case options::OPT__SLASH_MT:
5595 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005596 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005597 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005598 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005599 break;
5600 case options::OPT__SLASH_MTd:
5601 CmdArgs.push_back("-D_DEBUG");
5602 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005603 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005604 break;
5605 default:
5606 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005607 }
5608
David Majnemere2afb472015-07-24 06:49:13 +00005609 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5610 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5611 } else {
5612 CmdArgs.push_back(FlagForCRT.data());
5613
5614 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5615 // users want. The /Za flag to cl.exe turns this off, but it's not
5616 // implemented in clang.
5617 CmdArgs.push_back("--dependent-lib=oldnames");
5618 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005619
Hans Wennborg8858a032014-07-21 23:42:07 +00005620 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5621 // would produce interleaved output, so ignore /showIncludes in such cases.
5622 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5623 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5624 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005625
David Majnemerf6072342014-07-01 22:24:56 +00005626 // This controls whether or not we emit RTTI data for polymorphic types.
5627 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5628 /*default=*/false))
5629 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005630
Reid Kleckner124955a2015-08-05 18:51:13 +00005631 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005632 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005633 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5634 // If we are emitting CV but not DWARF, don't build information that LLVM
5635 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005636 if (*EmitCodeView && !EmitDwarf)
5637 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5638 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005639 CmdArgs.push_back("-gcodeview");
5640
Reid Klecknerc542d372014-06-27 17:02:02 +00005641 const Driver &D = getToolChain().getDriver();
5642 EHFlags EH = parseClangCLEHFlags(D, Args);
5643 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005644 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005645 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005646 CmdArgs.push_back("-fexceptions");
5647 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005648
Hans Wennborge50cec32014-06-13 20:59:54 +00005649 // /EP should expand to -E -P.
5650 if (Args.hasArg(options::OPT__SLASH_EP)) {
5651 CmdArgs.push_back("-E");
5652 CmdArgs.push_back("-P");
5653 }
5654
David Majnemera5b195a2015-02-14 01:35:12 +00005655 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005656 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5657 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005658 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5659 else
5660 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5661
5662 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5663 VolatileOptionID = A->getOption().getID();
5664
5665 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5666 CmdArgs.push_back("-fms-volatile");
5667
David Majnemer86c318f2014-02-11 21:05:00 +00005668 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5669 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5670 if (MostGeneralArg && BestCaseArg)
5671 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5672 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5673
5674 if (MostGeneralArg) {
5675 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5676 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5677 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5678
5679 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5680 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5681 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5682 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5683 << FirstConflict->getAsString(Args)
5684 << SecondConflict->getAsString(Args);
5685
5686 if (SingleArg)
5687 CmdArgs.push_back("-fms-memptr-rep=single");
5688 else if (MultipleArg)
5689 CmdArgs.push_back("-fms-memptr-rep=multiple");
5690 else
5691 CmdArgs.push_back("-fms-memptr-rep=virtual");
5692 }
5693
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005694 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5695 A->render(Args, CmdArgs);
5696
Hans Wennborg81f74482013-09-10 01:07:07 +00005697 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5698 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005699 if (Args.hasArg(options::OPT__SLASH_fallback))
5700 CmdArgs.push_back("msvc-fallback");
5701 else
5702 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005703 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005704}
5705
Douglas Katzman95354292015-06-23 20:42:09 +00005706visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005707 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005708 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005709 return CLFallback.get();
5710}
5711
Daniel Sanders7f933f42015-01-30 17:35:23 +00005712void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5713 ArgStringList &CmdArgs) const {
5714 StringRef CPUName;
5715 StringRef ABIName;
5716 const llvm::Triple &Triple = getToolChain().getTriple();
5717 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5718
5719 CmdArgs.push_back("-target-abi");
5720 CmdArgs.push_back(ABIName.data());
5721}
5722
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005723void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005724 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005725 const ArgList &Args,
5726 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005727 ArgStringList CmdArgs;
5728
5729 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5730 const InputInfo &Input = Inputs[0];
5731
James Y Knight2db38f32015-08-15 03:45:25 +00005732 std::string TripleStr =
5733 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5734 const llvm::Triple Triple(TripleStr);
5735
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005736 // Don't warn about "clang -w -c foo.s"
5737 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005738 // and "clang -emit-llvm -c foo.s"
5739 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005740
Rafael Espindola577637a2015-01-03 00:06:04 +00005741 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005742
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005743 // Invoke ourselves in -cc1as mode.
5744 //
5745 // FIXME: Implement custom jobs for internal actions.
5746 CmdArgs.push_back("-cc1as");
5747
5748 // Add the "effective" target triple.
5749 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005750 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5751
5752 // Set the output mode, we currently only expect to be used as a real
5753 // assembler.
5754 CmdArgs.push_back("-filetype");
5755 CmdArgs.push_back("obj");
5756
Eric Christopher45f2e712012-12-18 00:31:10 +00005757 // Set the main file name, so that debug info works even with
5758 // -save-temps or preprocessed assembly.
5759 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005760 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005761
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005762 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005763 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005764 if (!CPU.empty()) {
5765 CmdArgs.push_back("-target-cpu");
5766 CmdArgs.push_back(Args.MakeArgString(CPU));
5767 }
5768
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005769 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005770 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005771
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005772 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005773 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005774
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005775 // Pass along any -I options so we get proper .include search paths.
5776 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5777
Eric Christopherfc3ee562012-01-10 00:38:01 +00005778 // Determine the original source input.
5779 const Action *SourceAction = &JA;
5780 while (SourceAction->getKind() != Action::InputClass) {
5781 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5782 SourceAction = SourceAction->getInputs()[0];
5783 }
5784
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005785 // Forward -g and handle debug info related flags, assuming we are dealing
5786 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005787 if (SourceAction->getType() == types::TY_Asm ||
5788 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005789 bool WantDebug = false;
5790 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005791 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005792 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5793 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005794 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005795 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005796 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005797 if (DwarfVersion == 0)
5798 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005799 RenderDebugEnablingArgs(Args, CmdArgs,
5800 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5801 : CodeGenOptions::NoDebugInfo),
5802 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005803
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005804 // Add the -fdebug-compilation-dir flag if needed.
5805 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005806
5807 // Set the AT_producer to the clang version when using the integrated
5808 // assembler on assembly source files.
5809 CmdArgs.push_back("-dwarf-debug-producer");
5810 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005811
5812 // And pass along -I options
5813 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005814 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005815
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005816 // Handle -fPIC et al -- the relocation-model affects the assembler
5817 // for some targets.
5818 llvm::Reloc::Model RelocationModel;
5819 unsigned PICLevel;
5820 bool IsPIE;
5821 std::tie(RelocationModel, PICLevel, IsPIE) =
5822 ParsePICArgs(getToolChain(), Triple, Args);
5823
5824 const char *RMName = RelocationModelName(RelocationModel);
5825 if (RMName) {
5826 CmdArgs.push_back("-mrelocation-model");
5827 CmdArgs.push_back(RMName);
5828 }
5829
Kevin Enderby292dc082011-12-22 19:31:58 +00005830 // Optionally embed the -cc1as level arguments into the debug info, for build
5831 // analysis.
5832 if (getToolChain().UseDwarfDebugFlags()) {
5833 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005834 for (const auto &Arg : Args)
5835 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005836
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005837 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005838 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5839 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005840 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005841 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005842 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005843 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005844 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005845 }
5846 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005847 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005848 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005849
5850 // FIXME: Add -static support, once we have it.
5851
Daniel Sanders7f933f42015-01-30 17:35:23 +00005852 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005853 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005854 default:
5855 break;
5856
5857 case llvm::Triple::mips:
5858 case llvm::Triple::mipsel:
5859 case llvm::Triple::mips64:
5860 case llvm::Triple::mips64el:
5861 AddMIPSTargetArgs(Args, CmdArgs);
5862 break;
5863 }
5864
David Blaikie372d9502014-01-17 03:17:40 +00005865 // Consume all the warning flags. Usually this would be handled more
5866 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5867 // doesn't handle that so rather than warning about unused flags that are
5868 // actually used, we'll lie by omission instead.
5869 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005870 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5871 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005872
David Blaikie9260ed62013-07-25 21:19:01 +00005873 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5874 getToolChain().getDriver());
5875
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005876 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005877
5878 assert(Output.isFilename() && "Unexpected lipo output.");
5879 CmdArgs.push_back("-o");
5880 CmdArgs.push_back(Output.getFilename());
5881
Daniel Dunbarb440f562010-08-02 02:38:21 +00005882 assert(Input.isFilename() && "Invalid input.");
5883 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005884
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005885 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005886 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005887
5888 // Handle the debug info splitting at object creation time if we're
5889 // creating an object.
5890 // TODO: Currently only works on linux with newer objcopy.
5891 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005892 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005893 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005894 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005895}
5896
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005897void GnuTool::anchor() {}
5898
Daniel Dunbara3246a02009-03-18 08:07:30 +00005899void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005900 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005901 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005902 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005903 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005904 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005905
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005906 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005907 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005908 // Don't forward any -g arguments to assembly steps.
5909 if (isa<AssembleJobAction>(JA) &&
5910 A->getOption().matches(options::OPT_g_Group))
5911 continue;
5912
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005913 // Don't forward any -W arguments to assembly and link steps.
5914 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5915 A->getOption().matches(options::OPT_W_Group))
5916 continue;
5917
Daniel Dunbar2da02722009-03-19 07:55:12 +00005918 // It is unfortunate that we have to claim here, as this means
5919 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005920 // platforms using a generic gcc, even if we are just using gcc
5921 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005922 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005923 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005924 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005925 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005926
Daniel Dunbar4e295052010-01-25 22:35:08 +00005927 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005928
5929 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005930 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005931 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005932 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005933 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005934 }
5935
Daniel Dunbar5716d872009-05-02 21:41:52 +00005936 // Try to force gcc to match the tool chain we want, if we recognize
5937 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005938 //
5939 // FIXME: The triple class should directly provide the information we want
5940 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005941 switch (getToolChain().getArch()) {
5942 default:
5943 break;
5944 case llvm::Triple::x86:
5945 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005946 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005947 break;
5948 case llvm::Triple::x86_64:
5949 case llvm::Triple::ppc64:
5950 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005951 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005952 break;
5953 case llvm::Triple::sparcel:
5954 CmdArgs.push_back("-EL");
5955 break;
5956 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005957
Daniel Dunbarb440f562010-08-02 02:38:21 +00005958 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005959 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005960 CmdArgs.push_back(Output.getFilename());
5961 } else {
5962 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005963 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005964 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005965
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005966 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005967
5968 // Only pass -x if gcc will understand it; otherwise hope gcc
5969 // understands the suffix correctly. The main use case this would go
5970 // wrong in is for linker inputs if they happened to have an odd
5971 // suffix; really the only way to get this to happen is a command
5972 // like '-x foobar a.c' which will treat a.c like a linker input.
5973 //
5974 // FIXME: For the linker case specifically, can we safely convert
5975 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005976 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005977 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005978 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5979 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005980 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005981 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005982 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005983 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005984 else if (II.getType() == types::TY_ModuleFile)
5985 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005986 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005987
Daniel Dunbara3246a02009-03-18 08:07:30 +00005988 if (types::canTypeBeUserSpecified(II.getType())) {
5989 CmdArgs.push_back("-x");
5990 CmdArgs.push_back(types::getTypeName(II.getType()));
5991 }
5992
Daniel Dunbarb440f562010-08-02 02:38:21 +00005993 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005994 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005995 else {
5996 const Arg &A = II.getInputArg();
5997
5998 // Reverse translate some rewritten options.
5999 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6000 CmdArgs.push_back("-lstdc++");
6001 continue;
6002 }
6003
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006004 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006005 A.render(Args, CmdArgs);
6006 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006007 }
6008
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006009 const std::string customGCCName = D.getCCCGenericGCCName();
6010 const char *GCCName;
6011 if (!customGCCName.empty())
6012 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006013 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006014 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006015 } else
6016 GCCName = "gcc";
6017
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006018 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006019 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006020}
6021
Douglas Katzman95354292015-06-23 20:42:09 +00006022void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6023 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006024 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006025}
6026
Douglas Katzman95354292015-06-23 20:42:09 +00006027void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6028 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006029 const Driver &D = getToolChain().getDriver();
6030
Eric Christophercc7ff502015-01-29 00:56:17 +00006031 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006032 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006033 case types::TY_LLVM_IR:
6034 case types::TY_LTO_IR:
6035 case types::TY_LLVM_BC:
6036 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006037 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006038 break;
6039 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006040 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006041 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006042 case types::TY_Nothing:
6043 CmdArgs.push_back("-fsyntax-only");
6044 break;
6045 default:
6046 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006047 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006048}
6049
Douglas Katzman95354292015-06-23 20:42:09 +00006050void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6051 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006052 // The types are (hopefully) good enough.
6053}
6054
Tony Linthicum76329bf2011-12-12 21:14:55 +00006055// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006056void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
6057 ArgStringList &CmdArgs) const {}
6058void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6059 const InputInfo &Output,
6060 const InputInfoList &Inputs,
6061 const ArgList &Args,
6062 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006063 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006064
6065 const Driver &D = getToolChain().getDriver();
6066 ArgStringList CmdArgs;
6067
6068 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00006069 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006070 CmdArgs.push_back(Args.MakeArgString(MarchString));
6071
6072 RenderExtraToolArgs(JA, CmdArgs);
6073
6074 if (Output.isFilename()) {
6075 CmdArgs.push_back("-o");
6076 CmdArgs.push_back(Output.getFilename());
6077 } else {
6078 assert(Output.isNothing() && "Unexpected output");
6079 CmdArgs.push_back("-fsyntax-only");
6080 }
6081
Douglas Katzman54366072015-07-27 16:53:08 +00006082 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006083 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006084
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006085 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006086
Tony Linthicum76329bf2011-12-12 21:14:55 +00006087 // Only pass -x if gcc will understand it; otherwise hope gcc
6088 // understands the suffix correctly. The main use case this would go
6089 // wrong in is for linker inputs if they happened to have an odd
6090 // suffix; really the only way to get this to happen is a command
6091 // like '-x foobar a.c' which will treat a.c like a linker input.
6092 //
6093 // FIXME: For the linker case specifically, can we safely convert
6094 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006095 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006096 // Don't try to pass LLVM or AST inputs to a generic gcc.
6097 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
6098 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
6099 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006100 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006101 else if (II.getType() == types::TY_AST)
6102 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006103 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006104 else if (II.getType() == types::TY_ModuleFile)
6105 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006106 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006107
6108 if (II.isFilename())
6109 CmdArgs.push_back(II.getFilename());
6110 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006111 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006112 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006113 II.getInputArg().render(Args, CmdArgs);
6114 }
6115
6116 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006117 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006118 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006119}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006120
Douglas Katzman95354292015-06-23 20:42:09 +00006121void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6122 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006123 // The types are (hopefully) good enough.
6124}
6125
Douglas Katzman54366072015-07-27 16:53:08 +00006126static void
6127constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
6128 const toolchains::HexagonToolChain &ToolChain,
6129 const InputInfo &Output, const InputInfoList &Inputs,
6130 const ArgList &Args, ArgStringList &CmdArgs,
6131 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006132
Matthew Curtise689b052012-12-06 15:46:07 +00006133 const Driver &D = ToolChain.getDriver();
6134
Matthew Curtise689b052012-12-06 15:46:07 +00006135 //----------------------------------------------------------------------------
6136 //
6137 //----------------------------------------------------------------------------
6138 bool hasStaticArg = Args.hasArg(options::OPT_static);
6139 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006140 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00006141 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
6142 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6143 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006144 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006145 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006146
Matthew Curtise689b052012-12-06 15:46:07 +00006147 //----------------------------------------------------------------------------
6148 // Silence warnings for various options
6149 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00006150
Matthew Curtise689b052012-12-06 15:46:07 +00006151 Args.ClaimAllArgs(options::OPT_g_Group);
6152 Args.ClaimAllArgs(options::OPT_emit_llvm);
6153 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6154 // handled somewhere else.
6155 Args.ClaimAllArgs(options::OPT_static_libgcc);
6156
6157 //----------------------------------------------------------------------------
6158 //
6159 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006160 for (const auto &Opt : ToolChain.ExtraOpts)
6161 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006162
Douglas Katzman54366072015-07-27 16:53:08 +00006163 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00006164 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00006165
Matthew Curtise689b052012-12-06 15:46:07 +00006166 if (buildingLib) {
6167 CmdArgs.push_back("-shared");
6168 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
6169 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00006170 }
6171
Matthew Curtise689b052012-12-06 15:46:07 +00006172 if (hasStaticArg)
6173 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006174
Matthew Curtise8f80a12012-12-06 17:49:03 +00006175 if (buildPIE && !buildingLib)
6176 CmdArgs.push_back("-pie");
6177
Douglas Katzman54366072015-07-27 16:53:08 +00006178 if (const char *v =
6179 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006180 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00006181 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006182 }
6183
Matthew Curtise689b052012-12-06 15:46:07 +00006184 //----------------------------------------------------------------------------
6185 //
6186 //----------------------------------------------------------------------------
6187 CmdArgs.push_back("-o");
6188 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006189
Matthew Curtise689b052012-12-06 15:46:07 +00006190 const std::string MarchSuffix = "/" + MarchString;
6191 const std::string G0Suffix = "/G0";
6192 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00006193 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006194 const std::string StartFilesDir =
6195 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006196
6197 //----------------------------------------------------------------------------
6198 // moslib
6199 //----------------------------------------------------------------------------
6200 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006201 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006202
Sean Silva14facf32015-06-09 01:57:17 +00006203 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6204 A->claim();
6205 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00006206 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006207 }
Matthew Curtise689b052012-12-06 15:46:07 +00006208 if (oslibs.empty()) {
6209 oslibs.push_back("standalone");
6210 hasStandalone = true;
6211 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006212
Matthew Curtise689b052012-12-06 15:46:07 +00006213 //----------------------------------------------------------------------------
6214 // Start Files
6215 //----------------------------------------------------------------------------
6216 if (incStdLib && incStartFiles) {
6217
6218 if (!buildingLib) {
6219 if (hasStandalone) {
6220 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006221 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00006222 }
6223 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
6224 }
6225 std::string initObj = useShared ? "/initS.o" : "/init.o";
6226 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
6227 }
6228
6229 //----------------------------------------------------------------------------
6230 // Library Search Paths
6231 //----------------------------------------------------------------------------
Douglas Katzman6059ef92015-11-17 17:41:23 +00006232 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006233
6234 //----------------------------------------------------------------------------
6235 //
6236 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006237 Args.AddAllArgs(CmdArgs,
6238 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6239 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006240
6241 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6242
6243 //----------------------------------------------------------------------------
6244 // Libraries
6245 //----------------------------------------------------------------------------
6246 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006247 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006248 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6249 CmdArgs.push_back("-lm");
6250 }
6251
6252 CmdArgs.push_back("--start-group");
6253
6254 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006255 for (const std::string &Lib : oslibs)
6256 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006257 CmdArgs.push_back("-lc");
6258 }
6259 CmdArgs.push_back("-lgcc");
6260
6261 CmdArgs.push_back("--end-group");
6262 }
6263
6264 //----------------------------------------------------------------------------
6265 // End files
6266 //----------------------------------------------------------------------------
6267 if (incStdLib && incStartFiles) {
6268 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6269 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6270 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006271}
6272
Douglas Katzman95354292015-06-23 20:42:09 +00006273void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6274 const InputInfo &Output,
6275 const InputInfoList &Inputs,
6276 const ArgList &Args,
6277 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006278
Douglas Katzman54366072015-07-27 16:53:08 +00006279 const toolchains::HexagonToolChain &ToolChain =
6280 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006281
6282 ArgStringList CmdArgs;
6283 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6284 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006285
6286 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006287 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006288 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006289}
6290// Hexagon tools end.
6291
Tom Stellard8fa33092015-07-18 01:49:05 +00006292void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6293 const InputInfo &Output,
6294 const InputInfoList &Inputs,
6295 const ArgList &Args,
6296 const char *LinkingOutput) const {
6297
6298 std::string Linker = getToolChain().GetProgramPath(getShortName());
6299 ArgStringList CmdArgs;
6300 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006301 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006302 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006303 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006304 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6305 CmdArgs.push_back("-o");
6306 CmdArgs.push_back(Output.getFilename());
6307 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6308 CmdArgs, Inputs));
6309}
6310// AMDGPU tools end.
6311
Renato Golin7c542b42015-07-27 23:44:45 +00006312const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006313 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006314 if (!Arch.empty())
6315 MArch = Arch;
6316 else
Bernard Ogden31561762013-12-12 13:27:11 +00006317 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006318 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006319
6320 // Handle -march=native.
6321 if (MArch == "native") {
6322 std::string CPU = llvm::sys::getHostCPUName();
6323 if (CPU != "generic") {
6324 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006325 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006326 // If there is no valid architecture suffix for this CPU we don't know how
6327 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006328 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006329 MArch = "";
6330 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006331 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006332 }
6333 }
6334
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006335 return MArch;
6336}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006337
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006338/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006339StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006340 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006341 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6342 // here means an -march=native that we can't handle, so instead return no CPU.
6343 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006344 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006345
John Brawna95c1a82015-05-08 12:52:18 +00006346 // We need to return an empty string here on invalid MArch values as the
6347 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006348 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006349}
6350
6351/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006352std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006353 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006354 // FIXME: Warn on inconsistent use of -mcpu and -march.
6355 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006356 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006357 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006358 // Handle -mcpu=native.
6359 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006360 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006361 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006362 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006363 }
6364
Renato Goline17c5802015-07-27 23:44:42 +00006365 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006366}
6367
6368/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006369/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006370// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006371StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6372 const llvm::Triple &Triple) {
6373 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006374 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006375 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006376 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006377 if (ArchKind == llvm::ARM::AK_INVALID)
6378 // In case of generic Arch, i.e. "arm",
6379 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006380 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006381 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006382 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6383 // armv7k triple if it's actually been specified via "-arch armv7k".
6384 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006385 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006386 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006387 }
Renato Golin3c007252015-05-28 15:05:53 +00006388 if (ArchKind == llvm::ARM::AK_INVALID)
6389 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006390 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006391}
6392
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006393void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006394 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006395 if (Args.hasArg(options::OPT_r))
6396 return;
6397
John Brawn94fd9632015-05-21 12:19:49 +00006398 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6399 // to generate BE-8 executables.
6400 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6401 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006402}
6403
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006404mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006405 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6406 // was first introduced in Release 3. However, other compilers have
6407 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006408 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6409 .Case("mips1", NanLegacy)
6410 .Case("mips2", NanLegacy)
6411 .Case("mips3", NanLegacy)
6412 .Case("mips4", NanLegacy)
6413 .Case("mips5", NanLegacy)
6414 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006415 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006416 .Case("mips32r3", NanLegacy | Nan2008)
6417 .Case("mips32r5", NanLegacy | Nan2008)
6418 .Case("mips32r6", Nan2008)
6419 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006420 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006421 .Case("mips64r3", NanLegacy | Nan2008)
6422 .Case("mips64r5", NanLegacy | Nan2008)
6423 .Case("mips64r6", Nan2008)
6424 .Default(NanLegacy);
6425}
6426
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006427bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6428 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6429 return A && (A->getValue() == StringRef(Value));
6430}
6431
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006432bool mips::isUCLibc(const ArgList &Args) {
6433 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006434 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006435}
6436
Daniel Sanders2bf13662014-07-10 14:40:57 +00006437bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006438 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6439 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006440 .Case("2008", true)
6441 .Case("legacy", false)
6442 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006443
6444 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006445 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006446 .Cases("mips32r6", "mips64r6", true)
6447 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006448
6449 return false;
6450}
6451
Daniel Sanders379d44b2014-07-16 11:52:23 +00006452bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006453 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006454 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006455 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006456 return false;
6457
6458 if (ABIName != "32")
6459 return false;
6460
Toma Tabacu94ea6862015-06-16 13:54:13 +00006461 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6462 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006463 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006464 return false;
6465
Daniel Sanders379d44b2014-07-16 11:52:23 +00006466 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006467 .Cases("mips2", "mips3", "mips4", "mips5", true)
6468 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6469 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6470 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006471}
6472
Toma Tabacu94ea6862015-06-16 13:54:13 +00006473bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6474 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006475 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006476 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6477
6478 // FPXX shouldn't be used if -msingle-float is present.
6479 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6480 options::OPT_mdouble_float))
6481 if (A->getOption().matches(options::OPT_msingle_float))
6482 UseFPXX = false;
6483
6484 return UseFPXX;
6485}
6486
Tim Northover157d9112014-01-16 08:48:16 +00006487llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006488 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6489 // archs which Darwin doesn't use.
6490
6491 // The matching this routine does is fairly pointless, since it is neither the
6492 // complete architecture list, nor a reasonable subset. The problem is that
6493 // historically the driver driver accepts this and also ties its -march=
6494 // handling to the architecture name, so we need to be careful before removing
6495 // support for it.
6496
6497 // This code must be kept in sync with Clang's Darwin specific argument
6498 // translation.
6499
6500 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006501 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6502 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6503 .Case("ppc64", llvm::Triple::ppc64)
6504 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6505 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6506 llvm::Triple::x86)
6507 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6508 // This is derived from the driver driver.
6509 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6510 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6511 .Cases("armv7s", "xscale", llvm::Triple::arm)
6512 .Case("arm64", llvm::Triple::aarch64)
6513 .Case("r600", llvm::Triple::r600)
6514 .Case("amdgcn", llvm::Triple::amdgcn)
6515 .Case("nvptx", llvm::Triple::nvptx)
6516 .Case("nvptx64", llvm::Triple::nvptx64)
6517 .Case("amdil", llvm::Triple::amdil)
6518 .Case("spir", llvm::Triple::spir)
6519 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006520}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006521
Tim Northover157d9112014-01-16 08:48:16 +00006522void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006523 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006524 T.setArch(Arch);
6525
6526 if (Str == "x86_64h")
6527 T.setArchName(Str);
6528 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6529 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006530 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006531 }
6532}
6533
Bob Wilsondecc03e2012-11-23 06:14:39 +00006534const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006535 const InputInfo &Input) {
6536 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006537}
6538
Bob Wilsondecc03e2012-11-23 06:14:39 +00006539const char *Clang::getBaseInputStem(const ArgList &Args,
6540 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006541 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006542
Chris Lattner906bb902011-01-16 08:14:11 +00006543 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006544 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006545
6546 return Str;
6547}
6548
Bob Wilsondecc03e2012-11-23 06:14:39 +00006549const char *Clang::getDependencyFileName(const ArgList &Args,
6550 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006551 // FIXME: Think about this more.
6552 std::string Res;
6553
6554 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006555 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006556 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006557 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006558 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006559 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006560 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006561}
6562
Douglas Katzman95354292015-06-23 20:42:09 +00006563void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6564 const InputInfo &Output,
6565 const InputInfoList &Inputs,
6566 const ArgList &Args,
6567 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006568 const ToolChain &ToolChain = getToolChain();
6569 const Driver &D = ToolChain.getDriver();
6570 ArgStringList CmdArgs;
6571
6572 // Silence warning for "clang -g foo.o -o foo"
6573 Args.ClaimAllArgs(options::OPT_g_Group);
6574 // and "clang -emit-llvm foo.o -o foo"
6575 Args.ClaimAllArgs(options::OPT_emit_llvm);
6576 // and for "clang -w foo.o -o foo". Other warning options are already
6577 // handled somewhere else.
6578 Args.ClaimAllArgs(options::OPT_w);
6579
6580 if (!D.SysRoot.empty())
6581 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6582
6583 // CloudABI only supports static linkage.
6584 CmdArgs.push_back("-Bstatic");
6585 CmdArgs.push_back("--eh-frame-hdr");
6586 CmdArgs.push_back("--gc-sections");
6587
6588 if (Output.isFilename()) {
6589 CmdArgs.push_back("-o");
6590 CmdArgs.push_back(Output.getFilename());
6591 } else {
6592 assert(Output.isNothing() && "Invalid output.");
6593 }
6594
Douglas Katzman78b37b02015-11-17 20:28:07 +00006595 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006596 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6597 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6598 }
6599
6600 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006601 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006602 Args.AddAllArgs(CmdArgs,
6603 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6604 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006605
Teresa Johnson945bc502015-10-15 20:35:53 +00006606 if (D.isUsingLTO())
6607 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006608
6609 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6610
Douglas Katzman78b37b02015-11-17 20:28:07 +00006611 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006612 if (D.CCCIsCXX())
6613 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6614 CmdArgs.push_back("-lc");
6615 CmdArgs.push_back("-lcompiler_rt");
6616 }
6617
Douglas Katzman78b37b02015-11-17 20:28:07 +00006618 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006619 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6620
6621 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006622 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006623}
6624
Douglas Katzman95354292015-06-23 20:42:09 +00006625void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6626 const InputInfo &Output,
6627 const InputInfoList &Inputs,
6628 const ArgList &Args,
6629 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006630 ArgStringList CmdArgs;
6631
6632 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6633 const InputInfo &Input = Inputs[0];
6634
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006635 // Determine the original source input.
6636 const Action *SourceAction = &JA;
6637 while (SourceAction->getKind() != Action::InputClass) {
6638 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6639 SourceAction = SourceAction->getInputs()[0];
6640 }
6641
Eric Christopherf5a8f492015-12-08 00:10:10 +00006642 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006643 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006644 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6645 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006646 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006647 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006648 const llvm::Triple &T(getToolChain().getTriple());
6649 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006650 CmdArgs.push_back("-Q");
6651 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006652
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006653 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006654 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006655 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006656 if (Args.hasArg(options::OPT_gstabs))
6657 CmdArgs.push_back("--gstabs");
6658 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006659 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006660 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006661
Daniel Dunbarbe220842009-03-20 16:06:39 +00006662 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006663 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006664
Daniel Dunbar6d484762010-07-22 01:47:22 +00006665 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006666 if (getToolChain().getArch() == llvm::Triple::x86 ||
6667 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006668 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6669 CmdArgs.push_back("-force_cpusubtype_ALL");
6670
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006671 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006672 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006673 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006674 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006675 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006676 CmdArgs.push_back("-static");
6677
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006678 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006679
6680 assert(Output.isFilename() && "Unexpected lipo output.");
6681 CmdArgs.push_back("-o");
6682 CmdArgs.push_back(Output.getFilename());
6683
Daniel Dunbarb440f562010-08-02 02:38:21 +00006684 assert(Input.isFilename() && "Invalid input.");
6685 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006686
6687 // asm_final spec is empty.
6688
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006689 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006690 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006691}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006692
Tim Northover157d9112014-01-16 08:48:16 +00006693void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006694
Tim Northover157d9112014-01-16 08:48:16 +00006695void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6696 ArgStringList &CmdArgs) const {
6697 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006698
Daniel Dunbarc1964212009-03-26 16:23:12 +00006699 // Derived from darwin_arch spec.
6700 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006701 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006702
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006703 // FIXME: Is this needed anymore?
6704 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006705 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006706}
6707
Douglas Katzman95354292015-06-23 20:42:09 +00006708bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006709 // We only need to generate a temp path for LTO if we aren't compiling object
6710 // files. When compiling source files, we run 'dsymutil' after linking. We
6711 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006712 for (const auto &Input : Inputs)
6713 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006714 return true;
6715
6716 return false;
6717}
6718
Douglas Katzman95354292015-06-23 20:42:09 +00006719void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6720 ArgStringList &CmdArgs,
6721 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006722 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006723 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006724
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006725 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006726 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6727 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006728 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6729 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006730 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006731 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006732 }
6733
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006734 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006735 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006736 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6737 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006738
Bob Wilson3d27dad2013-08-02 22:25:34 +00006739 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6740 CmdArgs.push_back("-export_dynamic");
6741
Bob Wilsonb111ec92015-03-02 19:01:14 +00006742 // If we are using App Extension restrictions, pass a flag to the linker
6743 // telling it that the compiled code has been audited.
6744 if (Args.hasFlag(options::OPT_fapplication_extension,
6745 options::OPT_fno_application_extension, false))
6746 CmdArgs.push_back("-application_extension");
6747
Teresa Johnson945bc502015-10-15 20:35:53 +00006748 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006749 // If we are using LTO, then automatically create a temporary file path for
6750 // the linker to use, so that it's lifetime will extend past a possible
6751 // dsymutil step.
6752 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6753 const char *TmpPath = C.getArgs().MakeArgString(
6754 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6755 C.addTempFile(TmpPath);
6756 CmdArgs.push_back("-object_path_lto");
6757 CmdArgs.push_back(TmpPath);
6758 }
6759
6760 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6761 // it in clang installed libraries. If not found, the option is not used
6762 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6763 if (Version[0] >= 133) {
6764 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6765 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6766 SmallString<128> LibLTOPath(P);
6767 llvm::sys::path::append(LibLTOPath, "lib");
6768 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6769 if (llvm::sys::fs::exists(LibLTOPath)) {
6770 CmdArgs.push_back("-lto_library");
6771 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6772 } else {
6773 D.Diag(diag::warn_drv_lto_libpath);
6774 }
6775 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006776 }
6777
Daniel Dunbarc1964212009-03-26 16:23:12 +00006778 // Derived from the "link" spec.
6779 Args.AddAllArgs(CmdArgs, options::OPT_static);
6780 if (!Args.hasArg(options::OPT_static))
6781 CmdArgs.push_back("-dynamic");
6782 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6783 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6784 // here. How do we wish to handle such things?
6785 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006786
Daniel Dunbarc1964212009-03-26 16:23:12 +00006787 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006788 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006789 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006790 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006791
6792 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6793 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6794 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6795
6796 Arg *A;
6797 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6798 (A = Args.getLastArg(options::OPT_current__version)) ||
6799 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006800 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6801 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006802
6803 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6804 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6805 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6806 } else {
6807 CmdArgs.push_back("-dylib");
6808
6809 Arg *A;
6810 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6811 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6812 (A = Args.getLastArg(options::OPT_client__name)) ||
6813 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6814 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6815 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006816 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6817 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006818
Daniel Dunbarc1964212009-03-26 16:23:12 +00006819 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6820 "-dylib_compatibility_version");
6821 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6822 "-dylib_current_version");
6823
Tim Northover157d9112014-01-16 08:48:16 +00006824 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006825
6826 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6827 "-dylib_install_name");
6828 }
6829
6830 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6831 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6832 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006833 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006834 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006835 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6836 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6837 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6838 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6839 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6840 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006841 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006842 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6843 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6844 Args.AddAllArgs(CmdArgs, options::OPT_init);
6845
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006846 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006847 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006848
Daniel Dunbarc1964212009-03-26 16:23:12 +00006849 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6850 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6851 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6852 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6853 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006854
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006855 if (const Arg *A =
6856 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6857 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006858 if (A->getOption().matches(options::OPT_fpie) ||
6859 A->getOption().matches(options::OPT_fPIE))
6860 CmdArgs.push_back("-pie");
6861 else
6862 CmdArgs.push_back("-no_pie");
6863 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006864
6865 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6866 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6867 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6868 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6869 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6870 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6871 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6872 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6873 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6874 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6875 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6876 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6877 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6878 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6879 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6880 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006881
Daniel Dunbar84384642011-05-02 21:03:47 +00006882 // Give --sysroot= preference, over the Apple specific behavior to also use
6883 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006884 StringRef sysroot = C.getSysRoot();
6885 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006886 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006887 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006888 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6889 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006890 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006891 }
6892
Daniel Dunbarc1964212009-03-26 16:23:12 +00006893 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6894 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6895 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6896 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6897 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006898 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006899 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6900 Args.AddAllArgs(CmdArgs, options::OPT_y);
6901 Args.AddLastArg(CmdArgs, options::OPT_w);
6902 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6903 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6904 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6905 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6906 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6907 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6908 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6909 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6910 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6911 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6912 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6913 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6914}
6915
Douglas Katzman95354292015-06-23 20:42:09 +00006916void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6917 const InputInfo &Output,
6918 const InputInfoList &Inputs,
6919 const ArgList &Args,
6920 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006921 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006922
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006923 // If the number of arguments surpasses the system limits, we will encode the
6924 // input files in a separate file, shortening the command line. To this end,
6925 // build a list of input file names that can be passed via a file with the
6926 // -filelist linker option.
6927 llvm::opt::ArgStringList InputFileList;
6928
Daniel Dunbarc1964212009-03-26 16:23:12 +00006929 // The logic here is derived from gcc's behavior; most of which
6930 // comes from specs (starting with link_command). Consult gcc for
6931 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006932 ArgStringList CmdArgs;
6933
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006934 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6935 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6936 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006937 for (const auto &Arg : Args)
6938 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006939 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006940 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006941 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006942 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006943 return;
6944 }
6945
Daniel Dunbarc1964212009-03-26 16:23:12 +00006946 // I'm not sure why this particular decomposition exists in gcc, but
6947 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006948 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006949
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006950 // It seems that the 'e' option is completely ignored for dynamic executables
6951 // (the default), and with static executables, the last one wins, as expected.
6952 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6953 options::OPT_Z_Flag, options::OPT_u_Group,
6954 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006955
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006956 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6957 // members of static archive libraries which implement Objective-C classes or
6958 // categories.
6959 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6960 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006961
Daniel Dunbarc1964212009-03-26 16:23:12 +00006962 CmdArgs.push_back("-o");
6963 CmdArgs.push_back(Output.getFilename());
6964
Douglas Katzman78b37b02015-11-17 20:28:07 +00006965 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00006966 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006967
Peter Collingbournec4122c12015-06-15 21:08:13 +00006968 // SafeStack requires its own runtime libraries
6969 // These libraries should be linked first, to make sure the
6970 // __safestack_init constructor executes before everything else
6971 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6972 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6973 "libclang_rt.safestack_osx.a",
6974 /*AlwaysLink=*/true);
6975 }
6976
Daniel Dunbarc1964212009-03-26 16:23:12 +00006977 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006978
Douglas Gregor9295df02012-05-15 21:00:27 +00006979 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006980 // Build the input file for -filelist (list of linker input files) in case we
6981 // need it later
6982 for (const auto &II : Inputs) {
6983 if (!II.isFilename()) {
6984 // This is a linker input argument.
6985 // We cannot mix input arguments and file names in a -filelist input, thus
6986 // we prematurely stop our list (remaining files shall be passed as
6987 // arguments).
6988 if (InputFileList.size() > 0)
6989 break;
6990
6991 continue;
6992 }
6993
6994 InputFileList.push_back(II.getFilename());
6995 }
6996
Douglas Katzman78b37b02015-11-17 20:28:07 +00006997 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006998 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6999
Douglas Katzman78b37b02015-11-17 20:28:07 +00007000 if (isObjCRuntimeLinked(Args) &&
7001 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007002 // We use arclite library for both ARC and subscripting support.
7003 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7004
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007005 CmdArgs.push_back("-framework");
7006 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007007 // Link libobj.
7008 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007009 }
John McCall31168b02011-06-15 23:02:42 +00007010
Daniel Dunbarc1964212009-03-26 16:23:12 +00007011 if (LinkingOutput) {
7012 CmdArgs.push_back("-arch_multiple");
7013 CmdArgs.push_back("-final_output");
7014 CmdArgs.push_back(LinkingOutput);
7015 }
7016
Daniel Dunbarc1964212009-03-26 16:23:12 +00007017 if (Args.hasArg(options::OPT_fnested_functions))
7018 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007019
Justin Bognerc7701242015-05-12 05:44:36 +00007020 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7021
Douglas Katzman78b37b02015-11-17 20:28:07 +00007022 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007023 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007024 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007025
Daniel Dunbarc1964212009-03-26 16:23:12 +00007026 // link_ssp spec is empty.
7027
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007028 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007029 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007030 }
7031
Douglas Katzman78b37b02015-11-17 20:28:07 +00007032 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007033 // endfile_spec is empty.
7034 }
7035
7036 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7037 Args.AddAllArgs(CmdArgs, options::OPT_F);
7038
Steven Wu3ffb61b2015-02-06 18:08:29 +00007039 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007040 for (const Arg *A : Args.filtered(options::OPT_iframework))
7041 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007042
Douglas Katzman78b37b02015-11-17 20:28:07 +00007043 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007044 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7045 if (A->getValue() == StringRef("Accelerate")) {
7046 CmdArgs.push_back("-framework");
7047 CmdArgs.push_back("Accelerate");
7048 }
7049 }
7050 }
7051
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007052 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007053 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007054 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007055 Cmd->setInputFileList(std::move(InputFileList));
7056 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007057}
7058
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007059void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007060 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007061 const InputInfoList &Inputs,
7062 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007063 const char *LinkingOutput) const {
7064 ArgStringList CmdArgs;
7065
7066 CmdArgs.push_back("-create");
7067 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007068
7069 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007070 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007071
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007072 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007073 assert(II.isFilename() && "Unexpected lipo input.");
7074 CmdArgs.push_back(II.getFilename());
7075 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007076
7077 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007078 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007079}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007080
Daniel Dunbar88299622010-06-04 18:28:36 +00007081void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007082 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007083 const InputInfoList &Inputs,
7084 const ArgList &Args,
7085 const char *LinkingOutput) const {
7086 ArgStringList CmdArgs;
7087
Daniel Dunbareb86b042011-05-09 17:23:16 +00007088 CmdArgs.push_back("-o");
7089 CmdArgs.push_back(Output.getFilename());
7090
Daniel Dunbar88299622010-06-04 18:28:36 +00007091 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7092 const InputInfo &Input = Inputs[0];
7093 assert(Input.isFilename() && "Unexpected dsymutil input.");
7094 CmdArgs.push_back(Input.getFilename());
7095
Daniel Dunbar88299622010-06-04 18:28:36 +00007096 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007097 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007098 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007099}
7100
Eric Christopher551ef452011-08-23 17:56:55 +00007101void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007102 const InputInfo &Output,
7103 const InputInfoList &Inputs,
7104 const ArgList &Args,
7105 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007106 ArgStringList CmdArgs;
7107 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007108 CmdArgs.push_back("--debug-info");
7109 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007110 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007111
7112 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7113 const InputInfo &Input = Inputs[0];
7114 assert(Input.isFilename() && "Unexpected verify input");
7115
7116 // Grabbing the output of the earlier dsymutil run.
7117 CmdArgs.push_back(Input.getFilename());
7118
7119 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007120 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007121 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007122}
7123
Douglas Katzman95354292015-06-23 20:42:09 +00007124void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007125 const InputInfo &Output,
7126 const InputInfoList &Inputs,
7127 const ArgList &Args,
7128 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007129 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007130 ArgStringList CmdArgs;
7131
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007132 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007133
7134 CmdArgs.push_back("-o");
7135 CmdArgs.push_back(Output.getFilename());
7136
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007137 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007138 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007139
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007140 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007141 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007142}
7143
Douglas Katzman95354292015-06-23 20:42:09 +00007144void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7145 const InputInfo &Output,
7146 const InputInfoList &Inputs,
7147 const ArgList &Args,
7148 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007149 ArgStringList CmdArgs;
7150
David Chisnall272a0712012-02-29 15:06:12 +00007151 // Demangle C++ names in errors
7152 CmdArgs.push_back("-C");
7153
Douglas Katzman78b37b02015-11-17 20:28:07 +00007154 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007155 CmdArgs.push_back("-e");
7156 CmdArgs.push_back("_start");
7157 }
7158
7159 if (Args.hasArg(options::OPT_static)) {
7160 CmdArgs.push_back("-Bstatic");
7161 CmdArgs.push_back("-dn");
7162 } else {
7163 CmdArgs.push_back("-Bdynamic");
7164 if (Args.hasArg(options::OPT_shared)) {
7165 CmdArgs.push_back("-shared");
7166 } else {
7167 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007168 CmdArgs.push_back(
7169 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007170 }
7171 }
7172
7173 if (Output.isFilename()) {
7174 CmdArgs.push_back("-o");
7175 CmdArgs.push_back(Output.getFilename());
7176 } else {
7177 assert(Output.isNothing() && "Invalid output.");
7178 }
7179
Douglas Katzman78b37b02015-11-17 20:28:07 +00007180 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007181 if (!Args.hasArg(options::OPT_shared))
7182 CmdArgs.push_back(
7183 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7184
7185 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7186 CmdArgs.push_back(
7187 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7188 CmdArgs.push_back(
7189 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007190 }
7191
Douglas Katzman6059ef92015-11-17 17:41:23 +00007192 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007193
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007194 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7195 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007196
7197 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7198
Douglas Katzman78b37b02015-11-17 20:28:07 +00007199 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007200 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007201 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007202 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007203 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007204 if (!Args.hasArg(options::OPT_shared)) {
7205 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007206 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007207 }
David Chisnallf571cde2012-02-15 13:39:01 +00007208 }
7209
Douglas Katzman78b37b02015-11-17 20:28:07 +00007210 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007211 CmdArgs.push_back(
7212 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007213 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007214 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007215
Xinliang David Li69306c02015-10-22 06:15:31 +00007216 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007217
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007218 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007219 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007220}
7221
Douglas Katzman95354292015-06-23 20:42:09 +00007222void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7223 const InputInfo &Output,
7224 const InputInfoList &Inputs,
7225 const ArgList &Args,
7226 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007227 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007228 ArgStringList CmdArgs;
7229
Rafael Espindolacc126272014-02-28 01:55:21 +00007230 switch (getToolChain().getArch()) {
7231 case llvm::Triple::x86:
7232 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7233 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007234 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007235 break;
7236
7237 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007238 CmdArgs.push_back("-mppc");
7239 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007240 break;
7241
7242 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007243 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007244 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007245 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7246 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7247 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007248 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007249 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007250
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007251 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007252 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007253 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7254 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7255 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007256 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007257 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007258
7259 case llvm::Triple::mips64:
7260 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007261 StringRef CPUName;
7262 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007263 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007264
7265 CmdArgs.push_back("-mabi");
7266 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7267
7268 if (getToolChain().getArch() == llvm::Triple::mips64)
7269 CmdArgs.push_back("-EB");
7270 else
7271 CmdArgs.push_back("-EL");
7272
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007273 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007274 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007275 }
7276
Rafael Espindolacc126272014-02-28 01:55:21 +00007277 default:
7278 break;
7279 }
7280
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007281 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007282
7283 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007284 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007285
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007286 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007287 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007288
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007289 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007290 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007291}
7292
Douglas Katzman95354292015-06-23 20:42:09 +00007293void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7294 const InputInfo &Output,
7295 const InputInfoList &Inputs,
7296 const ArgList &Args,
7297 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007298 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007299 ArgStringList CmdArgs;
7300
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007301 // Silence warning for "clang -g foo.o -o foo"
7302 Args.ClaimAllArgs(options::OPT_g_Group);
7303 // and "clang -emit-llvm foo.o -o foo"
7304 Args.ClaimAllArgs(options::OPT_emit_llvm);
7305 // and for "clang -w foo.o -o foo". Other warning options are already
7306 // handled somewhere else.
7307 Args.ClaimAllArgs(options::OPT_w);
7308
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007309 if (getToolChain().getArch() == llvm::Triple::mips64)
7310 CmdArgs.push_back("-EB");
7311 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7312 CmdArgs.push_back("-EL");
7313
Douglas Katzman78b37b02015-11-17 20:28:07 +00007314 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007315 CmdArgs.push_back("-e");
7316 CmdArgs.push_back("__start");
7317 }
7318
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007319 if (Args.hasArg(options::OPT_static)) {
7320 CmdArgs.push_back("-Bstatic");
7321 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007322 if (Args.hasArg(options::OPT_rdynamic))
7323 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007324 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007325 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007326 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007327 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007328 } else {
7329 CmdArgs.push_back("-dynamic-linker");
7330 CmdArgs.push_back("/usr/libexec/ld.so");
7331 }
7332 }
7333
Rafael Espindola044f7832013-06-05 04:28:55 +00007334 if (Args.hasArg(options::OPT_nopie))
7335 CmdArgs.push_back("-nopie");
7336
Daniel Dunbarb440f562010-08-02 02:38:21 +00007337 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007338 CmdArgs.push_back("-o");
7339 CmdArgs.push_back(Output.getFilename());
7340 } else {
7341 assert(Output.isNothing() && "Invalid output.");
7342 }
7343
Douglas Katzman78b37b02015-11-17 20:28:07 +00007344 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007345 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007346 if (Args.hasArg(options::OPT_pg))
7347 CmdArgs.push_back(
7348 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007349 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007350 CmdArgs.push_back(
7351 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7352 CmdArgs.push_back(
7353 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007354 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007355 CmdArgs.push_back(
7356 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007357 }
7358 }
7359
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007360 std::string Triple = getToolChain().getTripleString();
7361 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007362 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007363 CmdArgs.push_back(
7364 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007365
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007366 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7367 options::OPT_e, options::OPT_s, options::OPT_t,
7368 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007369
Daniel Dunbar54423b22010-09-17 00:24:54 +00007370 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007371
Douglas Katzman78b37b02015-11-17 20:28:07 +00007372 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007373 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007374 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007375 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007376 CmdArgs.push_back("-lm_p");
7377 else
7378 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007379 }
7380
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007381 // FIXME: For some reason GCC passes -lgcc before adding
7382 // the default system libraries. Just mimic this for now.
7383 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007384
Eric Christopher17674ec2012-09-13 06:32:34 +00007385 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007386 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7387 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007388 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007389 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007390 }
7391
Chandler Carruth45661652011-12-17 22:32:42 +00007392 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007393 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007394 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007395 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007396 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007397 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007398
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007399 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007400 }
7401
Douglas Katzman78b37b02015-11-17 20:28:07 +00007402 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007403 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007404 CmdArgs.push_back(
7405 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007406 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007407 CmdArgs.push_back(
7408 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007409 }
7410
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007411 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007412 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007413}
Ed Schoutene33194b2009-04-02 19:13:12 +00007414
Douglas Katzman95354292015-06-23 20:42:09 +00007415void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7416 const InputInfo &Output,
7417 const InputInfoList &Inputs,
7418 const ArgList &Args,
7419 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007420 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007421 ArgStringList CmdArgs;
7422
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007423 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007424
7425 CmdArgs.push_back("-o");
7426 CmdArgs.push_back(Output.getFilename());
7427
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007428 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007429 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007430
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007431 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007432 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007433}
7434
Douglas Katzman95354292015-06-23 20:42:09 +00007435void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7436 const InputInfo &Output,
7437 const InputInfoList &Inputs,
7438 const ArgList &Args,
7439 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007440 const Driver &D = getToolChain().getDriver();
7441 ArgStringList CmdArgs;
7442
Douglas Katzman78b37b02015-11-17 20:28:07 +00007443 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007444 CmdArgs.push_back("-e");
7445 CmdArgs.push_back("__start");
7446 }
7447
7448 if (Args.hasArg(options::OPT_static)) {
7449 CmdArgs.push_back("-Bstatic");
7450 } else {
7451 if (Args.hasArg(options::OPT_rdynamic))
7452 CmdArgs.push_back("-export-dynamic");
7453 CmdArgs.push_back("--eh-frame-hdr");
7454 CmdArgs.push_back("-Bdynamic");
7455 if (Args.hasArg(options::OPT_shared)) {
7456 CmdArgs.push_back("-shared");
7457 } else {
7458 CmdArgs.push_back("-dynamic-linker");
7459 CmdArgs.push_back("/usr/libexec/ld.so");
7460 }
7461 }
7462
7463 if (Output.isFilename()) {
7464 CmdArgs.push_back("-o");
7465 CmdArgs.push_back(Output.getFilename());
7466 } else {
7467 assert(Output.isNothing() && "Invalid output.");
7468 }
7469
Douglas Katzman78b37b02015-11-17 20:28:07 +00007470 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007471 if (!Args.hasArg(options::OPT_shared)) {
7472 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007473 CmdArgs.push_back(
7474 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007475 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007476 CmdArgs.push_back(
7477 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7478 CmdArgs.push_back(
7479 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007480 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007481 CmdArgs.push_back(
7482 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007483 }
7484 }
7485
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007486 Args.AddAllArgs(CmdArgs,
7487 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007488
7489 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7490
Douglas Katzman78b37b02015-11-17 20:28:07 +00007491 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007492 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007493 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7494 if (Args.hasArg(options::OPT_pg))
7495 CmdArgs.push_back("-lm_p");
7496 else
7497 CmdArgs.push_back("-lm");
7498 }
7499
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007500 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007501 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007502 CmdArgs.push_back("-lpthread_p");
7503 else
7504 CmdArgs.push_back("-lpthread");
7505 }
7506
Eli Friedman9fa28852012-08-08 23:57:20 +00007507 if (!Args.hasArg(options::OPT_shared)) {
7508 if (Args.hasArg(options::OPT_pg))
7509 CmdArgs.push_back("-lc_p");
7510 else
7511 CmdArgs.push_back("-lc");
7512 }
7513
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007514 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007515 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007516 case llvm::Triple::arm:
7517 MyArch = "arm";
7518 break;
7519 case llvm::Triple::x86:
7520 MyArch = "i386";
7521 break;
7522 case llvm::Triple::x86_64:
7523 MyArch = "amd64";
7524 break;
7525 default:
7526 llvm_unreachable("Unsupported architecture");
7527 }
7528 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007529 }
7530
Douglas Katzman78b37b02015-11-17 20:28:07 +00007531 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007532 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007533 CmdArgs.push_back(
7534 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007535 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007536 CmdArgs.push_back(
7537 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007538 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007539
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007540 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007541 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007542}
7543
Douglas Katzman95354292015-06-23 20:42:09 +00007544void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7545 const InputInfo &Output,
7546 const InputInfoList &Inputs,
7547 const ArgList &Args,
7548 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007549 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007550 ArgStringList CmdArgs;
7551
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007552 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7553 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007554 switch (getToolChain().getArch()) {
7555 default:
7556 break;
7557 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007558 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007559 break;
7560 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007561 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007562 break;
7563 case llvm::Triple::mips:
7564 case llvm::Triple::mipsel:
7565 case llvm::Triple::mips64:
7566 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007567 StringRef CPUName;
7568 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007569 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007570
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007571 CmdArgs.push_back("-march");
7572 CmdArgs.push_back(CPUName.data());
7573
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007574 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007575 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007576
7577 if (getToolChain().getArch() == llvm::Triple::mips ||
7578 getToolChain().getArch() == llvm::Triple::mips64)
7579 CmdArgs.push_back("-EB");
7580 else
7581 CmdArgs.push_back("-EL");
7582
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007583 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007584 break;
7585 }
7586 case llvm::Triple::arm:
7587 case llvm::Triple::armeb:
7588 case llvm::Triple::thumb:
7589 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007590 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007591
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007592 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007593 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007594 else
Renato Golinf4421f72014-02-19 10:44:07 +00007595 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007596
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007597 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007598 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007599 case llvm::Triple::GNUEABI:
7600 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007601 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007602 break;
7603
7604 default:
7605 CmdArgs.push_back("-matpcs");
7606 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007607 break;
7608 }
7609 case llvm::Triple::sparc:
7610 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007611 case llvm::Triple::sparcv9: {
7612 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7613 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007614 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007615 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007616 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007617 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007618
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007619 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007620
7621 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007622 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007623
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007624 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007625 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007626
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007627 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007628 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007629}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007630
Douglas Katzman95354292015-06-23 20:42:09 +00007631void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7632 const InputInfo &Output,
7633 const InputInfoList &Inputs,
7634 const ArgList &Args,
7635 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007636 const toolchains::FreeBSD &ToolChain =
7637 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007638 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007639 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007640 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007641 !Args.hasArg(options::OPT_shared) &&
7642 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007643 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007644
7645 // Silence warning for "clang -g foo.o -o foo"
7646 Args.ClaimAllArgs(options::OPT_g_Group);
7647 // and "clang -emit-llvm foo.o -o foo"
7648 Args.ClaimAllArgs(options::OPT_emit_llvm);
7649 // and for "clang -w foo.o -o foo". Other warning options are already
7650 // handled somewhere else.
7651 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007652
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007653 if (!D.SysRoot.empty())
7654 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7655
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007656 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007657 CmdArgs.push_back("-pie");
7658
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007659 if (Args.hasArg(options::OPT_static)) {
7660 CmdArgs.push_back("-Bstatic");
7661 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007662 if (Args.hasArg(options::OPT_rdynamic))
7663 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007664 CmdArgs.push_back("--eh-frame-hdr");
7665 if (Args.hasArg(options::OPT_shared)) {
7666 CmdArgs.push_back("-Bshareable");
7667 } else {
7668 CmdArgs.push_back("-dynamic-linker");
7669 CmdArgs.push_back("/libexec/ld-elf.so.1");
7670 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007671 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007672 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7673 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7674 CmdArgs.push_back("--hash-style=both");
7675 }
7676 }
7677 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007678 }
7679
7680 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7681 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007682 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007683 CmdArgs.push_back("-m");
7684 CmdArgs.push_back("elf_i386_fbsd");
7685 }
7686
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007687 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007688 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007689 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007690 }
7691
Daniel Dunbarb440f562010-08-02 02:38:21 +00007692 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007693 CmdArgs.push_back("-o");
7694 CmdArgs.push_back(Output.getFilename());
7695 } else {
7696 assert(Output.isNothing() && "Invalid output.");
7697 }
7698
Douglas Katzman78b37b02015-11-17 20:28:07 +00007699 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007700 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007701 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007702 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007703 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007704 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007705 crt1 = "Scrt1.o";
7706 else
7707 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007708 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007709 if (crt1)
7710 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7711
7712 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7713
Craig Topper92fc2df2014-05-17 16:56:41 +00007714 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007715 if (Args.hasArg(options::OPT_static))
7716 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007717 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007718 crtbegin = "crtbeginS.o";
7719 else
7720 crtbegin = "crtbegin.o";
7721
7722 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007723 }
7724
7725 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007726 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007727 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7728 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007729 Args.AddAllArgs(CmdArgs, options::OPT_s);
7730 Args.AddAllArgs(CmdArgs, options::OPT_t);
7731 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7732 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007733
Teresa Johnson945bc502015-10-15 20:35:53 +00007734 if (D.isUsingLTO())
7735 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007736
Alexey Samsonov52550342014-09-15 19:58:40 +00007737 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007738 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007739
Douglas Katzman78b37b02015-11-17 20:28:07 +00007740 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007741 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007742 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007743 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007744 if (Args.hasArg(options::OPT_pg))
7745 CmdArgs.push_back("-lm_p");
7746 else
7747 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007748 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007749 if (NeedsSanitizerDeps)
7750 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007751 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7752 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007753 if (Args.hasArg(options::OPT_pg))
7754 CmdArgs.push_back("-lgcc_p");
7755 else
7756 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007757 if (Args.hasArg(options::OPT_static)) {
7758 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007759 } else if (Args.hasArg(options::OPT_pg)) {
7760 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007761 } else {
7762 CmdArgs.push_back("--as-needed");
7763 CmdArgs.push_back("-lgcc_s");
7764 CmdArgs.push_back("--no-as-needed");
7765 }
7766
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007767 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007768 if (Args.hasArg(options::OPT_pg))
7769 CmdArgs.push_back("-lpthread_p");
7770 else
7771 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007772 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007773
Roman Divacky66f22762011-02-10 16:59:40 +00007774 if (Args.hasArg(options::OPT_pg)) {
7775 if (Args.hasArg(options::OPT_shared))
7776 CmdArgs.push_back("-lc");
7777 else
7778 CmdArgs.push_back("-lc_p");
7779 CmdArgs.push_back("-lgcc_p");
7780 } else {
7781 CmdArgs.push_back("-lc");
7782 CmdArgs.push_back("-lgcc");
7783 }
7784
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007785 if (Args.hasArg(options::OPT_static)) {
7786 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007787 } else if (Args.hasArg(options::OPT_pg)) {
7788 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007789 } else {
7790 CmdArgs.push_back("--as-needed");
7791 CmdArgs.push_back("-lgcc_s");
7792 CmdArgs.push_back("--no-as-needed");
7793 }
7794 }
7795
Douglas Katzman78b37b02015-11-17 20:28:07 +00007796 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007797 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007798 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007799 else
7800 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007801 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007802 }
7803
Xinliang David Li69306c02015-10-22 06:15:31 +00007804 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007805
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007806 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007807 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007808}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007809
Douglas Katzman95354292015-06-23 20:42:09 +00007810void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007811 const InputInfo &Output,
7812 const InputInfoList &Inputs,
7813 const ArgList &Args,
7814 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007815 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007816 ArgStringList CmdArgs;
7817
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007818 // GNU as needs different flags for creating the correct output format
7819 // on architectures with different ABIs or optional feature sets.
7820 switch (getToolChain().getArch()) {
7821 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007822 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007823 break;
7824 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007825 case llvm::Triple::armeb:
7826 case llvm::Triple::thumb:
7827 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007828 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007829 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7830 std::string Arch =
7831 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007832 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007833 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007834 }
7835
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007836 case llvm::Triple::mips:
7837 case llvm::Triple::mipsel:
7838 case llvm::Triple::mips64:
7839 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007840 StringRef CPUName;
7841 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007842 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007843
7844 CmdArgs.push_back("-march");
7845 CmdArgs.push_back(CPUName.data());
7846
7847 CmdArgs.push_back("-mabi");
7848 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7849
7850 if (getToolChain().getArch() == llvm::Triple::mips ||
7851 getToolChain().getArch() == llvm::Triple::mips64)
7852 CmdArgs.push_back("-EB");
7853 else
7854 CmdArgs.push_back("-EL");
7855
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007856 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007857 break;
7858 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007859
7860 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007861 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007862 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007863 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7864 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007865 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007866 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007867 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007868
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007869 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007870 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007871 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7872 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007873 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007874 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007875 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007876
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007877 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007878 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007879 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007880
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007881 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007882
7883 CmdArgs.push_back("-o");
7884 CmdArgs.push_back(Output.getFilename());
7885
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007886 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007887 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007888
David Chisnallddbd68f2011-09-27 22:03:18 +00007889 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007890 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007891}
7892
Douglas Katzman95354292015-06-23 20:42:09 +00007893void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7894 const InputInfo &Output,
7895 const InputInfoList &Inputs,
7896 const ArgList &Args,
7897 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007898 const Driver &D = getToolChain().getDriver();
7899 ArgStringList CmdArgs;
7900
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007901 if (!D.SysRoot.empty())
7902 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7903
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007904 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007905 if (Args.hasArg(options::OPT_static)) {
7906 CmdArgs.push_back("-Bstatic");
7907 } else {
7908 if (Args.hasArg(options::OPT_rdynamic))
7909 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007910 if (Args.hasArg(options::OPT_shared)) {
7911 CmdArgs.push_back("-Bshareable");
7912 } else {
7913 CmdArgs.push_back("-dynamic-linker");
7914 CmdArgs.push_back("/libexec/ld.elf_so");
7915 }
7916 }
7917
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007918 // Many NetBSD architectures support more than one ABI.
7919 // Determine the correct emulation for ld.
7920 switch (getToolChain().getArch()) {
7921 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007922 CmdArgs.push_back("-m");
7923 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007924 break;
7925 case llvm::Triple::arm:
7926 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007927 CmdArgs.push_back("-m");
7928 switch (getToolChain().getTriple().getEnvironment()) {
7929 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007930 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007931 CmdArgs.push_back("armelf_nbsd_eabi");
7932 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007933 case llvm::Triple::EABIHF:
7934 case llvm::Triple::GNUEABIHF:
7935 CmdArgs.push_back("armelf_nbsd_eabihf");
7936 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007937 default:
7938 CmdArgs.push_back("armelf_nbsd");
7939 break;
7940 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007941 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007942 case llvm::Triple::armeb:
7943 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007944 arm::appendEBLinkFlags(
7945 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007946 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007947 CmdArgs.push_back("-m");
7948 switch (getToolChain().getTriple().getEnvironment()) {
7949 case llvm::Triple::EABI:
7950 case llvm::Triple::GNUEABI:
7951 CmdArgs.push_back("armelfb_nbsd_eabi");
7952 break;
7953 case llvm::Triple::EABIHF:
7954 case llvm::Triple::GNUEABIHF:
7955 CmdArgs.push_back("armelfb_nbsd_eabihf");
7956 break;
7957 default:
7958 CmdArgs.push_back("armelfb_nbsd");
7959 break;
7960 }
7961 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007962 case llvm::Triple::mips64:
7963 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007964 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007965 CmdArgs.push_back("-m");
7966 if (getToolChain().getArch() == llvm::Triple::mips64)
7967 CmdArgs.push_back("elf32btsmip");
7968 else
7969 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007970 } else if (mips::hasMipsAbiArg(Args, "64")) {
7971 CmdArgs.push_back("-m");
7972 if (getToolChain().getArch() == llvm::Triple::mips64)
7973 CmdArgs.push_back("elf64btsmip");
7974 else
7975 CmdArgs.push_back("elf64ltsmip");
7976 }
7977 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007978 case llvm::Triple::ppc:
7979 CmdArgs.push_back("-m");
7980 CmdArgs.push_back("elf32ppc_nbsd");
7981 break;
7982
7983 case llvm::Triple::ppc64:
7984 case llvm::Triple::ppc64le:
7985 CmdArgs.push_back("-m");
7986 CmdArgs.push_back("elf64ppc");
7987 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007988
7989 case llvm::Triple::sparc:
7990 CmdArgs.push_back("-m");
7991 CmdArgs.push_back("elf32_sparc");
7992 break;
7993
7994 case llvm::Triple::sparcv9:
7995 CmdArgs.push_back("-m");
7996 CmdArgs.push_back("elf64_sparc");
7997 break;
7998
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007999 default:
8000 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008001 }
8002
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008003 if (Output.isFilename()) {
8004 CmdArgs.push_back("-o");
8005 CmdArgs.push_back(Output.getFilename());
8006 } else {
8007 assert(Output.isNothing() && "Invalid output.");
8008 }
8009
Douglas Katzman78b37b02015-11-17 20:28:07 +00008010 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008011 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008012 CmdArgs.push_back(
8013 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8014 CmdArgs.push_back(
8015 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8016 CmdArgs.push_back(
8017 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008018 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008019 CmdArgs.push_back(
8020 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8021 CmdArgs.push_back(
8022 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008023 }
8024 }
8025
8026 Args.AddAllArgs(CmdArgs, options::OPT_L);
8027 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8028 Args.AddAllArgs(CmdArgs, options::OPT_e);
8029 Args.AddAllArgs(CmdArgs, options::OPT_s);
8030 Args.AddAllArgs(CmdArgs, options::OPT_t);
8031 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8032 Args.AddAllArgs(CmdArgs, options::OPT_r);
8033
8034 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8035
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008036 unsigned Major, Minor, Micro;
8037 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8038 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008039 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008040 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008041 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008042 case llvm::Triple::arm:
8043 case llvm::Triple::armeb:
8044 case llvm::Triple::thumb:
8045 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008046 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008047 case llvm::Triple::ppc64:
8048 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008049 case llvm::Triple::x86:
8050 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008051 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008052 break;
8053 default:
8054 break;
8055 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008056 }
8057
Douglas Katzman78b37b02015-11-17 20:28:07 +00008058 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008059 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008060 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008061 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8062 CmdArgs.push_back("-lm");
8063 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008064 if (Args.hasArg(options::OPT_pthread))
8065 CmdArgs.push_back("-lpthread");
8066 CmdArgs.push_back("-lc");
8067
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008068 if (useLibgcc) {
8069 if (Args.hasArg(options::OPT_static)) {
8070 // libgcc_eh depends on libc, so resolve as much as possible,
8071 // pull in any new requirements from libc and then get the rest
8072 // of libgcc.
8073 CmdArgs.push_back("-lgcc_eh");
8074 CmdArgs.push_back("-lc");
8075 CmdArgs.push_back("-lgcc");
8076 } else {
8077 CmdArgs.push_back("-lgcc");
8078 CmdArgs.push_back("--as-needed");
8079 CmdArgs.push_back("-lgcc_s");
8080 CmdArgs.push_back("--no-as-needed");
8081 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008082 }
8083 }
8084
Douglas Katzman78b37b02015-11-17 20:28:07 +00008085 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008086 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008087 CmdArgs.push_back(
8088 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008089 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008090 CmdArgs.push_back(
8091 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8092 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008093 }
8094
Xinliang David Li69306c02015-10-22 06:15:31 +00008095 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008096
Logan Chieneb9162f2014-06-26 14:23:45 +00008097 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008098 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008099}
8100
Douglas Katzman95354292015-06-23 20:42:09 +00008101void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8102 const InputInfo &Output,
8103 const InputInfoList &Inputs,
8104 const ArgList &Args,
8105 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008106 claimNoWarnArgs(Args);
8107
James Y Knight2db38f32015-08-15 03:45:25 +00008108 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8109 llvm::Triple Triple = llvm::Triple(TripleStr);
8110
Rafael Espindola92b00932010-08-10 00:25:48 +00008111 ArgStringList CmdArgs;
8112
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008113 llvm::Reloc::Model RelocationModel;
8114 unsigned PICLevel;
8115 bool IsPIE;
8116 std::tie(RelocationModel, PICLevel, IsPIE) =
8117 ParsePICArgs(getToolChain(), Triple, Args);
8118
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008119 switch (getToolChain().getArch()) {
8120 default:
8121 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008122 // Add --32/--64 to make sure we get the format we want.
8123 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008124 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008125 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008126 break;
8127 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008128 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8129 CmdArgs.push_back("--x32");
8130 else
8131 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008132 break;
8133 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008134 CmdArgs.push_back("-a32");
8135 CmdArgs.push_back("-mppc");
8136 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008137 break;
8138 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008139 CmdArgs.push_back("-a64");
8140 CmdArgs.push_back("-mppc64");
8141 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008142 break;
8143 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008144 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008145 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008146 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008147 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008148 break;
8149 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008150 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008151 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008152 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8153 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8154 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008155 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008156 }
8157 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008158 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008159 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8160 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8161 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008162 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008163 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008164 case llvm::Triple::arm:
8165 case llvm::Triple::armeb:
8166 case llvm::Triple::thumb:
8167 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008168 const llvm::Triple &Triple2 = getToolChain().getTriple();
8169 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008170 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008171 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008172 break;
8173 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008174 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008175 break;
8176 default:
8177 break;
8178 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008179
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008180 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008181 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8182 case arm::FloatABI::Soft:
8183 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8184 break;
8185 case arm::FloatABI::SoftFP:
8186 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8187 break;
8188 case arm::FloatABI::Hard:
8189 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8190 break;
8191 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008192
8193 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008194
8195 // FIXME: remove krait check when GNU tools support krait cpu
8196 // for now replace it with -march=armv7-a to avoid a lower
8197 // march from being picked in the absence of a cpu flag.
8198 Arg *A;
8199 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008200 StringRef(A->getValue()).lower() == "krait")
8201 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008202 else
8203 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008204 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008205 break;
8206 }
8207 case llvm::Triple::mips:
8208 case llvm::Triple::mipsel:
8209 case llvm::Triple::mips64:
8210 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008211 StringRef CPUName;
8212 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008213 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008214 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008215
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008216 CmdArgs.push_back("-march");
8217 CmdArgs.push_back(CPUName.data());
8218
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008219 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008220 CmdArgs.push_back(ABIName.data());
8221
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008222 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8223 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008224 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008225 CmdArgs.push_back("-mno-shared");
8226
Daniel Sanders379d44b2014-07-16 11:52:23 +00008227 // LLVM doesn't support -mplt yet and acts as if it is always given.
8228 // However, -mplt has no effect with the N64 ABI.
8229 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008230
8231 if (getToolChain().getArch() == llvm::Triple::mips ||
8232 getToolChain().getArch() == llvm::Triple::mips64)
8233 CmdArgs.push_back("-EB");
8234 else
8235 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008236
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008237 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8238 if (StringRef(A->getValue()) == "2008")
8239 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8240 }
8241
Daniel Sanders379d44b2014-07-16 11:52:23 +00008242 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8243 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8244 options::OPT_mfp64)) {
8245 A->claim();
8246 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008247 } else if (mips::shouldUseFPXX(
8248 Args, getToolChain().getTriple(), CPUName, ABIName,
8249 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008250 CmdArgs.push_back("-mfpxx");
8251
8252 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8253 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008254 if (Arg *A =
8255 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008256 if (A->getOption().matches(options::OPT_mips16)) {
8257 A->claim();
8258 A->render(Args, CmdArgs);
8259 } else {
8260 A->claim();
8261 CmdArgs.push_back("-no-mips16");
8262 }
8263 }
8264
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008265 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8266 options::OPT_mno_micromips);
8267 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8268 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8269
Simon Atanasyanbd986632013-11-26 11:58:04 +00008270 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8271 // Do not use AddLastArg because not all versions of MIPS assembler
8272 // support -mmsa / -mno-msa options.
8273 if (A->getOption().matches(options::OPT_mmsa))
8274 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8275 }
8276
Daniel Sanders379d44b2014-07-16 11:52:23 +00008277 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8278 options::OPT_msoft_float);
8279
Toma Tabacub36d6102015-06-11 12:13:18 +00008280 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8281 options::OPT_msingle_float);
8282
Daniel Sanders379d44b2014-07-16 11:52:23 +00008283 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8284 options::OPT_mno_odd_spreg);
8285
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008286 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008287 break;
8288 }
8289 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008290 // Always pass an -march option, since our default of z10 is later
8291 // than the GNU assembler's default.
8292 StringRef CPUName = getSystemZTargetCPU(Args);
8293 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008294 break;
8295 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008296 }
8297
Renato Golina74bbc72015-07-22 15:32:36 +00008298 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008299 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008300
8301 CmdArgs.push_back("-o");
8302 CmdArgs.push_back(Output.getFilename());
8303
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008304 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008305 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008306
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008307 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008308 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008309
8310 // Handle the debug info splitting at object creation time if we're
8311 // creating an object.
8312 // TODO: Currently only works on linux with newer objcopy.
8313 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008314 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008315 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008316 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008317}
8318
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008319static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008320 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008321 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008322 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008323 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8324 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008325 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008326 CmdArgs.push_back("-lgcc");
8327
Logan Chien3d3373c2012-11-19 12:04:11 +00008328 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008329 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008330 CmdArgs.push_back("-lgcc");
8331 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008332 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008333 CmdArgs.push_back("--as-needed");
8334 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008335 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008336 CmdArgs.push_back("--no-as-needed");
8337 }
8338
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008339 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008340 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008341 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008342 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008343
8344 // According to Android ABI, we have to link with libdl if we are
8345 // linking with non-static libgcc.
8346 //
8347 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8348 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8349 if (isAndroid && !StaticLibgcc)
8350 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008351}
8352
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008353static std::string getLinuxDynamicLinker(const ArgList &Args,
8354 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008355 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8356
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008357 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008358 if (ToolChain.getTriple().isArch64Bit())
8359 return "/system/bin/linker64";
8360 else
8361 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008362 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8363 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008364 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008365 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008366 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008367 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008368 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008369 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008370 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008371 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008372 return "/lib/ld-linux-armhf.so.3";
8373 else
8374 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008375 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8376 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008377 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008378 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008379 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008380 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008381 return "/lib/ld-linux.so.3";
8382 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8383 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008384 std::string LibDir =
8385 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008386 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008387 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008388 if (mips::isUCLibc(Args))
8389 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008390 else if (!ToolChain.getTriple().hasEnvironment()) {
8391 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8392 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8393 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8394 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008395 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008396
8397 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008398 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008399 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008400 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008401 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8402 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008403 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008404 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008405 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8406 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008407 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008408 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008409 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008410 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008411 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008412 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008413 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8414 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008415 else
8416 return "/lib64/ld-linux-x86-64.so.2";
8417}
8418
Renato Golinc4b49242014-02-13 10:01:16 +00008419static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008420 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008421 // Make use of compiler-rt if --rtlib option is used
8422 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8423
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008424 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008425 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008426 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008427 default:
8428 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008429 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008430 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008431 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008432 break;
8433 }
Renato Golinc4b49242014-02-13 10:01:16 +00008434 break;
8435 case ToolChain::RLT_Libgcc:
8436 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8437 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008438 }
8439}
8440
Rafael Espindola1e085772014-08-15 17:14:35 +00008441static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8442 switch (T.getArch()) {
8443 case llvm::Triple::x86:
8444 return "elf_i386";
8445 case llvm::Triple::aarch64:
8446 return "aarch64linux";
8447 case llvm::Triple::aarch64_be:
8448 return "aarch64_be_linux";
8449 case llvm::Triple::arm:
8450 case llvm::Triple::thumb:
8451 return "armelf_linux_eabi";
8452 case llvm::Triple::armeb:
8453 case llvm::Triple::thumbeb:
8454 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8455 case llvm::Triple::ppc:
8456 return "elf32ppclinux";
8457 case llvm::Triple::ppc64:
8458 return "elf64ppc";
8459 case llvm::Triple::ppc64le:
8460 return "elf64lppc";
8461 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008462 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008463 return "elf32_sparc";
8464 case llvm::Triple::sparcv9:
8465 return "elf64_sparc";
8466 case llvm::Triple::mips:
8467 return "elf32btsmip";
8468 case llvm::Triple::mipsel:
8469 return "elf32ltsmip";
8470 case llvm::Triple::mips64:
8471 if (mips::hasMipsAbiArg(Args, "n32"))
8472 return "elf32btsmipn32";
8473 return "elf64btsmip";
8474 case llvm::Triple::mips64el:
8475 if (mips::hasMipsAbiArg(Args, "n32"))
8476 return "elf32ltsmipn32";
8477 return "elf64ltsmip";
8478 case llvm::Triple::systemz:
8479 return "elf64_s390";
8480 case llvm::Triple::x86_64:
8481 if (T.getEnvironment() == llvm::Triple::GNUX32)
8482 return "elf32_x86_64";
8483 return "elf_x86_64";
8484 default:
8485 llvm_unreachable("Unexpected arch");
8486 }
8487}
8488
Douglas Katzman95354292015-06-23 20:42:09 +00008489void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8490 const InputInfo &Output,
8491 const InputInfoList &Inputs,
8492 const ArgList &Args,
8493 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008494 const toolchains::Linux &ToolChain =
8495 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008496 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008497
8498 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8499 llvm::Triple Triple = llvm::Triple(TripleStr);
8500
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008501 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008502 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008503 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008504 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8505 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008506 const bool HasCRTBeginEndFiles =
8507 ToolChain.getTriple().hasEnvironment() ||
8508 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008509
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008510 ArgStringList CmdArgs;
8511
Rafael Espindolad1002f62010-11-15 18:28:16 +00008512 // Silence warning for "clang -g foo.o -o foo"
8513 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008514 // and "clang -emit-llvm foo.o -o foo"
8515 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008516 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008517 // handled somewhere else.
8518 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008519
Peter Collingbourne39719a72015-11-20 20:49:39 +00008520 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8521 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008522 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008523 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008524 CmdArgs.push_back("-target");
8525 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8526 }
8527
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008528 if (!D.SysRoot.empty())
8529 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008530
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008531 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008532 CmdArgs.push_back("-pie");
8533
Rafael Espindola1c76c592010-11-07 22:57:16 +00008534 if (Args.hasArg(options::OPT_rdynamic))
8535 CmdArgs.push_back("-export-dynamic");
8536
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008537 if (Args.hasArg(options::OPT_s))
8538 CmdArgs.push_back("-s");
8539
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008540 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008541 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008542
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008543 for (const auto &Opt : ToolChain.ExtraOpts)
8544 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008545
8546 if (!Args.hasArg(options::OPT_static)) {
8547 CmdArgs.push_back("--eh-frame-hdr");
8548 }
8549
8550 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008551 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008552
8553 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008554 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8555 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008556 CmdArgs.push_back("-Bstatic");
8557 else
8558 CmdArgs.push_back("-static");
8559 } else if (Args.hasArg(options::OPT_shared)) {
8560 CmdArgs.push_back("-shared");
8561 }
8562
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008563 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8564 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008565 (!Args.hasArg(options::OPT_static) &&
8566 !Args.hasArg(options::OPT_shared))) {
8567 CmdArgs.push_back("-dynamic-linker");
8568 CmdArgs.push_back(Args.MakeArgString(
8569 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8570 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008571
8572 CmdArgs.push_back("-o");
8573 CmdArgs.push_back(Output.getFilename());
8574
Douglas Katzman78b37b02015-11-17 20:28:07 +00008575 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008576 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008577 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008578 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008579 if (Args.hasArg(options::OPT_pg))
8580 crt1 = "gcrt1.o";
8581 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008582 crt1 = "Scrt1.o";
8583 else
8584 crt1 = "crt1.o";
8585 }
8586 if (crt1)
8587 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008588
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008589 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8590 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008591
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008592 const char *crtbegin;
8593 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008594 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008595 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008596 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008597 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008598 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008599 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008600 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008601
8602 if (HasCRTBeginEndFiles)
8603 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008604
8605 // Add crtfastmath.o if available and fast math is enabled.
8606 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008607 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008608
8609 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008610 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008611
Douglas Katzman6059ef92015-11-17 17:41:23 +00008612 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008613
Teresa Johnson945bc502015-10-15 20:35:53 +00008614 if (D.isUsingLTO())
8615 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008616
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008617 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8618 CmdArgs.push_back("--no-demangle");
8619
Alexey Samsonov52550342014-09-15 19:58:40 +00008620 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008621 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008622 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008623 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008624
Douglas Katzman78b37b02015-11-17 20:28:07 +00008625 if (D.CCCIsCXX() &&
8626 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008627 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008628 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008629 if (OnlyLibstdcxxStatic)
8630 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008631 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008632 if (OnlyLibstdcxxStatic)
8633 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008634 CmdArgs.push_back("-lm");
8635 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008636 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8637 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008638
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008639 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008640 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8641 if (Args.hasArg(options::OPT_static))
8642 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008643
Alexey Samsonov52550342014-09-15 19:58:40 +00008644 if (NeedsSanitizerDeps)
8645 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8646
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008647 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8648 Args.hasArg(options::OPT_pthreads);
8649
8650 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8651 options::OPT_fno_openmp, false)) {
8652 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8653 // FIXME: Does this really make sense for all GNU toolchains?
8654 WantPthread = true;
8655
8656 // Also link the particular OpenMP runtimes.
8657 switch (getOpenMPRuntime(ToolChain, Args)) {
8658 case OMPRT_OMP:
8659 CmdArgs.push_back("-lomp");
8660 break;
8661 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008662 CmdArgs.push_back("-lgomp");
8663
8664 // FIXME: Exclude this for platforms with libgomp that don't require
8665 // librt. Most modern Linux platforms require it, but some may not.
8666 CmdArgs.push_back("-lrt");
8667 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008668 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008669 CmdArgs.push_back("-liomp5");
8670 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008671 case OMPRT_Unknown:
8672 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008673 break;
8674 }
Chandler Carruth01538002013-01-17 13:19:29 +00008675 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008676
Renato Golinc4b49242014-02-13 10:01:16 +00008677 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008678
Richard Smith31d1de22015-05-20 22:48:44 +00008679 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008680 CmdArgs.push_back("-lpthread");
8681
8682 CmdArgs.push_back("-lc");
8683
8684 if (Args.hasArg(options::OPT_static))
8685 CmdArgs.push_back("--end-group");
8686 else
Renato Golinc4b49242014-02-13 10:01:16 +00008687 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008688 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008689
Rafael Espindola81937ec2010-12-01 01:52:43 +00008690 if (!Args.hasArg(options::OPT_nostartfiles)) {
8691 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008692 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008693 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008694 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008695 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008696 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008697 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008698
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008699 if (HasCRTBeginEndFiles)
8700 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008701 if (!isAndroid)
8702 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008703 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00008704 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008705
Peter Collingbourne39719a72015-11-20 20:49:39 +00008706 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008707}
8708
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008709// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8710// for the various SFI requirements like register masking. The assembly tool
8711// inserts the file containing the macros as an input into all the assembly
8712// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008713void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8714 const InputInfo &Output,
8715 const InputInfoList &Inputs,
8716 const ArgList &Args,
8717 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008718 const toolchains::NaClToolChain &ToolChain =
8719 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008720 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8721 "nacl-arm-macros.s");
8722 InputInfoList NewInputs;
8723 NewInputs.push_back(NaClMacros);
8724 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008725 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8726 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008727}
8728
Douglas Katzman750cfc52015-06-29 18:42:16 +00008729// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008730// we use static by default, do not yet support sanitizers or LTO, and a few
8731// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008732// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008733void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8734 const InputInfo &Output,
8735 const InputInfoList &Inputs,
8736 const ArgList &Args,
8737 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008738
Douglas Katzman54366072015-07-27 16:53:08 +00008739 const toolchains::NaClToolChain &ToolChain =
8740 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008741 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008742 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008743 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008744 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008745
8746 ArgStringList CmdArgs;
8747
8748 // Silence warning for "clang -g foo.o -o foo"
8749 Args.ClaimAllArgs(options::OPT_g_Group);
8750 // and "clang -emit-llvm foo.o -o foo"
8751 Args.ClaimAllArgs(options::OPT_emit_llvm);
8752 // and for "clang -w foo.o -o foo". Other warning options are already
8753 // handled somewhere else.
8754 Args.ClaimAllArgs(options::OPT_w);
8755
8756 if (!D.SysRoot.empty())
8757 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8758
8759 if (Args.hasArg(options::OPT_rdynamic))
8760 CmdArgs.push_back("-export-dynamic");
8761
8762 if (Args.hasArg(options::OPT_s))
8763 CmdArgs.push_back("-s");
8764
Douglas Katzman54366072015-07-27 16:53:08 +00008765 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8766 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008767 CmdArgs.push_back("--build-id");
8768
8769 if (!IsStatic)
8770 CmdArgs.push_back("--eh-frame-hdr");
8771
8772 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008773 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008774 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008775 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008776 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008777 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008778 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008779 else if (Arch == llvm::Triple::mipsel)
8780 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008781 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008782 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8783 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008784
8785 if (IsStatic)
8786 CmdArgs.push_back("-static");
8787 else if (Args.hasArg(options::OPT_shared))
8788 CmdArgs.push_back("-shared");
8789
8790 CmdArgs.push_back("-o");
8791 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00008792 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008793 if (!Args.hasArg(options::OPT_shared))
8794 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8795 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8796
8797 const char *crtbegin;
8798 if (IsStatic)
8799 crtbegin = "crtbeginT.o";
8800 else if (Args.hasArg(options::OPT_shared))
8801 crtbegin = "crtbeginS.o";
8802 else
8803 crtbegin = "crtbegin.o";
8804 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8805 }
8806
8807 Args.AddAllArgs(CmdArgs, options::OPT_L);
8808 Args.AddAllArgs(CmdArgs, options::OPT_u);
8809
Douglas Katzman6059ef92015-11-17 17:41:23 +00008810 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008811
8812 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8813 CmdArgs.push_back("--no-demangle");
8814
8815 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8816
Douglas Katzman78b37b02015-11-17 20:28:07 +00008817 if (D.CCCIsCXX() &&
8818 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008819 bool OnlyLibstdcxxStatic =
8820 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008821 if (OnlyLibstdcxxStatic)
8822 CmdArgs.push_back("-Bstatic");
8823 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8824 if (OnlyLibstdcxxStatic)
8825 CmdArgs.push_back("-Bdynamic");
8826 CmdArgs.push_back("-lm");
8827 }
8828
8829 if (!Args.hasArg(options::OPT_nostdlib)) {
8830 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8831 // Always use groups, since it has no effect on dynamic libraries.
8832 CmdArgs.push_back("--start-group");
8833 CmdArgs.push_back("-lc");
8834 // NaCl's libc++ currently requires libpthread, so just always include it
8835 // in the group for C++.
8836 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008837 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008838 // Gold, used by Mips, handles nested groups differently than ld, and
8839 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8840 // which is not a desired behaviour here.
8841 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8842 if (getToolChain().getArch() == llvm::Triple::mipsel)
8843 CmdArgs.push_back("-lnacl");
8844
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008845 CmdArgs.push_back("-lpthread");
8846 }
8847
8848 CmdArgs.push_back("-lgcc");
8849 CmdArgs.push_back("--as-needed");
8850 if (IsStatic)
8851 CmdArgs.push_back("-lgcc_eh");
8852 else
8853 CmdArgs.push_back("-lgcc_s");
8854 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008855
8856 // Mips needs to create and use pnacl_legacy library that contains
8857 // definitions from bitcode/pnaclmm.c and definitions for
8858 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8859 if (getToolChain().getArch() == llvm::Triple::mipsel)
8860 CmdArgs.push_back("-lpnacl_legacy");
8861
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008862 CmdArgs.push_back("--end-group");
8863 }
8864
8865 if (!Args.hasArg(options::OPT_nostartfiles)) {
8866 const char *crtend;
8867 if (Args.hasArg(options::OPT_shared))
8868 crtend = "crtendS.o";
8869 else
8870 crtend = "crtend.o";
8871
8872 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8873 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8874 }
8875 }
8876
Peter Collingbourne39719a72015-11-20 20:49:39 +00008877 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8878 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008879}
8880
Douglas Katzman95354292015-06-23 20:42:09 +00008881void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8882 const InputInfo &Output,
8883 const InputInfoList &Inputs,
8884 const ArgList &Args,
8885 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008886 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008887 ArgStringList CmdArgs;
8888
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008889 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008890
8891 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008892 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008893
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008894 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008895 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008896
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008897 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008898 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008899}
8900
Douglas Katzman95354292015-06-23 20:42:09 +00008901void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8902 const InputInfo &Output,
8903 const InputInfoList &Inputs,
8904 const ArgList &Args,
8905 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008906 const Driver &D = getToolChain().getDriver();
8907 ArgStringList CmdArgs;
8908
Daniel Dunbarb440f562010-08-02 02:38:21 +00008909 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008910 CmdArgs.push_back("-o");
8911 CmdArgs.push_back(Output.getFilename());
8912 } else {
8913 assert(Output.isNothing() && "Invalid output.");
8914 }
8915
Douglas Katzman78b37b02015-11-17 20:28:07 +00008916 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008917 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8918 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8919 CmdArgs.push_back(
8920 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8921 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008922 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008923
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008924 Args.AddAllArgs(CmdArgs,
8925 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008926
Daniel Dunbar54423b22010-09-17 00:24:54 +00008927 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008928
Xinliang David Li69306c02015-10-22 06:15:31 +00008929 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008930
Douglas Katzman78b37b02015-11-17 20:28:07 +00008931 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008932 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008933 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008934 CmdArgs.push_back("-lm");
8935 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008936 }
8937
Douglas Katzman78b37b02015-11-17 20:28:07 +00008938 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008939 if (Args.hasArg(options::OPT_pthread))
8940 CmdArgs.push_back("-lpthread");
8941 CmdArgs.push_back("-lc");
8942 CmdArgs.push_back("-lCompilerRT-Generic");
8943 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8944 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008945 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008946 }
8947
Logan Chieneb9162f2014-06-26 14:23:45 +00008948 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008949 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008950}
8951
Daniel Dunbarcc912342009-05-02 18:28:39 +00008952/// DragonFly Tools
8953
8954// For now, DragonFly Assemble does just about the same as for
8955// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008956void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8957 const InputInfo &Output,
8958 const InputInfoList &Inputs,
8959 const ArgList &Args,
8960 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008961 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008962 ArgStringList CmdArgs;
8963
8964 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8965 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008966 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008967 CmdArgs.push_back("--32");
8968
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008969 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008970
8971 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008972 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008973
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008974 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008975 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008976
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008977 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008978 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008979}
8980
Douglas Katzman95354292015-06-23 20:42:09 +00008981void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8982 const InputInfo &Output,
8983 const InputInfoList &Inputs,
8984 const ArgList &Args,
8985 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008986 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008987 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008988 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008989
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008990 if (!D.SysRoot.empty())
8991 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8992
John McCall65b8da02013-04-11 22:55:55 +00008993 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008994 if (Args.hasArg(options::OPT_static)) {
8995 CmdArgs.push_back("-Bstatic");
8996 } else {
John McCall65b8da02013-04-11 22:55:55 +00008997 if (Args.hasArg(options::OPT_rdynamic))
8998 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008999 if (Args.hasArg(options::OPT_shared))
9000 CmdArgs.push_back("-Bshareable");
9001 else {
9002 CmdArgs.push_back("-dynamic-linker");
9003 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9004 }
John McCall65b8da02013-04-11 22:55:55 +00009005 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009006 }
9007
9008 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9009 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009010 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009011 CmdArgs.push_back("-m");
9012 CmdArgs.push_back("elf_i386");
9013 }
9014
Daniel Dunbarb440f562010-08-02 02:38:21 +00009015 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009016 CmdArgs.push_back("-o");
9017 CmdArgs.push_back(Output.getFilename());
9018 } else {
9019 assert(Output.isNothing() && "Invalid output.");
9020 }
9021
Douglas Katzman78b37b02015-11-17 20:28:07 +00009022 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009023 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009024 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009025 CmdArgs.push_back(
9026 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009027 else {
9028 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009029 CmdArgs.push_back(
9030 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009031 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009032 CmdArgs.push_back(
9033 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009034 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009035 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009036 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009037 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009038 CmdArgs.push_back(
9039 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009040 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009041 CmdArgs.push_back(
9042 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009043 }
9044
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009045 Args.AddAllArgs(CmdArgs,
9046 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009047
Daniel Dunbar54423b22010-09-17 00:24:54 +00009048 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009049
Douglas Katzman78b37b02015-11-17 20:28:07 +00009050 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009051 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9052 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009053 if (UseGCC47)
9054 CmdArgs.push_back("-L/usr/lib/gcc47");
9055 else
9056 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009057
9058 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009059 if (UseGCC47) {
9060 CmdArgs.push_back("-rpath");
9061 CmdArgs.push_back("/usr/lib/gcc47");
9062 } else {
9063 CmdArgs.push_back("-rpath");
9064 CmdArgs.push_back("/usr/lib/gcc44");
9065 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009066 }
9067
Hans Wennborg70850d82013-07-18 20:29:38 +00009068 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009069 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009070 CmdArgs.push_back("-lm");
9071 }
9072
Daniel Dunbarcc912342009-05-02 18:28:39 +00009073 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009074 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009075
9076 if (!Args.hasArg(options::OPT_nolibc)) {
9077 CmdArgs.push_back("-lc");
9078 }
9079
John McCall65b8da02013-04-11 22:55:55 +00009080 if (UseGCC47) {
9081 if (Args.hasArg(options::OPT_static) ||
9082 Args.hasArg(options::OPT_static_libgcc)) {
9083 CmdArgs.push_back("-lgcc");
9084 CmdArgs.push_back("-lgcc_eh");
9085 } else {
9086 if (Args.hasArg(options::OPT_shared_libgcc)) {
9087 CmdArgs.push_back("-lgcc_pic");
9088 if (!Args.hasArg(options::OPT_shared))
9089 CmdArgs.push_back("-lgcc");
9090 } else {
9091 CmdArgs.push_back("-lgcc");
9092 CmdArgs.push_back("--as-needed");
9093 CmdArgs.push_back("-lgcc_pic");
9094 CmdArgs.push_back("--no-as-needed");
9095 }
9096 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009097 } else {
John McCall65b8da02013-04-11 22:55:55 +00009098 if (Args.hasArg(options::OPT_shared)) {
9099 CmdArgs.push_back("-lgcc_pic");
9100 } else {
9101 CmdArgs.push_back("-lgcc");
9102 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009103 }
9104 }
9105
Douglas Katzman78b37b02015-11-17 20:28:07 +00009106 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009107 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009108 CmdArgs.push_back(
9109 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009110 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009111 CmdArgs.push_back(
9112 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9113 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009114 }
9115
Xinliang David Li69306c02015-10-22 06:15:31 +00009116 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009117
Logan Chieneb9162f2014-06-26 14:23:45 +00009118 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009119 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009120}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009121
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009122// Try to find Exe from a Visual Studio distribution. This first tries to find
9123// an installed copy of Visual Studio and, failing that, looks in the PATH,
9124// making sure that whatever executable that's found is not a same-named exe
9125// from clang itself to prevent clang from falling back to itself.
9126static std::string FindVisualStudioExecutable(const ToolChain &TC,
9127 const char *Exe,
9128 const char *ClangProgramPath) {
9129 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9130 std::string visualStudioBinDir;
9131 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9132 visualStudioBinDir)) {
9133 SmallString<128> FilePath(visualStudioBinDir);
9134 llvm::sys::path::append(FilePath, Exe);
9135 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9136 return FilePath.str();
9137 }
9138
9139 return Exe;
9140}
9141
Douglas Katzman95354292015-06-23 20:42:09 +00009142void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9143 const InputInfo &Output,
9144 const InputInfoList &Inputs,
9145 const ArgList &Args,
9146 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009147 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009148 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009149
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009150 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9151 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009152 CmdArgs.push_back(
9153 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009154
Douglas Katzman78b37b02015-11-17 20:28:07 +00009155 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9156 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009157 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009158
Zachary Turner10d75b22014-10-22 20:40:43 +00009159 if (!llvm::sys::Process::GetEnv("LIB")) {
9160 // If the VC environment hasn't been configured (perhaps because the user
9161 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009162 // the environment variable is set however, assume the user knows what
9163 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009164 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009165 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009166 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9167 SmallString<128> LibDir(VisualStudioDir);
9168 llvm::sys::path::append(LibDir, "VC", "lib");
9169 switch (MSVC.getArch()) {
9170 case llvm::Triple::x86:
9171 // x86 just puts the libraries directly in lib
9172 break;
9173 case llvm::Triple::x86_64:
9174 llvm::sys::path::append(LibDir, "amd64");
9175 break;
9176 case llvm::Triple::arm:
9177 llvm::sys::path::append(LibDir, "arm");
9178 break;
9179 default:
9180 break;
9181 }
9182 CmdArgs.push_back(
9183 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009184
9185 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9186 std::string UniversalCRTLibPath;
9187 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9188 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9189 UniversalCRTLibPath.c_str()));
9190 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009191 }
9192
9193 std::string WindowsSdkLibPath;
9194 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9195 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9196 WindowsSdkLibPath.c_str()));
9197 }
9198
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009199 CmdArgs.push_back("-nologo");
9200
Reid Kleckner124955a2015-08-05 18:51:13 +00009201 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009202 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009203
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009204 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009205 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009206 if (DLL) {
9207 CmdArgs.push_back(Args.MakeArgString("-dll"));
9208
9209 SmallString<128> ImplibName(Output.getFilename());
9210 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009211 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009212 }
9213
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009214 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009215 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009216 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009217 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009218 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9219 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009220 // Make sure the dynamic runtime thunk is not optimized out at link time
9221 // to ensure proper SEH handling.
9222 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009223 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009224 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009225 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009226 for (const auto &Lib : {"asan", "asan_cxx"})
9227 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009228 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009229 }
9230
Hans Wennborg2e274592013-08-13 23:38:57 +00009231 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009232
Alexey Bataevc7e84352015-08-19 04:49:01 +00009233 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9234 options::OPT_fno_openmp, false)) {
9235 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9236 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9237 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9238 TC.getDriver().Dir + "/../lib"));
9239 switch (getOpenMPRuntime(getToolChain(), Args)) {
9240 case OMPRT_OMP:
9241 CmdArgs.push_back("-defaultlib:libomp.lib");
9242 break;
9243 case OMPRT_IOMP5:
9244 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9245 break;
9246 case OMPRT_GOMP:
9247 break;
9248 case OMPRT_Unknown:
9249 // Already diagnosed.
9250 break;
9251 }
9252 }
9253
Reid Kleckner337188f2014-09-16 19:22:00 +00009254 // Add filenames, libraries, and other linker inputs.
9255 for (const auto &Input : Inputs) {
9256 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009257 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009258 continue;
9259 }
9260
9261 const Arg &A = Input.getInputArg();
9262
9263 // Render -l options differently for the MSVC linker.
9264 if (A.getOption().matches(options::OPT_l)) {
9265 StringRef Lib = A.getValue();
9266 const char *LinkLibArg;
9267 if (Lib.endswith(".lib"))
9268 LinkLibArg = Args.MakeArgString(Lib);
9269 else
9270 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9271 CmdArgs.push_back(LinkLibArg);
9272 continue;
9273 }
9274
9275 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9276 // or -L. Render it, even if MSVC doesn't understand it.
9277 A.renderAsInput(Args, CmdArgs);
9278 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009279
Zachary Turner719f58c2014-12-01 23:06:47 +00009280 // We need to special case some linker paths. In the case of lld, we need to
9281 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9282 // linker, we need to use a special search algorithm.
9283 llvm::SmallString<128> linkPath;
9284 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9285 if (Linker.equals_lower("lld"))
9286 Linker = "lld-link";
9287
9288 if (Linker.equals_lower("link")) {
9289 // If we're using the MSVC linker, it's not sufficient to just use link
9290 // from the program PATH, because other environments like GnuWin32 install
9291 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009292 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009293 C.getDriver().getClangProgramPath());
9294 } else {
9295 linkPath = Linker;
9296 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009297 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009298 }
9299
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009300 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009301 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009302}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009303
Douglas Katzman95354292015-06-23 20:42:09 +00009304void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9305 const InputInfo &Output,
9306 const InputInfoList &Inputs,
9307 const ArgList &Args,
9308 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009309 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9310}
9311
Douglas Katzman95354292015-06-23 20:42:09 +00009312std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009313 Compilation &C, const JobAction &JA, const InputInfo &Output,
9314 const InputInfoList &Inputs, const ArgList &Args,
9315 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009316 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009317 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009318 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009319 CmdArgs.push_back("/W0"); // No warnings.
9320
9321 // The goal is to be able to invoke this tool correctly based on
9322 // any flag accepted by clang-cl.
9323
9324 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009325 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009326
9327 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009328 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9329 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9330 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009331 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9332 if (A->getOption().getID() == options::OPT_O0) {
9333 CmdArgs.push_back("/Od");
9334 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009335 CmdArgs.push_back("/Og");
9336
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009337 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009338 if (OptLevel == "s" || OptLevel == "z")
9339 CmdArgs.push_back("/Os");
9340 else
9341 CmdArgs.push_back("/Ot");
9342
9343 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009344 }
9345 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009346 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9347 options::OPT_fno_omit_frame_pointer))
9348 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9349 ? "/Oy"
9350 : "/Oy-");
9351 if (!Args.hasArg(options::OPT_fwritable_strings))
9352 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009353
Nico Weber3f8dafb2015-03-12 19:37:10 +00009354 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009355 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9356
David Majnemerf6072342014-07-01 22:24:56 +00009357 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9358 /*default=*/false))
9359 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009360 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9361 options::OPT_fno_function_sections))
9362 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9363 ? "/Gy"
9364 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009365 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9366 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009367 CmdArgs.push_back(
9368 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009369 if (Args.hasArg(options::OPT_fsyntax_only))
9370 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009371 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9372 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009373 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009374
Nico Weber3f8dafb2015-03-12 19:37:10 +00009375 std::vector<std::string> Includes =
9376 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009377 for (const auto &Include : Includes)
9378 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009379
Hans Wennborg87cfa712013-09-19 20:32:16 +00009380 // Flags that can simply be passed through.
9381 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9382 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009383 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009384 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009385
9386 // The order of these flags is relevant, so pick the last one.
9387 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9388 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9389 A->render(Args, CmdArgs);
9390
Hans Wennborg87cfa712013-09-19 20:32:16 +00009391 // Input filename.
9392 assert(Inputs.size() == 1);
9393 const InputInfo &II = Inputs[0];
9394 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9395 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9396 if (II.isFilename())
9397 CmdArgs.push_back(II.getFilename());
9398 else
9399 II.getInputArg().renderAsInput(Args, CmdArgs);
9400
9401 // Output filename.
9402 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009403 const char *Fo =
9404 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009405 CmdArgs.push_back(Fo);
9406
Hans Wennborg188382e2013-09-20 18:16:35 +00009407 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009408 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9409 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009410 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009411 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009412}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009413
Yaron Keren1c0070c2015-07-02 04:45:27 +00009414/// MinGW Tools
9415void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9416 const InputInfo &Output,
9417 const InputInfoList &Inputs,
9418 const ArgList &Args,
9419 const char *LinkingOutput) const {
9420 claimNoWarnArgs(Args);
9421 ArgStringList CmdArgs;
9422
9423 if (getToolChain().getArch() == llvm::Triple::x86) {
9424 CmdArgs.push_back("--32");
9425 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9426 CmdArgs.push_back("--64");
9427 }
9428
9429 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9430
9431 CmdArgs.push_back("-o");
9432 CmdArgs.push_back(Output.getFilename());
9433
9434 for (const auto &II : Inputs)
9435 CmdArgs.push_back(II.getFilename());
9436
9437 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009438 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009439
9440 if (Args.hasArg(options::OPT_gsplit_dwarf))
9441 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9442 SplitDebugName(Args, Inputs[0]));
9443}
9444
9445void MinGW::Linker::AddLibGCC(const ArgList &Args,
9446 ArgStringList &CmdArgs) const {
9447 if (Args.hasArg(options::OPT_mthreads))
9448 CmdArgs.push_back("-lmingwthrd");
9449 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009450
Yaron Kerenaa281332015-08-09 00:24:07 +00009451 // Make use of compiler-rt if --rtlib option is used
9452 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9453 if (RLT == ToolChain::RLT_Libgcc) {
9454 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9455 Args.hasArg(options::OPT_static);
9456 bool Shared = Args.hasArg(options::OPT_shared);
9457 bool CXX = getToolChain().getDriver().CCCIsCXX();
9458
9459 if (Static || (!CXX && !Shared)) {
9460 CmdArgs.push_back("-lgcc");
9461 CmdArgs.push_back("-lgcc_eh");
9462 } else {
9463 CmdArgs.push_back("-lgcc_s");
9464 CmdArgs.push_back("-lgcc");
9465 }
9466 } else {
9467 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9468 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009469
Yaron Keren1c0070c2015-07-02 04:45:27 +00009470 CmdArgs.push_back("-lmoldname");
9471 CmdArgs.push_back("-lmingwex");
9472 CmdArgs.push_back("-lmsvcrt");
9473}
9474
9475void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9476 const InputInfo &Output,
9477 const InputInfoList &Inputs,
9478 const ArgList &Args,
9479 const char *LinkingOutput) const {
9480 const ToolChain &TC = getToolChain();
9481 const Driver &D = TC.getDriver();
9482 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9483
9484 ArgStringList CmdArgs;
9485
9486 // Silence warning for "clang -g foo.o -o foo"
9487 Args.ClaimAllArgs(options::OPT_g_Group);
9488 // and "clang -emit-llvm foo.o -o foo"
9489 Args.ClaimAllArgs(options::OPT_emit_llvm);
9490 // and for "clang -w foo.o -o foo". Other warning options are already
9491 // handled somewhere else.
9492 Args.ClaimAllArgs(options::OPT_w);
9493
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009494 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9495 if (LinkerName.equals_lower("lld")) {
9496 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009497 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009498 } else if (!LinkerName.equals_lower("ld")) {
9499 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009500 }
9501
Yaron Keren1c0070c2015-07-02 04:45:27 +00009502 if (!D.SysRoot.empty())
9503 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9504
9505 if (Args.hasArg(options::OPT_s))
9506 CmdArgs.push_back("-s");
9507
9508 CmdArgs.push_back("-m");
9509 if (TC.getArch() == llvm::Triple::x86)
9510 CmdArgs.push_back("i386pe");
9511 if (TC.getArch() == llvm::Triple::x86_64)
9512 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009513 if (TC.getArch() == llvm::Triple::arm)
9514 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009515
9516 if (Args.hasArg(options::OPT_mwindows)) {
9517 CmdArgs.push_back("--subsystem");
9518 CmdArgs.push_back("windows");
9519 } else if (Args.hasArg(options::OPT_mconsole)) {
9520 CmdArgs.push_back("--subsystem");
9521 CmdArgs.push_back("console");
9522 }
9523
9524 if (Args.hasArg(options::OPT_static))
9525 CmdArgs.push_back("-Bstatic");
9526 else {
9527 if (Args.hasArg(options::OPT_mdll))
9528 CmdArgs.push_back("--dll");
9529 else if (Args.hasArg(options::OPT_shared))
9530 CmdArgs.push_back("--shared");
9531 CmdArgs.push_back("-Bdynamic");
9532 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9533 CmdArgs.push_back("-e");
9534 if (TC.getArch() == llvm::Triple::x86)
9535 CmdArgs.push_back("_DllMainCRTStartup@12");
9536 else
9537 CmdArgs.push_back("DllMainCRTStartup");
9538 CmdArgs.push_back("--enable-auto-image-base");
9539 }
9540 }
9541
9542 CmdArgs.push_back("-o");
9543 CmdArgs.push_back(Output.getFilename());
9544
9545 Args.AddAllArgs(CmdArgs, options::OPT_e);
9546 // FIXME: add -N, -n flags
9547 Args.AddLastArg(CmdArgs, options::OPT_r);
9548 Args.AddLastArg(CmdArgs, options::OPT_s);
9549 Args.AddLastArg(CmdArgs, options::OPT_t);
9550 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9551 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9552
Douglas Katzman78b37b02015-11-17 20:28:07 +00009553 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009554 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9555 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9556 } else {
9557 if (Args.hasArg(options::OPT_municode))
9558 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9559 else
9560 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9561 }
9562 if (Args.hasArg(options::OPT_pg))
9563 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9564 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9565 }
9566
9567 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009568 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009569 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9570
9571 // TODO: Add ASan stuff here
9572
9573 // TODO: Add profile stuff here
9574
Douglas Katzman78b37b02015-11-17 20:28:07 +00009575 if (D.CCCIsCXX() &&
9576 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009577 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9578 !Args.hasArg(options::OPT_static);
9579 if (OnlyLibstdcxxStatic)
9580 CmdArgs.push_back("-Bstatic");
9581 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9582 if (OnlyLibstdcxxStatic)
9583 CmdArgs.push_back("-Bdynamic");
9584 }
9585
9586 if (!Args.hasArg(options::OPT_nostdlib)) {
9587 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9588 if (Args.hasArg(options::OPT_static))
9589 CmdArgs.push_back("--start-group");
9590
9591 if (Args.hasArg(options::OPT_fstack_protector) ||
9592 Args.hasArg(options::OPT_fstack_protector_strong) ||
9593 Args.hasArg(options::OPT_fstack_protector_all)) {
9594 CmdArgs.push_back("-lssp_nonshared");
9595 CmdArgs.push_back("-lssp");
9596 }
9597 if (Args.hasArg(options::OPT_fopenmp))
9598 CmdArgs.push_back("-lgomp");
9599
9600 AddLibGCC(Args, CmdArgs);
9601
9602 if (Args.hasArg(options::OPT_pg))
9603 CmdArgs.push_back("-lgmon");
9604
Yaron Kerenadce68e2015-07-06 18:52:19 +00009605 if (Args.hasArg(options::OPT_pthread))
9606 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009607
9608 // add system libraries
9609 if (Args.hasArg(options::OPT_mwindows)) {
9610 CmdArgs.push_back("-lgdi32");
9611 CmdArgs.push_back("-lcomdlg32");
9612 }
9613 CmdArgs.push_back("-ladvapi32");
9614 CmdArgs.push_back("-lshell32");
9615 CmdArgs.push_back("-luser32");
9616 CmdArgs.push_back("-lkernel32");
9617
9618 if (Args.hasArg(options::OPT_static))
9619 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009620 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009621 AddLibGCC(Args, CmdArgs);
9622 }
9623
9624 if (!Args.hasArg(options::OPT_nostartfiles)) {
9625 // Add crtfastmath.o if available and fast math is enabled.
9626 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9627
9628 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9629 }
9630 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009631 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009632 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009633}
9634
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009635/// XCore Tools
9636// We pass assemble and link construction to the xcc tool.
9637
Douglas Katzman95354292015-06-23 20:42:09 +00009638void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9639 const InputInfo &Output,
9640 const InputInfoList &Inputs,
9641 const ArgList &Args,
9642 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009643 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009644 ArgStringList CmdArgs;
9645
9646 CmdArgs.push_back("-o");
9647 CmdArgs.push_back(Output.getFilename());
9648
9649 CmdArgs.push_back("-c");
9650
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009651 if (Args.hasArg(options::OPT_v))
9652 CmdArgs.push_back("-v");
9653
Robert Lytton894d25c2014-05-02 09:33:25 +00009654 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9655 if (!A->getOption().matches(options::OPT_g0))
9656 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009657
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009658 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9659 false))
9660 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009661
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009662 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009663
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009664 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009665 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009666
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009667 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009668 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009669}
9670
Douglas Katzman95354292015-06-23 20:42:09 +00009671void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9672 const InputInfo &Output,
9673 const InputInfoList &Inputs,
9674 const ArgList &Args,
9675 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009676 ArgStringList CmdArgs;
9677
9678 if (Output.isFilename()) {
9679 CmdArgs.push_back("-o");
9680 CmdArgs.push_back(Output.getFilename());
9681 } else {
9682 assert(Output.isNothing() && "Invalid output.");
9683 }
9684
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009685 if (Args.hasArg(options::OPT_v))
9686 CmdArgs.push_back("-v");
9687
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009688 // Pass -fexceptions through to the linker if it was present.
9689 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9690 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009691 CmdArgs.push_back("-fexceptions");
9692
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009693 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9694
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009695 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009696 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009697}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009698
Douglas Katzman95354292015-06-23 20:42:09 +00009699void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9700 const InputInfo &Output,
9701 const InputInfoList &Inputs,
9702 const ArgList &Args,
9703 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009704 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009705 const auto &TC =
9706 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9707 ArgStringList CmdArgs;
9708 const char *Exec;
9709
9710 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009711 default:
9712 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009713 case llvm::Triple::arm:
9714 case llvm::Triple::thumb:
9715 break;
9716 case llvm::Triple::x86:
9717 CmdArgs.push_back("--32");
9718 break;
9719 case llvm::Triple::x86_64:
9720 CmdArgs.push_back("--64");
9721 break;
9722 }
9723
9724 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9725
9726 CmdArgs.push_back("-o");
9727 CmdArgs.push_back(Output.getFilename());
9728
9729 for (const auto &Input : Inputs)
9730 CmdArgs.push_back(Input.getFilename());
9731
9732 const std::string Assembler = TC.GetProgramPath("as");
9733 Exec = Args.MakeArgString(Assembler);
9734
Justin Bognerd3371d82015-07-17 03:35:54 +00009735 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009736}
9737
Douglas Katzman95354292015-06-23 20:42:09 +00009738void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9739 const InputInfo &Output,
9740 const InputInfoList &Inputs,
9741 const ArgList &Args,
9742 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009743 const auto &TC =
9744 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9745 const llvm::Triple &T = TC.getTriple();
9746 const Driver &D = TC.getDriver();
9747 SmallString<128> EntryPoint;
9748 ArgStringList CmdArgs;
9749 const char *Exec;
9750
9751 // Silence warning for "clang -g foo.o -o foo"
9752 Args.ClaimAllArgs(options::OPT_g_Group);
9753 // and "clang -emit-llvm foo.o -o foo"
9754 Args.ClaimAllArgs(options::OPT_emit_llvm);
9755 // and for "clang -w foo.o -o foo"
9756 Args.ClaimAllArgs(options::OPT_w);
9757 // Other warning options are already handled somewhere else.
9758
9759 if (!D.SysRoot.empty())
9760 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9761
9762 if (Args.hasArg(options::OPT_pie))
9763 CmdArgs.push_back("-pie");
9764 if (Args.hasArg(options::OPT_rdynamic))
9765 CmdArgs.push_back("-export-dynamic");
9766 if (Args.hasArg(options::OPT_s))
9767 CmdArgs.push_back("--strip-all");
9768
9769 CmdArgs.push_back("-m");
9770 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009771 default:
9772 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009773 case llvm::Triple::arm:
9774 case llvm::Triple::thumb:
9775 // FIXME: this is incorrect for WinCE
9776 CmdArgs.push_back("thumb2pe");
9777 break;
9778 case llvm::Triple::x86:
9779 CmdArgs.push_back("i386pe");
9780 EntryPoint.append("_");
9781 break;
9782 case llvm::Triple::x86_64:
9783 CmdArgs.push_back("i386pep");
9784 break;
9785 }
9786
9787 if (Args.hasArg(options::OPT_shared)) {
9788 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009789 default:
9790 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009791 case llvm::Triple::arm:
9792 case llvm::Triple::thumb:
9793 case llvm::Triple::x86_64:
9794 EntryPoint.append("_DllMainCRTStartup");
9795 break;
9796 case llvm::Triple::x86:
9797 EntryPoint.append("_DllMainCRTStartup@12");
9798 break;
9799 }
9800
9801 CmdArgs.push_back("-shared");
9802 CmdArgs.push_back("-Bdynamic");
9803
9804 CmdArgs.push_back("--enable-auto-image-base");
9805
9806 CmdArgs.push_back("--entry");
9807 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9808 } else {
9809 EntryPoint.append("mainCRTStartup");
9810
9811 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9812 : "-Bdynamic");
9813
Douglas Katzman78b37b02015-11-17 20:28:07 +00009814 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009815 CmdArgs.push_back("--entry");
9816 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9817 }
9818
9819 // FIXME: handle subsystem
9820 }
9821
9822 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009823 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009824
9825 CmdArgs.push_back("-o");
9826 CmdArgs.push_back(Output.getFilename());
9827
9828 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9829 SmallString<261> ImpLib(Output.getFilename());
9830 llvm::sys::path::replace_extension(ImpLib, ".lib");
9831
9832 CmdArgs.push_back("--out-implib");
9833 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9834 }
9835
Douglas Katzman78b37b02015-11-17 20:28:07 +00009836 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009837 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9838 const char *CRTBegin;
9839
9840 CRTBegin =
9841 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9842 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9843 }
9844
9845 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009846 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009847 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9848
9849 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9850 !Args.hasArg(options::OPT_nodefaultlibs)) {
9851 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9852 !Args.hasArg(options::OPT_static);
9853 if (StaticCXX)
9854 CmdArgs.push_back("-Bstatic");
9855 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9856 if (StaticCXX)
9857 CmdArgs.push_back("-Bdynamic");
9858 }
9859
9860 if (!Args.hasArg(options::OPT_nostdlib)) {
9861 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9862 // TODO handle /MT[d] /MD[d]
9863 CmdArgs.push_back("-lmsvcrt");
9864 AddRunTimeLibs(TC, D, CmdArgs, Args);
9865 }
9866 }
9867
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009868 if (TC.getSanitizerArgs().needsAsanRt()) {
9869 // TODO handle /MT[d] /MD[d]
9870 if (Args.hasArg(options::OPT_shared)) {
9871 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9872 } else {
9873 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9874 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9875 // Make sure the dynamic runtime thunk is not optimized out at link time
9876 // to ensure proper SEH handling.
9877 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9878 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9879 ? "___asan_seh_interceptor"
9880 : "__asan_seh_interceptor"));
9881 }
9882 }
9883
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009884 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009885
Justin Bognerd3371d82015-07-17 03:35:54 +00009886 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009887}
Douglas Katzman84a75642015-06-19 14:55:19 +00009888
Douglas Katzman95354292015-06-23 20:42:09 +00009889void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9890 const InputInfo &Output,
9891 const InputInfoList &Inputs,
9892 const ArgList &Args,
9893 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009894 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +00009895 assert(Inputs.size() == 1);
9896 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009897 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
9898 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +00009899
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009900 if (JA.getKind() == Action::PreprocessJobClass) {
9901 Args.ClaimAllArgs();
9902 CmdArgs.push_back("-E");
9903 } else {
9904 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9905 CmdArgs.push_back("-S");
9906 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9907 }
Douglas Katzman84a75642015-06-19 14:55:19 +00009908 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009909 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +00009910
Douglas Katzmanf6071112015-08-03 14:34:22 +00009911 // Append all -I, -iquote, -isystem paths, defines/undefines,
9912 // 'f' flags, optimize flags, and warning options.
9913 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009914 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +00009915 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +00009916 options::OPT_f_Group, options::OPT_f_clang_Group,
9917 options::OPT_g_Group, options::OPT_M_Group,
9918 options::OPT_O_Group, options::OPT_W_Group});
9919
9920 // If we're producing a dependency file, and assembly is the final action,
9921 // then the name of the target in the dependency file should be the '.o'
9922 // file, not the '.s' file produced by this step. For example, instead of
9923 // /tmp/mumble.s: mumble.c .../someheader.h
9924 // the filename on the lefthand side should be "mumble.o"
9925 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9926 C.getActions().size() == 1 &&
9927 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9928 Arg *A = Args.getLastArg(options::OPT_o);
9929 if (A) {
9930 CmdArgs.push_back("-MT");
9931 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9932 }
9933 }
9934
Douglas Katzman84a75642015-06-19 14:55:19 +00009935 CmdArgs.push_back(II.getFilename());
9936 CmdArgs.push_back("-o");
9937 CmdArgs.push_back(Output.getFilename());
9938
9939 std::string Exec =
9940 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009941 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9942 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009943}
9944
Douglas Katzman95354292015-06-23 20:42:09 +00009945void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9946 const InputInfo &Output,
9947 const InputInfoList &Inputs,
9948 const ArgList &Args,
9949 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009950 ArgStringList CmdArgs;
9951
9952 assert(Inputs.size() == 1);
9953 const InputInfo &II = Inputs[0];
9954 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9955 assert(Output.getType() == types::TY_Object);
9956
9957 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009958 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009959 CmdArgs.push_back("-noSPrefixing");
9960 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009961 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9962 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9963 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009964 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009965 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009966 }
9967 CmdArgs.push_back("-elf"); // Output format.
9968 CmdArgs.push_back(II.getFilename());
9969 CmdArgs.push_back(
9970 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9971
9972 std::string Exec =
9973 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009974 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9975 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009976}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009977
9978void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9979 const InputInfo &Output,
9980 const InputInfoList &Inputs,
9981 const ArgList &Args,
9982 const char *LinkingOutput) const {
9983 const auto &TC =
9984 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9985 const llvm::Triple &T = TC.getTriple();
9986 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +00009987 bool UseStartfiles =
9988 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +00009989 bool UseDefaultLibs =
9990 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009991
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009992 if (T.getArch() == llvm::Triple::sparc)
9993 CmdArgs.push_back("-EB");
9994 else // SHAVE assumes little-endian, and sparcel is expressly so.
9995 CmdArgs.push_back("-EL");
9996
9997 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9998 // but we never pass through a --sysroot option and various other bits.
9999 // For example, there are no sanitizers (yet) nor gold linker.
10000
10001 // Eat some arguments that may be present but have no effect.
10002 Args.ClaimAllArgs(options::OPT_g_Group);
10003 Args.ClaimAllArgs(options::OPT_w);
10004 Args.ClaimAllArgs(options::OPT_static_libgcc);
10005
10006 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10007 CmdArgs.push_back("-s");
10008
10009 CmdArgs.push_back("-o");
10010 CmdArgs.push_back(Output.getFilename());
10011
10012 if (UseStartfiles) {
10013 // If you want startfiles, it means you want the builtin crti and crtbegin,
10014 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010015 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10016 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010017 }
10018
10019 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10020 options::OPT_e, options::OPT_s, options::OPT_t,
10021 options::OPT_Z_Flag, options::OPT_r});
10022
Douglas Katzman674a3122015-11-18 16:24:46 +000010023 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010024
10025 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10026
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010027 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010028 if (C.getDriver().CCCIsCXX())
10029 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010030 if (T.getOS() == llvm::Triple::RTEMS) {
10031 CmdArgs.push_back("--start-group");
10032 CmdArgs.push_back("-lc");
10033 // You must provide your own "-L" option to enable finding these.
10034 CmdArgs.push_back("-lrtemscpu");
10035 CmdArgs.push_back("-lrtemsbsp");
10036 CmdArgs.push_back("--end-group");
10037 } else {
10038 CmdArgs.push_back("-lc");
10039 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010040 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010041 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010042 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010043 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10044 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010045 }
10046
10047 std::string Exec =
10048 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10049 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10050 CmdArgs, Inputs));
10051}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010052
10053void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10054 const InputInfo &Output,
10055 const InputInfoList &Inputs,
10056 const ArgList &Args,
10057 const char *LinkingOutput) const {
10058 claimNoWarnArgs(Args);
10059 ArgStringList CmdArgs;
10060
10061 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10062
10063 CmdArgs.push_back("-o");
10064 CmdArgs.push_back(Output.getFilename());
10065
10066 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10067 const InputInfo &Input = Inputs[0];
10068 assert(Input.isFilename() && "Invalid input.");
10069 CmdArgs.push_back(Input.getFilename());
10070
10071 const char *Exec =
10072 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10073 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10074}
10075
10076static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
10077 ArgStringList &CmdArgs) {
10078 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
10079 false) ||
10080 Args.hasArg(options::OPT_fprofile_generate) ||
10081 Args.hasArg(options::OPT_fprofile_instr_generate) ||
10082 Args.hasArg(options::OPT_fcreate_profile) ||
10083 Args.hasArg(options::OPT_coverage)))
10084 return;
10085
10086 assert(TC.getTriple().isPS4CPU() &&
10087 "Profiling libraries are only implemented for the PS4 CPU");
10088 CmdArgs.push_back("-lclang_rt.profile-x86_64");
10089}
10090
10091static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10092 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10093 if (SanArgs.needsUbsanRt()) {
10094 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10095 }
10096 if (SanArgs.needsAsanRt()) {
10097 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10098 }
10099}
10100
10101static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10102 const JobAction &JA, const InputInfo &Output,
10103 const InputInfoList &Inputs,
10104 const ArgList &Args,
10105 const char *LinkingOutput) {
10106 const toolchains::FreeBSD &ToolChain =
10107 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10108 const Driver &D = ToolChain.getDriver();
10109 ArgStringList CmdArgs;
10110
10111 // Silence warning for "clang -g foo.o -o foo"
10112 Args.ClaimAllArgs(options::OPT_g_Group);
10113 // and "clang -emit-llvm foo.o -o foo"
10114 Args.ClaimAllArgs(options::OPT_emit_llvm);
10115 // and for "clang -w foo.o -o foo". Other warning options are already
10116 // handled somewhere else.
10117 Args.ClaimAllArgs(options::OPT_w);
10118
10119 if (!D.SysRoot.empty())
10120 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10121
10122 if (Args.hasArg(options::OPT_pie))
10123 CmdArgs.push_back("-pie");
10124
10125 if (Args.hasArg(options::OPT_rdynamic))
10126 CmdArgs.push_back("-export-dynamic");
10127 if (Args.hasArg(options::OPT_shared))
10128 CmdArgs.push_back("--oformat=so");
10129
10130 if (Output.isFilename()) {
10131 CmdArgs.push_back("-o");
10132 CmdArgs.push_back(Output.getFilename());
10133 } else {
10134 assert(Output.isNothing() && "Invalid output.");
10135 }
10136
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010137 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10138
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010139 Args.AddAllArgs(CmdArgs, options::OPT_L);
10140 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10141 Args.AddAllArgs(CmdArgs, options::OPT_e);
10142 Args.AddAllArgs(CmdArgs, options::OPT_s);
10143 Args.AddAllArgs(CmdArgs, options::OPT_t);
10144 Args.AddAllArgs(CmdArgs, options::OPT_r);
10145
10146 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10147 CmdArgs.push_back("--no-demangle");
10148
10149 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10150
10151 if (Args.hasArg(options::OPT_pthread)) {
10152 CmdArgs.push_back("-lpthread");
10153 }
10154
10155 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010156
10157 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10158
10159 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10160}
10161
10162static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10163 const JobAction &JA, const InputInfo &Output,
10164 const InputInfoList &Inputs,
10165 const ArgList &Args,
10166 const char *LinkingOutput) {
10167 const toolchains::FreeBSD &ToolChain =
10168 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10169 const Driver &D = ToolChain.getDriver();
10170 ArgStringList CmdArgs;
10171
10172 // Silence warning for "clang -g foo.o -o foo"
10173 Args.ClaimAllArgs(options::OPT_g_Group);
10174 // and "clang -emit-llvm foo.o -o foo"
10175 Args.ClaimAllArgs(options::OPT_emit_llvm);
10176 // and for "clang -w foo.o -o foo". Other warning options are already
10177 // handled somewhere else.
10178 Args.ClaimAllArgs(options::OPT_w);
10179
10180 if (!D.SysRoot.empty())
10181 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10182
10183 if (Args.hasArg(options::OPT_pie))
10184 CmdArgs.push_back("-pie");
10185
10186 if (Args.hasArg(options::OPT_static)) {
10187 CmdArgs.push_back("-Bstatic");
10188 } else {
10189 if (Args.hasArg(options::OPT_rdynamic))
10190 CmdArgs.push_back("-export-dynamic");
10191 CmdArgs.push_back("--eh-frame-hdr");
10192 if (Args.hasArg(options::OPT_shared)) {
10193 CmdArgs.push_back("-Bshareable");
10194 } else {
10195 CmdArgs.push_back("-dynamic-linker");
10196 CmdArgs.push_back("/libexec/ld-elf.so.1");
10197 }
10198 CmdArgs.push_back("--enable-new-dtags");
10199 }
10200
10201 if (Output.isFilename()) {
10202 CmdArgs.push_back("-o");
10203 CmdArgs.push_back(Output.getFilename());
10204 } else {
10205 assert(Output.isNothing() && "Invalid output.");
10206 }
10207
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010208 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10209
Douglas Katzman78b37b02015-11-17 20:28:07 +000010210 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010211 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010212 if (!Args.hasArg(options::OPT_shared)) {
10213 if (Args.hasArg(options::OPT_pg))
10214 crt1 = "gcrt1.o";
10215 else if (Args.hasArg(options::OPT_pie))
10216 crt1 = "Scrt1.o";
10217 else
10218 crt1 = "crt1.o";
10219 }
10220 if (crt1)
10221 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10222
10223 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10224
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010225 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010226 if (Args.hasArg(options::OPT_static))
10227 crtbegin = "crtbeginT.o";
10228 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10229 crtbegin = "crtbeginS.o";
10230 else
10231 crtbegin = "crtbegin.o";
10232
10233 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10234 }
10235
10236 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010237 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010238 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10239 Args.AddAllArgs(CmdArgs, options::OPT_e);
10240 Args.AddAllArgs(CmdArgs, options::OPT_s);
10241 Args.AddAllArgs(CmdArgs, options::OPT_t);
10242 Args.AddAllArgs(CmdArgs, options::OPT_r);
10243
10244 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10245 CmdArgs.push_back("--no-demangle");
10246
10247 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10248
Douglas Katzman78b37b02015-11-17 20:28:07 +000010249 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010250 // For PS4, we always want to pass libm, libstdc++ and libkernel
10251 // libraries for both C and C++ compilations.
10252 CmdArgs.push_back("-lkernel");
10253 if (D.CCCIsCXX()) {
10254 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10255 if (Args.hasArg(options::OPT_pg))
10256 CmdArgs.push_back("-lm_p");
10257 else
10258 CmdArgs.push_back("-lm");
10259 }
10260 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10261 // the default system libraries. Just mimic this for now.
10262 if (Args.hasArg(options::OPT_pg))
10263 CmdArgs.push_back("-lgcc_p");
10264 else
10265 CmdArgs.push_back("-lcompiler_rt");
10266 if (Args.hasArg(options::OPT_static)) {
10267 CmdArgs.push_back("-lstdc++");
10268 } else if (Args.hasArg(options::OPT_pg)) {
10269 CmdArgs.push_back("-lgcc_eh_p");
10270 } else {
10271 CmdArgs.push_back("--as-needed");
10272 CmdArgs.push_back("-lstdc++");
10273 CmdArgs.push_back("--no-as-needed");
10274 }
10275
10276 if (Args.hasArg(options::OPT_pthread)) {
10277 if (Args.hasArg(options::OPT_pg))
10278 CmdArgs.push_back("-lpthread_p");
10279 else
10280 CmdArgs.push_back("-lpthread");
10281 }
10282
10283 if (Args.hasArg(options::OPT_pg)) {
10284 if (Args.hasArg(options::OPT_shared))
10285 CmdArgs.push_back("-lc");
10286 else {
10287 if (Args.hasArg(options::OPT_static)) {
10288 CmdArgs.push_back("--start-group");
10289 CmdArgs.push_back("-lc_p");
10290 CmdArgs.push_back("-lpthread_p");
10291 CmdArgs.push_back("--end-group");
10292 } else {
10293 CmdArgs.push_back("-lc_p");
10294 }
10295 }
10296 CmdArgs.push_back("-lgcc_p");
10297 } else {
10298 if (Args.hasArg(options::OPT_static)) {
10299 CmdArgs.push_back("--start-group");
10300 CmdArgs.push_back("-lc");
10301 CmdArgs.push_back("-lpthread");
10302 CmdArgs.push_back("--end-group");
10303 } else {
10304 CmdArgs.push_back("-lc");
10305 }
10306 CmdArgs.push_back("-lcompiler_rt");
10307 }
10308
10309 if (Args.hasArg(options::OPT_static)) {
10310 CmdArgs.push_back("-lstdc++");
10311 } else if (Args.hasArg(options::OPT_pg)) {
10312 CmdArgs.push_back("-lgcc_eh_p");
10313 } else {
10314 CmdArgs.push_back("--as-needed");
10315 CmdArgs.push_back("-lstdc++");
10316 CmdArgs.push_back("--no-as-needed");
10317 }
10318 }
10319
Douglas Katzman78b37b02015-11-17 20:28:07 +000010320 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010321 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10322 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10323 else
10324 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10325 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10326 }
10327
10328 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010329
10330 const char *Exec =
10331#ifdef LLVM_ON_WIN32
10332 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10333#else
10334 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10335#endif
10336
10337 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10338}
10339
10340void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10341 const InputInfo &Output,
10342 const InputInfoList &Inputs,
10343 const ArgList &Args,
10344 const char *LinkingOutput) const {
10345 const toolchains::FreeBSD &ToolChain =
10346 static_cast<const toolchains::FreeBSD &>(getToolChain());
10347 const Driver &D = ToolChain.getDriver();
10348 bool PS4Linker;
10349 StringRef LinkerOptName;
10350 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10351 LinkerOptName = A->getValue();
10352 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10353 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10354 }
10355
10356 if (LinkerOptName == "gold")
10357 PS4Linker = false;
10358 else if (LinkerOptName == "ps4")
10359 PS4Linker = true;
10360 else
10361 PS4Linker = !Args.hasArg(options::OPT_shared);
10362
10363 if (PS4Linker)
10364 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10365 else
10366 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10367}