blob: 426415d13df04ec48bd2ce935e99839ebb124677 [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" ||
2060 CPU == "cortex-a72") {
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
Justin Bognera88f0122014-06-20 22:59:50 +00003422 // We normally speed up the clang process a bit by skipping destructors at
3423 // exit, but when we're generating diagnostics we can rely on some of the
3424 // cleanup.
3425 if (!C.isForDiagnostics())
3426 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003427
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003428// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003429#ifdef NDEBUG
3430 CmdArgs.push_back("-disable-llvm-verifier");
3431#endif
3432
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003433 // Set the main file name, so that debug info works even with
3434 // -save-temps.
3435 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003436 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003437
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003438 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003439 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003440 if (Args.hasArg(options::OPT_static))
3441 CmdArgs.push_back("-static-define");
3442
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003443 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003444 // Enable region store model by default.
3445 CmdArgs.push_back("-analyzer-store=region");
3446
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003447 // Treat blocks as analysis entry points.
3448 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3449
Ted Kremenek49c79792011-03-24 00:28:47 +00003450 CmdArgs.push_back("-analyzer-eagerly-assume");
3451
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003452 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003453 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003454 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003455
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003456 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003457 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003458
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003459 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003460 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003461
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003462 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003463
Artem Belevichba558952015-05-06 18:20:23 +00003464 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003465 CmdArgs.push_back("-analyzer-checker=cplusplus");
3466
Nico Webere8e53112014-05-11 01:04:02 +00003467 // Enable the following experimental checkers for testing.
3468 CmdArgs.push_back(
3469 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003470 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3471 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003472 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003473 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3474 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003475
3476 // Default nullability checks.
3477 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3478 CmdArgs.push_back(
3479 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003480 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003481
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003482 // Set the output format. The default is plist, for (lame) historical
3483 // reasons.
3484 CmdArgs.push_back("-analyzer-output");
3485 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003486 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003487 else
3488 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003489
Ted Kremenekfe449a22010-03-22 22:32:05 +00003490 // Disable the presentation of standard compiler warnings when
3491 // using --analyze. We only want to show static analyzer diagnostics
3492 // or frontend errors.
3493 CmdArgs.push_back("-w");
3494
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003495 // Add -Xanalyzer arguments when running as analyzer.
3496 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003497 }
3498
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003499 CheckCodeGenerationOptions(D, Args);
3500
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003501 llvm::Reloc::Model RelocationModel;
3502 unsigned PICLevel;
3503 bool IsPIE;
3504 std::tie(RelocationModel, PICLevel, IsPIE) =
3505 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003506
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003507 const char *RMName = RelocationModelName(RelocationModel);
3508 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003509 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003510 CmdArgs.push_back(RMName);
3511 }
3512 if (PICLevel > 0) {
3513 CmdArgs.push_back("-pic-level");
3514 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3515 if (IsPIE) {
3516 CmdArgs.push_back("-pie-level");
3517 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003518 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003519 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003520
Renato Golin4854d802015-11-09 12:40:41 +00003521 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3522 CmdArgs.push_back("-meabi");
3523 CmdArgs.push_back(A->getValue());
3524 }
3525
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003526 CmdArgs.push_back("-mthread-model");
3527 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3528 CmdArgs.push_back(A->getValue());
3529 else
3530 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3531
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003532 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3533
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003534 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3535 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003536 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003537
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003538 // LLVM Code Generator Options.
3539
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003540 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3541 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003542 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3543 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003544 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003545 CmdArgs.push_back(A->getValue());
3546 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003547 }
3548 }
3549
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003550 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3551 StringRef v = A->getValue();
3552 CmdArgs.push_back("-mllvm");
3553 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3554 A->claim();
3555 }
3556
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003557 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3558 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003559 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003560 }
3561
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003562 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3563 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003564 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003565 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003566 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003567 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3568 CmdArgs.push_back("-fpcc-struct-return");
3569 } else {
3570 assert(A->getOption().matches(options::OPT_freg_struct_return));
3571 CmdArgs.push_back("-freg-struct-return");
3572 }
3573 }
3574
Roman Divacky65b88cd2011-03-01 17:40:53 +00003575 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3576 CmdArgs.push_back("-mrtd");
3577
Rafael Espindola224dd632011-12-14 21:02:23 +00003578 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003579 CmdArgs.push_back("-mdisable-fp-elim");
3580 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3581 options::OPT_fno_zero_initialized_in_bss))
3582 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003583
3584 bool OFastEnabled = isOptimizationLevelFast(Args);
3585 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3586 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003587 OptSpecifier StrictAliasingAliasOption =
3588 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003589 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3590 // doesn't do any TBAA.
3591 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003592 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003593 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003594 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003595 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3596 options::OPT_fno_struct_path_tbaa))
3597 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003598 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3599 false))
3600 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003601 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3602 options::OPT_fno_strict_vtable_pointers,
3603 false))
3604 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003605 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3606 options::OPT_fno_optimize_sibling_calls))
3607 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003608
Eric Christopher006208c2013-04-04 06:29:47 +00003609 // Handle segmented stacks.
3610 if (Args.hasArg(options::OPT_fsplit_stack))
3611 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003612
3613 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3614 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003615 OptSpecifier FastMathAliasOption =
3616 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3617
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003618 // Handle various floating point optimization flags, mapping them to the
3619 // appropriate LLVM code generation flags. The pattern for all of these is to
3620 // default off the codegen optimizations, and if any flag enables them and no
3621 // flag disables them after the flag enabling them, enable the codegen
3622 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003623 if (Arg *A = Args.getLastArg(
3624 options::OPT_ffast_math, FastMathAliasOption,
3625 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3626 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3627 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003628 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3629 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003630 A->getOption().getID() != options::OPT_fhonor_infinities)
3631 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003632 if (Arg *A = Args.getLastArg(
3633 options::OPT_ffast_math, FastMathAliasOption,
3634 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3635 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3636 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003637 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3638 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003639 A->getOption().getID() != options::OPT_fhonor_nans)
3640 CmdArgs.push_back("-menable-no-nans");
3641
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003642 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3643 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003644 if (Arg *A =
3645 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3646 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3647 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003648 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3649 // However, turning *off* -ffast_math merely restores the toolchain default
3650 // (which may be false).
3651 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3652 A->getOption().getID() == options::OPT_ffast_math ||
3653 A->getOption().getID() == options::OPT_Ofast)
3654 MathErrno = false;
3655 else if (A->getOption().getID() == options::OPT_fmath_errno)
3656 MathErrno = true;
3657 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003658 if (MathErrno)
3659 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003660
3661 // There are several flags which require disabling very specific
3662 // optimizations. Any of these being disabled forces us to turn off the
3663 // entire set of LLVM optimizations, so collect them through all the flag
3664 // madness.
3665 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003666 if (Arg *A = Args.getLastArg(
3667 options::OPT_ffast_math, FastMathAliasOption,
3668 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3669 options::OPT_fno_unsafe_math_optimizations,
3670 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003671 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3672 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003673 A->getOption().getID() != options::OPT_fno_associative_math)
3674 AssociativeMath = true;
3675 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003676 if (Arg *A = Args.getLastArg(
3677 options::OPT_ffast_math, FastMathAliasOption,
3678 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3679 options::OPT_fno_unsafe_math_optimizations,
3680 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003681 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3682 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003683 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3684 ReciprocalMath = true;
3685 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003686 if (Arg *A = Args.getLastArg(
3687 options::OPT_ffast_math, FastMathAliasOption,
3688 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3689 options::OPT_fno_unsafe_math_optimizations,
3690 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003691 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3692 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003693 A->getOption().getID() != options::OPT_fsigned_zeros)
3694 SignedZeros = false;
3695 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003696 if (Arg *A = Args.getLastArg(
3697 options::OPT_ffast_math, FastMathAliasOption,
3698 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3699 options::OPT_fno_unsafe_math_optimizations,
3700 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003701 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3702 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003703 A->getOption().getID() != options::OPT_ftrapping_math)
3704 TrappingMath = false;
3705 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3706 !TrappingMath)
3707 CmdArgs.push_back("-menable-unsafe-fp-math");
3708
Sanjay Patel76c9e092015-01-23 16:40:50 +00003709 if (!SignedZeros)
3710 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003711
Sanjay Patel359b1052015-04-09 15:03:23 +00003712 if (ReciprocalMath)
3713 CmdArgs.push_back("-freciprocal-math");
3714
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003715 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003716 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003717 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003718 options::OPT_ffp_contract)) {
3719 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003720 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003721 if (Val == "fast" || Val == "on" || Val == "off") {
3722 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3723 } else {
3724 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003725 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003726 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003727 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3728 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003729 // If fast-math is set then set the fp-contract mode to fast.
3730 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3731 }
3732 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003733
Sanjay Patel2987c292015-06-11 14:53:41 +00003734 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003735
Bob Wilson6a039162012-07-19 03:52:53 +00003736 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3737 // and if we find them, tell the frontend to provide the appropriate
3738 // preprocessor macros. This is distinct from enabling any optimizations as
3739 // these options induce language changes which must survive serialization
3740 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003741 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3742 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003743 if (!A->getOption().matches(options::OPT_fno_fast_math))
3744 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003745 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3746 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003747 if (A->getOption().matches(options::OPT_ffinite_math_only))
3748 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003749
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003750 // Decide whether to use verbose asm. Verbose assembly is the default on
3751 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003752 bool IsIntegratedAssemblerDefault =
3753 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003754 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003755 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003756 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003757 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003758
Rafael Espindolab8a12932015-05-22 20:44:03 +00003759 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3760 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003761 CmdArgs.push_back("-no-integrated-as");
3762
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003763 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3764 CmdArgs.push_back("-mdebug-pass");
3765 CmdArgs.push_back("Structure");
3766 }
3767 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3768 CmdArgs.push_back("-mdebug-pass");
3769 CmdArgs.push_back("Arguments");
3770 }
3771
John McCall8517abc2010-02-19 02:45:38 +00003772 // Enable -mconstructor-aliases except on darwin, where we have to
3773 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003774 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003775 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003776
John McCall7ef5cb32011-03-18 02:56:14 +00003777 // Darwin's kernel doesn't support guard variables; just die if we
3778 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003779 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003780 CmdArgs.push_back("-fforbid-guard-variables");
3781
Akira Hatanaka02028482015-11-12 17:21:22 +00003782 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3783 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003784 CmdArgs.push_back("-mms-bitfields");
3785 }
John McCall8517abc2010-02-19 02:45:38 +00003786
Daniel Dunbar306945d2009-09-16 06:17:29 +00003787 // This is a coarse approximation of what llvm-gcc actually does, both
3788 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3789 // complicated ways.
3790 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003791 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3792 options::OPT_fno_asynchronous_unwind_tables,
3793 (getToolChain().IsUnwindTablesDefault() ||
3794 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3795 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003796 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3797 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003798 CmdArgs.push_back("-munwind-tables");
3799
Chandler Carruth05fb5852012-11-21 23:40:23 +00003800 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003801
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003802 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3803 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003804 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003805 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003806
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003807 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003808 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003809
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003810 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003811 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003812 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003813 }
3814
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003815 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003816 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003817 if (!CPU.empty()) {
3818 CmdArgs.push_back("-target-cpu");
3819 CmdArgs.push_back(Args.MakeArgString(CPU));
3820 }
3821
Rafael Espindolaeb265472013-08-21 21:59:03 +00003822 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3823 CmdArgs.push_back("-mfpmath");
3824 CmdArgs.push_back(A->getValue());
3825 }
3826
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003827 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003828 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003829
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003830 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003831 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003832 default:
3833 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003834
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003835 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003836 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003837 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003838 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003839 // Use the effective triple, which takes into account the deployment target.
3840 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003841 break;
3842
Tim Northover573cbee2014-05-24 12:52:07 +00003843 case llvm::Triple::aarch64:
3844 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003845 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003846 break;
3847
Eric Christopher0b26a612010-03-02 02:41:08 +00003848 case llvm::Triple::mips:
3849 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003850 case llvm::Triple::mips64:
3851 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003852 AddMIPSTargetArgs(Args, CmdArgs);
3853 break;
3854
Ulrich Weigand8afad612014-07-28 13:17:52 +00003855 case llvm::Triple::ppc:
3856 case llvm::Triple::ppc64:
3857 case llvm::Triple::ppc64le:
3858 AddPPCTargetArgs(Args, CmdArgs);
3859 break;
3860
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003861 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003862 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003863 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003864 AddSparcTargetArgs(Args, CmdArgs);
3865 break;
3866
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003867 case llvm::Triple::x86:
3868 case llvm::Triple::x86_64:
3869 AddX86TargetArgs(Args, CmdArgs);
3870 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003871
3872 case llvm::Triple::hexagon:
3873 AddHexagonTargetArgs(Args, CmdArgs);
3874 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003875 }
3876
Douglas Katzman3459ce22015-10-08 04:24:12 +00003877 // The 'g' groups options involve a somewhat intricate sequence of decisions
3878 // about what to pass from the driver to the frontend, but by the time they
3879 // reach cc1 they've been factored into two well-defined orthogonal choices:
3880 // * what level of debug info to generate
3881 // * what dwarf version to write
3882 // This avoids having to monkey around further in cc1 other than to disable
3883 // codeview if not running in a Windows environment. Perhaps even that
3884 // decision should be made in the driver as well though.
3885 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3886 CodeGenOptions::NoDebugInfo;
3887 // These two are potentially updated by AddClangCLArgs.
3888 unsigned DwarfVersion = 0;
3889 bool EmitCodeView = false;
3890
Hans Wennborg75958c42013-08-08 00:17:41 +00003891 // Add clang-cl arguments.
3892 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003893 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003894
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003895 // Pass the linker version in use.
3896 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3897 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003898 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003899 }
3900
Eric Christopherb7d97e92013-04-03 01:58:53 +00003901 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003902 CmdArgs.push_back("-momit-leaf-frame-pointer");
3903
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003904 // Explicitly error on some things we know we don't support and can't just
3905 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003906 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003907 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3908 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003909 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003910 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003911 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3912 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003913 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003914 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003915 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003916 }
3917
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003918 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003919 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003920 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003921 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003922 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3923 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003924 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003925 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003926 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003927
Chad Rosierbe10f982011-08-02 17:58:04 +00003928 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003929 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003930 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3931 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003932 }
3933
Rafael Espindola08a692a2010-03-07 04:46:18 +00003934 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003935 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003936 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003937 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
3938 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
3939 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003940 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003941 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003942 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00003943 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003944 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003945 // Some 'g' group option other than one expressly disabling debug info
3946 // must have been the final (winning) one. They're all equivalent.
3947 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00003948 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003949 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003950
Douglas Katzman3459ce22015-10-08 04:24:12 +00003951 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
3952 // (because that would mean that "-g0" was the rightmost 'g' group option).
3953 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
3954 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
3955 // exists of removing the gdwarf options from the g_group.
3956 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
3957 options::OPT_gdwarf_4))
3958 DwarfVersion = DwarfVersionNum(A->getSpelling());
3959
Reid Kleckner124955a2015-08-05 18:51:13 +00003960 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00003961 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
3962 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
3963 // DwarfVersion remains at 0 if no explicit choice was made.
3964 CmdArgs.push_back("-gcodeview");
3965 } else if (DwarfVersion == 0 &&
3966 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
3967 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
3968 }
Reid Kleckner124955a2015-08-05 18:51:13 +00003969
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003970 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3971 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003972
3973 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00003974 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003975 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003976 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003977
Eric Christopher138c32b2013-09-13 22:37:55 +00003978 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003979 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003980 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003981 CmdArgs.push_back("-dwarf-ext-refs");
3982 CmdArgs.push_back("-fmodule-format=obj");
3983 }
3984
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003985 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3986 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003987 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003988 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003989 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003990 CmdArgs.push_back("-backend-option");
3991 CmdArgs.push_back("-split-dwarf=Enable");
3992 }
3993
Douglas Katzman3459ce22015-10-08 04:24:12 +00003994 // After we've dealt with all combinations of things that could
3995 // make DebugInfoKind be other than None or DebugLineTablesOnly,
3996 // figure out if we need to "upgrade" it to standalone debug info.
3997 // We parse these two '-f' options whether or not they will be used,
3998 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
3999 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4000 options::OPT_fno_standalone_debug,
4001 getToolChain().GetDefaultStandaloneDebug());
4002 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4003 DebugInfoKind = CodeGenOptions::FullDebugInfo;
4004 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
4005
Eric Christopher138c32b2013-09-13 22:37:55 +00004006 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4007 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4008 CmdArgs.push_back("-backend-option");
4009 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4010 }
Eric Christophereec89c22013-06-18 00:03:50 +00004011
Eric Christopher0d403d22014-02-14 01:27:03 +00004012 // -gdwarf-aranges turns on the emission of the aranges section in the
4013 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004014 // Always enabled on the PS4.
4015 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004016 CmdArgs.push_back("-backend-option");
4017 CmdArgs.push_back("-generate-arange-section");
4018 }
4019
David Blaikief36d9ba2014-01-27 18:52:43 +00004020 if (Args.hasFlag(options::OPT_fdebug_types_section,
4021 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004022 CmdArgs.push_back("-backend-option");
4023 CmdArgs.push_back("-generate-type-units");
4024 }
Eric Christophereec89c22013-06-18 00:03:50 +00004025
Ed Schouten6e576152015-03-26 17:50:28 +00004026 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4027 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4028
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004029 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004030 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004031 CmdArgs.push_back("-ffunction-sections");
4032 }
4033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004034 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4035 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004036 CmdArgs.push_back("-fdata-sections");
4037 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004038
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004039 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004040 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004041 CmdArgs.push_back("-fno-unique-section-names");
4042
Chris Lattner3c77a352010-06-22 00:03:40 +00004043 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4044
Diego Novilloa0545962015-07-10 18:00:07 +00004045 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004046
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004047 // Pass options for controlling the default header search paths.
4048 if (Args.hasArg(options::OPT_nostdinc)) {
4049 CmdArgs.push_back("-nostdsysteminc");
4050 CmdArgs.push_back("-nobuiltininc");
4051 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004052 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004053 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004054 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4055 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4056 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004057
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004058 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004059 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004060 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004061
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004062 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4063
Ted Kremenekf7639e12012-03-06 20:06:33 +00004064 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004065 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004066 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004067 options::OPT_ccc_arcmt_modify,
4068 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004069 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004070 switch (A->getOption().getID()) {
4071 default:
4072 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004073 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004074 CmdArgs.push_back("-arcmt-check");
4075 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004076 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004077 CmdArgs.push_back("-arcmt-modify");
4078 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004079 case options::OPT_ccc_arcmt_migrate:
4080 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004081 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004082 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004083
4084 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4085 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004086 break;
John McCalld70fb982011-06-15 23:25:17 +00004087 }
4088 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004089 } else {
4090 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4091 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4092 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004093 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004094
Ted Kremenekf7639e12012-03-06 20:06:33 +00004095 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4096 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004097 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4098 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004099 }
4100 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004101 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004102
4103 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004104 options::OPT_objcmt_migrate_subscripting,
4105 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004106 // None specified, means enable them all.
4107 CmdArgs.push_back("-objcmt-migrate-literals");
4108 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004109 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004110 } else {
4111 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4112 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004113 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004114 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004115 } else {
4116 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4117 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4118 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4119 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4120 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4121 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004122 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004123 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4124 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4125 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4126 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4127 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4128 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4129 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004130 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004131 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004132 }
4133
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004134 // Add preprocessing options like -I, -D, etc. if we are using the
4135 // preprocessor.
4136 //
4137 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004138 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004139 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4140 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004141
Rafael Espindolaa7431922011-07-21 23:40:37 +00004142 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4143 // that "The compiler can only warn and ignore the option if not recognized".
4144 // When building with ccache, it will pass -D options to clang even on
4145 // preprocessed inputs and configure concludes that -fPIC is not supported.
4146 Args.ClaimAllArgs(options::OPT_D);
4147
Alp Toker7874bdc2013-11-15 20:40:58 +00004148 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004149 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4150 if (A->getOption().matches(options::OPT_O4)) {
4151 CmdArgs.push_back("-O3");
4152 D.Diag(diag::warn_O4_is_O3);
4153 } else {
4154 A->render(Args, CmdArgs);
4155 }
4156 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004157
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004158 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004159 for (const Arg *A :
4160 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4161 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004162 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004163 }
4164
Rafael Espindola577637a2015-01-03 00:06:04 +00004165 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004166
Richard Smith3be1cb22014-08-07 00:24:21 +00004167 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004168 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004169 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4170 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004171 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004172 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004173
4174 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004175 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004176 //
4177 // If a std is supplied, only add -trigraphs if it follows the
4178 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004179 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004180 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4181 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004182 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004183 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004184 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004185 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004186 else
4187 Std->render(Args, CmdArgs);
4188
Nico Weber00721502014-12-23 22:32:37 +00004189 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004190 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004191 options::OPT_ftrigraphs,
4192 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004193 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004194 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004195 } else {
4196 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004197 //
4198 // FIXME: Clang doesn't correctly handle -std= when the input language
4199 // doesn't match. For the time being just ignore this for C++ inputs;
4200 // eventually we want to do all the standard defaulting here instead of
4201 // splitting it between the driver and clang -cc1.
4202 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004203 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4204 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004205 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004206 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004207
Nico Weber00721502014-12-23 22:32:37 +00004208 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4209 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004210 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004211
Richard Smith282b4492013-09-04 22:50:31 +00004212 // GCC's behavior for -Wwrite-strings is a bit strange:
4213 // * In C, this "warning flag" changes the types of string literals from
4214 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4215 // for the discarded qualifier.
4216 // * In C++, this is just a normal warning flag.
4217 //
4218 // Implementing this warning correctly in C is hard, so we follow GCC's
4219 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4220 // a non-const char* in C, rather than using this crude hack.
4221 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004222 // FIXME: This should behave just like a warning flag, and thus should also
4223 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4224 Arg *WriteStrings =
4225 Args.getLastArg(options::OPT_Wwrite_strings,
4226 options::OPT_Wno_write_strings, options::OPT_w);
4227 if (WriteStrings &&
4228 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004229 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004230 }
4231
Chandler Carruth61fbf622011-04-23 09:27:53 +00004232 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004233 // during C++ compilation, which it is by default. GCC keeps this define even
4234 // in the presence of '-w', match this behavior bug-for-bug.
4235 if (types::isCXX(InputType) &&
4236 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4237 true)) {
4238 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004239 }
4240
Chandler Carruthe0391482010-05-22 02:21:53 +00004241 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4242 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4243 if (Asm->getOption().matches(options::OPT_fasm))
4244 CmdArgs.push_back("-fgnu-keywords");
4245 else
4246 CmdArgs.push_back("-fno-gnu-keywords");
4247 }
4248
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004249 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4250 CmdArgs.push_back("-fno-dwarf-directory-asm");
4251
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004252 if (ShouldDisableAutolink(Args, getToolChain()))
4253 CmdArgs.push_back("-fno-autolink");
4254
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004255 // Add in -fdebug-compilation-dir if necessary.
4256 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004257
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004258 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4259 StringRef Map = A->getValue();
4260 if (Map.find('=') == StringRef::npos)
4261 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4262 else
4263 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4264 A->claim();
4265 }
4266
Richard Smith9a568822011-11-21 19:36:32 +00004267 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4268 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004269 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004270 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004271 }
4272
Richard Smith79c927b2013-11-06 19:31:51 +00004273 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4274 CmdArgs.push_back("-foperator-arrow-depth");
4275 CmdArgs.push_back(A->getValue());
4276 }
4277
Richard Smith9a568822011-11-21 19:36:32 +00004278 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4279 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004280 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004281 }
4282
Richard Smitha3d3bd22013-05-08 02:12:03 +00004283 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4284 CmdArgs.push_back("-fconstexpr-steps");
4285 CmdArgs.push_back(A->getValue());
4286 }
4287
Richard Smithb3a14522013-02-22 01:59:51 +00004288 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4289 CmdArgs.push_back("-fbracket-depth");
4290 CmdArgs.push_back(A->getValue());
4291 }
4292
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004293 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4294 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004295 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004296 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004297 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4298 } else
4299 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004300 }
4301
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004302 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004303 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004304
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004305 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4306 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004307 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004308 }
David Chisnall5778fce2009-08-31 16:41:57 +00004309
Chris Lattnere23003d2010-01-09 21:54:33 +00004310 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4311 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004312 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004313 }
4314
Chris Lattnerb35583d2010-04-07 20:49:23 +00004315 CmdArgs.push_back("-ferror-limit");
4316 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004317 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004318 else
4319 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004320
Chandler Carrutha77a7272010-05-06 04:55:18 +00004321 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4322 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004323 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004324 }
4325
4326 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4327 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004328 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004329 }
4330
Richard Smithf6f003a2011-12-16 19:06:07 +00004331 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4332 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004333 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004334 }
4335
Nick Lewycky24653262014-12-16 21:39:02 +00004336 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4337 CmdArgs.push_back("-fspell-checking-limit");
4338 CmdArgs.push_back(A->getValue());
4339 }
4340
Daniel Dunbar2c978472009-11-04 06:24:47 +00004341 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004342 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004343 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004344 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004345 } else {
4346 // If -fmessage-length=N was not specified, determine whether this is a
4347 // terminal and, if so, implicitly define -fmessage-length appropriately.
4348 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004349 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004350 }
4351
John McCallb4a99d32013-02-19 01:57:35 +00004352 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4353 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4354 options::OPT_fvisibility_ms_compat)) {
4355 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4356 CmdArgs.push_back("-fvisibility");
4357 CmdArgs.push_back(A->getValue());
4358 } else {
4359 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4360 CmdArgs.push_back("-fvisibility");
4361 CmdArgs.push_back("hidden");
4362 CmdArgs.push_back("-ftype-visibility");
4363 CmdArgs.push_back("default");
4364 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004365 }
4366
Douglas Gregor08329632010-06-15 17:05:35 +00004367 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004368
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004369 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4370
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004371 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004372 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4373 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004374 CmdArgs.push_back("-ffreestanding");
4375
Daniel Dunbare357d562009-12-03 18:42:11 +00004376 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004377 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004378 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004379 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004380 // Emulated TLS is enabled by default on Android, and can be enabled manually
4381 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004382 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004383 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4384 EmulatedTLSDefault))
4385 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004386 // AltiVec-like language extensions aren't relevant for assembling.
4387 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004388 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004389 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4390 }
Richard Trieu91844232012-06-26 18:18:47 +00004391 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4392 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004393
Alexey Bataevdb390212015-05-20 04:24:19 +00004394 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004395 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4396 options::OPT_fno_openmp, false))
4397 switch (getOpenMPRuntime(getToolChain(), Args)) {
4398 case OMPRT_OMP:
4399 case OMPRT_IOMP5:
4400 // Clang can generate useful OpenMP code for these two runtime libraries.
4401 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004402
4403 // If no option regarding the use of TLS in OpenMP codegeneration is
4404 // given, decide a default based on the target. Otherwise rely on the
4405 // options and pass the right information to the frontend.
4406 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004407 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004408 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004409 break;
4410 default:
4411 // By default, if Clang doesn't know how to generate useful OpenMP code
4412 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4413 // down to the actual compilation.
4414 // FIXME: It would be better to have a mode which *only* omits IR
4415 // generation based on the OpenMP support so that we get consistent
4416 // semantic analysis, etc.
4417 break;
4418 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004419
Peter Collingbourne32701642013-11-01 18:16:25 +00004420 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004421 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004422
Eric Christopher459d2712013-02-19 06:16:53 +00004423 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004424 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4425 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4426 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4427 Arch == llvm::Triple::ppc64le))
4428 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4429 << "ppc/ppc64/ppc64le";
4430 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004431
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004432 // -fzvector is incompatible with -faltivec.
4433 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4434 if (Args.hasArg(options::OPT_faltivec))
4435 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4436 << "-faltivec";
4437
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004438 if (getToolChain().SupportsProfiling())
4439 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004440
4441 // -flax-vector-conversions is default.
4442 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4443 options::OPT_fno_lax_vector_conversions))
4444 CmdArgs.push_back("-fno-lax-vector-conversions");
4445
John Brawna7b4ec02015-08-10 11:11:28 +00004446 if (Args.getLastArg(options::OPT_fapple_kext) ||
4447 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004448 CmdArgs.push_back("-fapple-kext");
4449
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004450 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004451 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004452 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004453 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4454 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004455
4456 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4457 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004458 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004459 }
4460
Bob Wilson14adb362012-02-03 06:27:22 +00004461 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004462
Chandler Carruth6e501032011-03-27 00:04:55 +00004463 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4464 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004465 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004466 if (A->getOption().matches(options::OPT_fwrapv))
4467 CmdArgs.push_back("-fwrapv");
4468 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4469 options::OPT_fno_strict_overflow)) {
4470 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4471 CmdArgs.push_back("-fwrapv");
4472 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004473
4474 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4475 options::OPT_fno_reroll_loops))
4476 if (A->getOption().matches(options::OPT_freroll_loops))
4477 CmdArgs.push_back("-freroll-loops");
4478
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004479 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004480 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4481 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004482
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004483 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4484
Daniel Dunbar4930e332009-11-17 08:07:36 +00004485 // -stack-protector=0 is default.
4486 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004487 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4488 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4489 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4490 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4491 Args.ClaimAllArgs(options::OPT_fstack_protector);
4492 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004493 options::OPT_fstack_protector_all,
4494 options::OPT_fstack_protector_strong,
4495 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004496 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004497 StackProtectorLevel = std::max<unsigned>(
4498 LangOptions::SSPOn,
4499 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004500 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004501 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004502 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004503 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004504 } else {
4505 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004506 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004507 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004508 if (StackProtectorLevel) {
4509 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004510 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004511 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004512
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004513 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004514 for (const Arg *A : Args.filtered(options::OPT__param)) {
4515 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004516 if (Str.startswith("ssp-buffer-size=")) {
4517 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004518 CmdArgs.push_back("-stack-protector-buffer-size");
4519 // FIXME: Verify the argument is a valid integer.
4520 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004521 }
Sean Silva14facf32015-06-09 01:57:17 +00004522 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004523 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004524 }
4525
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004526 // Translate -mstackrealign
4527 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004528 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004529 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004530
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004531 if (Args.hasArg(options::OPT_mstack_alignment)) {
4532 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4533 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004534 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004535
Hans Wennborg77dc2362015-01-20 19:45:50 +00004536 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4537 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4538
4539 if (!Size.empty())
4540 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4541 else
4542 CmdArgs.push_back("-mstack-probe-size=0");
4543 }
4544
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004545 switch (getToolChain().getArch()) {
4546 case llvm::Triple::aarch64:
4547 case llvm::Triple::aarch64_be:
4548 case llvm::Triple::arm:
4549 case llvm::Triple::armeb:
4550 case llvm::Triple::thumb:
4551 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004552 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004553 break;
4554
4555 default:
4556 break;
4557 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004558
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004559 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4560 options::OPT_mno_restrict_it)) {
4561 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4562 CmdArgs.push_back("-backend-option");
4563 CmdArgs.push_back("-arm-restrict-it");
4564 } else {
4565 CmdArgs.push_back("-backend-option");
4566 CmdArgs.push_back("-arm-no-restrict-it");
4567 }
James Y Knight2db38f32015-08-15 03:45:25 +00004568 } else if (Triple.isOSWindows() &&
4569 (Triple.getArch() == llvm::Triple::arm ||
4570 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004571 // Windows on ARM expects restricted IT blocks
4572 CmdArgs.push_back("-backend-option");
4573 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004574 }
4575
Daniel Dunbard18049a2009-04-07 21:16:11 +00004576 // Forward -f options with positive and negative forms; we translate
4577 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004578 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4579 StringRef fname = A->getValue();
4580 if (!llvm::sys::fs::exists(fname))
4581 D.Diag(diag::err_drv_no_such_file) << fname;
4582 else
4583 A->render(Args, CmdArgs);
4584 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004585
John Brawna7b4ec02015-08-10 11:11:28 +00004586 // -fbuiltin is default unless -mkernel is used
4587 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4588 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004589 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004590
Nuno Lopes13c88c72009-12-16 16:59:22 +00004591 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4592 options::OPT_fno_assume_sane_operator_new))
4593 CmdArgs.push_back("-fno-assume-sane-operator-new");
4594
Daniel Dunbar4930e332009-11-17 08:07:36 +00004595 // -fblocks=0 is default.
4596 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004597 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004598 (Args.hasArg(options::OPT_fgnu_runtime) &&
4599 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4600 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004601 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004602
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004603 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004604 !getToolChain().hasBlocksRuntime())
4605 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004606 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004607
Richard Smith47972af2015-06-16 00:08:24 +00004608 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004609 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004610 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004611 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004612 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004613 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4614 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004615 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004616 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004617 HaveModules = true;
4618 }
4619 }
4620
Richard Smith47972af2015-06-16 00:08:24 +00004621 // -fmodule-maps enables implicit reading of module map files. By default,
4622 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004623 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4624 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004625 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004626 }
4627
Daniel Jasperac42b752013-10-21 06:34:34 +00004628 // -fmodules-decluse checks that modules used are declared so (off by
4629 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004630 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004631 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004632 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004633 }
4634
Daniel Jasper962b38e2014-04-11 11:47:45 +00004635 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4636 // all #included headers are part of modules.
4637 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004638 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004639 CmdArgs.push_back("-fmodules-strict-decluse");
4640 }
4641
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004642 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4643 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4644 options::OPT_fno_implicit_modules)) {
4645 CmdArgs.push_back("-fno-implicit-modules");
4646 }
4647
Daniel Jasperac42b752013-10-21 06:34:34 +00004648 // -fmodule-name specifies the module that is currently being built (or
4649 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004650 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004651
Richard Smith9887d792014-10-17 01:42:53 +00004652 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004653 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004654 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004655
Richard Smithe842a472014-10-22 02:05:46 +00004656 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004657 if (HaveModules)
4658 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4659 else
4660 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004661
4662 // -fmodule-cache-path specifies where our implicitly-built module files
4663 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004664 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004665 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004666 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004667 if (HaveModules) {
4668 if (C.isForDiagnostics()) {
4669 // When generating crash reports, we want to emit the modules along with
4670 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004671 Path = Output.getFilename();
4672 llvm::sys::path::replace_extension(Path, ".cache");
4673 llvm::sys::path::append(Path, "modules");
4674 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004675 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004676 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004677 llvm::sys::path::append(Path, "org.llvm.clang.");
4678 appendUserToPath(Path);
4679 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004680 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004681 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004682 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4683 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004684 }
4685
4686 // When building modules and generating crashdumps, we need to dump a module
4687 // dependency VFS alongside the output.
4688 if (HaveModules && C.isForDiagnostics()) {
4689 SmallString<128> VFSDir(Output.getFilename());
4690 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004691 // Add the cache directory as a temp so the crash diagnostics pick it up.
4692 C.addTempFile(Args.MakeArgString(VFSDir));
4693
Justin Bognera88f0122014-06-20 22:59:50 +00004694 llvm::sys::path::append(VFSDir, "vfs");
4695 CmdArgs.push_back("-module-dependency-dir");
4696 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004697 }
4698
Richard Smith9887d792014-10-17 01:42:53 +00004699 if (HaveModules)
4700 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004701
Douglas Gregor35b04d62013-02-07 19:01:24 +00004702 // Pass through all -fmodules-ignore-macro arguments.
4703 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004704 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4705 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004706
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004707 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4708
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004709 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4710 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4711 D.Diag(diag::err_drv_argument_not_allowed_with)
4712 << A->getAsString(Args) << "-fbuild-session-timestamp";
4713
4714 llvm::sys::fs::file_status Status;
4715 if (llvm::sys::fs::status(A->getValue(), Status))
4716 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004717 CmdArgs.push_back(Args.MakeArgString(
4718 "-fbuild-session-timestamp=" +
4719 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004720 }
4721
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004722 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004723 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4724 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004725 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4726
4727 Args.AddLastArg(CmdArgs,
4728 options::OPT_fmodules_validate_once_per_build_session);
4729 }
4730
Ben Langmuirdcf73862014-03-12 00:06:17 +00004731 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4732
John McCalldfea9982010-04-09 19:12:06 +00004733 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004734 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004735 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004736 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004737
Anders Carlssond470fef2010-11-21 00:09:52 +00004738 // -felide-constructors is the default.
4739 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004740 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004741 CmdArgs.push_back("-fno-elide-constructors");
4742
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004743 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004744
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004745 if (KernelOrKext || (types::isCXX(InputType) &&
4746 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4747 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004748 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004749
Tony Linthicum76329bf2011-12-12 21:14:55 +00004750 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004751 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4752 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004753 CmdArgs.push_back("-fshort-enums");
4754
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004755 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004756 if (Arg *A = Args.getLastArg(
4757 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4758 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4759 if (A->getOption().matches(options::OPT_funsigned_char) ||
4760 A->getOption().matches(options::OPT_fno_signed_char)) {
4761 CmdArgs.push_back("-fno-signed-char");
4762 }
4763 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004764 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004765 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004766
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004767 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004768 if (!Args.hasFlag(
4769 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4770 !IsWindowsCygnus && !IsWindowsGNU &&
4771 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4772 getToolChain().getArch() != llvm::Triple::hexagon &&
4773 getToolChain().getArch() != llvm::Triple::xcore &&
4774 ((getToolChain().getTriple().getVendor() !=
4775 llvm::Triple::MipsTechnologies) ||
4776 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004777 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004778 CmdArgs.push_back("-fno-use-cxa-atexit");
4779
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004780 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004781 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004782 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004783 CmdArgs.push_back("-fms-extensions");
4784
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004785 // -fno-use-line-directives is default.
4786 if (Args.hasFlag(options::OPT_fuse_line_directives,
4787 options::OPT_fno_use_line_directives, false))
4788 CmdArgs.push_back("-fuse-line-directives");
4789
Francois Pichet1b4f1632011-09-17 04:32:15 +00004790 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004791 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004792 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004793 (IsWindowsMSVC &&
4794 Args.hasFlag(options::OPT_fms_extensions,
4795 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004796 CmdArgs.push_back("-fms-compatibility");
4797
David Majnemerc371ff02015-03-22 08:39:22 +00004798 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004799 VersionTuple MSVT = visualstudio::getMSVCVersion(
4800 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4801 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004802 CmdArgs.push_back(
4803 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004804
David Majnemer8db91762015-05-18 04:49:30 +00004805 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4806 if (ImplyVCPPCXXVer) {
4807 if (IsMSVC2015Compatible)
4808 CmdArgs.push_back("-std=c++14");
4809 else
4810 CmdArgs.push_back("-std=c++11");
4811 }
4812
Eric Christopher5ecce122013-02-18 00:38:31 +00004813 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004814 if (Args.hasFlag(options::OPT_fborland_extensions,
4815 options::OPT_fno_borland_extensions, false))
4816 CmdArgs.push_back("-fborland-extensions");
4817
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004818 // -fno-declspec is default, except for PS4.
4819 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4820 getToolChain().getTriple().isPS4()))
4821 CmdArgs.push_back("-fdeclspec");
4822 else if (Args.hasArg(options::OPT_fno_declspec))
4823 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4824
David Majnemerc371ff02015-03-22 08:39:22 +00004825 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4826 // than 19.
4827 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4828 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004829 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004830 CmdArgs.push_back("-fno-threadsafe-statics");
4831
Francois Pichet02744872011-09-01 16:38:08 +00004832 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4833 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004834 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004835 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004836 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004837
Chandler Carruthe03aa552010-04-17 20:17:31 +00004838 // -fgnu-keywords default varies depending on language; only pass if
4839 // specified.
4840 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004841 options::OPT_fno_gnu_keywords))
4842 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004843
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004844 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004845 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004846 CmdArgs.push_back("-fgnu89-inline");
4847
Chad Rosier9c76d242012-03-15 22:31:42 +00004848 if (Args.hasArg(options::OPT_fno_inline))
4849 CmdArgs.push_back("-fno-inline");
4850
Chad Rosier64d6be92012-03-06 21:17:19 +00004851 if (Args.hasArg(options::OPT_fno_inline_functions))
4852 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004853
John McCall5fb5df92012-06-20 06:18:46 +00004854 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004855
John McCall5fb5df92012-06-20 06:18:46 +00004856 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004857 // legacy is the default. Except for deployment taget of 10.5,
4858 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4859 // gets ignored silently.
4860 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004861 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4862 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004863 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004864 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004865 if (getToolChain().UseObjCMixedDispatch())
4866 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4867 else
4868 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4869 }
4870 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004871
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004872 // When ObjectiveC legacy runtime is in effect on MacOSX,
4873 // turn on the option to do Array/Dictionary subscripting
4874 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004875 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004876 getToolChain().getTriple().isMacOSX() &&
4877 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4878 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004879 objcRuntime.isNeXTFamily())
4880 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004881
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004882 // -fencode-extended-block-signature=1 is default.
4883 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4884 CmdArgs.push_back("-fencode-extended-block-signature");
4885 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004886
John McCall24fc0de2011-07-06 00:26:06 +00004887 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4888 // NOTE: This logic is duplicated in ToolChains.cpp.
4889 bool ARC = isObjCAutoRefCount(Args);
4890 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004891 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004892
John McCall24fc0de2011-07-06 00:26:06 +00004893 CmdArgs.push_back("-fobjc-arc");
4894
Chandler Carruth491db322011-11-04 07:34:47 +00004895 // FIXME: It seems like this entire block, and several around it should be
4896 // wrapped in isObjC, but for now we just use it here as this is where it
4897 // was being used previously.
4898 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4899 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4900 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4901 else
4902 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4903 }
4904
John McCall24fc0de2011-07-06 00:26:06 +00004905 // Allow the user to enable full exceptions code emission.
4906 // We define off for Objective-CC, on for Objective-C++.
4907 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4908 options::OPT_fno_objc_arc_exceptions,
4909 /*default*/ types::isCXX(InputType)))
4910 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00004911
John McCall24fc0de2011-07-06 00:26:06 +00004912 }
4913
4914 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4915 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004916 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004917 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004918
John McCall24fc0de2011-07-06 00:26:06 +00004919 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4920 // takes precedence.
4921 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4922 if (!GCArg)
4923 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4924 if (GCArg) {
4925 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004926 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004927 } else if (getToolChain().SupportsObjCGC()) {
4928 GCArg->render(Args, CmdArgs);
4929 } else {
4930 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004931 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004932 }
4933 }
4934
John McCallfbe5ed72015-11-05 19:19:56 +00004935 // Pass down -fobjc-weak or -fno-objc-weak if present.
4936 if (types::isObjC(InputType)) {
4937 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
4938 options::OPT_fno_objc_weak);
4939 if (!WeakArg) {
4940 // nothing to do
4941 } else if (GCArg) {
4942 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4943 D.Diag(diag::err_objc_weak_with_gc);
4944 } else if (!objcRuntime.allowsWeak()) {
4945 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4946 D.Diag(diag::err_objc_weak_unsupported);
4947 } else {
4948 WeakArg->render(Args, CmdArgs);
4949 }
4950 }
4951
Bob Wilsonb111ec92015-03-02 19:01:14 +00004952 if (Args.hasFlag(options::OPT_fapplication_extension,
4953 options::OPT_fno_application_extension, false))
4954 CmdArgs.push_back("-fapplication-extension");
4955
Reid Klecknerc542d372014-06-27 17:02:02 +00004956 // Handle GCC-style exception args.
4957 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004958 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4959 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004960
Tim Northovere931f9f2015-10-30 16:30:41 +00004961 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00004962 CmdArgs.push_back("-fsjlj-exceptions");
4963
4964 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004965 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4966 options::OPT_fno_assume_sane_operator_new))
4967 CmdArgs.push_back("-fno-assume-sane-operator-new");
4968
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004969 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4970 // most platforms.
4971 if (Args.hasFlag(options::OPT_fsized_deallocation,
4972 options::OPT_fno_sized_deallocation, false))
4973 CmdArgs.push_back("-fsized-deallocation");
4974
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004975 // -fconstant-cfstrings is default, and may be subject to argument translation
4976 // on Darwin.
4977 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4978 options::OPT_fno_constant_cfstrings) ||
4979 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4980 options::OPT_mno_constant_cfstrings))
4981 CmdArgs.push_back("-fno-constant-cfstrings");
4982
John Thompsoned4e2952009-11-05 20:14:16 +00004983 // -fshort-wchar default varies depending on platform; only
4984 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004985 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4986 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004987 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004988
Hans Wennborg28c96312013-07-31 23:39:13 +00004989 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004990 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004991 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004992 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004993
Daniel Dunbar096ed292011-10-05 21:04:55 +00004994 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4995 // -fno-pack-struct doesn't apply to -fpack-struct=.
4996 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004997 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004998 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004999 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005000 } else if (Args.hasFlag(options::OPT_fpack_struct,
5001 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005002 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005003 }
5004
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005005 // Handle -fmax-type-align=N and -fno-type-align
5006 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5007 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5008 if (!SkipMaxTypeAlign) {
5009 std::string MaxTypeAlignStr = "-fmax-type-align=";
5010 MaxTypeAlignStr += A->getValue();
5011 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5012 }
5013 } else if (getToolChain().getTriple().isOSDarwin()) {
5014 if (!SkipMaxTypeAlign) {
5015 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5016 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5017 }
5018 }
5019
John Brawna7b4ec02015-08-10 11:11:28 +00005020 // -fcommon is the default unless compiling kernel code or the target says so
5021 bool NoCommonDefault =
5022 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5023 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5024 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005025 CmdArgs.push_back("-fno-common");
5026
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005027 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005028 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005029 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005030 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005031 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005032 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005033
Daniel Dunbar6358d682010-10-15 22:30:42 +00005034 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005035 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005036 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005037 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005038
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005039 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005040 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5041 StringRef value = inputCharset->getValue();
5042 if (value != "UTF-8")
5043 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5044 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005045 }
5046
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005047 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005048 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5049 StringRef value = execCharset->getValue();
5050 if (value != "UTF-8")
5051 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5052 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005053 }
5054
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005055 // -fcaret-diagnostics is default.
5056 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5057 options::OPT_fno_caret_diagnostics, true))
5058 CmdArgs.push_back("-fno-caret-diagnostics");
5059
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005060 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005061 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005062 options::OPT_fno_diagnostics_fixit_info))
5063 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005064
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005065 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005066 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005067 options::OPT_fno_diagnostics_show_option))
5068 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005069
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005070 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005071 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005072 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005073 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005074 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005075
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005076 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005077 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005078 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005079 }
5080
Chandler Carruthb6766f02011-03-27 01:50:55 +00005081 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005082 options::OPT_fdiagnostics_show_note_include_stack,
5083 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005084 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005085 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005086 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5087 else
5088 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5089 }
5090
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005091 // Color diagnostics are the default, unless the terminal doesn't support
5092 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005093 // Support both clang's -f[no-]color-diagnostics and gcc's
5094 // -f[no-]diagnostics-colors[=never|always|auto].
5095 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005096 for (const auto &Arg : Args) {
5097 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005098 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5099 !O.matches(options::OPT_fdiagnostics_color) &&
5100 !O.matches(options::OPT_fno_color_diagnostics) &&
5101 !O.matches(options::OPT_fno_diagnostics_color) &&
5102 !O.matches(options::OPT_fdiagnostics_color_EQ))
5103 continue;
5104
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005105 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005106 if (O.matches(options::OPT_fcolor_diagnostics) ||
5107 O.matches(options::OPT_fdiagnostics_color)) {
5108 ShowColors = Colors_On;
5109 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5110 O.matches(options::OPT_fno_diagnostics_color)) {
5111 ShowColors = Colors_Off;
5112 } else {
5113 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005114 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005115 if (value == "always")
5116 ShowColors = Colors_On;
5117 else if (value == "never")
5118 ShowColors = Colors_Off;
5119 else if (value == "auto")
5120 ShowColors = Colors_Auto;
5121 else
5122 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005123 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005124 }
5125 }
5126 if (ShowColors == Colors_On ||
5127 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005128 CmdArgs.push_back("-fcolor-diagnostics");
5129
Nico Rieck7857d462013-09-11 00:38:02 +00005130 if (Args.hasArg(options::OPT_fansi_escape_codes))
5131 CmdArgs.push_back("-fansi-escape-codes");
5132
Daniel Dunbardb097022009-06-08 21:13:54 +00005133 if (!Args.hasFlag(options::OPT_fshow_source_location,
5134 options::OPT_fno_show_source_location))
5135 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005136
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005137 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005138 true))
5139 CmdArgs.push_back("-fno-show-column");
5140
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005141 if (!Args.hasFlag(options::OPT_fspell_checking,
5142 options::OPT_fno_spell_checking))
5143 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005144
Chad Rosierc8e56e82012-12-05 21:08:21 +00005145 // -fno-asm-blocks is default.
5146 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5147 false))
5148 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005149
Steven Wucb0d13f2015-01-16 23:05:28 +00005150 // -fgnu-inline-asm is default.
5151 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5152 options::OPT_fno_gnu_inline_asm, true))
5153 CmdArgs.push_back("-fno-gnu-inline-asm");
5154
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005155 // Enable vectorization per default according to the optimization level
5156 // selected. For optimization levels that want vectorization we use the alias
5157 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005158 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005159 OptSpecifier VectorizeAliasOption =
5160 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005161 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005162 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005163 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005164
Chad Rosier136d67d2014-04-28 19:30:57 +00005165 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005166 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005167 OptSpecifier SLPVectAliasOption =
5168 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005169 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005170 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005171 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005172
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005173 // -fno-slp-vectorize-aggressive is default.
5174 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005175 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005176 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005177
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005178 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5179 A->render(Args, CmdArgs);
5180
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005181 // -fdollars-in-identifiers default varies depending on platform and
5182 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005183 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005184 options::OPT_fno_dollars_in_identifiers)) {
5185 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005186 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005187 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005188 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005189 }
5190
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005191 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5192 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005193 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005194 options::OPT_fno_unit_at_a_time)) {
5195 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005196 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005197 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005198
Eli Friedman055c9702011-11-02 01:53:16 +00005199 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5200 options::OPT_fno_apple_pragma_pack, false))
5201 CmdArgs.push_back("-fapple-pragma-pack");
5202
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005203 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005204 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5205 // by default.
5206 if (getToolChain().getArch() == llvm::Triple::le32) {
5207 CmdArgs.push_back("-fno-math-builtin");
5208 }
5209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005210// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5211//
5212// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005213#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005214 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005215 (getToolChain().getArch() == llvm::Triple::arm ||
5216 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005217 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5218 CmdArgs.push_back("-fno-builtin-strcat");
5219 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5220 CmdArgs.push_back("-fno-builtin-strcpy");
5221 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005222#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005223
Justin Bognera88f0122014-06-20 22:59:50 +00005224 // Enable rewrite includes if the user's asked for it or if we're generating
5225 // diagnostics.
5226 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5227 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005228 if (Args.hasFlag(options::OPT_frewrite_includes,
5229 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005230 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005231 CmdArgs.push_back("-frewrite-includes");
5232
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005233 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005234 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005235 options::OPT_traditional_cpp)) {
5236 if (isa<PreprocessJobAction>(JA))
5237 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005238 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005239 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005240 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005241
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005242 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005243 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005244
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005245 // Handle serialized diagnostics.
5246 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5247 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005248 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005249 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005250
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005251 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5252 CmdArgs.push_back("-fretain-comments-from-system-headers");
5253
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005254 // Forward -fcomment-block-commands to -cc1.
5255 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005256 // Forward -fparse-all-comments to -cc1.
5257 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005258
John Brawnad31ace2015-09-23 13:55:40 +00005259 // Turn -fplugin=name.so into -load name.so
5260 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5261 CmdArgs.push_back("-load");
5262 CmdArgs.push_back(A->getValue());
5263 A->claim();
5264 }
5265
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005266 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5267 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005268 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005269 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5270 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005271
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005272 // We translate this by hand to the -cc1 argument, since nightly test uses
5273 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005274 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005275 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005276 } else
Sean Silva14facf32015-06-09 01:57:17 +00005277 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005278 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005279
Bob Wilson23a55f12014-12-21 07:00:00 +00005280 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005281 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5282 // by the frontend.
5283 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5284 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005285
Daniel Dunbard67a3222009-03-30 06:36:42 +00005286 if (Output.getType() == types::TY_Dependencies) {
5287 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005288 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005289 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005290 CmdArgs.push_back(Output.getFilename());
5291 } else {
5292 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005293 }
5294
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005295 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005296
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005297 if (Input.isFilename())
5298 CmdArgs.push_back(Input.getFilename());
5299 else
5300 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005301
Chris Lattnere9d7d782009-11-03 19:50:27 +00005302 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5303
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005304 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005305
5306 // Optionally embed the -cc1 level arguments into the debug info, for build
5307 // analysis.
5308 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005309 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005310 for (const auto &Arg : Args)
5311 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005312
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005313 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005314 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005315 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005316 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005317 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005318 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005319 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005320 }
5321 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005322 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005323 }
5324
Eric Christopherd3804002013-02-22 20:12:52 +00005325 // Add the split debug info name to the command lines here so we
5326 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005327 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005328 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5329 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005330 const char *SplitDwarfOut;
5331 if (SplitDwarf) {
5332 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005333 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005334 CmdArgs.push_back(SplitDwarfOut);
5335 }
5336
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005337 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5338 // Include them with -fcuda-include-gpubinary.
5339 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005340 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005341 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005342 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005343 }
5344
Eric Christopherd3804002013-02-22 20:12:52 +00005345 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005346 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005347 Output.getType() == types::TY_Object &&
5348 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005349 auto CLCommand =
5350 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005351 C.addCommand(llvm::make_unique<FallbackCommand>(
5352 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005353 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005354 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005355 }
5356
Eric Christopherf1545832013-02-22 23:50:16 +00005357 // Handle the debug info splitting at object creation time if we're
5358 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005359 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005360 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005361 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005362
Roman Divacky178e01602011-02-10 16:52:03 +00005363 if (Arg *A = Args.getLastArg(options::OPT_pg))
5364 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005365 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5366 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005367
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005368 // Claim some arguments which clang supports automatically.
5369
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005370 // -fpch-preprocess is used with gcc to add a special marker in the output to
5371 // include the PCH file. Clang's PTH solution is completely transparent, so we
5372 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005373 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005374
Daniel Dunbar17731772009-03-23 19:03:36 +00005375 // Claim some arguments which clang doesn't support, but we don't
5376 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005377 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5378 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005379
Rafael Espindolab0092d72013-09-04 19:37:35 +00005380 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005381 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005382}
5383
John McCall5fb5df92012-06-20 06:18:46 +00005384/// Add options related to the Objective-C runtime/ABI.
5385///
5386/// Returns true if the runtime is non-fragile.
5387ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5388 ArgStringList &cmdArgs,
5389 RewriteKind rewriteKind) const {
5390 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005391 Arg *runtimeArg =
5392 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5393 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005394
5395 // Just forward -fobjc-runtime= to the frontend. This supercedes
5396 // options about fragility.
5397 if (runtimeArg &&
5398 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5399 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005400 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005401 if (runtime.tryParse(value)) {
5402 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005403 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005404 }
5405
5406 runtimeArg->render(args, cmdArgs);
5407 return runtime;
5408 }
5409
5410 // Otherwise, we'll need the ABI "version". Version numbers are
5411 // slightly confusing for historical reasons:
5412 // 1 - Traditional "fragile" ABI
5413 // 2 - Non-fragile ABI, version 1
5414 // 3 - Non-fragile ABI, version 2
5415 unsigned objcABIVersion = 1;
5416 // If -fobjc-abi-version= is present, use that to set the version.
5417 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005418 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005419 if (value == "1")
5420 objcABIVersion = 1;
5421 else if (value == "2")
5422 objcABIVersion = 2;
5423 else if (value == "3")
5424 objcABIVersion = 3;
5425 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005426 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005427 } else {
5428 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005429 bool nonFragileABIIsDefault =
5430 (rewriteKind == RK_NonFragile ||
5431 (rewriteKind == RK_None &&
5432 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005433 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5434 options::OPT_fno_objc_nonfragile_abi,
5435 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005436// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005437#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5438 unsigned nonFragileABIVersion = 1;
5439#else
5440 unsigned nonFragileABIVersion = 2;
5441#endif
5442
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005443 if (Arg *abiArg =
5444 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005445 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005446 if (value == "1")
5447 nonFragileABIVersion = 1;
5448 else if (value == "2")
5449 nonFragileABIVersion = 2;
5450 else
5451 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005452 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005453 }
5454
5455 objcABIVersion = 1 + nonFragileABIVersion;
5456 } else {
5457 objcABIVersion = 1;
5458 }
5459 }
5460
5461 // We don't actually care about the ABI version other than whether
5462 // it's non-fragile.
5463 bool isNonFragile = objcABIVersion != 1;
5464
5465 // If we have no runtime argument, ask the toolchain for its default runtime.
5466 // However, the rewriter only really supports the Mac runtime, so assume that.
5467 ObjCRuntime runtime;
5468 if (!runtimeArg) {
5469 switch (rewriteKind) {
5470 case RK_None:
5471 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5472 break;
5473 case RK_Fragile:
5474 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5475 break;
5476 case RK_NonFragile:
5477 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5478 break;
5479 }
5480
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005481 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005482 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5483 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005484 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005485 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5486
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005487 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005488 } else {
5489 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5490 }
5491
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005492 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005493 } else {
5494 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005495 // Legacy behaviour is to target the gnustep runtime if we are i
5496 // non-fragile mode or the GCC runtime in fragile mode.
5497 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005498 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005499 else
5500 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005501 }
5502
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005503 cmdArgs.push_back(
5504 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005505 return runtime;
5506}
5507
Reid Klecknerc542d372014-06-27 17:02:02 +00005508static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5509 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5510 I += HaveDash;
5511 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005512}
Reid Klecknerc542d372014-06-27 17:02:02 +00005513
Benjamin Kramere003ca22015-10-28 13:54:16 +00005514namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005515struct EHFlags {
5516 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5517 bool Synch;
5518 bool Asynch;
5519 bool NoExceptC;
5520};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005521} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005522
5523/// /EH controls whether to run destructor cleanups when exceptions are
5524/// thrown. There are three modifiers:
5525/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5526/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5527/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5528/// - c: Assume that extern "C" functions are implicitly noexcept. This
5529/// modifier is an optimization, so we ignore it for now.
5530/// The default is /EHs-c-, meaning cleanups are disabled.
5531static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5532 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005533
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005534 std::vector<std::string> EHArgs =
5535 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005536 for (auto EHVal : EHArgs) {
5537 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5538 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005539 case 'a':
5540 EH.Asynch = maybeConsumeDash(EHVal, I);
5541 continue;
5542 case 'c':
5543 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5544 continue;
5545 case 's':
5546 EH.Synch = maybeConsumeDash(EHVal, I);
5547 continue;
5548 default:
5549 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005550 }
5551 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5552 break;
5553 }
5554 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005555
Reid Klecknerc542d372014-06-27 17:02:02 +00005556 return EH;
5557}
5558
Douglas Katzman3459ce22015-10-08 04:24:12 +00005559void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5560 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5561 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005562 unsigned RTOptionID = options::OPT__SLASH_MT;
5563
Hans Wennborgf1a74252013-09-10 20:18:04 +00005564 if (Args.hasArg(options::OPT__SLASH_LDd))
5565 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5566 // but defining _DEBUG is sticky.
5567 RTOptionID = options::OPT__SLASH_MTd;
5568
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005569 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005570 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005571
David Majnemere2afb472015-07-24 06:49:13 +00005572 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005573 switch (RTOptionID) {
5574 case options::OPT__SLASH_MD:
5575 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005576 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005577 CmdArgs.push_back("-D_MT");
5578 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005579 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005580 break;
5581 case options::OPT__SLASH_MDd:
5582 CmdArgs.push_back("-D_DEBUG");
5583 CmdArgs.push_back("-D_MT");
5584 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005585 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005586 break;
5587 case options::OPT__SLASH_MT:
5588 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005589 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005590 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005591 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005592 break;
5593 case options::OPT__SLASH_MTd:
5594 CmdArgs.push_back("-D_DEBUG");
5595 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005596 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005597 break;
5598 default:
5599 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005600 }
5601
David Majnemere2afb472015-07-24 06:49:13 +00005602 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5603 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5604 } else {
5605 CmdArgs.push_back(FlagForCRT.data());
5606
5607 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5608 // users want. The /Za flag to cl.exe turns this off, but it's not
5609 // implemented in clang.
5610 CmdArgs.push_back("--dependent-lib=oldnames");
5611 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005612
Hans Wennborg8858a032014-07-21 23:42:07 +00005613 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5614 // would produce interleaved output, so ignore /showIncludes in such cases.
5615 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5616 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5617 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005618
David Majnemerf6072342014-07-01 22:24:56 +00005619 // This controls whether or not we emit RTTI data for polymorphic types.
5620 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5621 /*default=*/false))
5622 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005623
Reid Kleckner124955a2015-08-05 18:51:13 +00005624 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005625 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005626 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5627 // If we are emitting CV but not DWARF, don't build information that LLVM
5628 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005629 if (*EmitCodeView && !EmitDwarf)
5630 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5631 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005632 CmdArgs.push_back("-gcodeview");
5633
Reid Klecknerc542d372014-06-27 17:02:02 +00005634 const Driver &D = getToolChain().getDriver();
5635 EHFlags EH = parseClangCLEHFlags(D, Args);
5636 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005637 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005638 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005639 CmdArgs.push_back("-fexceptions");
5640 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005641
Hans Wennborge50cec32014-06-13 20:59:54 +00005642 // /EP should expand to -E -P.
5643 if (Args.hasArg(options::OPT__SLASH_EP)) {
5644 CmdArgs.push_back("-E");
5645 CmdArgs.push_back("-P");
5646 }
5647
David Majnemera5b195a2015-02-14 01:35:12 +00005648 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005649 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5650 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005651 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5652 else
5653 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5654
5655 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5656 VolatileOptionID = A->getOption().getID();
5657
5658 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5659 CmdArgs.push_back("-fms-volatile");
5660
David Majnemer86c318f2014-02-11 21:05:00 +00005661 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5662 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5663 if (MostGeneralArg && BestCaseArg)
5664 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5665 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5666
5667 if (MostGeneralArg) {
5668 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5669 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5670 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5671
5672 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5673 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5674 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5675 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5676 << FirstConflict->getAsString(Args)
5677 << SecondConflict->getAsString(Args);
5678
5679 if (SingleArg)
5680 CmdArgs.push_back("-fms-memptr-rep=single");
5681 else if (MultipleArg)
5682 CmdArgs.push_back("-fms-memptr-rep=multiple");
5683 else
5684 CmdArgs.push_back("-fms-memptr-rep=virtual");
5685 }
5686
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005687 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5688 A->render(Args, CmdArgs);
5689
Hans Wennborg81f74482013-09-10 01:07:07 +00005690 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5691 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005692 if (Args.hasArg(options::OPT__SLASH_fallback))
5693 CmdArgs.push_back("msvc-fallback");
5694 else
5695 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005696 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005697}
5698
Douglas Katzman95354292015-06-23 20:42:09 +00005699visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005700 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005701 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005702 return CLFallback.get();
5703}
5704
Daniel Sanders7f933f42015-01-30 17:35:23 +00005705void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5706 ArgStringList &CmdArgs) const {
5707 StringRef CPUName;
5708 StringRef ABIName;
5709 const llvm::Triple &Triple = getToolChain().getTriple();
5710 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5711
5712 CmdArgs.push_back("-target-abi");
5713 CmdArgs.push_back(ABIName.data());
5714}
5715
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005716void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005717 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005718 const ArgList &Args,
5719 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005720 ArgStringList CmdArgs;
5721
5722 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5723 const InputInfo &Input = Inputs[0];
5724
James Y Knight2db38f32015-08-15 03:45:25 +00005725 std::string TripleStr =
5726 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5727 const llvm::Triple Triple(TripleStr);
5728
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005729 // Don't warn about "clang -w -c foo.s"
5730 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005731 // and "clang -emit-llvm -c foo.s"
5732 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005733
Rafael Espindola577637a2015-01-03 00:06:04 +00005734 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005735
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005736 // Invoke ourselves in -cc1as mode.
5737 //
5738 // FIXME: Implement custom jobs for internal actions.
5739 CmdArgs.push_back("-cc1as");
5740
5741 // Add the "effective" target triple.
5742 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005743 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5744
5745 // Set the output mode, we currently only expect to be used as a real
5746 // assembler.
5747 CmdArgs.push_back("-filetype");
5748 CmdArgs.push_back("obj");
5749
Eric Christopher45f2e712012-12-18 00:31:10 +00005750 // Set the main file name, so that debug info works even with
5751 // -save-temps or preprocessed assembly.
5752 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005753 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005754
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005755 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005756 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005757 if (!CPU.empty()) {
5758 CmdArgs.push_back("-target-cpu");
5759 CmdArgs.push_back(Args.MakeArgString(CPU));
5760 }
5761
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005762 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005763 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005764
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005765 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005766 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005767
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005768 // Pass along any -I options so we get proper .include search paths.
5769 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5770
Eric Christopherfc3ee562012-01-10 00:38:01 +00005771 // Determine the original source input.
5772 const Action *SourceAction = &JA;
5773 while (SourceAction->getKind() != Action::InputClass) {
5774 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5775 SourceAction = SourceAction->getInputs()[0];
5776 }
5777
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005778 // Forward -g and handle debug info related flags, assuming we are dealing
5779 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005780 if (SourceAction->getType() == types::TY_Asm ||
5781 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005782 bool WantDebug = false;
5783 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005784 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005785 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5786 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005787 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005788 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005789 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005790 if (DwarfVersion == 0)
5791 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005792 RenderDebugEnablingArgs(Args, CmdArgs,
5793 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5794 : CodeGenOptions::NoDebugInfo),
5795 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005796
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005797 // Add the -fdebug-compilation-dir flag if needed.
5798 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005799
5800 // Set the AT_producer to the clang version when using the integrated
5801 // assembler on assembly source files.
5802 CmdArgs.push_back("-dwarf-debug-producer");
5803 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005804
5805 // And pass along -I options
5806 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005807 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005808
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005809 // Handle -fPIC et al -- the relocation-model affects the assembler
5810 // for some targets.
5811 llvm::Reloc::Model RelocationModel;
5812 unsigned PICLevel;
5813 bool IsPIE;
5814 std::tie(RelocationModel, PICLevel, IsPIE) =
5815 ParsePICArgs(getToolChain(), Triple, Args);
5816
5817 const char *RMName = RelocationModelName(RelocationModel);
5818 if (RMName) {
5819 CmdArgs.push_back("-mrelocation-model");
5820 CmdArgs.push_back(RMName);
5821 }
5822
Kevin Enderby292dc082011-12-22 19:31:58 +00005823 // Optionally embed the -cc1as level arguments into the debug info, for build
5824 // analysis.
5825 if (getToolChain().UseDwarfDebugFlags()) {
5826 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005827 for (const auto &Arg : Args)
5828 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005829
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005830 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005831 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5832 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005833 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005834 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005835 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005836 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005837 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005838 }
5839 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005840 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005841 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005842
5843 // FIXME: Add -static support, once we have it.
5844
Daniel Sanders7f933f42015-01-30 17:35:23 +00005845 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005846 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005847 default:
5848 break;
5849
5850 case llvm::Triple::mips:
5851 case llvm::Triple::mipsel:
5852 case llvm::Triple::mips64:
5853 case llvm::Triple::mips64el:
5854 AddMIPSTargetArgs(Args, CmdArgs);
5855 break;
5856 }
5857
David Blaikie372d9502014-01-17 03:17:40 +00005858 // Consume all the warning flags. Usually this would be handled more
5859 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5860 // doesn't handle that so rather than warning about unused flags that are
5861 // actually used, we'll lie by omission instead.
5862 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005863 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5864 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005865
David Blaikie9260ed62013-07-25 21:19:01 +00005866 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5867 getToolChain().getDriver());
5868
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005869 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005870
5871 assert(Output.isFilename() && "Unexpected lipo output.");
5872 CmdArgs.push_back("-o");
5873 CmdArgs.push_back(Output.getFilename());
5874
Daniel Dunbarb440f562010-08-02 02:38:21 +00005875 assert(Input.isFilename() && "Invalid input.");
5876 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005877
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005878 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005879 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005880
5881 // Handle the debug info splitting at object creation time if we're
5882 // creating an object.
5883 // TODO: Currently only works on linux with newer objcopy.
5884 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005885 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005886 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005887 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005888}
5889
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005890void GnuTool::anchor() {}
5891
Daniel Dunbara3246a02009-03-18 08:07:30 +00005892void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005893 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005894 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005895 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005896 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005897 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005898
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005899 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005900 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005901 // Don't forward any -g arguments to assembly steps.
5902 if (isa<AssembleJobAction>(JA) &&
5903 A->getOption().matches(options::OPT_g_Group))
5904 continue;
5905
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005906 // Don't forward any -W arguments to assembly and link steps.
5907 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5908 A->getOption().matches(options::OPT_W_Group))
5909 continue;
5910
Daniel Dunbar2da02722009-03-19 07:55:12 +00005911 // It is unfortunate that we have to claim here, as this means
5912 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005913 // platforms using a generic gcc, even if we are just using gcc
5914 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005915 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005916 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005917 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005918 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005919
Daniel Dunbar4e295052010-01-25 22:35:08 +00005920 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005921
5922 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005923 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005924 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005925 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005926 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005927 }
5928
Daniel Dunbar5716d872009-05-02 21:41:52 +00005929 // Try to force gcc to match the tool chain we want, if we recognize
5930 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005931 //
5932 // FIXME: The triple class should directly provide the information we want
5933 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005934 switch (getToolChain().getArch()) {
5935 default:
5936 break;
5937 case llvm::Triple::x86:
5938 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005939 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005940 break;
5941 case llvm::Triple::x86_64:
5942 case llvm::Triple::ppc64:
5943 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005944 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005945 break;
5946 case llvm::Triple::sparcel:
5947 CmdArgs.push_back("-EL");
5948 break;
5949 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005950
Daniel Dunbarb440f562010-08-02 02:38:21 +00005951 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005952 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005953 CmdArgs.push_back(Output.getFilename());
5954 } else {
5955 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005956 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005957 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005958
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005959 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005960
5961 // Only pass -x if gcc will understand it; otherwise hope gcc
5962 // understands the suffix correctly. The main use case this would go
5963 // wrong in is for linker inputs if they happened to have an odd
5964 // suffix; really the only way to get this to happen is a command
5965 // like '-x foobar a.c' which will treat a.c like a linker input.
5966 //
5967 // FIXME: For the linker case specifically, can we safely convert
5968 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005969 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005970 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005971 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5972 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005973 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005974 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005975 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005976 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005977 else if (II.getType() == types::TY_ModuleFile)
5978 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005979 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005980
Daniel Dunbara3246a02009-03-18 08:07:30 +00005981 if (types::canTypeBeUserSpecified(II.getType())) {
5982 CmdArgs.push_back("-x");
5983 CmdArgs.push_back(types::getTypeName(II.getType()));
5984 }
5985
Daniel Dunbarb440f562010-08-02 02:38:21 +00005986 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005987 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005988 else {
5989 const Arg &A = II.getInputArg();
5990
5991 // Reverse translate some rewritten options.
5992 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5993 CmdArgs.push_back("-lstdc++");
5994 continue;
5995 }
5996
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005997 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005998 A.render(Args, CmdArgs);
5999 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006000 }
6001
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006002 const std::string customGCCName = D.getCCCGenericGCCName();
6003 const char *GCCName;
6004 if (!customGCCName.empty())
6005 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006006 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006007 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006008 } else
6009 GCCName = "gcc";
6010
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006011 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006012 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006013}
6014
Douglas Katzman95354292015-06-23 20:42:09 +00006015void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6016 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006017 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006018}
6019
Douglas Katzman95354292015-06-23 20:42:09 +00006020void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6021 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006022 const Driver &D = getToolChain().getDriver();
6023
Eric Christophercc7ff502015-01-29 00:56:17 +00006024 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006025 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006026 case types::TY_LLVM_IR:
6027 case types::TY_LTO_IR:
6028 case types::TY_LLVM_BC:
6029 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006030 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006031 break;
6032 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006033 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006034 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006035 case types::TY_Nothing:
6036 CmdArgs.push_back("-fsyntax-only");
6037 break;
6038 default:
6039 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006040 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006041}
6042
Douglas Katzman95354292015-06-23 20:42:09 +00006043void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6044 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006045 // The types are (hopefully) good enough.
6046}
6047
Tony Linthicum76329bf2011-12-12 21:14:55 +00006048// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006049void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
6050 ArgStringList &CmdArgs) const {}
6051void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6052 const InputInfo &Output,
6053 const InputInfoList &Inputs,
6054 const ArgList &Args,
6055 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006056 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006057
6058 const Driver &D = getToolChain().getDriver();
6059 ArgStringList CmdArgs;
6060
6061 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00006062 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006063 CmdArgs.push_back(Args.MakeArgString(MarchString));
6064
6065 RenderExtraToolArgs(JA, CmdArgs);
6066
6067 if (Output.isFilename()) {
6068 CmdArgs.push_back("-o");
6069 CmdArgs.push_back(Output.getFilename());
6070 } else {
6071 assert(Output.isNothing() && "Unexpected output");
6072 CmdArgs.push_back("-fsyntax-only");
6073 }
6074
Douglas Katzman54366072015-07-27 16:53:08 +00006075 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006076 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006077
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006078 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006079
Tony Linthicum76329bf2011-12-12 21:14:55 +00006080 // Only pass -x if gcc will understand it; otherwise hope gcc
6081 // understands the suffix correctly. The main use case this would go
6082 // wrong in is for linker inputs if they happened to have an odd
6083 // suffix; really the only way to get this to happen is a command
6084 // like '-x foobar a.c' which will treat a.c like a linker input.
6085 //
6086 // FIXME: For the linker case specifically, can we safely convert
6087 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006088 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006089 // Don't try to pass LLVM or AST inputs to a generic gcc.
6090 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
6091 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
6092 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006093 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006094 else if (II.getType() == types::TY_AST)
6095 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006096 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006097 else if (II.getType() == types::TY_ModuleFile)
6098 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006099 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006100
6101 if (II.isFilename())
6102 CmdArgs.push_back(II.getFilename());
6103 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006104 // Don't render as input, we need gcc to do the translations.
6105 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006106 II.getInputArg().render(Args, CmdArgs);
6107 }
6108
6109 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006110 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006111 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006112}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006113
Douglas Katzman95354292015-06-23 20:42:09 +00006114void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6115 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006116 // The types are (hopefully) good enough.
6117}
6118
Douglas Katzman54366072015-07-27 16:53:08 +00006119static void
6120constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
6121 const toolchains::HexagonToolChain &ToolChain,
6122 const InputInfo &Output, const InputInfoList &Inputs,
6123 const ArgList &Args, ArgStringList &CmdArgs,
6124 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006125
Matthew Curtise689b052012-12-06 15:46:07 +00006126 const Driver &D = ToolChain.getDriver();
6127
Matthew Curtise689b052012-12-06 15:46:07 +00006128 //----------------------------------------------------------------------------
6129 //
6130 //----------------------------------------------------------------------------
6131 bool hasStaticArg = Args.hasArg(options::OPT_static);
6132 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006133 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00006134 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
6135 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6136 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006137 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006138 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006139
Matthew Curtise689b052012-12-06 15:46:07 +00006140 //----------------------------------------------------------------------------
6141 // Silence warnings for various options
6142 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00006143
Matthew Curtise689b052012-12-06 15:46:07 +00006144 Args.ClaimAllArgs(options::OPT_g_Group);
6145 Args.ClaimAllArgs(options::OPT_emit_llvm);
6146 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6147 // handled somewhere else.
6148 Args.ClaimAllArgs(options::OPT_static_libgcc);
6149
6150 //----------------------------------------------------------------------------
6151 //
6152 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006153 for (const auto &Opt : ToolChain.ExtraOpts)
6154 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006155
Douglas Katzman54366072015-07-27 16:53:08 +00006156 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00006157 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00006158
Matthew Curtise689b052012-12-06 15:46:07 +00006159 if (buildingLib) {
6160 CmdArgs.push_back("-shared");
6161 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
6162 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00006163 }
6164
Matthew Curtise689b052012-12-06 15:46:07 +00006165 if (hasStaticArg)
6166 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006167
Matthew Curtise8f80a12012-12-06 17:49:03 +00006168 if (buildPIE && !buildingLib)
6169 CmdArgs.push_back("-pie");
6170
Douglas Katzman54366072015-07-27 16:53:08 +00006171 if (const char *v =
6172 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006173 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00006174 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006175 }
6176
Matthew Curtise689b052012-12-06 15:46:07 +00006177 //----------------------------------------------------------------------------
6178 //
6179 //----------------------------------------------------------------------------
6180 CmdArgs.push_back("-o");
6181 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006182
Matthew Curtise689b052012-12-06 15:46:07 +00006183 const std::string MarchSuffix = "/" + MarchString;
6184 const std::string G0Suffix = "/G0";
6185 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00006186 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006187 const std::string StartFilesDir =
6188 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006189
6190 //----------------------------------------------------------------------------
6191 // moslib
6192 //----------------------------------------------------------------------------
6193 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006194 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006195
Sean Silva14facf32015-06-09 01:57:17 +00006196 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6197 A->claim();
6198 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00006199 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006200 }
Matthew Curtise689b052012-12-06 15:46:07 +00006201 if (oslibs.empty()) {
6202 oslibs.push_back("standalone");
6203 hasStandalone = true;
6204 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006205
Matthew Curtise689b052012-12-06 15:46:07 +00006206 //----------------------------------------------------------------------------
6207 // Start Files
6208 //----------------------------------------------------------------------------
6209 if (incStdLib && incStartFiles) {
6210
6211 if (!buildingLib) {
6212 if (hasStandalone) {
6213 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006214 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00006215 }
6216 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
6217 }
6218 std::string initObj = useShared ? "/initS.o" : "/init.o";
6219 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
6220 }
6221
6222 //----------------------------------------------------------------------------
6223 // Library Search Paths
6224 //----------------------------------------------------------------------------
Douglas Katzman6059ef92015-11-17 17:41:23 +00006225 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006226
6227 //----------------------------------------------------------------------------
6228 //
6229 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006230 Args.AddAllArgs(CmdArgs,
6231 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6232 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006233
6234 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6235
6236 //----------------------------------------------------------------------------
6237 // Libraries
6238 //----------------------------------------------------------------------------
6239 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006240 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006241 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6242 CmdArgs.push_back("-lm");
6243 }
6244
6245 CmdArgs.push_back("--start-group");
6246
6247 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006248 for (const std::string &Lib : oslibs)
6249 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006250 CmdArgs.push_back("-lc");
6251 }
6252 CmdArgs.push_back("-lgcc");
6253
6254 CmdArgs.push_back("--end-group");
6255 }
6256
6257 //----------------------------------------------------------------------------
6258 // End files
6259 //----------------------------------------------------------------------------
6260 if (incStdLib && incStartFiles) {
6261 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6262 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6263 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006264}
6265
Douglas Katzman95354292015-06-23 20:42:09 +00006266void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6267 const InputInfo &Output,
6268 const InputInfoList &Inputs,
6269 const ArgList &Args,
6270 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006271
Douglas Katzman54366072015-07-27 16:53:08 +00006272 const toolchains::HexagonToolChain &ToolChain =
6273 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006274
6275 ArgStringList CmdArgs;
6276 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6277 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006278
6279 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006280 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006281 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006282}
6283// Hexagon tools end.
6284
Tom Stellard8fa33092015-07-18 01:49:05 +00006285void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6286 const InputInfo &Output,
6287 const InputInfoList &Inputs,
6288 const ArgList &Args,
6289 const char *LinkingOutput) const {
6290
6291 std::string Linker = getToolChain().GetProgramPath(getShortName());
6292 ArgStringList CmdArgs;
6293 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006294 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006295 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006296 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006297 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6298 CmdArgs.push_back("-o");
6299 CmdArgs.push_back(Output.getFilename());
6300 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6301 CmdArgs, Inputs));
6302}
6303// AMDGPU tools end.
6304
Renato Golin7c542b42015-07-27 23:44:45 +00006305const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006306 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006307 if (!Arch.empty())
6308 MArch = Arch;
6309 else
Bernard Ogden31561762013-12-12 13:27:11 +00006310 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006311 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006312
6313 // Handle -march=native.
6314 if (MArch == "native") {
6315 std::string CPU = llvm::sys::getHostCPUName();
6316 if (CPU != "generic") {
6317 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006318 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006319 // If there is no valid architecture suffix for this CPU we don't know how
6320 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006321 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006322 MArch = "";
6323 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006324 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006325 }
6326 }
6327
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006328 return MArch;
6329}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006330
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006331/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006332StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006333 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006334 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6335 // here means an -march=native that we can't handle, so instead return no CPU.
6336 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006337 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006338
John Brawna95c1a82015-05-08 12:52:18 +00006339 // We need to return an empty string here on invalid MArch values as the
6340 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006341 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006342}
6343
6344/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006345std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006346 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006347 // FIXME: Warn on inconsistent use of -mcpu and -march.
6348 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006349 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006350 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006351 // Handle -mcpu=native.
6352 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006353 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006354 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006355 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006356 }
6357
Renato Goline17c5802015-07-27 23:44:42 +00006358 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006359}
6360
6361/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006362/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006363// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006364StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6365 const llvm::Triple &Triple) {
6366 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006367 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006368 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006369 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006370 if (ArchKind == llvm::ARM::AK_INVALID)
6371 // In case of generic Arch, i.e. "arm",
6372 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006373 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006374 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006375 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6376 // armv7k triple if it's actually been specified via "-arch armv7k".
6377 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006378 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006379 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006380 }
Renato Golin3c007252015-05-28 15:05:53 +00006381 if (ArchKind == llvm::ARM::AK_INVALID)
6382 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006383 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006384}
6385
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006386void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006387 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006388 if (Args.hasArg(options::OPT_r))
6389 return;
6390
John Brawn94fd9632015-05-21 12:19:49 +00006391 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6392 // to generate BE-8 executables.
6393 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6394 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006395}
6396
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006397mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006398 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6399 // was first introduced in Release 3. However, other compilers have
6400 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006401 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6402 .Case("mips1", NanLegacy)
6403 .Case("mips2", NanLegacy)
6404 .Case("mips3", NanLegacy)
6405 .Case("mips4", NanLegacy)
6406 .Case("mips5", NanLegacy)
6407 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006408 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006409 .Case("mips32r3", NanLegacy | Nan2008)
6410 .Case("mips32r5", NanLegacy | Nan2008)
6411 .Case("mips32r6", Nan2008)
6412 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006413 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006414 .Case("mips64r3", NanLegacy | Nan2008)
6415 .Case("mips64r5", NanLegacy | Nan2008)
6416 .Case("mips64r6", Nan2008)
6417 .Default(NanLegacy);
6418}
6419
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006420bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6421 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6422 return A && (A->getValue() == StringRef(Value));
6423}
6424
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006425bool mips::isUCLibc(const ArgList &Args) {
6426 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006427 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006428}
6429
Daniel Sanders2bf13662014-07-10 14:40:57 +00006430bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006431 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6432 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006433 .Case("2008", true)
6434 .Case("legacy", false)
6435 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006436
6437 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006438 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006439 .Cases("mips32r6", "mips64r6", true)
6440 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006441
6442 return false;
6443}
6444
Daniel Sanders379d44b2014-07-16 11:52:23 +00006445bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006446 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006447 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006448 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006449 return false;
6450
6451 if (ABIName != "32")
6452 return false;
6453
Toma Tabacu94ea6862015-06-16 13:54:13 +00006454 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6455 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006456 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006457 return false;
6458
Daniel Sanders379d44b2014-07-16 11:52:23 +00006459 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006460 .Cases("mips2", "mips3", "mips4", "mips5", true)
6461 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6462 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6463 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006464}
6465
Toma Tabacu94ea6862015-06-16 13:54:13 +00006466bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6467 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006468 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006469 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6470
6471 // FPXX shouldn't be used if -msingle-float is present.
6472 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6473 options::OPT_mdouble_float))
6474 if (A->getOption().matches(options::OPT_msingle_float))
6475 UseFPXX = false;
6476
6477 return UseFPXX;
6478}
6479
Tim Northover157d9112014-01-16 08:48:16 +00006480llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006481 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6482 // archs which Darwin doesn't use.
6483
6484 // The matching this routine does is fairly pointless, since it is neither the
6485 // complete architecture list, nor a reasonable subset. The problem is that
6486 // historically the driver driver accepts this and also ties its -march=
6487 // handling to the architecture name, so we need to be careful before removing
6488 // support for it.
6489
6490 // This code must be kept in sync with Clang's Darwin specific argument
6491 // translation.
6492
6493 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006494 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6495 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6496 .Case("ppc64", llvm::Triple::ppc64)
6497 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6498 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6499 llvm::Triple::x86)
6500 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6501 // This is derived from the driver driver.
6502 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6503 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6504 .Cases("armv7s", "xscale", llvm::Triple::arm)
6505 .Case("arm64", llvm::Triple::aarch64)
6506 .Case("r600", llvm::Triple::r600)
6507 .Case("amdgcn", llvm::Triple::amdgcn)
6508 .Case("nvptx", llvm::Triple::nvptx)
6509 .Case("nvptx64", llvm::Triple::nvptx64)
6510 .Case("amdil", llvm::Triple::amdil)
6511 .Case("spir", llvm::Triple::spir)
6512 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006513}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006514
Tim Northover157d9112014-01-16 08:48:16 +00006515void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006516 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006517 T.setArch(Arch);
6518
6519 if (Str == "x86_64h")
6520 T.setArchName(Str);
6521 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6522 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006523 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006524 }
6525}
6526
Bob Wilsondecc03e2012-11-23 06:14:39 +00006527const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006528 const InputInfo &Input) {
6529 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006530}
6531
Bob Wilsondecc03e2012-11-23 06:14:39 +00006532const char *Clang::getBaseInputStem(const ArgList &Args,
6533 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006534 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006535
Chris Lattner906bb902011-01-16 08:14:11 +00006536 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006537 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006538
6539 return Str;
6540}
6541
Bob Wilsondecc03e2012-11-23 06:14:39 +00006542const char *Clang::getDependencyFileName(const ArgList &Args,
6543 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006544 // FIXME: Think about this more.
6545 std::string Res;
6546
6547 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006548 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006549 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006550 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006551 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006552 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006553 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006554}
6555
Douglas Katzman95354292015-06-23 20:42:09 +00006556void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6557 const InputInfo &Output,
6558 const InputInfoList &Inputs,
6559 const ArgList &Args,
6560 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006561 const ToolChain &ToolChain = getToolChain();
6562 const Driver &D = ToolChain.getDriver();
6563 ArgStringList CmdArgs;
6564
6565 // Silence warning for "clang -g foo.o -o foo"
6566 Args.ClaimAllArgs(options::OPT_g_Group);
6567 // and "clang -emit-llvm foo.o -o foo"
6568 Args.ClaimAllArgs(options::OPT_emit_llvm);
6569 // and for "clang -w foo.o -o foo". Other warning options are already
6570 // handled somewhere else.
6571 Args.ClaimAllArgs(options::OPT_w);
6572
6573 if (!D.SysRoot.empty())
6574 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6575
6576 // CloudABI only supports static linkage.
6577 CmdArgs.push_back("-Bstatic");
6578 CmdArgs.push_back("--eh-frame-hdr");
6579 CmdArgs.push_back("--gc-sections");
6580
6581 if (Output.isFilename()) {
6582 CmdArgs.push_back("-o");
6583 CmdArgs.push_back(Output.getFilename());
6584 } else {
6585 assert(Output.isNothing() && "Invalid output.");
6586 }
6587
Douglas Katzman78b37b02015-11-17 20:28:07 +00006588 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006589 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6590 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6591 }
6592
6593 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006594 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006595 Args.AddAllArgs(CmdArgs,
6596 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6597 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006598
Teresa Johnson945bc502015-10-15 20:35:53 +00006599 if (D.isUsingLTO())
6600 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006601
6602 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6603
Douglas Katzman78b37b02015-11-17 20:28:07 +00006604 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006605 if (D.CCCIsCXX())
6606 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6607 CmdArgs.push_back("-lc");
6608 CmdArgs.push_back("-lcompiler_rt");
6609 }
6610
Douglas Katzman78b37b02015-11-17 20:28:07 +00006611 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006612 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6613
6614 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006615 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006616}
6617
Douglas Katzman95354292015-06-23 20:42:09 +00006618void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6619 const InputInfo &Output,
6620 const InputInfoList &Inputs,
6621 const ArgList &Args,
6622 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006623 ArgStringList CmdArgs;
6624
6625 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6626 const InputInfo &Input = Inputs[0];
6627
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006628 // Determine the original source input.
6629 const Action *SourceAction = &JA;
6630 while (SourceAction->getKind() != Action::InputClass) {
6631 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6632 SourceAction = SourceAction->getInputs()[0];
6633 }
6634
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006635 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006636 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006637 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6638 // FIXME: at run-time detect assembler capabilities or rely on version
6639 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006640 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006641 const llvm::Triple &T(getToolChain().getTriple());
6642 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006643 CmdArgs.push_back("-Q");
6644 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006645
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006646 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006647 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006648 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006649 if (Args.hasArg(options::OPT_gstabs))
6650 CmdArgs.push_back("--gstabs");
6651 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006652 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006653 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006654
Daniel Dunbarbe220842009-03-20 16:06:39 +00006655 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006656 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006657
Daniel Dunbar6d484762010-07-22 01:47:22 +00006658 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006659 if (getToolChain().getArch() == llvm::Triple::x86 ||
6660 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006661 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6662 CmdArgs.push_back("-force_cpusubtype_ALL");
6663
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006664 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006665 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006666 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006667 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006668 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006669 CmdArgs.push_back("-static");
6670
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006671 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006672
6673 assert(Output.isFilename() && "Unexpected lipo output.");
6674 CmdArgs.push_back("-o");
6675 CmdArgs.push_back(Output.getFilename());
6676
Daniel Dunbarb440f562010-08-02 02:38:21 +00006677 assert(Input.isFilename() && "Invalid input.");
6678 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006679
6680 // asm_final spec is empty.
6681
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006682 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006683 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006684}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006685
Tim Northover157d9112014-01-16 08:48:16 +00006686void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006687
Tim Northover157d9112014-01-16 08:48:16 +00006688void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6689 ArgStringList &CmdArgs) const {
6690 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006691
Daniel Dunbarc1964212009-03-26 16:23:12 +00006692 // Derived from darwin_arch spec.
6693 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006694 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006695
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006696 // FIXME: Is this needed anymore?
6697 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006698 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006699}
6700
Douglas Katzman95354292015-06-23 20:42:09 +00006701bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006702 // We only need to generate a temp path for LTO if we aren't compiling object
6703 // files. When compiling source files, we run 'dsymutil' after linking. We
6704 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006705 for (const auto &Input : Inputs)
6706 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006707 return true;
6708
6709 return false;
6710}
6711
Douglas Katzman95354292015-06-23 20:42:09 +00006712void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6713 ArgStringList &CmdArgs,
6714 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006715 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006716 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006717
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006718 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006719 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6720 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006721 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6722 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006723 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006724 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006725 }
6726
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006727 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006728 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006729 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6730 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006731
Bob Wilson3d27dad2013-08-02 22:25:34 +00006732 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6733 CmdArgs.push_back("-export_dynamic");
6734
Bob Wilsonb111ec92015-03-02 19:01:14 +00006735 // If we are using App Extension restrictions, pass a flag to the linker
6736 // telling it that the compiled code has been audited.
6737 if (Args.hasFlag(options::OPT_fapplication_extension,
6738 options::OPT_fno_application_extension, false))
6739 CmdArgs.push_back("-application_extension");
6740
Teresa Johnson945bc502015-10-15 20:35:53 +00006741 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006742 // If we are using LTO, then automatically create a temporary file path for
6743 // the linker to use, so that it's lifetime will extend past a possible
6744 // dsymutil step.
6745 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6746 const char *TmpPath = C.getArgs().MakeArgString(
6747 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6748 C.addTempFile(TmpPath);
6749 CmdArgs.push_back("-object_path_lto");
6750 CmdArgs.push_back(TmpPath);
6751 }
6752
6753 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6754 // it in clang installed libraries. If not found, the option is not used
6755 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6756 if (Version[0] >= 133) {
6757 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6758 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6759 SmallString<128> LibLTOPath(P);
6760 llvm::sys::path::append(LibLTOPath, "lib");
6761 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6762 if (llvm::sys::fs::exists(LibLTOPath)) {
6763 CmdArgs.push_back("-lto_library");
6764 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6765 } else {
6766 D.Diag(diag::warn_drv_lto_libpath);
6767 }
6768 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006769 }
6770
Daniel Dunbarc1964212009-03-26 16:23:12 +00006771 // Derived from the "link" spec.
6772 Args.AddAllArgs(CmdArgs, options::OPT_static);
6773 if (!Args.hasArg(options::OPT_static))
6774 CmdArgs.push_back("-dynamic");
6775 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6776 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6777 // here. How do we wish to handle such things?
6778 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006779
Daniel Dunbarc1964212009-03-26 16:23:12 +00006780 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006781 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006782 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006783 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006784
6785 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6786 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6787 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6788
6789 Arg *A;
6790 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6791 (A = Args.getLastArg(options::OPT_current__version)) ||
6792 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006793 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6794 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006795
6796 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6797 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6798 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6799 } else {
6800 CmdArgs.push_back("-dylib");
6801
6802 Arg *A;
6803 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6804 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6805 (A = Args.getLastArg(options::OPT_client__name)) ||
6806 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6807 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6808 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006809 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6810 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006811
Daniel Dunbarc1964212009-03-26 16:23:12 +00006812 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6813 "-dylib_compatibility_version");
6814 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6815 "-dylib_current_version");
6816
Tim Northover157d9112014-01-16 08:48:16 +00006817 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006818
6819 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6820 "-dylib_install_name");
6821 }
6822
6823 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6824 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6825 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006826 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006827 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006828 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6829 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6830 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6831 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6832 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6833 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006834 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006835 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6836 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6837 Args.AddAllArgs(CmdArgs, options::OPT_init);
6838
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006839 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006840 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006841
Daniel Dunbarc1964212009-03-26 16:23:12 +00006842 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6843 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6844 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6845 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6846 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006847
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006848 if (const Arg *A =
6849 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6850 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006851 if (A->getOption().matches(options::OPT_fpie) ||
6852 A->getOption().matches(options::OPT_fPIE))
6853 CmdArgs.push_back("-pie");
6854 else
6855 CmdArgs.push_back("-no_pie");
6856 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006857
6858 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6859 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6860 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6861 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6862 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6863 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6864 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6865 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6866 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6867 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6868 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6869 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6870 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6871 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6872 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6873 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006874
Daniel Dunbar84384642011-05-02 21:03:47 +00006875 // Give --sysroot= preference, over the Apple specific behavior to also use
6876 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006877 StringRef sysroot = C.getSysRoot();
6878 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006879 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006880 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006881 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6882 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006883 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006884 }
6885
Daniel Dunbarc1964212009-03-26 16:23:12 +00006886 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6887 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6888 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6889 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6890 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006891 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006892 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6893 Args.AddAllArgs(CmdArgs, options::OPT_y);
6894 Args.AddLastArg(CmdArgs, options::OPT_w);
6895 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6896 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6897 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6898 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6899 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6900 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6901 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6902 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6903 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6904 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6905 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6906 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6907}
6908
Douglas Katzman95354292015-06-23 20:42:09 +00006909void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6910 const InputInfo &Output,
6911 const InputInfoList &Inputs,
6912 const ArgList &Args,
6913 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006914 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006915
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006916 // If the number of arguments surpasses the system limits, we will encode the
6917 // input files in a separate file, shortening the command line. To this end,
6918 // build a list of input file names that can be passed via a file with the
6919 // -filelist linker option.
6920 llvm::opt::ArgStringList InputFileList;
6921
Daniel Dunbarc1964212009-03-26 16:23:12 +00006922 // The logic here is derived from gcc's behavior; most of which
6923 // comes from specs (starting with link_command). Consult gcc for
6924 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006925 ArgStringList CmdArgs;
6926
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006927 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6928 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6929 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006930 for (const auto &Arg : Args)
6931 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006932 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006933 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006934 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006935 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006936 return;
6937 }
6938
Daniel Dunbarc1964212009-03-26 16:23:12 +00006939 // I'm not sure why this particular decomposition exists in gcc, but
6940 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006941 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006942
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006943 // It seems that the 'e' option is completely ignored for dynamic executables
6944 // (the default), and with static executables, the last one wins, as expected.
6945 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6946 options::OPT_Z_Flag, options::OPT_u_Group,
6947 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006948
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006949 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6950 // members of static archive libraries which implement Objective-C classes or
6951 // categories.
6952 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6953 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006954
Daniel Dunbarc1964212009-03-26 16:23:12 +00006955 CmdArgs.push_back("-o");
6956 CmdArgs.push_back(Output.getFilename());
6957
Douglas Katzman78b37b02015-11-17 20:28:07 +00006958 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00006959 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006960
Peter Collingbournec4122c12015-06-15 21:08:13 +00006961 // SafeStack requires its own runtime libraries
6962 // These libraries should be linked first, to make sure the
6963 // __safestack_init constructor executes before everything else
6964 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6965 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6966 "libclang_rt.safestack_osx.a",
6967 /*AlwaysLink=*/true);
6968 }
6969
Daniel Dunbarc1964212009-03-26 16:23:12 +00006970 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006971
Douglas Gregor9295df02012-05-15 21:00:27 +00006972 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006973 // Build the input file for -filelist (list of linker input files) in case we
6974 // need it later
6975 for (const auto &II : Inputs) {
6976 if (!II.isFilename()) {
6977 // This is a linker input argument.
6978 // We cannot mix input arguments and file names in a -filelist input, thus
6979 // we prematurely stop our list (remaining files shall be passed as
6980 // arguments).
6981 if (InputFileList.size() > 0)
6982 break;
6983
6984 continue;
6985 }
6986
6987 InputFileList.push_back(II.getFilename());
6988 }
6989
Douglas Katzman78b37b02015-11-17 20:28:07 +00006990 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006991 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6992
Douglas Katzman78b37b02015-11-17 20:28:07 +00006993 if (isObjCRuntimeLinked(Args) &&
6994 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006995 // We use arclite library for both ARC and subscripting support.
6996 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6997
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006998 CmdArgs.push_back("-framework");
6999 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007000 // Link libobj.
7001 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007002 }
John McCall31168b02011-06-15 23:02:42 +00007003
Daniel Dunbarc1964212009-03-26 16:23:12 +00007004 if (LinkingOutput) {
7005 CmdArgs.push_back("-arch_multiple");
7006 CmdArgs.push_back("-final_output");
7007 CmdArgs.push_back(LinkingOutput);
7008 }
7009
Daniel Dunbarc1964212009-03-26 16:23:12 +00007010 if (Args.hasArg(options::OPT_fnested_functions))
7011 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007012
Justin Bognerc7701242015-05-12 05:44:36 +00007013 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7014
Douglas Katzman78b37b02015-11-17 20:28:07 +00007015 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007016 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007017 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007018
Daniel Dunbarc1964212009-03-26 16:23:12 +00007019 // link_ssp spec is empty.
7020
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007021 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007022 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007023 }
7024
Douglas Katzman78b37b02015-11-17 20:28:07 +00007025 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007026 // endfile_spec is empty.
7027 }
7028
7029 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7030 Args.AddAllArgs(CmdArgs, options::OPT_F);
7031
Steven Wu3ffb61b2015-02-06 18:08:29 +00007032 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007033 for (const Arg *A : Args.filtered(options::OPT_iframework))
7034 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007035
Douglas Katzman78b37b02015-11-17 20:28:07 +00007036 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007037 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7038 if (A->getValue() == StringRef("Accelerate")) {
7039 CmdArgs.push_back("-framework");
7040 CmdArgs.push_back("Accelerate");
7041 }
7042 }
7043 }
7044
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007045 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007046 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007047 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007048 Cmd->setInputFileList(std::move(InputFileList));
7049 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007050}
7051
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007052void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007053 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007054 const InputInfoList &Inputs,
7055 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007056 const char *LinkingOutput) const {
7057 ArgStringList CmdArgs;
7058
7059 CmdArgs.push_back("-create");
7060 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007061
7062 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007063 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007064
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007065 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007066 assert(II.isFilename() && "Unexpected lipo input.");
7067 CmdArgs.push_back(II.getFilename());
7068 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007069
7070 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007071 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007072}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007073
Daniel Dunbar88299622010-06-04 18:28:36 +00007074void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007075 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007076 const InputInfoList &Inputs,
7077 const ArgList &Args,
7078 const char *LinkingOutput) const {
7079 ArgStringList CmdArgs;
7080
Daniel Dunbareb86b042011-05-09 17:23:16 +00007081 CmdArgs.push_back("-o");
7082 CmdArgs.push_back(Output.getFilename());
7083
Daniel Dunbar88299622010-06-04 18:28:36 +00007084 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7085 const InputInfo &Input = Inputs[0];
7086 assert(Input.isFilename() && "Unexpected dsymutil input.");
7087 CmdArgs.push_back(Input.getFilename());
7088
Daniel Dunbar88299622010-06-04 18:28:36 +00007089 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007090 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007091 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007092}
7093
Eric Christopher551ef452011-08-23 17:56:55 +00007094void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007095 const InputInfo &Output,
7096 const InputInfoList &Inputs,
7097 const ArgList &Args,
7098 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007099 ArgStringList CmdArgs;
7100 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007101 CmdArgs.push_back("--debug-info");
7102 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007103 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007104
7105 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7106 const InputInfo &Input = Inputs[0];
7107 assert(Input.isFilename() && "Unexpected verify input");
7108
7109 // Grabbing the output of the earlier dsymutil run.
7110 CmdArgs.push_back(Input.getFilename());
7111
7112 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007113 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007114 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007115}
7116
Douglas Katzman95354292015-06-23 20:42:09 +00007117void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007118 const InputInfo &Output,
7119 const InputInfoList &Inputs,
7120 const ArgList &Args,
7121 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007122 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007123 ArgStringList CmdArgs;
7124
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007125 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007126
7127 CmdArgs.push_back("-o");
7128 CmdArgs.push_back(Output.getFilename());
7129
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007130 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007131 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007132
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007133 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007134 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007135}
7136
Douglas Katzman95354292015-06-23 20:42:09 +00007137void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7138 const InputInfo &Output,
7139 const InputInfoList &Inputs,
7140 const ArgList &Args,
7141 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007142 ArgStringList CmdArgs;
7143
David Chisnall272a0712012-02-29 15:06:12 +00007144 // Demangle C++ names in errors
7145 CmdArgs.push_back("-C");
7146
Douglas Katzman78b37b02015-11-17 20:28:07 +00007147 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007148 CmdArgs.push_back("-e");
7149 CmdArgs.push_back("_start");
7150 }
7151
7152 if (Args.hasArg(options::OPT_static)) {
7153 CmdArgs.push_back("-Bstatic");
7154 CmdArgs.push_back("-dn");
7155 } else {
7156 CmdArgs.push_back("-Bdynamic");
7157 if (Args.hasArg(options::OPT_shared)) {
7158 CmdArgs.push_back("-shared");
7159 } else {
7160 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007161 CmdArgs.push_back(
7162 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007163 }
7164 }
7165
7166 if (Output.isFilename()) {
7167 CmdArgs.push_back("-o");
7168 CmdArgs.push_back(Output.getFilename());
7169 } else {
7170 assert(Output.isNothing() && "Invalid output.");
7171 }
7172
Douglas Katzman78b37b02015-11-17 20:28:07 +00007173 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007174 if (!Args.hasArg(options::OPT_shared))
7175 CmdArgs.push_back(
7176 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7177
7178 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7179 CmdArgs.push_back(
7180 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7181 CmdArgs.push_back(
7182 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007183 }
7184
Douglas Katzman6059ef92015-11-17 17:41:23 +00007185 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007186
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007187 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7188 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007189
7190 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7191
Douglas Katzman78b37b02015-11-17 20:28:07 +00007192 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007193 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007194 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007195 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007196 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007197 if (!Args.hasArg(options::OPT_shared)) {
7198 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007199 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007200 }
David Chisnallf571cde2012-02-15 13:39:01 +00007201 }
7202
Douglas Katzman78b37b02015-11-17 20:28:07 +00007203 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007204 CmdArgs.push_back(
7205 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007206 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007207 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007208
Xinliang David Li69306c02015-10-22 06:15:31 +00007209 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007210
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007211 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007212 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007213}
7214
Douglas Katzman95354292015-06-23 20:42:09 +00007215void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7216 const InputInfo &Output,
7217 const InputInfoList &Inputs,
7218 const ArgList &Args,
7219 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007220 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007221 ArgStringList CmdArgs;
7222
Rafael Espindolacc126272014-02-28 01:55:21 +00007223 switch (getToolChain().getArch()) {
7224 case llvm::Triple::x86:
7225 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7226 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007227 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007228 break;
7229
7230 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007231 CmdArgs.push_back("-mppc");
7232 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007233 break;
7234
7235 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007236 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007237 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007238 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7239 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7240 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007241 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007242 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007243
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007244 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007245 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007246 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7247 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7248 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007249 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007250 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007251
7252 case llvm::Triple::mips64:
7253 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007254 StringRef CPUName;
7255 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007256 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007257
7258 CmdArgs.push_back("-mabi");
7259 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7260
7261 if (getToolChain().getArch() == llvm::Triple::mips64)
7262 CmdArgs.push_back("-EB");
7263 else
7264 CmdArgs.push_back("-EL");
7265
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007266 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007267 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007268 }
7269
Rafael Espindolacc126272014-02-28 01:55:21 +00007270 default:
7271 break;
7272 }
7273
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007274 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007275
7276 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007277 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007278
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007279 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007280 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007281
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007282 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007283 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007284}
7285
Douglas Katzman95354292015-06-23 20:42:09 +00007286void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7287 const InputInfo &Output,
7288 const InputInfoList &Inputs,
7289 const ArgList &Args,
7290 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007291 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007292 ArgStringList CmdArgs;
7293
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007294 // Silence warning for "clang -g foo.o -o foo"
7295 Args.ClaimAllArgs(options::OPT_g_Group);
7296 // and "clang -emit-llvm foo.o -o foo"
7297 Args.ClaimAllArgs(options::OPT_emit_llvm);
7298 // and for "clang -w foo.o -o foo". Other warning options are already
7299 // handled somewhere else.
7300 Args.ClaimAllArgs(options::OPT_w);
7301
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007302 if (getToolChain().getArch() == llvm::Triple::mips64)
7303 CmdArgs.push_back("-EB");
7304 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7305 CmdArgs.push_back("-EL");
7306
Douglas Katzman78b37b02015-11-17 20:28:07 +00007307 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007308 CmdArgs.push_back("-e");
7309 CmdArgs.push_back("__start");
7310 }
7311
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007312 if (Args.hasArg(options::OPT_static)) {
7313 CmdArgs.push_back("-Bstatic");
7314 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007315 if (Args.hasArg(options::OPT_rdynamic))
7316 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007317 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007318 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007319 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007320 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007321 } else {
7322 CmdArgs.push_back("-dynamic-linker");
7323 CmdArgs.push_back("/usr/libexec/ld.so");
7324 }
7325 }
7326
Rafael Espindola044f7832013-06-05 04:28:55 +00007327 if (Args.hasArg(options::OPT_nopie))
7328 CmdArgs.push_back("-nopie");
7329
Daniel Dunbarb440f562010-08-02 02:38:21 +00007330 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007331 CmdArgs.push_back("-o");
7332 CmdArgs.push_back(Output.getFilename());
7333 } else {
7334 assert(Output.isNothing() && "Invalid output.");
7335 }
7336
Douglas Katzman78b37b02015-11-17 20:28:07 +00007337 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007338 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007339 if (Args.hasArg(options::OPT_pg))
7340 CmdArgs.push_back(
7341 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007342 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007343 CmdArgs.push_back(
7344 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7345 CmdArgs.push_back(
7346 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007347 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007348 CmdArgs.push_back(
7349 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007350 }
7351 }
7352
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007353 std::string Triple = getToolChain().getTripleString();
7354 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007355 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007356 CmdArgs.push_back(
7357 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007358
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007359 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7360 options::OPT_e, options::OPT_s, options::OPT_t,
7361 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007362
Daniel Dunbar54423b22010-09-17 00:24:54 +00007363 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007364
Douglas Katzman78b37b02015-11-17 20:28:07 +00007365 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007366 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007367 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007368 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007369 CmdArgs.push_back("-lm_p");
7370 else
7371 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007372 }
7373
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007374 // FIXME: For some reason GCC passes -lgcc before adding
7375 // the default system libraries. Just mimic this for now.
7376 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007377
Eric Christopher17674ec2012-09-13 06:32:34 +00007378 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007379 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7380 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007381 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007382 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007383 }
7384
Chandler Carruth45661652011-12-17 22:32:42 +00007385 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007386 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007387 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007388 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007389 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007390 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007391
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007392 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007393 }
7394
Douglas Katzman78b37b02015-11-17 20:28:07 +00007395 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007396 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007397 CmdArgs.push_back(
7398 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007399 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007400 CmdArgs.push_back(
7401 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007402 }
7403
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007404 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007405 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007406}
Ed Schoutene33194b2009-04-02 19:13:12 +00007407
Douglas Katzman95354292015-06-23 20:42:09 +00007408void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7409 const InputInfo &Output,
7410 const InputInfoList &Inputs,
7411 const ArgList &Args,
7412 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007413 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007414 ArgStringList CmdArgs;
7415
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007416 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007417
7418 CmdArgs.push_back("-o");
7419 CmdArgs.push_back(Output.getFilename());
7420
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007421 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007422 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007423
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007424 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007425 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007426}
7427
Douglas Katzman95354292015-06-23 20:42:09 +00007428void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7429 const InputInfo &Output,
7430 const InputInfoList &Inputs,
7431 const ArgList &Args,
7432 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007433 const Driver &D = getToolChain().getDriver();
7434 ArgStringList CmdArgs;
7435
Douglas Katzman78b37b02015-11-17 20:28:07 +00007436 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007437 CmdArgs.push_back("-e");
7438 CmdArgs.push_back("__start");
7439 }
7440
7441 if (Args.hasArg(options::OPT_static)) {
7442 CmdArgs.push_back("-Bstatic");
7443 } else {
7444 if (Args.hasArg(options::OPT_rdynamic))
7445 CmdArgs.push_back("-export-dynamic");
7446 CmdArgs.push_back("--eh-frame-hdr");
7447 CmdArgs.push_back("-Bdynamic");
7448 if (Args.hasArg(options::OPT_shared)) {
7449 CmdArgs.push_back("-shared");
7450 } else {
7451 CmdArgs.push_back("-dynamic-linker");
7452 CmdArgs.push_back("/usr/libexec/ld.so");
7453 }
7454 }
7455
7456 if (Output.isFilename()) {
7457 CmdArgs.push_back("-o");
7458 CmdArgs.push_back(Output.getFilename());
7459 } else {
7460 assert(Output.isNothing() && "Invalid output.");
7461 }
7462
Douglas Katzman78b37b02015-11-17 20:28:07 +00007463 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007464 if (!Args.hasArg(options::OPT_shared)) {
7465 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007466 CmdArgs.push_back(
7467 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007468 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007469 CmdArgs.push_back(
7470 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7471 CmdArgs.push_back(
7472 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007473 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007474 CmdArgs.push_back(
7475 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007476 }
7477 }
7478
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007479 Args.AddAllArgs(CmdArgs,
7480 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007481
7482 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7483
Douglas Katzman78b37b02015-11-17 20:28:07 +00007484 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007485 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007486 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7487 if (Args.hasArg(options::OPT_pg))
7488 CmdArgs.push_back("-lm_p");
7489 else
7490 CmdArgs.push_back("-lm");
7491 }
7492
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007493 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007494 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007495 CmdArgs.push_back("-lpthread_p");
7496 else
7497 CmdArgs.push_back("-lpthread");
7498 }
7499
Eli Friedman9fa28852012-08-08 23:57:20 +00007500 if (!Args.hasArg(options::OPT_shared)) {
7501 if (Args.hasArg(options::OPT_pg))
7502 CmdArgs.push_back("-lc_p");
7503 else
7504 CmdArgs.push_back("-lc");
7505 }
7506
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007507 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007508 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007509 case llvm::Triple::arm:
7510 MyArch = "arm";
7511 break;
7512 case llvm::Triple::x86:
7513 MyArch = "i386";
7514 break;
7515 case llvm::Triple::x86_64:
7516 MyArch = "amd64";
7517 break;
7518 default:
7519 llvm_unreachable("Unsupported architecture");
7520 }
7521 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007522 }
7523
Douglas Katzman78b37b02015-11-17 20:28:07 +00007524 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007525 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007526 CmdArgs.push_back(
7527 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007528 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007529 CmdArgs.push_back(
7530 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007531 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007532
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007533 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007534 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007535}
7536
Douglas Katzman95354292015-06-23 20:42:09 +00007537void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7538 const InputInfo &Output,
7539 const InputInfoList &Inputs,
7540 const ArgList &Args,
7541 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007542 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007543 ArgStringList CmdArgs;
7544
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007545 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7546 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007547 switch (getToolChain().getArch()) {
7548 default:
7549 break;
7550 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007551 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007552 break;
7553 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007554 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007555 break;
7556 case llvm::Triple::mips:
7557 case llvm::Triple::mipsel:
7558 case llvm::Triple::mips64:
7559 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007560 StringRef CPUName;
7561 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007562 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007563
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007564 CmdArgs.push_back("-march");
7565 CmdArgs.push_back(CPUName.data());
7566
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007567 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007568 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007569
7570 if (getToolChain().getArch() == llvm::Triple::mips ||
7571 getToolChain().getArch() == llvm::Triple::mips64)
7572 CmdArgs.push_back("-EB");
7573 else
7574 CmdArgs.push_back("-EL");
7575
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007576 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007577 break;
7578 }
7579 case llvm::Triple::arm:
7580 case llvm::Triple::armeb:
7581 case llvm::Triple::thumb:
7582 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007583 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007584
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007585 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007586 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007587 else
Renato Golinf4421f72014-02-19 10:44:07 +00007588 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007589
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007590 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007591 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007592 case llvm::Triple::GNUEABI:
7593 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007594 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007595 break;
7596
7597 default:
7598 CmdArgs.push_back("-matpcs");
7599 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007600 break;
7601 }
7602 case llvm::Triple::sparc:
7603 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007604 case llvm::Triple::sparcv9: {
7605 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7606 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007607 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007608 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007609 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007610 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007611
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007612 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007613
7614 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007615 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007616
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007617 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007618 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007619
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007620 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007621 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007622}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007623
Douglas Katzman95354292015-06-23 20:42:09 +00007624void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7625 const InputInfo &Output,
7626 const InputInfoList &Inputs,
7627 const ArgList &Args,
7628 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007629 const toolchains::FreeBSD &ToolChain =
7630 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007631 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007632 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007633 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007634 !Args.hasArg(options::OPT_shared) &&
7635 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007636 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007637
7638 // Silence warning for "clang -g foo.o -o foo"
7639 Args.ClaimAllArgs(options::OPT_g_Group);
7640 // and "clang -emit-llvm foo.o -o foo"
7641 Args.ClaimAllArgs(options::OPT_emit_llvm);
7642 // and for "clang -w foo.o -o foo". Other warning options are already
7643 // handled somewhere else.
7644 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007645
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007646 if (!D.SysRoot.empty())
7647 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7648
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007649 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007650 CmdArgs.push_back("-pie");
7651
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007652 if (Args.hasArg(options::OPT_static)) {
7653 CmdArgs.push_back("-Bstatic");
7654 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007655 if (Args.hasArg(options::OPT_rdynamic))
7656 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007657 CmdArgs.push_back("--eh-frame-hdr");
7658 if (Args.hasArg(options::OPT_shared)) {
7659 CmdArgs.push_back("-Bshareable");
7660 } else {
7661 CmdArgs.push_back("-dynamic-linker");
7662 CmdArgs.push_back("/libexec/ld-elf.so.1");
7663 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007664 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007665 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7666 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7667 CmdArgs.push_back("--hash-style=both");
7668 }
7669 }
7670 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007671 }
7672
7673 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7674 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007675 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007676 CmdArgs.push_back("-m");
7677 CmdArgs.push_back("elf_i386_fbsd");
7678 }
7679
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007680 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007681 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007682 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007683 }
7684
Daniel Dunbarb440f562010-08-02 02:38:21 +00007685 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007686 CmdArgs.push_back("-o");
7687 CmdArgs.push_back(Output.getFilename());
7688 } else {
7689 assert(Output.isNothing() && "Invalid output.");
7690 }
7691
Douglas Katzman78b37b02015-11-17 20:28:07 +00007692 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007693 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007694 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007695 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007696 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007697 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007698 crt1 = "Scrt1.o";
7699 else
7700 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007701 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007702 if (crt1)
7703 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7704
7705 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7706
Craig Topper92fc2df2014-05-17 16:56:41 +00007707 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007708 if (Args.hasArg(options::OPT_static))
7709 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007710 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007711 crtbegin = "crtbeginS.o";
7712 else
7713 crtbegin = "crtbegin.o";
7714
7715 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007716 }
7717
7718 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007719 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007720 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7721 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007722 Args.AddAllArgs(CmdArgs, options::OPT_s);
7723 Args.AddAllArgs(CmdArgs, options::OPT_t);
7724 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7725 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007726
Teresa Johnson945bc502015-10-15 20:35:53 +00007727 if (D.isUsingLTO())
7728 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007729
Alexey Samsonov52550342014-09-15 19:58:40 +00007730 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007731 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007732
Douglas Katzman78b37b02015-11-17 20:28:07 +00007733 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007734 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007735 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007736 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007737 if (Args.hasArg(options::OPT_pg))
7738 CmdArgs.push_back("-lm_p");
7739 else
7740 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007741 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007742 if (NeedsSanitizerDeps)
7743 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007744 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7745 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007746 if (Args.hasArg(options::OPT_pg))
7747 CmdArgs.push_back("-lgcc_p");
7748 else
7749 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007750 if (Args.hasArg(options::OPT_static)) {
7751 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007752 } else if (Args.hasArg(options::OPT_pg)) {
7753 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007754 } else {
7755 CmdArgs.push_back("--as-needed");
7756 CmdArgs.push_back("-lgcc_s");
7757 CmdArgs.push_back("--no-as-needed");
7758 }
7759
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007760 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007761 if (Args.hasArg(options::OPT_pg))
7762 CmdArgs.push_back("-lpthread_p");
7763 else
7764 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007765 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007766
Roman Divacky66f22762011-02-10 16:59:40 +00007767 if (Args.hasArg(options::OPT_pg)) {
7768 if (Args.hasArg(options::OPT_shared))
7769 CmdArgs.push_back("-lc");
7770 else
7771 CmdArgs.push_back("-lc_p");
7772 CmdArgs.push_back("-lgcc_p");
7773 } else {
7774 CmdArgs.push_back("-lc");
7775 CmdArgs.push_back("-lgcc");
7776 }
7777
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007778 if (Args.hasArg(options::OPT_static)) {
7779 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007780 } else if (Args.hasArg(options::OPT_pg)) {
7781 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007782 } else {
7783 CmdArgs.push_back("--as-needed");
7784 CmdArgs.push_back("-lgcc_s");
7785 CmdArgs.push_back("--no-as-needed");
7786 }
7787 }
7788
Douglas Katzman78b37b02015-11-17 20:28:07 +00007789 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007790 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007791 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007792 else
7793 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007794 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007795 }
7796
Xinliang David Li69306c02015-10-22 06:15:31 +00007797 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007798
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007799 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007800 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007801}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007802
Douglas Katzman95354292015-06-23 20:42:09 +00007803void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007804 const InputInfo &Output,
7805 const InputInfoList &Inputs,
7806 const ArgList &Args,
7807 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007808 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007809 ArgStringList CmdArgs;
7810
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007811 // GNU as needs different flags for creating the correct output format
7812 // on architectures with different ABIs or optional feature sets.
7813 switch (getToolChain().getArch()) {
7814 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007815 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007816 break;
7817 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007818 case llvm::Triple::armeb:
7819 case llvm::Triple::thumb:
7820 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007821 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007822 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7823 std::string Arch =
7824 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007825 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007826 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007827 }
7828
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007829 case llvm::Triple::mips:
7830 case llvm::Triple::mipsel:
7831 case llvm::Triple::mips64:
7832 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007833 StringRef CPUName;
7834 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007835 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007836
7837 CmdArgs.push_back("-march");
7838 CmdArgs.push_back(CPUName.data());
7839
7840 CmdArgs.push_back("-mabi");
7841 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7842
7843 if (getToolChain().getArch() == llvm::Triple::mips ||
7844 getToolChain().getArch() == llvm::Triple::mips64)
7845 CmdArgs.push_back("-EB");
7846 else
7847 CmdArgs.push_back("-EL");
7848
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007849 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007850 break;
7851 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007852
7853 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007854 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007855 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007856 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7857 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007858 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007859 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007860 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007861
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007862 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007863 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007864 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7865 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007866 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007867 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007868 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007869
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007870 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007871 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007872 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007873
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007874 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007875
7876 CmdArgs.push_back("-o");
7877 CmdArgs.push_back(Output.getFilename());
7878
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007879 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007880 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007881
David Chisnallddbd68f2011-09-27 22:03:18 +00007882 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007883 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007884}
7885
Douglas Katzman95354292015-06-23 20:42:09 +00007886void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7887 const InputInfo &Output,
7888 const InputInfoList &Inputs,
7889 const ArgList &Args,
7890 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007891 const Driver &D = getToolChain().getDriver();
7892 ArgStringList CmdArgs;
7893
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007894 if (!D.SysRoot.empty())
7895 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7896
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007897 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007898 if (Args.hasArg(options::OPT_static)) {
7899 CmdArgs.push_back("-Bstatic");
7900 } else {
7901 if (Args.hasArg(options::OPT_rdynamic))
7902 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007903 if (Args.hasArg(options::OPT_shared)) {
7904 CmdArgs.push_back("-Bshareable");
7905 } else {
7906 CmdArgs.push_back("-dynamic-linker");
7907 CmdArgs.push_back("/libexec/ld.elf_so");
7908 }
7909 }
7910
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007911 // Many NetBSD architectures support more than one ABI.
7912 // Determine the correct emulation for ld.
7913 switch (getToolChain().getArch()) {
7914 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007915 CmdArgs.push_back("-m");
7916 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007917 break;
7918 case llvm::Triple::arm:
7919 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007920 CmdArgs.push_back("-m");
7921 switch (getToolChain().getTriple().getEnvironment()) {
7922 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007923 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007924 CmdArgs.push_back("armelf_nbsd_eabi");
7925 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007926 case llvm::Triple::EABIHF:
7927 case llvm::Triple::GNUEABIHF:
7928 CmdArgs.push_back("armelf_nbsd_eabihf");
7929 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007930 default:
7931 CmdArgs.push_back("armelf_nbsd");
7932 break;
7933 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007934 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007935 case llvm::Triple::armeb:
7936 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007937 arm::appendEBLinkFlags(
7938 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007939 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007940 CmdArgs.push_back("-m");
7941 switch (getToolChain().getTriple().getEnvironment()) {
7942 case llvm::Triple::EABI:
7943 case llvm::Triple::GNUEABI:
7944 CmdArgs.push_back("armelfb_nbsd_eabi");
7945 break;
7946 case llvm::Triple::EABIHF:
7947 case llvm::Triple::GNUEABIHF:
7948 CmdArgs.push_back("armelfb_nbsd_eabihf");
7949 break;
7950 default:
7951 CmdArgs.push_back("armelfb_nbsd");
7952 break;
7953 }
7954 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007955 case llvm::Triple::mips64:
7956 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007957 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007958 CmdArgs.push_back("-m");
7959 if (getToolChain().getArch() == llvm::Triple::mips64)
7960 CmdArgs.push_back("elf32btsmip");
7961 else
7962 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007963 } else if (mips::hasMipsAbiArg(Args, "64")) {
7964 CmdArgs.push_back("-m");
7965 if (getToolChain().getArch() == llvm::Triple::mips64)
7966 CmdArgs.push_back("elf64btsmip");
7967 else
7968 CmdArgs.push_back("elf64ltsmip");
7969 }
7970 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007971 case llvm::Triple::ppc:
7972 CmdArgs.push_back("-m");
7973 CmdArgs.push_back("elf32ppc_nbsd");
7974 break;
7975
7976 case llvm::Triple::ppc64:
7977 case llvm::Triple::ppc64le:
7978 CmdArgs.push_back("-m");
7979 CmdArgs.push_back("elf64ppc");
7980 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007981
7982 case llvm::Triple::sparc:
7983 CmdArgs.push_back("-m");
7984 CmdArgs.push_back("elf32_sparc");
7985 break;
7986
7987 case llvm::Triple::sparcv9:
7988 CmdArgs.push_back("-m");
7989 CmdArgs.push_back("elf64_sparc");
7990 break;
7991
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007992 default:
7993 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007994 }
7995
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007996 if (Output.isFilename()) {
7997 CmdArgs.push_back("-o");
7998 CmdArgs.push_back(Output.getFilename());
7999 } else {
8000 assert(Output.isNothing() && "Invalid output.");
8001 }
8002
Douglas Katzman78b37b02015-11-17 20:28:07 +00008003 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008004 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008005 CmdArgs.push_back(
8006 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8007 CmdArgs.push_back(
8008 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8009 CmdArgs.push_back(
8010 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008011 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008012 CmdArgs.push_back(
8013 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8014 CmdArgs.push_back(
8015 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008016 }
8017 }
8018
8019 Args.AddAllArgs(CmdArgs, options::OPT_L);
8020 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8021 Args.AddAllArgs(CmdArgs, options::OPT_e);
8022 Args.AddAllArgs(CmdArgs, options::OPT_s);
8023 Args.AddAllArgs(CmdArgs, options::OPT_t);
8024 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8025 Args.AddAllArgs(CmdArgs, options::OPT_r);
8026
8027 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8028
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008029 unsigned Major, Minor, Micro;
8030 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8031 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008032 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008033 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008034 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008035 case llvm::Triple::arm:
8036 case llvm::Triple::armeb:
8037 case llvm::Triple::thumb:
8038 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008039 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008040 case llvm::Triple::ppc64:
8041 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008042 case llvm::Triple::x86:
8043 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008044 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008045 break;
8046 default:
8047 break;
8048 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008049 }
8050
Douglas Katzman78b37b02015-11-17 20:28:07 +00008051 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008052 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008053 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008054 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8055 CmdArgs.push_back("-lm");
8056 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008057 if (Args.hasArg(options::OPT_pthread))
8058 CmdArgs.push_back("-lpthread");
8059 CmdArgs.push_back("-lc");
8060
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008061 if (useLibgcc) {
8062 if (Args.hasArg(options::OPT_static)) {
8063 // libgcc_eh depends on libc, so resolve as much as possible,
8064 // pull in any new requirements from libc and then get the rest
8065 // of libgcc.
8066 CmdArgs.push_back("-lgcc_eh");
8067 CmdArgs.push_back("-lc");
8068 CmdArgs.push_back("-lgcc");
8069 } else {
8070 CmdArgs.push_back("-lgcc");
8071 CmdArgs.push_back("--as-needed");
8072 CmdArgs.push_back("-lgcc_s");
8073 CmdArgs.push_back("--no-as-needed");
8074 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008075 }
8076 }
8077
Douglas Katzman78b37b02015-11-17 20:28:07 +00008078 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008079 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008080 CmdArgs.push_back(
8081 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008082 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008083 CmdArgs.push_back(
8084 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8085 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008086 }
8087
Xinliang David Li69306c02015-10-22 06:15:31 +00008088 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008089
Logan Chieneb9162f2014-06-26 14:23:45 +00008090 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008091 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008092}
8093
Douglas Katzman95354292015-06-23 20:42:09 +00008094void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8095 const InputInfo &Output,
8096 const InputInfoList &Inputs,
8097 const ArgList &Args,
8098 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008099 claimNoWarnArgs(Args);
8100
James Y Knight2db38f32015-08-15 03:45:25 +00008101 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8102 llvm::Triple Triple = llvm::Triple(TripleStr);
8103
Rafael Espindola92b00932010-08-10 00:25:48 +00008104 ArgStringList CmdArgs;
8105
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008106 llvm::Reloc::Model RelocationModel;
8107 unsigned PICLevel;
8108 bool IsPIE;
8109 std::tie(RelocationModel, PICLevel, IsPIE) =
8110 ParsePICArgs(getToolChain(), Triple, Args);
8111
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008112 switch (getToolChain().getArch()) {
8113 default:
8114 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008115 // Add --32/--64 to make sure we get the format we want.
8116 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008117 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008118 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008119 break;
8120 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008121 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8122 CmdArgs.push_back("--x32");
8123 else
8124 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008125 break;
8126 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008127 CmdArgs.push_back("-a32");
8128 CmdArgs.push_back("-mppc");
8129 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008130 break;
8131 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008132 CmdArgs.push_back("-a64");
8133 CmdArgs.push_back("-mppc64");
8134 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008135 break;
8136 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008137 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008138 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008139 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008140 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008141 break;
8142 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008143 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008144 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008145 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8146 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8147 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008148 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008149 }
8150 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008151 CmdArgs.push_back("-64");
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 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008157 case llvm::Triple::arm:
8158 case llvm::Triple::armeb:
8159 case llvm::Triple::thumb:
8160 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008161 const llvm::Triple &Triple2 = getToolChain().getTriple();
8162 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008163 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008164 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008165 break;
8166 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008167 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008168 break;
8169 default:
8170 break;
8171 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008172
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008173 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008174 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8175 case arm::FloatABI::Soft:
8176 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8177 break;
8178 case arm::FloatABI::SoftFP:
8179 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8180 break;
8181 case arm::FloatABI::Hard:
8182 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8183 break;
8184 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008185
8186 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008187
8188 // FIXME: remove krait check when GNU tools support krait cpu
8189 // for now replace it with -march=armv7-a to avoid a lower
8190 // march from being picked in the absence of a cpu flag.
8191 Arg *A;
8192 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008193 StringRef(A->getValue()).lower() == "krait")
8194 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008195 else
8196 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008197 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008198 break;
8199 }
8200 case llvm::Triple::mips:
8201 case llvm::Triple::mipsel:
8202 case llvm::Triple::mips64:
8203 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008204 StringRef CPUName;
8205 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008206 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008207 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008208
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008209 CmdArgs.push_back("-march");
8210 CmdArgs.push_back(CPUName.data());
8211
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008212 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008213 CmdArgs.push_back(ABIName.data());
8214
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008215 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8216 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008217 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008218 CmdArgs.push_back("-mno-shared");
8219
Daniel Sanders379d44b2014-07-16 11:52:23 +00008220 // LLVM doesn't support -mplt yet and acts as if it is always given.
8221 // However, -mplt has no effect with the N64 ABI.
8222 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008223
8224 if (getToolChain().getArch() == llvm::Triple::mips ||
8225 getToolChain().getArch() == llvm::Triple::mips64)
8226 CmdArgs.push_back("-EB");
8227 else
8228 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008229
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008230 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8231 if (StringRef(A->getValue()) == "2008")
8232 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8233 }
8234
Daniel Sanders379d44b2014-07-16 11:52:23 +00008235 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8236 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8237 options::OPT_mfp64)) {
8238 A->claim();
8239 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008240 } else if (mips::shouldUseFPXX(
8241 Args, getToolChain().getTriple(), CPUName, ABIName,
8242 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008243 CmdArgs.push_back("-mfpxx");
8244
8245 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8246 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008247 if (Arg *A =
8248 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008249 if (A->getOption().matches(options::OPT_mips16)) {
8250 A->claim();
8251 A->render(Args, CmdArgs);
8252 } else {
8253 A->claim();
8254 CmdArgs.push_back("-no-mips16");
8255 }
8256 }
8257
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008258 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8259 options::OPT_mno_micromips);
8260 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8261 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8262
Simon Atanasyanbd986632013-11-26 11:58:04 +00008263 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8264 // Do not use AddLastArg because not all versions of MIPS assembler
8265 // support -mmsa / -mno-msa options.
8266 if (A->getOption().matches(options::OPT_mmsa))
8267 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8268 }
8269
Daniel Sanders379d44b2014-07-16 11:52:23 +00008270 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8271 options::OPT_msoft_float);
8272
Toma Tabacub36d6102015-06-11 12:13:18 +00008273 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8274 options::OPT_msingle_float);
8275
Daniel Sanders379d44b2014-07-16 11:52:23 +00008276 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8277 options::OPT_mno_odd_spreg);
8278
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008279 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008280 break;
8281 }
8282 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008283 // Always pass an -march option, since our default of z10 is later
8284 // than the GNU assembler's default.
8285 StringRef CPUName = getSystemZTargetCPU(Args);
8286 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008287 break;
8288 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008289 }
8290
Renato Golina74bbc72015-07-22 15:32:36 +00008291 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008292 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008293
8294 CmdArgs.push_back("-o");
8295 CmdArgs.push_back(Output.getFilename());
8296
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008297 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008298 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008299
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008300 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008301 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008302
8303 // Handle the debug info splitting at object creation time if we're
8304 // creating an object.
8305 // TODO: Currently only works on linux with newer objcopy.
8306 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008307 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008308 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008309 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008310}
8311
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008312static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008313 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008314 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008315 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008316 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8317 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008318 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008319 CmdArgs.push_back("-lgcc");
8320
Logan Chien3d3373c2012-11-19 12:04:11 +00008321 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008322 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008323 CmdArgs.push_back("-lgcc");
8324 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008325 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008326 CmdArgs.push_back("--as-needed");
8327 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008328 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008329 CmdArgs.push_back("--no-as-needed");
8330 }
8331
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008332 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008333 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008334 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008335 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008336
8337 // According to Android ABI, we have to link with libdl if we are
8338 // linking with non-static libgcc.
8339 //
8340 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8341 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8342 if (isAndroid && !StaticLibgcc)
8343 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008344}
8345
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008346static std::string getLinuxDynamicLinker(const ArgList &Args,
8347 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008348 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8349
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008350 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008351 if (ToolChain.getTriple().isArch64Bit())
8352 return "/system/bin/linker64";
8353 else
8354 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008355 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8356 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008357 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008358 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008359 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008360 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008361 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008362 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008363 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008364 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008365 return "/lib/ld-linux-armhf.so.3";
8366 else
8367 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008368 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8369 // TODO: check which dynamic linker name.
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)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008372 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008373 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008374 return "/lib/ld-linux.so.3";
8375 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8376 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008377 std::string LibDir =
8378 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008379 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008380 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008381 if (mips::isUCLibc(Args))
8382 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008383 else if (!ToolChain.getTriple().hasEnvironment()) {
8384 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8385 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8386 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8387 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008388 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008389
8390 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008391 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008392 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008393 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008394 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8395 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008396 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008397 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008398 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8399 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008400 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008401 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008402 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008403 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008404 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008405 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008406 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8407 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008408 else
8409 return "/lib64/ld-linux-x86-64.so.2";
8410}
8411
Renato Golinc4b49242014-02-13 10:01:16 +00008412static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008413 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008414 // Make use of compiler-rt if --rtlib option is used
8415 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8416
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008417 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008418 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008419 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008420 default:
8421 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008422 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008423 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008424 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008425 break;
8426 }
Renato Golinc4b49242014-02-13 10:01:16 +00008427 break;
8428 case ToolChain::RLT_Libgcc:
8429 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8430 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008431 }
8432}
8433
Rafael Espindola1e085772014-08-15 17:14:35 +00008434static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8435 switch (T.getArch()) {
8436 case llvm::Triple::x86:
8437 return "elf_i386";
8438 case llvm::Triple::aarch64:
8439 return "aarch64linux";
8440 case llvm::Triple::aarch64_be:
8441 return "aarch64_be_linux";
8442 case llvm::Triple::arm:
8443 case llvm::Triple::thumb:
8444 return "armelf_linux_eabi";
8445 case llvm::Triple::armeb:
8446 case llvm::Triple::thumbeb:
8447 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8448 case llvm::Triple::ppc:
8449 return "elf32ppclinux";
8450 case llvm::Triple::ppc64:
8451 return "elf64ppc";
8452 case llvm::Triple::ppc64le:
8453 return "elf64lppc";
8454 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008455 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008456 return "elf32_sparc";
8457 case llvm::Triple::sparcv9:
8458 return "elf64_sparc";
8459 case llvm::Triple::mips:
8460 return "elf32btsmip";
8461 case llvm::Triple::mipsel:
8462 return "elf32ltsmip";
8463 case llvm::Triple::mips64:
8464 if (mips::hasMipsAbiArg(Args, "n32"))
8465 return "elf32btsmipn32";
8466 return "elf64btsmip";
8467 case llvm::Triple::mips64el:
8468 if (mips::hasMipsAbiArg(Args, "n32"))
8469 return "elf32ltsmipn32";
8470 return "elf64ltsmip";
8471 case llvm::Triple::systemz:
8472 return "elf64_s390";
8473 case llvm::Triple::x86_64:
8474 if (T.getEnvironment() == llvm::Triple::GNUX32)
8475 return "elf32_x86_64";
8476 return "elf_x86_64";
8477 default:
8478 llvm_unreachable("Unexpected arch");
8479 }
8480}
8481
Douglas Katzman95354292015-06-23 20:42:09 +00008482void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8483 const InputInfo &Output,
8484 const InputInfoList &Inputs,
8485 const ArgList &Args,
8486 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008487 const toolchains::Linux &ToolChain =
8488 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008489 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008490
8491 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8492 llvm::Triple Triple = llvm::Triple(TripleStr);
8493
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008494 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008495 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008496 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008497 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8498 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008499 const bool HasCRTBeginEndFiles =
8500 ToolChain.getTriple().hasEnvironment() ||
8501 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008502
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008503 ArgStringList CmdArgs;
8504
Rafael Espindolad1002f62010-11-15 18:28:16 +00008505 // Silence warning for "clang -g foo.o -o foo"
8506 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008507 // and "clang -emit-llvm foo.o -o foo"
8508 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008509 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008510 // handled somewhere else.
8511 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008512
Peter Collingbourne39719a72015-11-20 20:49:39 +00008513 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8514 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008515 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008516 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008517 CmdArgs.push_back("-target");
8518 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8519 }
8520
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008521 if (!D.SysRoot.empty())
8522 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008523
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008524 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008525 CmdArgs.push_back("-pie");
8526
Rafael Espindola1c76c592010-11-07 22:57:16 +00008527 if (Args.hasArg(options::OPT_rdynamic))
8528 CmdArgs.push_back("-export-dynamic");
8529
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008530 if (Args.hasArg(options::OPT_s))
8531 CmdArgs.push_back("-s");
8532
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008533 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008534 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008535
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008536 for (const auto &Opt : ToolChain.ExtraOpts)
8537 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008538
8539 if (!Args.hasArg(options::OPT_static)) {
8540 CmdArgs.push_back("--eh-frame-hdr");
8541 }
8542
8543 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008544 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008545
8546 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008547 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8548 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008549 CmdArgs.push_back("-Bstatic");
8550 else
8551 CmdArgs.push_back("-static");
8552 } else if (Args.hasArg(options::OPT_shared)) {
8553 CmdArgs.push_back("-shared");
8554 }
8555
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008556 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8557 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008558 (!Args.hasArg(options::OPT_static) &&
8559 !Args.hasArg(options::OPT_shared))) {
8560 CmdArgs.push_back("-dynamic-linker");
8561 CmdArgs.push_back(Args.MakeArgString(
8562 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8563 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008564
8565 CmdArgs.push_back("-o");
8566 CmdArgs.push_back(Output.getFilename());
8567
Douglas Katzman78b37b02015-11-17 20:28:07 +00008568 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008569 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008570 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008571 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008572 if (Args.hasArg(options::OPT_pg))
8573 crt1 = "gcrt1.o";
8574 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008575 crt1 = "Scrt1.o";
8576 else
8577 crt1 = "crt1.o";
8578 }
8579 if (crt1)
8580 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008581
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008582 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8583 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008584
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008585 const char *crtbegin;
8586 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008587 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008588 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008589 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008590 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008591 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008592 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008593 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008594
8595 if (HasCRTBeginEndFiles)
8596 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008597
8598 // Add crtfastmath.o if available and fast math is enabled.
8599 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008600 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008601
8602 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008603 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008604
Douglas Katzman6059ef92015-11-17 17:41:23 +00008605 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008606
Teresa Johnson945bc502015-10-15 20:35:53 +00008607 if (D.isUsingLTO())
8608 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008609
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008610 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8611 CmdArgs.push_back("--no-demangle");
8612
Alexey Samsonov52550342014-09-15 19:58:40 +00008613 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008614 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008615 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008616 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008617
Douglas Katzman78b37b02015-11-17 20:28:07 +00008618 if (D.CCCIsCXX() &&
8619 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008620 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008621 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008622 if (OnlyLibstdcxxStatic)
8623 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008624 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008625 if (OnlyLibstdcxxStatic)
8626 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008627 CmdArgs.push_back("-lm");
8628 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008629 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8630 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008631
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008632 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008633 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8634 if (Args.hasArg(options::OPT_static))
8635 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008636
Alexey Samsonov52550342014-09-15 19:58:40 +00008637 if (NeedsSanitizerDeps)
8638 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8639
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008640 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8641 Args.hasArg(options::OPT_pthreads);
8642
8643 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8644 options::OPT_fno_openmp, false)) {
8645 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8646 // FIXME: Does this really make sense for all GNU toolchains?
8647 WantPthread = true;
8648
8649 // Also link the particular OpenMP runtimes.
8650 switch (getOpenMPRuntime(ToolChain, Args)) {
8651 case OMPRT_OMP:
8652 CmdArgs.push_back("-lomp");
8653 break;
8654 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008655 CmdArgs.push_back("-lgomp");
8656
8657 // FIXME: Exclude this for platforms with libgomp that don't require
8658 // librt. Most modern Linux platforms require it, but some may not.
8659 CmdArgs.push_back("-lrt");
8660 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008661 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008662 CmdArgs.push_back("-liomp5");
8663 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008664 case OMPRT_Unknown:
8665 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008666 break;
8667 }
Chandler Carruth01538002013-01-17 13:19:29 +00008668 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008669
Renato Golinc4b49242014-02-13 10:01:16 +00008670 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008671
Richard Smith31d1de22015-05-20 22:48:44 +00008672 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008673 CmdArgs.push_back("-lpthread");
8674
8675 CmdArgs.push_back("-lc");
8676
8677 if (Args.hasArg(options::OPT_static))
8678 CmdArgs.push_back("--end-group");
8679 else
Renato Golinc4b49242014-02-13 10:01:16 +00008680 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008681 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008682
Rafael Espindola81937ec2010-12-01 01:52:43 +00008683 if (!Args.hasArg(options::OPT_nostartfiles)) {
8684 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008685 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008686 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008687 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008688 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008689 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008690 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008691
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008692 if (HasCRTBeginEndFiles)
8693 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008694 if (!isAndroid)
8695 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008696 }
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008697 } else if (Args.hasArg(options::OPT_rtlib_EQ))
8698 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008699
Peter Collingbourne39719a72015-11-20 20:49:39 +00008700 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008701}
8702
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008703// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8704// for the various SFI requirements like register masking. The assembly tool
8705// inserts the file containing the macros as an input into all the assembly
8706// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008707void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8708 const InputInfo &Output,
8709 const InputInfoList &Inputs,
8710 const ArgList &Args,
8711 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008712 const toolchains::NaClToolChain &ToolChain =
8713 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008714 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8715 "nacl-arm-macros.s");
8716 InputInfoList NewInputs;
8717 NewInputs.push_back(NaClMacros);
8718 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008719 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8720 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008721}
8722
Douglas Katzman750cfc52015-06-29 18:42:16 +00008723// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008724// we use static by default, do not yet support sanitizers or LTO, and a few
8725// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008726// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008727void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8728 const InputInfo &Output,
8729 const InputInfoList &Inputs,
8730 const ArgList &Args,
8731 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008732
Douglas Katzman54366072015-07-27 16:53:08 +00008733 const toolchains::NaClToolChain &ToolChain =
8734 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008735 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008736 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008737 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008738 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008739
8740 ArgStringList CmdArgs;
8741
8742 // Silence warning for "clang -g foo.o -o foo"
8743 Args.ClaimAllArgs(options::OPT_g_Group);
8744 // and "clang -emit-llvm foo.o -o foo"
8745 Args.ClaimAllArgs(options::OPT_emit_llvm);
8746 // and for "clang -w foo.o -o foo". Other warning options are already
8747 // handled somewhere else.
8748 Args.ClaimAllArgs(options::OPT_w);
8749
8750 if (!D.SysRoot.empty())
8751 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8752
8753 if (Args.hasArg(options::OPT_rdynamic))
8754 CmdArgs.push_back("-export-dynamic");
8755
8756 if (Args.hasArg(options::OPT_s))
8757 CmdArgs.push_back("-s");
8758
Douglas Katzman54366072015-07-27 16:53:08 +00008759 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8760 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008761 CmdArgs.push_back("--build-id");
8762
8763 if (!IsStatic)
8764 CmdArgs.push_back("--eh-frame-hdr");
8765
8766 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008767 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008768 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008769 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008770 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008771 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008772 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008773 else if (Arch == llvm::Triple::mipsel)
8774 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008775 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008776 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8777 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008778
8779 if (IsStatic)
8780 CmdArgs.push_back("-static");
8781 else if (Args.hasArg(options::OPT_shared))
8782 CmdArgs.push_back("-shared");
8783
8784 CmdArgs.push_back("-o");
8785 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00008786 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008787 if (!Args.hasArg(options::OPT_shared))
8788 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8789 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8790
8791 const char *crtbegin;
8792 if (IsStatic)
8793 crtbegin = "crtbeginT.o";
8794 else if (Args.hasArg(options::OPT_shared))
8795 crtbegin = "crtbeginS.o";
8796 else
8797 crtbegin = "crtbegin.o";
8798 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8799 }
8800
8801 Args.AddAllArgs(CmdArgs, options::OPT_L);
8802 Args.AddAllArgs(CmdArgs, options::OPT_u);
8803
Douglas Katzman6059ef92015-11-17 17:41:23 +00008804 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008805
8806 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8807 CmdArgs.push_back("--no-demangle");
8808
8809 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8810
Douglas Katzman78b37b02015-11-17 20:28:07 +00008811 if (D.CCCIsCXX() &&
8812 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008813 bool OnlyLibstdcxxStatic =
8814 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008815 if (OnlyLibstdcxxStatic)
8816 CmdArgs.push_back("-Bstatic");
8817 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8818 if (OnlyLibstdcxxStatic)
8819 CmdArgs.push_back("-Bdynamic");
8820 CmdArgs.push_back("-lm");
8821 }
8822
8823 if (!Args.hasArg(options::OPT_nostdlib)) {
8824 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8825 // Always use groups, since it has no effect on dynamic libraries.
8826 CmdArgs.push_back("--start-group");
8827 CmdArgs.push_back("-lc");
8828 // NaCl's libc++ currently requires libpthread, so just always include it
8829 // in the group for C++.
8830 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008831 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008832 // Gold, used by Mips, handles nested groups differently than ld, and
8833 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8834 // which is not a desired behaviour here.
8835 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8836 if (getToolChain().getArch() == llvm::Triple::mipsel)
8837 CmdArgs.push_back("-lnacl");
8838
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008839 CmdArgs.push_back("-lpthread");
8840 }
8841
8842 CmdArgs.push_back("-lgcc");
8843 CmdArgs.push_back("--as-needed");
8844 if (IsStatic)
8845 CmdArgs.push_back("-lgcc_eh");
8846 else
8847 CmdArgs.push_back("-lgcc_s");
8848 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008849
8850 // Mips needs to create and use pnacl_legacy library that contains
8851 // definitions from bitcode/pnaclmm.c and definitions for
8852 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8853 if (getToolChain().getArch() == llvm::Triple::mipsel)
8854 CmdArgs.push_back("-lpnacl_legacy");
8855
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008856 CmdArgs.push_back("--end-group");
8857 }
8858
8859 if (!Args.hasArg(options::OPT_nostartfiles)) {
8860 const char *crtend;
8861 if (Args.hasArg(options::OPT_shared))
8862 crtend = "crtendS.o";
8863 else
8864 crtend = "crtend.o";
8865
8866 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8867 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8868 }
8869 }
8870
Peter Collingbourne39719a72015-11-20 20:49:39 +00008871 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8872 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008873}
8874
Douglas Katzman95354292015-06-23 20:42:09 +00008875void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8876 const InputInfo &Output,
8877 const InputInfoList &Inputs,
8878 const ArgList &Args,
8879 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008880 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008881 ArgStringList CmdArgs;
8882
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008883 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008884
8885 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008886 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008887
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008888 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008889 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008890
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008891 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008892 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008893}
8894
Douglas Katzman95354292015-06-23 20:42:09 +00008895void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8896 const InputInfo &Output,
8897 const InputInfoList &Inputs,
8898 const ArgList &Args,
8899 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008900 const Driver &D = getToolChain().getDriver();
8901 ArgStringList CmdArgs;
8902
Daniel Dunbarb440f562010-08-02 02:38:21 +00008903 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008904 CmdArgs.push_back("-o");
8905 CmdArgs.push_back(Output.getFilename());
8906 } else {
8907 assert(Output.isNothing() && "Invalid output.");
8908 }
8909
Douglas Katzman78b37b02015-11-17 20:28:07 +00008910 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008911 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8912 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8913 CmdArgs.push_back(
8914 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8915 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008916 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008917
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008918 Args.AddAllArgs(CmdArgs,
8919 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008920
Daniel Dunbar54423b22010-09-17 00:24:54 +00008921 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008922
Xinliang David Li69306c02015-10-22 06:15:31 +00008923 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008924
Douglas Katzman78b37b02015-11-17 20:28:07 +00008925 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008926 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008927 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008928 CmdArgs.push_back("-lm");
8929 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008930 }
8931
Douglas Katzman78b37b02015-11-17 20:28:07 +00008932 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008933 if (Args.hasArg(options::OPT_pthread))
8934 CmdArgs.push_back("-lpthread");
8935 CmdArgs.push_back("-lc");
8936 CmdArgs.push_back("-lCompilerRT-Generic");
8937 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8938 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008939 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008940 }
8941
Logan Chieneb9162f2014-06-26 14:23:45 +00008942 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008943 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008944}
8945
Daniel Dunbarcc912342009-05-02 18:28:39 +00008946/// DragonFly Tools
8947
8948// For now, DragonFly Assemble does just about the same as for
8949// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008950void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8951 const InputInfo &Output,
8952 const InputInfoList &Inputs,
8953 const ArgList &Args,
8954 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008955 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008956 ArgStringList CmdArgs;
8957
8958 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8959 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008960 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008961 CmdArgs.push_back("--32");
8962
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008963 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008964
8965 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008966 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008967
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008968 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008969 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008970
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008971 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008972 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008973}
8974
Douglas Katzman95354292015-06-23 20:42:09 +00008975void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8976 const InputInfo &Output,
8977 const InputInfoList &Inputs,
8978 const ArgList &Args,
8979 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008980 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008981 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008982 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008983
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008984 if (!D.SysRoot.empty())
8985 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8986
John McCall65b8da02013-04-11 22:55:55 +00008987 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008988 if (Args.hasArg(options::OPT_static)) {
8989 CmdArgs.push_back("-Bstatic");
8990 } else {
John McCall65b8da02013-04-11 22:55:55 +00008991 if (Args.hasArg(options::OPT_rdynamic))
8992 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008993 if (Args.hasArg(options::OPT_shared))
8994 CmdArgs.push_back("-Bshareable");
8995 else {
8996 CmdArgs.push_back("-dynamic-linker");
8997 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8998 }
John McCall65b8da02013-04-11 22:55:55 +00008999 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009000 }
9001
9002 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9003 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009004 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009005 CmdArgs.push_back("-m");
9006 CmdArgs.push_back("elf_i386");
9007 }
9008
Daniel Dunbarb440f562010-08-02 02:38:21 +00009009 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009010 CmdArgs.push_back("-o");
9011 CmdArgs.push_back(Output.getFilename());
9012 } else {
9013 assert(Output.isNothing() && "Invalid output.");
9014 }
9015
Douglas Katzman78b37b02015-11-17 20:28:07 +00009016 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009017 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009018 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009019 CmdArgs.push_back(
9020 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009021 else {
9022 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009023 CmdArgs.push_back(
9024 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009025 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009026 CmdArgs.push_back(
9027 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009028 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009029 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009030 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009031 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009032 CmdArgs.push_back(
9033 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009034 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009035 CmdArgs.push_back(
9036 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009037 }
9038
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009039 Args.AddAllArgs(CmdArgs,
9040 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009041
Daniel Dunbar54423b22010-09-17 00:24:54 +00009042 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009043
Douglas Katzman78b37b02015-11-17 20:28:07 +00009044 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009045 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9046 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009047 if (UseGCC47)
9048 CmdArgs.push_back("-L/usr/lib/gcc47");
9049 else
9050 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009051
9052 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009053 if (UseGCC47) {
9054 CmdArgs.push_back("-rpath");
9055 CmdArgs.push_back("/usr/lib/gcc47");
9056 } else {
9057 CmdArgs.push_back("-rpath");
9058 CmdArgs.push_back("/usr/lib/gcc44");
9059 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009060 }
9061
Hans Wennborg70850d82013-07-18 20:29:38 +00009062 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009063 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009064 CmdArgs.push_back("-lm");
9065 }
9066
Daniel Dunbarcc912342009-05-02 18:28:39 +00009067 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009068 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009069
9070 if (!Args.hasArg(options::OPT_nolibc)) {
9071 CmdArgs.push_back("-lc");
9072 }
9073
John McCall65b8da02013-04-11 22:55:55 +00009074 if (UseGCC47) {
9075 if (Args.hasArg(options::OPT_static) ||
9076 Args.hasArg(options::OPT_static_libgcc)) {
9077 CmdArgs.push_back("-lgcc");
9078 CmdArgs.push_back("-lgcc_eh");
9079 } else {
9080 if (Args.hasArg(options::OPT_shared_libgcc)) {
9081 CmdArgs.push_back("-lgcc_pic");
9082 if (!Args.hasArg(options::OPT_shared))
9083 CmdArgs.push_back("-lgcc");
9084 } else {
9085 CmdArgs.push_back("-lgcc");
9086 CmdArgs.push_back("--as-needed");
9087 CmdArgs.push_back("-lgcc_pic");
9088 CmdArgs.push_back("--no-as-needed");
9089 }
9090 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009091 } else {
John McCall65b8da02013-04-11 22:55:55 +00009092 if (Args.hasArg(options::OPT_shared)) {
9093 CmdArgs.push_back("-lgcc_pic");
9094 } else {
9095 CmdArgs.push_back("-lgcc");
9096 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009097 }
9098 }
9099
Douglas Katzman78b37b02015-11-17 20:28:07 +00009100 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009101 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009102 CmdArgs.push_back(
9103 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009104 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009105 CmdArgs.push_back(
9106 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9107 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009108 }
9109
Xinliang David Li69306c02015-10-22 06:15:31 +00009110 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009111
Logan Chieneb9162f2014-06-26 14:23:45 +00009112 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009113 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009114}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009115
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009116// Try to find Exe from a Visual Studio distribution. This first tries to find
9117// an installed copy of Visual Studio and, failing that, looks in the PATH,
9118// making sure that whatever executable that's found is not a same-named exe
9119// from clang itself to prevent clang from falling back to itself.
9120static std::string FindVisualStudioExecutable(const ToolChain &TC,
9121 const char *Exe,
9122 const char *ClangProgramPath) {
9123 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9124 std::string visualStudioBinDir;
9125 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9126 visualStudioBinDir)) {
9127 SmallString<128> FilePath(visualStudioBinDir);
9128 llvm::sys::path::append(FilePath, Exe);
9129 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9130 return FilePath.str();
9131 }
9132
9133 return Exe;
9134}
9135
Douglas Katzman95354292015-06-23 20:42:09 +00009136void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9137 const InputInfo &Output,
9138 const InputInfoList &Inputs,
9139 const ArgList &Args,
9140 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009141 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009142 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009143
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009144 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9145 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009146 CmdArgs.push_back(
9147 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009148
Douglas Katzman78b37b02015-11-17 20:28:07 +00009149 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9150 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009151 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009152
Zachary Turner10d75b22014-10-22 20:40:43 +00009153 if (!llvm::sys::Process::GetEnv("LIB")) {
9154 // If the VC environment hasn't been configured (perhaps because the user
9155 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009156 // the environment variable is set however, assume the user knows what
9157 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009158 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009159 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009160 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9161 SmallString<128> LibDir(VisualStudioDir);
9162 llvm::sys::path::append(LibDir, "VC", "lib");
9163 switch (MSVC.getArch()) {
9164 case llvm::Triple::x86:
9165 // x86 just puts the libraries directly in lib
9166 break;
9167 case llvm::Triple::x86_64:
9168 llvm::sys::path::append(LibDir, "amd64");
9169 break;
9170 case llvm::Triple::arm:
9171 llvm::sys::path::append(LibDir, "arm");
9172 break;
9173 default:
9174 break;
9175 }
9176 CmdArgs.push_back(
9177 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009178
9179 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9180 std::string UniversalCRTLibPath;
9181 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9182 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9183 UniversalCRTLibPath.c_str()));
9184 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009185 }
9186
9187 std::string WindowsSdkLibPath;
9188 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9189 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9190 WindowsSdkLibPath.c_str()));
9191 }
9192
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009193 CmdArgs.push_back("-nologo");
9194
Reid Kleckner124955a2015-08-05 18:51:13 +00009195 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009196 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009197
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009198 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009199 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009200 if (DLL) {
9201 CmdArgs.push_back(Args.MakeArgString("-dll"));
9202
9203 SmallString<128> ImplibName(Output.getFilename());
9204 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009205 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009206 }
9207
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009208 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009209 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009210 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009211 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009212 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9213 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009214 // Make sure the dynamic runtime thunk is not optimized out at link time
9215 // to ensure proper SEH handling.
9216 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009217 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009218 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009219 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009220 for (const auto &Lib : {"asan", "asan_cxx"})
9221 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009222 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009223 }
9224
Hans Wennborg2e274592013-08-13 23:38:57 +00009225 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009226
Alexey Bataevc7e84352015-08-19 04:49:01 +00009227 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9228 options::OPT_fno_openmp, false)) {
9229 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9230 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9231 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9232 TC.getDriver().Dir + "/../lib"));
9233 switch (getOpenMPRuntime(getToolChain(), Args)) {
9234 case OMPRT_OMP:
9235 CmdArgs.push_back("-defaultlib:libomp.lib");
9236 break;
9237 case OMPRT_IOMP5:
9238 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9239 break;
9240 case OMPRT_GOMP:
9241 break;
9242 case OMPRT_Unknown:
9243 // Already diagnosed.
9244 break;
9245 }
9246 }
9247
Reid Kleckner337188f2014-09-16 19:22:00 +00009248 // Add filenames, libraries, and other linker inputs.
9249 for (const auto &Input : Inputs) {
9250 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009251 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009252 continue;
9253 }
9254
9255 const Arg &A = Input.getInputArg();
9256
9257 // Render -l options differently for the MSVC linker.
9258 if (A.getOption().matches(options::OPT_l)) {
9259 StringRef Lib = A.getValue();
9260 const char *LinkLibArg;
9261 if (Lib.endswith(".lib"))
9262 LinkLibArg = Args.MakeArgString(Lib);
9263 else
9264 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9265 CmdArgs.push_back(LinkLibArg);
9266 continue;
9267 }
9268
9269 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9270 // or -L. Render it, even if MSVC doesn't understand it.
9271 A.renderAsInput(Args, CmdArgs);
9272 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009273
Zachary Turner719f58c2014-12-01 23:06:47 +00009274 // We need to special case some linker paths. In the case of lld, we need to
9275 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9276 // linker, we need to use a special search algorithm.
9277 llvm::SmallString<128> linkPath;
9278 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9279 if (Linker.equals_lower("lld"))
9280 Linker = "lld-link";
9281
9282 if (Linker.equals_lower("link")) {
9283 // If we're using the MSVC linker, it's not sufficient to just use link
9284 // from the program PATH, because other environments like GnuWin32 install
9285 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009286 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009287 C.getDriver().getClangProgramPath());
9288 } else {
9289 linkPath = Linker;
9290 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009291 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009292 }
9293
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009294 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009295 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009296}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009297
Douglas Katzman95354292015-06-23 20:42:09 +00009298void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9299 const InputInfo &Output,
9300 const InputInfoList &Inputs,
9301 const ArgList &Args,
9302 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009303 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9304}
9305
Douglas Katzman95354292015-06-23 20:42:09 +00009306std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009307 Compilation &C, const JobAction &JA, const InputInfo &Output,
9308 const InputInfoList &Inputs, const ArgList &Args,
9309 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009310 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009311 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009312 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009313 CmdArgs.push_back("/W0"); // No warnings.
9314
9315 // The goal is to be able to invoke this tool correctly based on
9316 // any flag accepted by clang-cl.
9317
9318 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009319 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009320
9321 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009322 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9323 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9324 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009325 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9326 if (A->getOption().getID() == options::OPT_O0) {
9327 CmdArgs.push_back("/Od");
9328 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009329 CmdArgs.push_back("/Og");
9330
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009331 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009332 if (OptLevel == "s" || OptLevel == "z")
9333 CmdArgs.push_back("/Os");
9334 else
9335 CmdArgs.push_back("/Ot");
9336
9337 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009338 }
9339 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009340 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9341 options::OPT_fno_omit_frame_pointer))
9342 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9343 ? "/Oy"
9344 : "/Oy-");
9345 if (!Args.hasArg(options::OPT_fwritable_strings))
9346 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009347
Nico Weber3f8dafb2015-03-12 19:37:10 +00009348 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009349 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9350
David Majnemerf6072342014-07-01 22:24:56 +00009351 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9352 /*default=*/false))
9353 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009354 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9355 options::OPT_fno_function_sections))
9356 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9357 ? "/Gy"
9358 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009359 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9360 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009361 CmdArgs.push_back(
9362 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009363 if (Args.hasArg(options::OPT_fsyntax_only))
9364 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009365 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9366 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009367 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009368
Nico Weber3f8dafb2015-03-12 19:37:10 +00009369 std::vector<std::string> Includes =
9370 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009371 for (const auto &Include : Includes)
9372 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009373
Hans Wennborg87cfa712013-09-19 20:32:16 +00009374 // Flags that can simply be passed through.
9375 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9376 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009377 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009378 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009379
9380 // The order of these flags is relevant, so pick the last one.
9381 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9382 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9383 A->render(Args, CmdArgs);
9384
Hans Wennborg87cfa712013-09-19 20:32:16 +00009385 // Input filename.
9386 assert(Inputs.size() == 1);
9387 const InputInfo &II = Inputs[0];
9388 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9389 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9390 if (II.isFilename())
9391 CmdArgs.push_back(II.getFilename());
9392 else
9393 II.getInputArg().renderAsInput(Args, CmdArgs);
9394
9395 // Output filename.
9396 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009397 const char *Fo =
9398 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009399 CmdArgs.push_back(Fo);
9400
Hans Wennborg188382e2013-09-20 18:16:35 +00009401 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009402 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9403 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009404 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009405 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009406}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009407
Yaron Keren1c0070c2015-07-02 04:45:27 +00009408/// MinGW Tools
9409void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9410 const InputInfo &Output,
9411 const InputInfoList &Inputs,
9412 const ArgList &Args,
9413 const char *LinkingOutput) const {
9414 claimNoWarnArgs(Args);
9415 ArgStringList CmdArgs;
9416
9417 if (getToolChain().getArch() == llvm::Triple::x86) {
9418 CmdArgs.push_back("--32");
9419 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9420 CmdArgs.push_back("--64");
9421 }
9422
9423 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9424
9425 CmdArgs.push_back("-o");
9426 CmdArgs.push_back(Output.getFilename());
9427
9428 for (const auto &II : Inputs)
9429 CmdArgs.push_back(II.getFilename());
9430
9431 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009432 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009433
9434 if (Args.hasArg(options::OPT_gsplit_dwarf))
9435 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9436 SplitDebugName(Args, Inputs[0]));
9437}
9438
9439void MinGW::Linker::AddLibGCC(const ArgList &Args,
9440 ArgStringList &CmdArgs) const {
9441 if (Args.hasArg(options::OPT_mthreads))
9442 CmdArgs.push_back("-lmingwthrd");
9443 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009444
Yaron Kerenaa281332015-08-09 00:24:07 +00009445 // Make use of compiler-rt if --rtlib option is used
9446 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9447 if (RLT == ToolChain::RLT_Libgcc) {
9448 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9449 Args.hasArg(options::OPT_static);
9450 bool Shared = Args.hasArg(options::OPT_shared);
9451 bool CXX = getToolChain().getDriver().CCCIsCXX();
9452
9453 if (Static || (!CXX && !Shared)) {
9454 CmdArgs.push_back("-lgcc");
9455 CmdArgs.push_back("-lgcc_eh");
9456 } else {
9457 CmdArgs.push_back("-lgcc_s");
9458 CmdArgs.push_back("-lgcc");
9459 }
9460 } else {
9461 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9462 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009463
Yaron Keren1c0070c2015-07-02 04:45:27 +00009464 CmdArgs.push_back("-lmoldname");
9465 CmdArgs.push_back("-lmingwex");
9466 CmdArgs.push_back("-lmsvcrt");
9467}
9468
9469void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9470 const InputInfo &Output,
9471 const InputInfoList &Inputs,
9472 const ArgList &Args,
9473 const char *LinkingOutput) const {
9474 const ToolChain &TC = getToolChain();
9475 const Driver &D = TC.getDriver();
9476 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9477
9478 ArgStringList CmdArgs;
9479
9480 // Silence warning for "clang -g foo.o -o foo"
9481 Args.ClaimAllArgs(options::OPT_g_Group);
9482 // and "clang -emit-llvm foo.o -o foo"
9483 Args.ClaimAllArgs(options::OPT_emit_llvm);
9484 // and for "clang -w foo.o -o foo". Other warning options are already
9485 // handled somewhere else.
9486 Args.ClaimAllArgs(options::OPT_w);
9487
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009488 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9489 if (LinkerName.equals_lower("lld")) {
9490 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009491 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009492 } else if (!LinkerName.equals_lower("ld")) {
9493 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009494 }
9495
Yaron Keren1c0070c2015-07-02 04:45:27 +00009496 if (!D.SysRoot.empty())
9497 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9498
9499 if (Args.hasArg(options::OPT_s))
9500 CmdArgs.push_back("-s");
9501
9502 CmdArgs.push_back("-m");
9503 if (TC.getArch() == llvm::Triple::x86)
9504 CmdArgs.push_back("i386pe");
9505 if (TC.getArch() == llvm::Triple::x86_64)
9506 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009507 if (TC.getArch() == llvm::Triple::arm)
9508 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009509
9510 if (Args.hasArg(options::OPT_mwindows)) {
9511 CmdArgs.push_back("--subsystem");
9512 CmdArgs.push_back("windows");
9513 } else if (Args.hasArg(options::OPT_mconsole)) {
9514 CmdArgs.push_back("--subsystem");
9515 CmdArgs.push_back("console");
9516 }
9517
9518 if (Args.hasArg(options::OPT_static))
9519 CmdArgs.push_back("-Bstatic");
9520 else {
9521 if (Args.hasArg(options::OPT_mdll))
9522 CmdArgs.push_back("--dll");
9523 else if (Args.hasArg(options::OPT_shared))
9524 CmdArgs.push_back("--shared");
9525 CmdArgs.push_back("-Bdynamic");
9526 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9527 CmdArgs.push_back("-e");
9528 if (TC.getArch() == llvm::Triple::x86)
9529 CmdArgs.push_back("_DllMainCRTStartup@12");
9530 else
9531 CmdArgs.push_back("DllMainCRTStartup");
9532 CmdArgs.push_back("--enable-auto-image-base");
9533 }
9534 }
9535
9536 CmdArgs.push_back("-o");
9537 CmdArgs.push_back(Output.getFilename());
9538
9539 Args.AddAllArgs(CmdArgs, options::OPT_e);
9540 // FIXME: add -N, -n flags
9541 Args.AddLastArg(CmdArgs, options::OPT_r);
9542 Args.AddLastArg(CmdArgs, options::OPT_s);
9543 Args.AddLastArg(CmdArgs, options::OPT_t);
9544 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9545 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9546
Douglas Katzman78b37b02015-11-17 20:28:07 +00009547 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009548 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9549 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9550 } else {
9551 if (Args.hasArg(options::OPT_municode))
9552 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9553 else
9554 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9555 }
9556 if (Args.hasArg(options::OPT_pg))
9557 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9558 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9559 }
9560
9561 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009562 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009563 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9564
9565 // TODO: Add ASan stuff here
9566
9567 // TODO: Add profile stuff here
9568
Douglas Katzman78b37b02015-11-17 20:28:07 +00009569 if (D.CCCIsCXX() &&
9570 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009571 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9572 !Args.hasArg(options::OPT_static);
9573 if (OnlyLibstdcxxStatic)
9574 CmdArgs.push_back("-Bstatic");
9575 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9576 if (OnlyLibstdcxxStatic)
9577 CmdArgs.push_back("-Bdynamic");
9578 }
9579
9580 if (!Args.hasArg(options::OPT_nostdlib)) {
9581 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9582 if (Args.hasArg(options::OPT_static))
9583 CmdArgs.push_back("--start-group");
9584
9585 if (Args.hasArg(options::OPT_fstack_protector) ||
9586 Args.hasArg(options::OPT_fstack_protector_strong) ||
9587 Args.hasArg(options::OPT_fstack_protector_all)) {
9588 CmdArgs.push_back("-lssp_nonshared");
9589 CmdArgs.push_back("-lssp");
9590 }
9591 if (Args.hasArg(options::OPT_fopenmp))
9592 CmdArgs.push_back("-lgomp");
9593
9594 AddLibGCC(Args, CmdArgs);
9595
9596 if (Args.hasArg(options::OPT_pg))
9597 CmdArgs.push_back("-lgmon");
9598
Yaron Kerenadce68e2015-07-06 18:52:19 +00009599 if (Args.hasArg(options::OPT_pthread))
9600 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009601
9602 // add system libraries
9603 if (Args.hasArg(options::OPT_mwindows)) {
9604 CmdArgs.push_back("-lgdi32");
9605 CmdArgs.push_back("-lcomdlg32");
9606 }
9607 CmdArgs.push_back("-ladvapi32");
9608 CmdArgs.push_back("-lshell32");
9609 CmdArgs.push_back("-luser32");
9610 CmdArgs.push_back("-lkernel32");
9611
9612 if (Args.hasArg(options::OPT_static))
9613 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009614 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009615 AddLibGCC(Args, CmdArgs);
9616 }
9617
9618 if (!Args.hasArg(options::OPT_nostartfiles)) {
9619 // Add crtfastmath.o if available and fast math is enabled.
9620 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9621
9622 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9623 }
9624 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009625 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009626 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009627}
9628
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009629/// XCore Tools
9630// We pass assemble and link construction to the xcc tool.
9631
Douglas Katzman95354292015-06-23 20:42:09 +00009632void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9633 const InputInfo &Output,
9634 const InputInfoList &Inputs,
9635 const ArgList &Args,
9636 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009637 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009638 ArgStringList CmdArgs;
9639
9640 CmdArgs.push_back("-o");
9641 CmdArgs.push_back(Output.getFilename());
9642
9643 CmdArgs.push_back("-c");
9644
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009645 if (Args.hasArg(options::OPT_v))
9646 CmdArgs.push_back("-v");
9647
Robert Lytton894d25c2014-05-02 09:33:25 +00009648 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9649 if (!A->getOption().matches(options::OPT_g0))
9650 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009651
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009652 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9653 false))
9654 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009656 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009657
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009658 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009659 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009660
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009661 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009662 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009663}
9664
Douglas Katzman95354292015-06-23 20:42:09 +00009665void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9666 const InputInfo &Output,
9667 const InputInfoList &Inputs,
9668 const ArgList &Args,
9669 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009670 ArgStringList CmdArgs;
9671
9672 if (Output.isFilename()) {
9673 CmdArgs.push_back("-o");
9674 CmdArgs.push_back(Output.getFilename());
9675 } else {
9676 assert(Output.isNothing() && "Invalid output.");
9677 }
9678
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009679 if (Args.hasArg(options::OPT_v))
9680 CmdArgs.push_back("-v");
9681
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009682 // Pass -fexceptions through to the linker if it was present.
9683 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9684 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009685 CmdArgs.push_back("-fexceptions");
9686
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009687 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9688
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009689 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009690 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009691}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009692
Douglas Katzman95354292015-06-23 20:42:09 +00009693void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9694 const InputInfo &Output,
9695 const InputInfoList &Inputs,
9696 const ArgList &Args,
9697 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009698 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009699 const auto &TC =
9700 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9701 ArgStringList CmdArgs;
9702 const char *Exec;
9703
9704 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009705 default:
9706 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009707 case llvm::Triple::arm:
9708 case llvm::Triple::thumb:
9709 break;
9710 case llvm::Triple::x86:
9711 CmdArgs.push_back("--32");
9712 break;
9713 case llvm::Triple::x86_64:
9714 CmdArgs.push_back("--64");
9715 break;
9716 }
9717
9718 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9719
9720 CmdArgs.push_back("-o");
9721 CmdArgs.push_back(Output.getFilename());
9722
9723 for (const auto &Input : Inputs)
9724 CmdArgs.push_back(Input.getFilename());
9725
9726 const std::string Assembler = TC.GetProgramPath("as");
9727 Exec = Args.MakeArgString(Assembler);
9728
Justin Bognerd3371d82015-07-17 03:35:54 +00009729 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009730}
9731
Douglas Katzman95354292015-06-23 20:42:09 +00009732void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9733 const InputInfo &Output,
9734 const InputInfoList &Inputs,
9735 const ArgList &Args,
9736 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009737 const auto &TC =
9738 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9739 const llvm::Triple &T = TC.getTriple();
9740 const Driver &D = TC.getDriver();
9741 SmallString<128> EntryPoint;
9742 ArgStringList CmdArgs;
9743 const char *Exec;
9744
9745 // Silence warning for "clang -g foo.o -o foo"
9746 Args.ClaimAllArgs(options::OPT_g_Group);
9747 // and "clang -emit-llvm foo.o -o foo"
9748 Args.ClaimAllArgs(options::OPT_emit_llvm);
9749 // and for "clang -w foo.o -o foo"
9750 Args.ClaimAllArgs(options::OPT_w);
9751 // Other warning options are already handled somewhere else.
9752
9753 if (!D.SysRoot.empty())
9754 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9755
9756 if (Args.hasArg(options::OPT_pie))
9757 CmdArgs.push_back("-pie");
9758 if (Args.hasArg(options::OPT_rdynamic))
9759 CmdArgs.push_back("-export-dynamic");
9760 if (Args.hasArg(options::OPT_s))
9761 CmdArgs.push_back("--strip-all");
9762
9763 CmdArgs.push_back("-m");
9764 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009765 default:
9766 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009767 case llvm::Triple::arm:
9768 case llvm::Triple::thumb:
9769 // FIXME: this is incorrect for WinCE
9770 CmdArgs.push_back("thumb2pe");
9771 break;
9772 case llvm::Triple::x86:
9773 CmdArgs.push_back("i386pe");
9774 EntryPoint.append("_");
9775 break;
9776 case llvm::Triple::x86_64:
9777 CmdArgs.push_back("i386pep");
9778 break;
9779 }
9780
9781 if (Args.hasArg(options::OPT_shared)) {
9782 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009783 default:
9784 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009785 case llvm::Triple::arm:
9786 case llvm::Triple::thumb:
9787 case llvm::Triple::x86_64:
9788 EntryPoint.append("_DllMainCRTStartup");
9789 break;
9790 case llvm::Triple::x86:
9791 EntryPoint.append("_DllMainCRTStartup@12");
9792 break;
9793 }
9794
9795 CmdArgs.push_back("-shared");
9796 CmdArgs.push_back("-Bdynamic");
9797
9798 CmdArgs.push_back("--enable-auto-image-base");
9799
9800 CmdArgs.push_back("--entry");
9801 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9802 } else {
9803 EntryPoint.append("mainCRTStartup");
9804
9805 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9806 : "-Bdynamic");
9807
Douglas Katzman78b37b02015-11-17 20:28:07 +00009808 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009809 CmdArgs.push_back("--entry");
9810 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9811 }
9812
9813 // FIXME: handle subsystem
9814 }
9815
9816 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009817 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009818
9819 CmdArgs.push_back("-o");
9820 CmdArgs.push_back(Output.getFilename());
9821
9822 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9823 SmallString<261> ImpLib(Output.getFilename());
9824 llvm::sys::path::replace_extension(ImpLib, ".lib");
9825
9826 CmdArgs.push_back("--out-implib");
9827 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9828 }
9829
Douglas Katzman78b37b02015-11-17 20:28:07 +00009830 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009831 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9832 const char *CRTBegin;
9833
9834 CRTBegin =
9835 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9836 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9837 }
9838
9839 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009840 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009841 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9842
9843 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9844 !Args.hasArg(options::OPT_nodefaultlibs)) {
9845 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9846 !Args.hasArg(options::OPT_static);
9847 if (StaticCXX)
9848 CmdArgs.push_back("-Bstatic");
9849 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9850 if (StaticCXX)
9851 CmdArgs.push_back("-Bdynamic");
9852 }
9853
9854 if (!Args.hasArg(options::OPT_nostdlib)) {
9855 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9856 // TODO handle /MT[d] /MD[d]
9857 CmdArgs.push_back("-lmsvcrt");
9858 AddRunTimeLibs(TC, D, CmdArgs, Args);
9859 }
9860 }
9861
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009862 if (TC.getSanitizerArgs().needsAsanRt()) {
9863 // TODO handle /MT[d] /MD[d]
9864 if (Args.hasArg(options::OPT_shared)) {
9865 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9866 } else {
9867 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9868 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9869 // Make sure the dynamic runtime thunk is not optimized out at link time
9870 // to ensure proper SEH handling.
9871 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9872 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9873 ? "___asan_seh_interceptor"
9874 : "__asan_seh_interceptor"));
9875 }
9876 }
9877
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009878 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009879
Justin Bognerd3371d82015-07-17 03:35:54 +00009880 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009881}
Douglas Katzman84a75642015-06-19 14:55:19 +00009882
Douglas Katzman95354292015-06-23 20:42:09 +00009883void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9884 const InputInfo &Output,
9885 const InputInfoList &Inputs,
9886 const ArgList &Args,
9887 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009888 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +00009889 assert(Inputs.size() == 1);
9890 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009891 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
9892 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +00009893
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009894 if (JA.getKind() == Action::PreprocessJobClass) {
9895 Args.ClaimAllArgs();
9896 CmdArgs.push_back("-E");
9897 } else {
9898 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9899 CmdArgs.push_back("-S");
9900 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9901 }
Douglas Katzman84a75642015-06-19 14:55:19 +00009902 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009903 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +00009904
Douglas Katzmanf6071112015-08-03 14:34:22 +00009905 // Append all -I, -iquote, -isystem paths, defines/undefines,
9906 // 'f' flags, optimize flags, and warning options.
9907 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009908 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +00009909 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +00009910 options::OPT_f_Group, options::OPT_f_clang_Group,
9911 options::OPT_g_Group, options::OPT_M_Group,
9912 options::OPT_O_Group, options::OPT_W_Group});
9913
9914 // If we're producing a dependency file, and assembly is the final action,
9915 // then the name of the target in the dependency file should be the '.o'
9916 // file, not the '.s' file produced by this step. For example, instead of
9917 // /tmp/mumble.s: mumble.c .../someheader.h
9918 // the filename on the lefthand side should be "mumble.o"
9919 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9920 C.getActions().size() == 1 &&
9921 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9922 Arg *A = Args.getLastArg(options::OPT_o);
9923 if (A) {
9924 CmdArgs.push_back("-MT");
9925 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9926 }
9927 }
9928
Douglas Katzman84a75642015-06-19 14:55:19 +00009929 CmdArgs.push_back(II.getFilename());
9930 CmdArgs.push_back("-o");
9931 CmdArgs.push_back(Output.getFilename());
9932
9933 std::string Exec =
9934 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009935 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9936 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009937}
9938
Douglas Katzman95354292015-06-23 20:42:09 +00009939void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9940 const InputInfo &Output,
9941 const InputInfoList &Inputs,
9942 const ArgList &Args,
9943 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009944 ArgStringList CmdArgs;
9945
9946 assert(Inputs.size() == 1);
9947 const InputInfo &II = Inputs[0];
9948 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9949 assert(Output.getType() == types::TY_Object);
9950
9951 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009952 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009953 CmdArgs.push_back("-noSPrefixing");
9954 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009955 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9956 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9957 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009958 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009959 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009960 }
9961 CmdArgs.push_back("-elf"); // Output format.
9962 CmdArgs.push_back(II.getFilename());
9963 CmdArgs.push_back(
9964 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9965
9966 std::string Exec =
9967 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009968 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9969 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009970}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009971
9972void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9973 const InputInfo &Output,
9974 const InputInfoList &Inputs,
9975 const ArgList &Args,
9976 const char *LinkingOutput) const {
9977 const auto &TC =
9978 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9979 const llvm::Triple &T = TC.getTriple();
9980 ArgStringList CmdArgs;
Douglas Katzman9d403742015-11-17 22:33:34 +00009981 bool UseStartfiles = !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +00009982 bool UseDefaultLibs =
9983 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009984
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009985 if (T.getArch() == llvm::Triple::sparc)
9986 CmdArgs.push_back("-EB");
9987 else // SHAVE assumes little-endian, and sparcel is expressly so.
9988 CmdArgs.push_back("-EL");
9989
9990 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9991 // but we never pass through a --sysroot option and various other bits.
9992 // For example, there are no sanitizers (yet) nor gold linker.
9993
9994 // Eat some arguments that may be present but have no effect.
9995 Args.ClaimAllArgs(options::OPT_g_Group);
9996 Args.ClaimAllArgs(options::OPT_w);
9997 Args.ClaimAllArgs(options::OPT_static_libgcc);
9998
9999 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10000 CmdArgs.push_back("-s");
10001
10002 CmdArgs.push_back("-o");
10003 CmdArgs.push_back(Output.getFilename());
10004
10005 if (UseStartfiles) {
10006 // If you want startfiles, it means you want the builtin crti and crtbegin,
10007 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010008 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10009 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010010 }
10011
10012 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10013 options::OPT_e, options::OPT_s, options::OPT_t,
10014 options::OPT_Z_Flag, options::OPT_r});
10015
Douglas Katzman674a3122015-11-18 16:24:46 +000010016 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010017
10018 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10019
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010020 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010021 if (C.getDriver().CCCIsCXX())
10022 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010023 if (T.getOS() == llvm::Triple::RTEMS) {
10024 CmdArgs.push_back("--start-group");
10025 CmdArgs.push_back("-lc");
10026 // You must provide your own "-L" option to enable finding these.
10027 CmdArgs.push_back("-lrtemscpu");
10028 CmdArgs.push_back("-lrtemsbsp");
10029 CmdArgs.push_back("--end-group");
10030 } else {
10031 CmdArgs.push_back("-lc");
10032 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010033 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010034 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010035 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010036 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10037 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010038 }
10039
10040 std::string Exec =
10041 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10042 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10043 CmdArgs, Inputs));
10044}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010045
10046void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10047 const InputInfo &Output,
10048 const InputInfoList &Inputs,
10049 const ArgList &Args,
10050 const char *LinkingOutput) const {
10051 claimNoWarnArgs(Args);
10052 ArgStringList CmdArgs;
10053
10054 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10055
10056 CmdArgs.push_back("-o");
10057 CmdArgs.push_back(Output.getFilename());
10058
10059 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10060 const InputInfo &Input = Inputs[0];
10061 assert(Input.isFilename() && "Invalid input.");
10062 CmdArgs.push_back(Input.getFilename());
10063
10064 const char *Exec =
10065 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10066 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10067}
10068
10069static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
10070 ArgStringList &CmdArgs) {
10071 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
10072 false) ||
10073 Args.hasArg(options::OPT_fprofile_generate) ||
10074 Args.hasArg(options::OPT_fprofile_instr_generate) ||
10075 Args.hasArg(options::OPT_fcreate_profile) ||
10076 Args.hasArg(options::OPT_coverage)))
10077 return;
10078
10079 assert(TC.getTriple().isPS4CPU() &&
10080 "Profiling libraries are only implemented for the PS4 CPU");
10081 CmdArgs.push_back("-lclang_rt.profile-x86_64");
10082}
10083
10084static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10085 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10086 if (SanArgs.needsUbsanRt()) {
10087 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10088 }
10089 if (SanArgs.needsAsanRt()) {
10090 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10091 }
10092}
10093
10094static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10095 const JobAction &JA, const InputInfo &Output,
10096 const InputInfoList &Inputs,
10097 const ArgList &Args,
10098 const char *LinkingOutput) {
10099 const toolchains::FreeBSD &ToolChain =
10100 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10101 const Driver &D = ToolChain.getDriver();
10102 ArgStringList CmdArgs;
10103
10104 // Silence warning for "clang -g foo.o -o foo"
10105 Args.ClaimAllArgs(options::OPT_g_Group);
10106 // and "clang -emit-llvm foo.o -o foo"
10107 Args.ClaimAllArgs(options::OPT_emit_llvm);
10108 // and for "clang -w foo.o -o foo". Other warning options are already
10109 // handled somewhere else.
10110 Args.ClaimAllArgs(options::OPT_w);
10111
10112 if (!D.SysRoot.empty())
10113 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10114
10115 if (Args.hasArg(options::OPT_pie))
10116 CmdArgs.push_back("-pie");
10117
10118 if (Args.hasArg(options::OPT_rdynamic))
10119 CmdArgs.push_back("-export-dynamic");
10120 if (Args.hasArg(options::OPT_shared))
10121 CmdArgs.push_back("--oformat=so");
10122
10123 if (Output.isFilename()) {
10124 CmdArgs.push_back("-o");
10125 CmdArgs.push_back(Output.getFilename());
10126 } else {
10127 assert(Output.isNothing() && "Invalid output.");
10128 }
10129
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010130 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10131
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010132 Args.AddAllArgs(CmdArgs, options::OPT_L);
10133 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10134 Args.AddAllArgs(CmdArgs, options::OPT_e);
10135 Args.AddAllArgs(CmdArgs, options::OPT_s);
10136 Args.AddAllArgs(CmdArgs, options::OPT_t);
10137 Args.AddAllArgs(CmdArgs, options::OPT_r);
10138
10139 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10140 CmdArgs.push_back("--no-demangle");
10141
10142 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10143
10144 if (Args.hasArg(options::OPT_pthread)) {
10145 CmdArgs.push_back("-lpthread");
10146 }
10147
10148 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010149
10150 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10151
10152 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10153}
10154
10155static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10156 const JobAction &JA, const InputInfo &Output,
10157 const InputInfoList &Inputs,
10158 const ArgList &Args,
10159 const char *LinkingOutput) {
10160 const toolchains::FreeBSD &ToolChain =
10161 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10162 const Driver &D = ToolChain.getDriver();
10163 ArgStringList CmdArgs;
10164
10165 // Silence warning for "clang -g foo.o -o foo"
10166 Args.ClaimAllArgs(options::OPT_g_Group);
10167 // and "clang -emit-llvm foo.o -o foo"
10168 Args.ClaimAllArgs(options::OPT_emit_llvm);
10169 // and for "clang -w foo.o -o foo". Other warning options are already
10170 // handled somewhere else.
10171 Args.ClaimAllArgs(options::OPT_w);
10172
10173 if (!D.SysRoot.empty())
10174 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10175
10176 if (Args.hasArg(options::OPT_pie))
10177 CmdArgs.push_back("-pie");
10178
10179 if (Args.hasArg(options::OPT_static)) {
10180 CmdArgs.push_back("-Bstatic");
10181 } else {
10182 if (Args.hasArg(options::OPT_rdynamic))
10183 CmdArgs.push_back("-export-dynamic");
10184 CmdArgs.push_back("--eh-frame-hdr");
10185 if (Args.hasArg(options::OPT_shared)) {
10186 CmdArgs.push_back("-Bshareable");
10187 } else {
10188 CmdArgs.push_back("-dynamic-linker");
10189 CmdArgs.push_back("/libexec/ld-elf.so.1");
10190 }
10191 CmdArgs.push_back("--enable-new-dtags");
10192 }
10193
10194 if (Output.isFilename()) {
10195 CmdArgs.push_back("-o");
10196 CmdArgs.push_back(Output.getFilename());
10197 } else {
10198 assert(Output.isNothing() && "Invalid output.");
10199 }
10200
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010201 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10202
Douglas Katzman78b37b02015-11-17 20:28:07 +000010203 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010204 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010205 if (!Args.hasArg(options::OPT_shared)) {
10206 if (Args.hasArg(options::OPT_pg))
10207 crt1 = "gcrt1.o";
10208 else if (Args.hasArg(options::OPT_pie))
10209 crt1 = "Scrt1.o";
10210 else
10211 crt1 = "crt1.o";
10212 }
10213 if (crt1)
10214 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10215
10216 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10217
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010218 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010219 if (Args.hasArg(options::OPT_static))
10220 crtbegin = "crtbeginT.o";
10221 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10222 crtbegin = "crtbeginS.o";
10223 else
10224 crtbegin = "crtbegin.o";
10225
10226 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10227 }
10228
10229 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010230 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010231 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10232 Args.AddAllArgs(CmdArgs, options::OPT_e);
10233 Args.AddAllArgs(CmdArgs, options::OPT_s);
10234 Args.AddAllArgs(CmdArgs, options::OPT_t);
10235 Args.AddAllArgs(CmdArgs, options::OPT_r);
10236
10237 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10238 CmdArgs.push_back("--no-demangle");
10239
10240 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10241
Douglas Katzman78b37b02015-11-17 20:28:07 +000010242 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010243 // For PS4, we always want to pass libm, libstdc++ and libkernel
10244 // libraries for both C and C++ compilations.
10245 CmdArgs.push_back("-lkernel");
10246 if (D.CCCIsCXX()) {
10247 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10248 if (Args.hasArg(options::OPT_pg))
10249 CmdArgs.push_back("-lm_p");
10250 else
10251 CmdArgs.push_back("-lm");
10252 }
10253 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10254 // the default system libraries. Just mimic this for now.
10255 if (Args.hasArg(options::OPT_pg))
10256 CmdArgs.push_back("-lgcc_p");
10257 else
10258 CmdArgs.push_back("-lcompiler_rt");
10259 if (Args.hasArg(options::OPT_static)) {
10260 CmdArgs.push_back("-lstdc++");
10261 } else if (Args.hasArg(options::OPT_pg)) {
10262 CmdArgs.push_back("-lgcc_eh_p");
10263 } else {
10264 CmdArgs.push_back("--as-needed");
10265 CmdArgs.push_back("-lstdc++");
10266 CmdArgs.push_back("--no-as-needed");
10267 }
10268
10269 if (Args.hasArg(options::OPT_pthread)) {
10270 if (Args.hasArg(options::OPT_pg))
10271 CmdArgs.push_back("-lpthread_p");
10272 else
10273 CmdArgs.push_back("-lpthread");
10274 }
10275
10276 if (Args.hasArg(options::OPT_pg)) {
10277 if (Args.hasArg(options::OPT_shared))
10278 CmdArgs.push_back("-lc");
10279 else {
10280 if (Args.hasArg(options::OPT_static)) {
10281 CmdArgs.push_back("--start-group");
10282 CmdArgs.push_back("-lc_p");
10283 CmdArgs.push_back("-lpthread_p");
10284 CmdArgs.push_back("--end-group");
10285 } else {
10286 CmdArgs.push_back("-lc_p");
10287 }
10288 }
10289 CmdArgs.push_back("-lgcc_p");
10290 } else {
10291 if (Args.hasArg(options::OPT_static)) {
10292 CmdArgs.push_back("--start-group");
10293 CmdArgs.push_back("-lc");
10294 CmdArgs.push_back("-lpthread");
10295 CmdArgs.push_back("--end-group");
10296 } else {
10297 CmdArgs.push_back("-lc");
10298 }
10299 CmdArgs.push_back("-lcompiler_rt");
10300 }
10301
10302 if (Args.hasArg(options::OPT_static)) {
10303 CmdArgs.push_back("-lstdc++");
10304 } else if (Args.hasArg(options::OPT_pg)) {
10305 CmdArgs.push_back("-lgcc_eh_p");
10306 } else {
10307 CmdArgs.push_back("--as-needed");
10308 CmdArgs.push_back("-lstdc++");
10309 CmdArgs.push_back("--no-as-needed");
10310 }
10311 }
10312
Douglas Katzman78b37b02015-11-17 20:28:07 +000010313 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010314 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10315 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10316 else
10317 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10318 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10319 }
10320
10321 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010322
10323 const char *Exec =
10324#ifdef LLVM_ON_WIN32
10325 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10326#else
10327 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10328#endif
10329
10330 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10331}
10332
10333void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10334 const InputInfo &Output,
10335 const InputInfoList &Inputs,
10336 const ArgList &Args,
10337 const char *LinkingOutput) const {
10338 const toolchains::FreeBSD &ToolChain =
10339 static_cast<const toolchains::FreeBSD &>(getToolChain());
10340 const Driver &D = ToolChain.getDriver();
10341 bool PS4Linker;
10342 StringRef LinkerOptName;
10343 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10344 LinkerOptName = A->getValue();
10345 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10346 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10347 }
10348
10349 if (LinkerOptName == "gold")
10350 PS4Linker = false;
10351 else if (LinkerOptName == "ps4")
10352 PS4Linker = true;
10353 else
10354 PS4Linker = !Args.hasArg(options::OPT_shared);
10355
10356 if (PS4Linker)
10357 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10358 else
10359 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10360}