blob: 41a4e9a51c8a07b9419af45a097b82341839d3a4 [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) {
Eric Christopherc1984072015-12-08 02:10:19 +0000218 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000219 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000220 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000221
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000222 // Add filenames immediately.
223 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000224 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000225 continue;
226 }
227
228 // Otherwise, this is a linker input argument.
229 const Arg &A = II.getInputArg();
230
231 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000232 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000233 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000234 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000235 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000236 else if (A.getOption().matches(options::OPT_z)) {
237 // Pass -z prefix for gcc linker compatibility.
238 A.claim();
239 A.render(Args, CmdArgs);
240 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000241 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000242 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000243 }
Bill Wendling281ca292012-03-12 21:22:35 +0000244
245 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000246 // and only supported on native toolchains.
247 if (!TC.isCrossCompiling())
248 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000249}
250
John McCall31168b02011-06-15 23:02:42 +0000251/// \brief Determine whether Objective-C automated reference counting is
252/// enabled.
253static bool isObjCAutoRefCount(const ArgList &Args) {
254 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
255}
256
Ted Kremeneke65b0862012-03-06 20:05:56 +0000257/// \brief Determine whether we are linking the ObjC runtime.
258static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000259 if (isObjCAutoRefCount(Args)) {
260 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000261 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000262 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000263 return Args.hasArg(options::OPT_fobjc_link_runtime);
264}
265
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000266static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000267 // Don't forward inputs from the original command line. They are added from
268 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000269 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000270 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000271}
272
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000273void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
274 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000275 ArgStringList &CmdArgs,
276 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000277 const InputInfoList &Inputs,
278 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000279 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000280
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000281 CheckPreprocessingOptions(D, Args);
282
283 Args.AddLastArg(CmdArgs, options::OPT_C);
284 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000285
286 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000287 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000288 (A = Args.getLastArg(options::OPT_MD)) ||
289 (A = Args.getLastArg(options::OPT_MMD))) {
290 // Determine the output location.
291 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000292 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000293 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000294 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000295 } else if (Output.getType() == types::TY_Dependencies) {
296 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000297 } else if (A->getOption().matches(options::OPT_M) ||
298 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000299 DepFile = "-";
300 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000301 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000302 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 }
304 CmdArgs.push_back("-dependency-file");
305 CmdArgs.push_back(DepFile);
306
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000307 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000308 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
309 const char *DepTarget;
310
311 // If user provided -o, that is the dependency target, except
312 // when we are only generating a dependency file.
313 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
314 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000315 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 } else {
317 // Otherwise derive from the base input.
318 //
319 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000320 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000321 llvm::sys::path::replace_extension(P, "o");
322 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000323 }
324
325 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000326 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000327 QuoteTarget(DepTarget, Quoted);
328 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000329 }
330
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000331 if (A->getOption().matches(options::OPT_M) ||
332 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000333 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000334 if ((isa<PrecompileJobAction>(JA) &&
335 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
336 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000337 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338 }
339
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000340 if (Args.hasArg(options::OPT_MG)) {
341 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000342 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000343 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000344 CmdArgs.push_back("-MG");
345 }
346
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000348 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000349
350 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000351 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000352 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000353
Daniel Dunbara442fd52010-06-11 22:00:13 +0000354 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000355 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000356 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000357 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000358 CmdArgs.push_back(Args.MakeArgString(Quoted));
359
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000361 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000362 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000363 }
364 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 // Add -i* options, and automatically translate to
367 // -include-pch/-include-pth for transparent PCH support. It's
368 // wonky, but we include looking for .gch so we can support seamless
369 // replacement into a build system already set up to be generating
370 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000371 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000372 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000373 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000374 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
375 RenderedImplicitInclude = true;
376
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000377 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000379
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000380 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000381 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000382 SmallString<128> P(A->getValue());
383 // We want the files to have a name like foo.h.pch. Add a dummy extension
384 // so that replace_extension does the right thing.
385 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000386 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000387 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000388 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000390 }
391
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000393 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000394 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000396 }
397
Douglas Gregor111af7d2009-04-18 00:34:01 +0000398 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000399 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000401 FoundPCH = UsePCH;
402 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000404 }
405
406 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000407 if (IsFirstImplicitInclude) {
408 A->claim();
409 if (UsePCH)
410 CmdArgs.push_back("-include-pch");
411 else
412 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000413 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 continue;
415 } else {
416 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000417 D.Diag(diag::warn_drv_pch_not_first_include) << P
418 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000419 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000420 }
421 }
422
423 // Not translated, render as usual.
424 A->claim();
425 A->render(Args, CmdArgs);
426 }
427
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000428 Args.AddAllArgs(CmdArgs,
429 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
430 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000431
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000432 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000433
434 // FIXME: There is a very unfortunate problem here, some troubled
435 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
436 // really support that we would have to parse and then translate
437 // those options. :(
438 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
439 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000440
441 // -I- is a deprecated GCC feature, reject it.
442 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000443 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000444
445 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
446 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000447 StringRef sysroot = C.getSysRoot();
448 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000449 if (!Args.hasArg(options::OPT_isysroot)) {
450 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000451 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000452 }
453 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000454
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000456 // FIXME: We should probably sink the logic for handling these from the
457 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // CPATH - included following the user specified includes (but prior to
459 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000463 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000467 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469
Artem Belevichfa11ab52015-11-17 22:28:46 +0000470 // Optional AuxToolChain indicates that we need to include headers
471 // for more than one target. If that's the case, add include paths
472 // from AuxToolChain right after include paths of the same kind for
473 // the current target.
474
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000475 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000476 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000477 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000478 if (AuxToolChain)
479 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
480 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000481
482 // Add system include arguments.
483 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000484 if (AuxToolChain)
485 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
486
487 // Add CUDA include arguments, if needed.
488 if (types::isCuda(Inputs[0].getType()))
489 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000490}
491
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000492// FIXME: Move to target hook.
493static bool isSignedCharDefault(const llvm::Triple &Triple) {
494 switch (Triple.getArch()) {
495 default:
496 return true;
497
Tim Northover9bb857a2013-01-31 12:13:10 +0000498 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000499 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000500 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000501 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000502 case llvm::Triple::thumb:
503 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000504 if (Triple.isOSDarwin() || Triple.isOSWindows())
505 return true;
506 return false;
507
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000508 case llvm::Triple::ppc:
509 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000510 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000511 return true;
512 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000513
David Majnemerdcecd932015-05-23 19:23:55 +0000514 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000515 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000516 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000517 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000518 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000519 }
520}
521
Robert Lytton0e076492013-08-13 09:43:10 +0000522static bool isNoCommonDefault(const llvm::Triple &Triple) {
523 switch (Triple.getArch()) {
524 default:
525 return false;
526
527 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000528 case llvm::Triple::wasm32:
529 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000530 return true;
531 }
532}
533
Renato Goline17c5802015-07-27 23:44:42 +0000534// ARM tools start.
535
536// Get SubArch (vN).
537static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
538 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000539 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000540}
541
542// True if M-profile.
543static bool isARMMProfile(const llvm::Triple &Triple) {
544 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000545 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000546 return Profile == llvm::ARM::PK_M;
547}
548
549// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000550static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
551 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000552 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
553 CPU = A->getValue();
554 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
555 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000556 if (!FromAs)
557 return;
558
559 for (const Arg *A :
560 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
561 StringRef Value = A->getValue();
562 if (Value.startswith("-mcpu="))
563 CPU = Value.substr(6);
564 if (Value.startswith("-march="))
565 Arch = Value.substr(7);
566 }
Renato Goline17c5802015-07-27 23:44:42 +0000567}
568
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000569// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000570// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000571static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000572 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000573 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000574 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
575 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000576 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
577}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000578
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000579// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000580static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000581 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000582 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000583 unsigned FPUID = llvm::ARM::parseFPU(FPU);
584 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000585 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
586}
587
Bradley Smithbbf5a002015-11-18 16:33:48 +0000588// Decode ARM features from string like +[no]featureA+[no]featureB+...
589static bool DecodeARMFeatures(const Driver &D, StringRef text,
590 std::vector<const char *> &Features) {
591 SmallVector<StringRef, 8> Split;
592 text.split(Split, StringRef("+"), -1, false);
593
594 for (StringRef Feature : Split) {
595 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
596 if (FeatureName)
597 Features.push_back(FeatureName);
598 else
599 return false;
600 }
601 return true;
602}
603
Renato Golin7c542b42015-07-27 23:44:45 +0000604// Check if -march is valid by checking if it can be canonicalised and parsed.
605// getARMArch is used here instead of just checking the -march value in order
606// to handle -march=native correctly.
607static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000608 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000609 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000610 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000611 std::pair<StringRef, StringRef> Split = ArchName.split("+");
612
Renato Goline17c5802015-07-27 23:44:42 +0000613 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000614 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
615 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000616 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000617}
618
Renato Golin7c542b42015-07-27 23:44:45 +0000619// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
620static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
621 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000622 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000623 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000624 std::pair<StringRef, StringRef> Split = CPUName.split("+");
625
Renato Goline17c5802015-07-27 23:44:42 +0000626 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000627 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
628 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000629 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000630}
631
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000632static bool useAAPCSForMachO(const llvm::Triple &T) {
633 // The backend is hardwired to assume AAPCS for M-class processors, ensure
634 // the frontend matches that.
635 return T.getEnvironment() == llvm::Triple::EABI ||
636 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
637}
638
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000639// Select the float ABI as determined by -msoft-float, -mhard-float, and
640// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000641arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
642 const Driver &D = TC.getDriver();
643 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000644 auto SubArch = getARMSubArchVersionNumber(Triple);
645 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000646 if (Arg *A =
647 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
648 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000649 if (A->getOption().matches(options::OPT_msoft_float)) {
650 ABI = FloatABI::Soft;
651 } else if (A->getOption().matches(options::OPT_mhard_float)) {
652 ABI = FloatABI::Hard;
653 } else {
654 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
655 .Case("soft", FloatABI::Soft)
656 .Case("softfp", FloatABI::SoftFP)
657 .Case("hard", FloatABI::Hard)
658 .Default(FloatABI::Invalid);
659 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000660 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000661 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000662 }
663 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000664
665 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
666 // "apcs-gnu".
667 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000668 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000669 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
670 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000671 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000672 }
673
674 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000675 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000676 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000677 case llvm::Triple::Darwin:
678 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000679 case llvm::Triple::IOS:
680 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000681 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000682 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000683 break;
684 }
Tim Northover756447a2015-10-30 16:30:36 +0000685 case llvm::Triple::WatchOS:
686 ABI = FloatABI::Hard;
687 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000688
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000689 // FIXME: this is invalid for WindowsCE
690 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000691 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000692 break;
693
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000694 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000695 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000696 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000697 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000698 break;
699 default:
700 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000701 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000702 break;
703 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000704 break;
705
Daniel Dunbar78485922009-09-10 23:00:09 +0000706 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000707 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000708 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000709 case llvm::Triple::EABIHF:
710 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000711 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000712 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000713 case llvm::Triple::EABI:
714 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000715 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000716 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000717 case llvm::Triple::Android:
718 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000719 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000720 default:
721 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000722 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000723 if (Triple.getOS() != llvm::Triple::UnknownOS ||
724 !Triple.isOSBinFormatMachO())
725 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000726 break;
727 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000728 }
729 }
730
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000731 assert(ABI != FloatABI::Invalid && "must select an ABI");
732 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000733}
734
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000735static void getARMTargetFeatures(const ToolChain &TC,
736 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000737 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000738 std::vector<const char *> &Features,
739 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000740 const Driver &D = TC.getDriver();
741
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000742 bool KernelOrKext =
743 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000744 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000745 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
746 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
747
Nico Weber6e0ebae2015-04-29 21:16:40 +0000748 if (!ForAS) {
749 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
750 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
751 // stripped out by the ARM target. We should probably pass this a new
752 // -target-option, which is handled by the -cc1/-cc1as invocation.
753 //
754 // FIXME2: For consistency, it would be ideal if we set up the target
755 // machine state the same when using the frontend or the assembler. We don't
756 // currently do that for the assembler, we pass the options directly to the
757 // backend and never even instantiate the frontend TargetInfo. If we did,
758 // and used its handleTargetFeatures hook, then we could ensure the
759 // assembler and the frontend behave the same.
760
761 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000762 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000763 Features.push_back("+soft-float");
764
765 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000766 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000767 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000768 } else {
769 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
770 // to the assembler correctly.
771 for (const Arg *A :
772 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
773 StringRef Value = A->getValue();
774 if (Value.startswith("-mfpu=")) {
775 WaFPU = A;
776 } else if (Value.startswith("-mcpu=")) {
777 WaCPU = A;
778 } else if (Value.startswith("-mhwdiv=")) {
779 WaHDiv = A;
780 } else if (Value.startswith("-march=")) {
781 WaArch = A;
782 }
783 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000784 }
785
Renato Golin7c542b42015-07-27 23:44:45 +0000786 // Check -march. ClangAs gives preference to -Wa,-march=.
787 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000788 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000789 if (WaArch) {
790 if (ArchArg)
791 D.Diag(clang::diag::warn_drv_unused_argument)
792 << ArchArg->getAsString(Args);
793 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000794 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000795 // FIXME: Set Arch.
796 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
797 } else if (ArchArg) {
798 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000799 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000800 }
801
Renato Golin7c542b42015-07-27 23:44:45 +0000802 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
803 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000804 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000805 if (WaCPU) {
806 if (CPUArg)
807 D.Diag(clang::diag::warn_drv_unused_argument)
808 << CPUArg->getAsString(Args);
809 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000810 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000811 } else if (CPUArg) {
812 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000813 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000814 }
John Brawna95c1a82015-05-08 12:52:18 +0000815
Renato Golin23459c62015-07-30 16:40:17 +0000816 // Add CPU features for generic CPUs
817 if (CPUName == "native") {
818 llvm::StringMap<bool> HostFeatures;
819 if (llvm::sys::getHostCPUFeatures(HostFeatures))
820 for (auto &F : HostFeatures)
821 Features.push_back(
822 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
823 }
824
825 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
826 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
827 if (WaFPU) {
828 if (FPUArg)
829 D.Diag(clang::diag::warn_drv_unused_argument)
830 << FPUArg->getAsString(Args);
831 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
832 Features);
833 } else if (FPUArg) {
834 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
835 }
836
837 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
838 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
839 if (WaHDiv) {
840 if (HDivArg)
841 D.Diag(clang::diag::warn_drv_unused_argument)
842 << HDivArg->getAsString(Args);
843 getARMHWDivFeatures(D, WaHDiv, Args,
844 StringRef(WaHDiv->getValue()).substr(8), Features);
845 } else if (HDivArg)
846 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
847
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000848 // Setting -msoft-float effectively disables NEON because of the GCC
849 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000850 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000851 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000852 // Also need to explicitly disable features which imply NEON.
853 Features.push_back("-crypto");
854 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000855
Eric Christopher269c2a22015-04-04 03:34:43 +0000856 // En/disable crc code generation.
857 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000858 if (A->getOption().matches(options::OPT_mcrc))
859 Features.push_back("+crc");
860 else
861 Features.push_back("-crc");
862 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000863
864 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
865 Features.insert(Features.begin(), "+v8.1a");
866 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000867
Akira Hatanakac2694822015-07-07 08:28:42 +0000868 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
869 // neither options are specified, see if we are compiling for kernel/kext and
870 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000871 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
872 options::OPT_mno_long_calls)) {
873 if (A->getOption().matches(options::OPT_mlong_calls))
874 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000875 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
876 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000877 Features.push_back("+long-calls");
878 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000879
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000880 // Kernel code has more strict alignment requirements.
881 if (KernelOrKext)
882 Features.push_back("+strict-align");
883 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
884 options::OPT_munaligned_access)) {
885 if (A->getOption().matches(options::OPT_munaligned_access)) {
886 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
887 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
888 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
889 } else
890 Features.push_back("+strict-align");
891 } else {
892 // Assume pre-ARMv6 doesn't support unaligned accesses.
893 //
894 // ARMv6 may or may not support unaligned accesses depending on the
895 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
896 // Darwin and NetBSD targets support unaligned accesses, and others don't.
897 //
898 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
899 // which raises an alignment fault on unaligned accesses. Linux
900 // defaults this bit to 0 and handles it as a system-wide (not
901 // per-process) setting. It is therefore safe to assume that ARMv7+
902 // Linux targets support unaligned accesses. The same goes for NaCl.
903 //
904 // The above behavior is consistent with GCC.
905 int VersionNum = getARMSubArchVersionNumber(Triple);
906 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000907 if (VersionNum < 6 ||
908 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000909 Features.push_back("+strict-align");
910 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
911 if (VersionNum < 7)
912 Features.push_back("+strict-align");
913 } else
914 Features.push_back("+strict-align");
915 }
916
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000917 // llvm does not support reserving registers in general. There is support
918 // for reserving r9 on ARM though (defined as a platform-specific register
919 // in ARM EABI).
920 if (Args.hasArg(options::OPT_ffixed_r9))
921 Features.push_back("+reserve-r9");
922
Akira Hatanaka580efb22015-07-16 00:43:00 +0000923 // The kext linker doesn't know how to deal with movw/movt.
924 if (KernelOrKext)
925 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000926}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000927
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000928void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
929 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000930 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000931 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000932 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000933 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000934 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000935 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000936 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000937 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000938 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000939 } else if (Triple.isWatchOS()) {
940 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000941 } else {
942 ABIName = "apcs-gnu";
943 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000944 } else if (Triple.isOSWindows()) {
945 // FIXME: this is invalid for WindowsCE
946 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000947 } else {
948 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000949 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000950 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000951 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000952 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000953 ABIName = "aapcs-linux";
954 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000955 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000956 case llvm::Triple::EABI:
957 ABIName = "aapcs";
958 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000959 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000960 if (Triple.getOS() == llvm::Triple::NetBSD)
961 ABIName = "apcs-gnu";
962 else
963 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000964 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000965 }
966 }
967 CmdArgs.push_back("-target-abi");
968 CmdArgs.push_back(ABIName);
969
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000970 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000971 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000972 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000973 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000974 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000975 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000976 CmdArgs.push_back("-mfloat-abi");
977 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000978 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000979 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000980 CmdArgs.push_back("-mfloat-abi");
981 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000982 } else {
983 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000984 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000985 CmdArgs.push_back("-mfloat-abi");
986 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000987 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000988
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000989 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000990 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
991 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000992 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000993 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000994 CmdArgs.push_back("-arm-global-merge=false");
995 else
996 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000997 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000998
Bob Wilson9c8af452013-04-11 18:53:25 +0000999 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001000 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001001 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001002}
Renato Goline17c5802015-07-27 23:44:42 +00001003// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001004
Tim Northover573cbee2014-05-24 12:52:07 +00001005/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1006/// targeting.
1007static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001008 Arg *A;
1009 std::string CPU;
1010 // If we have -mtune or -mcpu, use that.
1011 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001012 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001013 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001014 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001015 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001016 }
1017
Kevin Qin110db6f2014-07-18 07:03:22 +00001018 // Handle CPU name is 'native'.
1019 if (CPU == "native")
1020 return llvm::sys::getHostCPUName();
1021 else if (CPU.size())
1022 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001023
James Molloy9b1586b2014-04-17 12:51:17 +00001024 // Make sure we pick "cyclone" if -arch is used.
1025 // FIXME: Should this be picked by checking the target triple instead?
1026 if (Args.getLastArg(options::OPT_arch))
1027 return "cyclone";
1028
1029 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001030}
1031
Tim Northover573cbee2014-05-24 12:52:07 +00001032void Clang::AddAArch64TargetArgs(const ArgList &Args,
1033 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001034 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1035 llvm::Triple Triple(TripleStr);
1036
1037 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1038 Args.hasArg(options::OPT_mkernel) ||
1039 Args.hasArg(options::OPT_fapple_kext))
1040 CmdArgs.push_back("-disable-red-zone");
1041
1042 if (!Args.hasFlag(options::OPT_mimplicit_float,
1043 options::OPT_mno_implicit_float, true))
1044 CmdArgs.push_back("-no-implicit-float");
1045
Craig Topper92fc2df2014-05-17 16:56:41 +00001046 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001047 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1048 ABIName = A->getValue();
1049 else if (Triple.isOSDarwin())
1050 ABIName = "darwinpcs";
1051 else
1052 ABIName = "aapcs";
1053
1054 CmdArgs.push_back("-target-abi");
1055 CmdArgs.push_back(ABIName);
1056
Bradley Smith9ff64332014-10-13 10:16:06 +00001057 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1058 options::OPT_mno_fix_cortex_a53_835769)) {
1059 CmdArgs.push_back("-backend-option");
1060 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1061 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1062 else
1063 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001064 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001065 // Enabled A53 errata (835769) workaround by default on android
1066 CmdArgs.push_back("-backend-option");
1067 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001068 }
1069
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001070 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001071 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1072 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001073 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001074 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001075 CmdArgs.push_back("-aarch64-global-merge=false");
1076 else
1077 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001078 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001079}
1080
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001081// Get CPU and ABI names. They are not independent
1082// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001083void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1084 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001085 const char *DefMips32CPU = "mips32r2";
1086 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001087
Daniel Sanders2bf13662014-07-10 14:40:57 +00001088 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1089 // default for mips64(el)?-img-linux-gnu.
1090 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1091 Triple.getEnvironment() == llvm::Triple::GNU) {
1092 DefMips32CPU = "mips32r6";
1093 DefMips64CPU = "mips64r6";
1094 }
Renato Golin7c542b42015-07-27 23:44:45 +00001095
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001096 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001097 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001098 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001099
Brad Smithba26f582015-01-06 02:53:17 +00001100 // MIPS3 is the default for mips64*-unknown-openbsd.
1101 if (Triple.getOS() == llvm::Triple::OpenBSD)
1102 DefMips64CPU = "mips3";
1103
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001104 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001105 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001106
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001107 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001108 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001109 // Convert a GNU style Mips ABI name to the name
1110 // accepted by LLVM Mips backend.
1111 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001112 .Case("32", "o32")
1113 .Case("64", "n64")
1114 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001115 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001116
1117 // Setup default CPU and ABI names.
1118 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001119 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001120 default:
1121 llvm_unreachable("Unexpected triple arch name");
1122 case llvm::Triple::mips:
1123 case llvm::Triple::mipsel:
1124 CPUName = DefMips32CPU;
1125 break;
1126 case llvm::Triple::mips64:
1127 case llvm::Triple::mips64el:
1128 CPUName = DefMips64CPU;
1129 break;
1130 }
1131 }
1132
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001133 if (ABIName.empty()) {
1134 // Deduce ABI name from the target triple.
1135 if (Triple.getArch() == llvm::Triple::mips ||
1136 Triple.getArch() == llvm::Triple::mipsel)
1137 ABIName = "o32";
1138 else
1139 ABIName = "n64";
1140 }
1141
1142 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001143 // Deduce CPU name from ABI name.
1144 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001145 .Cases("o32", "eabi", DefMips32CPU)
1146 .Cases("n32", "n64", DefMips64CPU)
1147 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001148 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001149
1150 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001151}
1152
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001153std::string mips::getMipsABILibSuffix(const ArgList &Args,
1154 const llvm::Triple &Triple) {
1155 StringRef CPUName, ABIName;
1156 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1157 return llvm::StringSwitch<std::string>(ABIName)
1158 .Case("o32", "")
1159 .Case("n32", "32")
1160 .Case("n64", "64");
1161}
1162
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001163// Convert ABI name to the GNU tools acceptable variant.
1164static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1165 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001166 .Case("o32", "32")
1167 .Case("n64", "64")
1168 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001169}
1170
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001171// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1172// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001173static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1174 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001175 if (Arg *A =
1176 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1177 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001178 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001179 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001180 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001181 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001182 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001183 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1184 .Case("soft", mips::FloatABI::Soft)
1185 .Case("hard", mips::FloatABI::Hard)
1186 .Default(mips::FloatABI::Invalid);
1187 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001188 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001189 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001190 }
1191 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001192 }
1193
1194 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001195 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001196 // Assume "hard", because it's a default value used by gcc.
1197 // When we start to recognize specific target MIPS processors,
1198 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001200 }
1201
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001202 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1203 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001204}
1205
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001206static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001207 std::vector<const char *> &Features,
1208 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001209 StringRef FeatureName) {
1210 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001211 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001212 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001213 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001214 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001215 }
1216}
1217
Daniel Sanders379d44b2014-07-16 11:52:23 +00001218static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1219 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001220 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001221 StringRef CPUName;
1222 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001223 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001224 ABIName = getGnuCompatibleMipsABIName(ABIName);
1225
Daniel Sandersfeb61302014-08-08 15:47:17 +00001226 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1227 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001228
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001229 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1230 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001231 // FIXME: Note, this is a hack. We need to pass the selected float
1232 // mode to the MipsTargetInfoBase to define appropriate macros there.
1233 // Now it is the only method.
1234 Features.push_back("+soft-float");
1235 }
1236
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001237 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001238 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001239 if (Val == "2008") {
1240 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1241 Features.push_back("+nan2008");
1242 else {
1243 Features.push_back("-nan2008");
1244 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1245 }
1246 } else if (Val == "legacy") {
1247 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1248 Features.push_back("-nan2008");
1249 else {
1250 Features.push_back("+nan2008");
1251 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1252 }
1253 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001254 D.Diag(diag::err_drv_unsupported_option_argument)
1255 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001256 }
1257
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001258 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1259 options::OPT_mdouble_float, "single-float");
1260 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1261 "mips16");
1262 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1263 options::OPT_mno_micromips, "micromips");
1264 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1265 "dsp");
1266 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1267 "dspr2");
1268 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1269 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001270
1271 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1272 // pass -mfpxx
1273 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1274 options::OPT_mfp64)) {
1275 if (A->getOption().matches(options::OPT_mfp32))
1276 Features.push_back(Args.MakeArgString("-fp64"));
1277 else if (A->getOption().matches(options::OPT_mfpxx)) {
1278 Features.push_back(Args.MakeArgString("+fpxx"));
1279 Features.push_back(Args.MakeArgString("+nooddspreg"));
1280 } else
1281 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001282 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001283 Features.push_back(Args.MakeArgString("+fpxx"));
1284 Features.push_back(Args.MakeArgString("+nooddspreg"));
1285 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001286
Daniel Sanders28e5d392014-07-10 10:39:51 +00001287 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1288 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001289}
1290
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001291void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001292 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001293 const Driver &D = getToolChain().getDriver();
1294 StringRef CPUName;
1295 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001296 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001297 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001298
1299 CmdArgs.push_back("-target-abi");
1300 CmdArgs.push_back(ABIName.data());
1301
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001302 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1303 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001304 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001305 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001306 CmdArgs.push_back("-mfloat-abi");
1307 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001308 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001309 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001310 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001311 CmdArgs.push_back("-mfloat-abi");
1312 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001313 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001314
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001315 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1316 if (A->getOption().matches(options::OPT_mxgot)) {
1317 CmdArgs.push_back("-mllvm");
1318 CmdArgs.push_back("-mxgot");
1319 }
1320 }
1321
Simon Atanasyanc580b322013-05-11 06:33:44 +00001322 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1323 options::OPT_mno_ldc1_sdc1)) {
1324 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1325 CmdArgs.push_back("-mllvm");
1326 CmdArgs.push_back("-mno-ldc1-sdc1");
1327 }
1328 }
1329
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001330 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1331 options::OPT_mno_check_zero_division)) {
1332 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1333 CmdArgs.push_back("-mllvm");
1334 CmdArgs.push_back("-mno-check-zero-division");
1335 }
1336 }
1337
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001338 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001339 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001340 CmdArgs.push_back("-mllvm");
1341 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1342 A->claim();
1343 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001344}
1345
Hal Finkel8eb59282012-06-11 22:35:19 +00001346/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1347static std::string getPPCTargetCPU(const ArgList &Args) {
1348 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001349 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001350
1351 if (CPUName == "native") {
1352 std::string CPU = llvm::sys::getHostCPUName();
1353 if (!CPU.empty() && CPU != "generic")
1354 return CPU;
1355 else
1356 return "";
1357 }
1358
1359 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001360 .Case("common", "generic")
1361 .Case("440", "440")
1362 .Case("440fp", "440")
1363 .Case("450", "450")
1364 .Case("601", "601")
1365 .Case("602", "602")
1366 .Case("603", "603")
1367 .Case("603e", "603e")
1368 .Case("603ev", "603ev")
1369 .Case("604", "604")
1370 .Case("604e", "604e")
1371 .Case("620", "620")
1372 .Case("630", "pwr3")
1373 .Case("G3", "g3")
1374 .Case("7400", "7400")
1375 .Case("G4", "g4")
1376 .Case("7450", "7450")
1377 .Case("G4+", "g4+")
1378 .Case("750", "750")
1379 .Case("970", "970")
1380 .Case("G5", "g5")
1381 .Case("a2", "a2")
1382 .Case("a2q", "a2q")
1383 .Case("e500mc", "e500mc")
1384 .Case("e5500", "e5500")
1385 .Case("power3", "pwr3")
1386 .Case("power4", "pwr4")
1387 .Case("power5", "pwr5")
1388 .Case("power5x", "pwr5x")
1389 .Case("power6", "pwr6")
1390 .Case("power6x", "pwr6x")
1391 .Case("power7", "pwr7")
1392 .Case("power8", "pwr8")
1393 .Case("pwr3", "pwr3")
1394 .Case("pwr4", "pwr4")
1395 .Case("pwr5", "pwr5")
1396 .Case("pwr5x", "pwr5x")
1397 .Case("pwr6", "pwr6")
1398 .Case("pwr6x", "pwr6x")
1399 .Case("pwr7", "pwr7")
1400 .Case("pwr8", "pwr8")
1401 .Case("powerpc", "ppc")
1402 .Case("powerpc64", "ppc64")
1403 .Case("powerpc64le", "ppc64le")
1404 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001405 }
1406
1407 return "";
1408}
1409
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001410static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1411 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001412 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001413 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1414 StringRef Name = A->getOption().getName();
1415 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001416
1417 // Skip over "-m".
1418 assert(Name.startswith("m") && "Invalid feature name.");
1419 Name = Name.substr(1);
1420
1421 bool IsNegative = Name.startswith("no-");
1422 if (IsNegative)
1423 Name = Name.substr(3);
1424
1425 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1426 // pass the correct option to the backend while calling the frontend
1427 // option the same.
1428 // TODO: Change the LLVM backend option maybe?
1429 if (Name == "mfcrf")
1430 Name = "mfocrf";
1431
1432 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1433 }
1434
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001435 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1436 if (FloatABI == ppc::FloatABI::Soft &&
1437 !(Triple.getArch() == llvm::Triple::ppc64 ||
1438 Triple.getArch() == llvm::Triple::ppc64le))
1439 Features.push_back("+soft-float");
1440 else if (FloatABI == ppc::FloatABI::Soft &&
1441 (Triple.getArch() == llvm::Triple::ppc64 ||
1442 Triple.getArch() == llvm::Triple::ppc64le))
1443 D.Diag(diag::err_drv_invalid_mfloat_abi)
1444 << "soft float is not supported for ppc64";
1445
Eric Christopher643bb6a2013-10-16 20:40:08 +00001446 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001447 AddTargetFeature(Args, Features, options::OPT_faltivec,
1448 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001449}
1450
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001451ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1452 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1453 if (Arg *A =
1454 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1455 options::OPT_mfloat_abi_EQ)) {
1456 if (A->getOption().matches(options::OPT_msoft_float))
1457 ABI = ppc::FloatABI::Soft;
1458 else if (A->getOption().matches(options::OPT_mhard_float))
1459 ABI = ppc::FloatABI::Hard;
1460 else {
1461 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1462 .Case("soft", ppc::FloatABI::Soft)
1463 .Case("hard", ppc::FloatABI::Hard)
1464 .Default(ppc::FloatABI::Invalid);
1465 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1466 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1467 ABI = ppc::FloatABI::Hard;
1468 }
1469 }
1470 }
1471
1472 // If unspecified, choose the default based on the platform.
1473 if (ABI == ppc::FloatABI::Invalid) {
1474 ABI = ppc::FloatABI::Hard;
1475 }
1476
1477 return ABI;
1478}
1479
Ulrich Weigand8afad612014-07-28 13:17:52 +00001480void Clang::AddPPCTargetArgs(const ArgList &Args,
1481 ArgStringList &CmdArgs) const {
1482 // Select the ABI to use.
1483 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001484 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001485 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001486 case llvm::Triple::ppc64: {
1487 // When targeting a processor that supports QPX, or if QPX is
1488 // specifically enabled, default to using the ABI that supports QPX (so
1489 // long as it is not specifically disabled).
1490 bool HasQPX = false;
1491 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1492 HasQPX = A->getValue() == StringRef("a2q");
1493 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1494 if (HasQPX) {
1495 ABIName = "elfv1-qpx";
1496 break;
1497 }
1498
Ulrich Weigand8afad612014-07-28 13:17:52 +00001499 ABIName = "elfv1";
1500 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001501 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001502 case llvm::Triple::ppc64le:
1503 ABIName = "elfv2";
1504 break;
1505 default:
1506 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001507 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001508
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001509 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1510 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1511 // the option if given as we don't have backend support for any targets
1512 // that don't use the altivec abi.
1513 if (StringRef(A->getValue()) != "altivec")
1514 ABIName = A->getValue();
1515
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001516 ppc::FloatABI FloatABI =
1517 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1518
1519 if (FloatABI == ppc::FloatABI::Soft) {
1520 // Floating point operations and argument passing are soft.
1521 CmdArgs.push_back("-msoft-float");
1522 CmdArgs.push_back("-mfloat-abi");
1523 CmdArgs.push_back("soft");
1524 } else {
1525 // Floating point operations and argument passing are hard.
1526 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1527 CmdArgs.push_back("-mfloat-abi");
1528 CmdArgs.push_back("hard");
1529 }
1530
Ulrich Weigand8afad612014-07-28 13:17:52 +00001531 if (ABIName) {
1532 CmdArgs.push_back("-target-abi");
1533 CmdArgs.push_back(ABIName);
1534 }
1535}
1536
1537bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1538 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1539 return A && (A->getValue() == StringRef(Value));
1540}
1541
Tom Stellard6674c702013-04-01 20:56:53 +00001542/// Get the (LLVM) name of the R600 gpu we are targeting.
1543static std::string getR600TargetGPU(const ArgList &Args) {
1544 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001545 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001546 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001547 .Cases("rv630", "rv635", "r600")
1548 .Cases("rv610", "rv620", "rs780", "rs880")
1549 .Case("rv740", "rv770")
1550 .Case("palm", "cedar")
1551 .Cases("sumo", "sumo2", "sumo")
1552 .Case("hemlock", "cypress")
1553 .Case("aruba", "cayman")
1554 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001555 }
1556 return "";
1557}
1558
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001559void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001560 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001561 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001562 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001563
James Y Knightb2406522015-06-15 20:51:24 +00001564 bool SoftFloatABI = false;
1565 if (Arg *A =
1566 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001567 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001568 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001569 }
1570
James Y Knightb2406522015-06-15 20:51:24 +00001571 // Only the hard-float ABI on Sparc is standardized, and it is the
1572 // default. GCC also supports a nonstandard soft-float ABI mode, and
1573 // perhaps LLVM should implement that, too. However, since llvm
1574 // currently does not support Sparc soft-float, at all, display an
1575 // error if it's requested.
1576 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001577 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1578 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001579 }
1580}
1581
Richard Sandiford4652d892013-07-19 16:51:51 +00001582static const char *getSystemZTargetCPU(const ArgList &Args) {
1583 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1584 return A->getValue();
1585 return "z10";
1586}
1587
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001588static void getSystemZTargetFeatures(const ArgList &Args,
1589 std::vector<const char *> &Features) {
1590 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001591 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001592 if (A->getOption().matches(options::OPT_mhtm))
1593 Features.push_back("+transactional-execution");
1594 else
1595 Features.push_back("-transactional-execution");
1596 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001597 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001598 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001599 if (A->getOption().matches(options::OPT_mvx))
1600 Features.push_back("+vector");
1601 else
1602 Features.push_back("-vector");
1603 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001604}
1605
Chandler Carruth953fb082013-01-13 11:46:33 +00001606static const char *getX86TargetCPU(const ArgList &Args,
1607 const llvm::Triple &Triple) {
1608 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001610 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001611 return "core-avx2";
1612
Chandler Carruth953fb082013-01-13 11:46:33 +00001613 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001614 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001615
1616 // FIXME: Reject attempts to use -march=native unless the target matches
1617 // the host.
1618 //
1619 // FIXME: We should also incorporate the detected target features for use
1620 // with -native.
1621 std::string CPU = llvm::sys::getHostCPUName();
1622 if (!CPU.empty() && CPU != "generic")
1623 return Args.MakeArgString(CPU);
1624 }
1625
Reid Kleckner3123eff2015-06-30 16:32:04 +00001626 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1627 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1628 StringRef Arch = A->getValue();
1629 const char *CPU;
1630 if (Triple.getArch() == llvm::Triple::x86) {
1631 CPU = llvm::StringSwitch<const char *>(Arch)
1632 .Case("IA32", "i386")
1633 .Case("SSE", "pentium3")
1634 .Case("SSE2", "pentium4")
1635 .Case("AVX", "sandybridge")
1636 .Case("AVX2", "haswell")
1637 .Default(nullptr);
1638 } else {
1639 CPU = llvm::StringSwitch<const char *>(Arch)
1640 .Case("AVX", "sandybridge")
1641 .Case("AVX2", "haswell")
1642 .Default(nullptr);
1643 }
1644 if (CPU)
1645 return CPU;
1646 }
1647
Chandler Carruth953fb082013-01-13 11:46:33 +00001648 // Select the default CPU if none was given (or detection failed).
1649
1650 if (Triple.getArch() != llvm::Triple::x86_64 &&
1651 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001652 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001653
1654 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1655
1656 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001657 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001658 if (Triple.getArchName() == "x86_64h")
1659 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001660 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001661 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001662
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001663 // Set up default CPU name for PS4 compilers.
1664 if (Triple.isPS4CPU())
1665 return "btver2";
1666
Alexey Bataev286d1b92014-01-31 04:07:13 +00001667 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001668 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001669 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001670
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001671 // Everything else goes to x86-64 in 64-bit mode.
1672 if (Is64Bit)
1673 return "x86-64";
1674
1675 switch (Triple.getOS()) {
1676 case llvm::Triple::FreeBSD:
1677 case llvm::Triple::NetBSD:
1678 case llvm::Triple::OpenBSD:
1679 return "i486";
1680 case llvm::Triple::Haiku:
1681 return "i586";
1682 case llvm::Triple::Bitrig:
1683 return "i686";
1684 default:
1685 // Fallback to p4.
1686 return "pentium4";
1687 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001688}
1689
Dan Gohmanc2853072015-09-03 22:51:53 +00001690/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1691static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1692 // If we have -mcpu=, use that.
1693 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1694 StringRef CPU = A->getValue();
1695
1696#ifdef __wasm__
1697 // Handle "native" by examining the host. "native" isn't meaningful when
1698 // cross compiling, so only support this when the host is also WebAssembly.
1699 if (CPU == "native")
1700 return llvm::sys::getHostCPUName();
1701#endif
1702
1703 return CPU;
1704 }
1705
1706 return "generic";
1707}
1708
Renato Golin7c542b42015-07-27 23:44:45 +00001709static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1710 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001711 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001712 default:
1713 return "";
1714
Amara Emerson703da2e2013-10-31 09:32:33 +00001715 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001716 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001717 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001718
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001719 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001720 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001721 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001722 case llvm::Triple::thumbeb: {
1723 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001724 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001725 return arm::getARMTargetCPU(MCPU, MArch, T);
1726 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001727 case llvm::Triple::mips:
1728 case llvm::Triple::mipsel:
1729 case llvm::Triple::mips64:
1730 case llvm::Triple::mips64el: {
1731 StringRef CPUName;
1732 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001733 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001734 return CPUName;
1735 }
1736
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001737 case llvm::Triple::nvptx:
1738 case llvm::Triple::nvptx64:
1739 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1740 return A->getValue();
1741 return "";
1742
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001743 case llvm::Triple::ppc:
1744 case llvm::Triple::ppc64:
1745 case llvm::Triple::ppc64le: {
1746 std::string TargetCPUName = getPPCTargetCPU(Args);
1747 // LLVM may default to generating code for the native CPU,
1748 // but, like gcc, we default to a more generic option for
1749 // each architecture. (except on Darwin)
1750 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1751 if (T.getArch() == llvm::Triple::ppc64)
1752 TargetCPUName = "ppc64";
1753 else if (T.getArch() == llvm::Triple::ppc64le)
1754 TargetCPUName = "ppc64le";
1755 else
1756 TargetCPUName = "ppc";
1757 }
1758 return TargetCPUName;
1759 }
1760
1761 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001762 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001763 case llvm::Triple::sparcv9:
1764 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001765 return A->getValue();
1766 return "";
1767
1768 case llvm::Triple::x86:
1769 case llvm::Triple::x86_64:
1770 return getX86TargetCPU(Args, T);
1771
1772 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001773 return "hexagon" +
1774 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001775
1776 case llvm::Triple::systemz:
1777 return getSystemZTargetCPU(Args);
1778
1779 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001780 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001781 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001782
1783 case llvm::Triple::wasm32:
1784 case llvm::Triple::wasm64:
1785 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001786 }
1787}
1788
Alp Tokerce365ca2013-12-02 12:43:03 +00001789static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001790 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001791 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1792 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1793 // forward.
1794 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001795 std::string Plugin =
1796 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001797 CmdArgs.push_back(Args.MakeArgString(Plugin));
1798
1799 // Try to pass driver level flags relevant to LTO code generation down to
1800 // the plugin.
1801
1802 // Handle flags for selecting CPU variants.
1803 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1804 if (!CPU.empty())
1805 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001806
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001807 if (IsThinLTO)
1808 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001809}
1810
Sanjay Patel2987c292015-06-11 14:53:41 +00001811/// This is a helper function for validating the optional refinement step
1812/// parameter in reciprocal argument strings. Return false if there is an error
1813/// parsing the refinement step. Otherwise, return true and set the Position
1814/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001815static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001816 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001817 const char RefinementStepToken = ':';
1818 Position = In.find(RefinementStepToken);
1819 if (Position != StringRef::npos) {
1820 StringRef Option = A.getOption().getName();
1821 StringRef RefStep = In.substr(Position + 1);
1822 // Allow exactly one numeric character for the additional refinement
1823 // step parameter. This is reasonable for all currently-supported
1824 // operations and architectures because we would expect that a larger value
1825 // of refinement steps would cause the estimate "optimization" to
1826 // under-perform the native operation. Also, if the estimate does not
1827 // converge quickly, it probably will not ever converge, so further
1828 // refinement steps will not produce a better answer.
1829 if (RefStep.size() != 1) {
1830 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1831 return false;
1832 }
1833 char RefStepChar = RefStep[0];
1834 if (RefStepChar < '0' || RefStepChar > '9') {
1835 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1836 return false;
1837 }
1838 }
1839 return true;
1840}
1841
1842/// The -mrecip flag requires processing of many optional parameters.
1843static void ParseMRecip(const Driver &D, const ArgList &Args,
1844 ArgStringList &OutStrings) {
1845 StringRef DisabledPrefixIn = "!";
1846 StringRef DisabledPrefixOut = "!";
1847 StringRef EnabledPrefixOut = "";
1848 StringRef Out = "-mrecip=";
1849
1850 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1851 if (!A)
1852 return;
1853
1854 unsigned NumOptions = A->getNumValues();
1855 if (NumOptions == 0) {
1856 // No option is the same as "all".
1857 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1858 return;
1859 }
1860
1861 // Pass through "all", "none", or "default" with an optional refinement step.
1862 if (NumOptions == 1) {
1863 StringRef Val = A->getValue(0);
1864 size_t RefStepLoc;
1865 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1866 return;
1867 StringRef ValBase = Val.slice(0, RefStepLoc);
1868 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1869 OutStrings.push_back(Args.MakeArgString(Out + Val));
1870 return;
1871 }
1872 }
1873
1874 // Each reciprocal type may be enabled or disabled individually.
1875 // Check each input value for validity, concatenate them all back together,
1876 // and pass through.
1877
1878 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001879 OptionStrings.insert(std::make_pair("divd", false));
1880 OptionStrings.insert(std::make_pair("divf", false));
1881 OptionStrings.insert(std::make_pair("vec-divd", false));
1882 OptionStrings.insert(std::make_pair("vec-divf", false));
1883 OptionStrings.insert(std::make_pair("sqrtd", false));
1884 OptionStrings.insert(std::make_pair("sqrtf", false));
1885 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1886 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001887
1888 for (unsigned i = 0; i != NumOptions; ++i) {
1889 StringRef Val = A->getValue(i);
1890
1891 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1892 // Ignore the disablement token for string matching.
1893 if (IsDisabled)
1894 Val = Val.substr(1);
1895
1896 size_t RefStep;
1897 if (!getRefinementStep(Val, D, *A, RefStep))
1898 return;
1899
1900 StringRef ValBase = Val.slice(0, RefStep);
1901 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1902 if (OptionIter == OptionStrings.end()) {
1903 // Try again specifying float suffix.
1904 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1905 if (OptionIter == OptionStrings.end()) {
1906 // The input name did not match any known option string.
1907 D.Diag(diag::err_drv_unknown_argument) << Val;
1908 return;
1909 }
1910 // The option was specified without a float or double suffix.
1911 // Make sure that the double entry was not already specified.
1912 // The float entry will be checked below.
1913 if (OptionStrings[ValBase.str() + 'd']) {
1914 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1915 return;
1916 }
1917 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001918
Sanjay Patel2987c292015-06-11 14:53:41 +00001919 if (OptionIter->second == true) {
1920 // Duplicate option specified.
1921 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1922 return;
1923 }
1924
1925 // Mark the matched option as found. Do not allow duplicate specifiers.
1926 OptionIter->second = true;
1927
1928 // If the precision was not specified, also mark the double entry as found.
1929 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1930 OptionStrings[ValBase.str() + 'd'] = true;
1931
1932 // Build the output string.
1933 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1934 Out = Args.MakeArgString(Out + Prefix + Val);
1935 if (i != NumOptions - 1)
1936 Out = Args.MakeArgString(Out + ",");
1937 }
1938
1939 OutStrings.push_back(Args.MakeArgString(Out));
1940}
1941
Eric Christopherc54920a2015-03-23 19:26:05 +00001942static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001943 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001944 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001945 // If -march=native, autodetect the feature list.
1946 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1947 if (StringRef(A->getValue()) == "native") {
1948 llvm::StringMap<bool> HostFeatures;
1949 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1950 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001951 Features.push_back(
1952 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001953 }
1954 }
1955
Jim Grosbach82eee262013-11-16 00:53:35 +00001956 if (Triple.getArchName() == "x86_64h") {
1957 // x86_64h implies quite a few of the more modern subtarget features
1958 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1959 Features.push_back("-rdrnd");
1960 Features.push_back("-aes");
1961 Features.push_back("-pclmul");
1962 Features.push_back("-rtm");
1963 Features.push_back("-hle");
1964 Features.push_back("-fsgsbase");
1965 }
1966
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001967 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001968 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001969 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001970 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001971 Features.push_back("+sse4.2");
1972 Features.push_back("+popcnt");
1973 } else
1974 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001975 }
1976
Eric Christopherc54920a2015-03-23 19:26:05 +00001977 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001978 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1979 StringRef Arch = A->getValue();
1980 bool ArchUsed = false;
1981 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001982 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001983 if (Arch == "AVX" || Arch == "AVX2") {
1984 ArchUsed = true;
1985 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1986 }
1987 }
1988 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001989 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001990 if (Arch == "IA32") {
1991 ArchUsed = true;
1992 } else if (Arch == "SSE" || Arch == "SSE2") {
1993 ArchUsed = true;
1994 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1995 }
1996 }
1997 if (!ArchUsed)
1998 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1999 }
2000
Jim Grosbach82eee262013-11-16 00:53:35 +00002001 // Now add any that the user explicitly requested on the command line,
2002 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00002003 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
2004 StringRef Name = A->getOption().getName();
2005 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002006
2007 // Skip over "-m".
2008 assert(Name.startswith("m") && "Invalid feature name.");
2009 Name = Name.substr(1);
2010
2011 bool IsNegative = Name.startswith("no-");
2012 if (IsNegative)
2013 Name = Name.substr(3);
2014
2015 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2016 }
2017}
2018
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002019void Clang::AddX86TargetArgs(const ArgList &Args,
2020 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002021 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002022 Args.hasArg(options::OPT_mkernel) ||
2023 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002024 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002025
Bob Wilson2616e2e2013-02-10 16:01:41 +00002026 // Default to avoid implicit floating-point for kernel/kext code, but allow
2027 // that to be overridden with -mno-soft-float.
2028 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2029 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002030 if (Arg *A = Args.getLastArg(
2031 options::OPT_msoft_float, options::OPT_mno_soft_float,
2032 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002033 const Option &O = A->getOption();
2034 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2035 O.matches(options::OPT_msoft_float));
2036 }
2037 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002038 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002039
2040 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2041 StringRef Value = A->getValue();
2042 if (Value == "intel" || Value == "att") {
2043 CmdArgs.push_back("-mllvm");
2044 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2045 } else {
2046 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2047 << A->getOption().getName() << Value;
2048 }
2049 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002050}
2051
Tony Linthicum76329bf2011-12-12 21:14:55 +00002052void Clang::AddHexagonTargetArgs(const ArgList &Args,
2053 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002054 CmdArgs.push_back("-mqdsp6-compat");
2055 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002056
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002057 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2058 std::string N = llvm::utostr(G.getValue());
2059 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002060 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002061 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002062 }
2063
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002064 if (!Args.hasArg(options::OPT_fno_short_enums))
2065 CmdArgs.push_back("-fshort-enums");
2066 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002067 CmdArgs.push_back("-mllvm");
2068 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002069 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002070 CmdArgs.push_back("-mllvm");
2071 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002072}
2073
Kevin Qin110db6f2014-07-18 07:03:22 +00002074// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002075static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002076 std::vector<const char *> &Features) {
2077 SmallVector<StringRef, 8> Split;
2078 text.split(Split, StringRef("+"), -1, false);
2079
Benjamin Kramer72e64312015-09-24 14:48:49 +00002080 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002081 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002082 .Case("fp", "+fp-armv8")
2083 .Case("simd", "+neon")
2084 .Case("crc", "+crc")
2085 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002086 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002087 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002088 .Case("nofp", "-fp-armv8")
2089 .Case("nosimd", "-neon")
2090 .Case("nocrc", "-crc")
2091 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002092 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002093 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002094 .Default(nullptr);
2095 if (result)
2096 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002097 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002098 D.Diag(diag::err_drv_no_neon_modifier);
2099 else
2100 return false;
2101 }
2102 return true;
2103}
2104
2105// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2106// decode CPU and feature.
2107static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2108 std::vector<const char *> &Features) {
2109 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2110 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002111 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
Christof Doumaba13ad52015-12-02 12:03:42 +00002112 CPU == "cortex-a72" || CPU == "cortex-a35") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002113 Features.push_back("+neon");
2114 Features.push_back("+crc");
2115 Features.push_back("+crypto");
2116 } else if (CPU == "generic") {
2117 Features.push_back("+neon");
2118 } else {
2119 return false;
2120 }
2121
2122 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2123 return false;
2124
2125 return true;
2126}
2127
2128static bool
2129getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2130 const ArgList &Args,
2131 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002132 std::string MarchLowerCase = March.lower();
2133 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002134
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002135 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002136 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002137 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002138 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002139 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2140 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002141 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002142 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002143 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002144
2145 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2146 return false;
2147
2148 return true;
2149}
2150
2151static bool
2152getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2153 const ArgList &Args,
2154 std::vector<const char *> &Features) {
2155 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002156 std::string McpuLowerCase = Mcpu.lower();
2157 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002158 return false;
2159
2160 return true;
2161}
2162
2163static bool
2164getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2165 const ArgList &Args,
2166 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002167 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002168 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002169 if (MtuneLowerCase == "native")
2170 MtuneLowerCase = llvm::sys::getHostCPUName();
2171 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002172 Features.push_back("+zcm");
2173 Features.push_back("+zcz");
2174 }
2175 return true;
2176}
2177
2178static bool
2179getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2180 const ArgList &Args,
2181 std::vector<const char *> &Features) {
2182 StringRef CPU;
2183 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002184 std::string McpuLowerCase = Mcpu.lower();
2185 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002186 return false;
2187
2188 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2189}
2190
Justin Bognerf9052562015-11-13 23:07:31 +00002191static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002192 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002193 Arg *A;
2194 bool success = true;
2195 // Enable NEON by default.
2196 Features.push_back("+neon");
2197 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2198 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2199 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2200 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002201 else if (Args.hasArg(options::OPT_arch))
2202 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2203 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002204
2205 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2206 success =
2207 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2208 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2209 success =
2210 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002211 else if (Args.hasArg(options::OPT_arch))
2212 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2213 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002214
2215 if (!success)
2216 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002217
2218 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2219 Features.push_back("-fp-armv8");
2220 Features.push_back("-crypto");
2221 Features.push_back("-neon");
2222 }
Bradley Smith418c5932014-05-02 15:17:51 +00002223
2224 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002225 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002226 if (A->getOption().matches(options::OPT_mcrc))
2227 Features.push_back("+crc");
2228 else
2229 Features.push_back("-crc");
2230 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002231
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002232 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2233 options::OPT_munaligned_access))
2234 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2235 Features.push_back("+strict-align");
2236
Justin Bognerf9052562015-11-13 23:07:31 +00002237 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002238 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002239}
2240
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002241static void getHexagonTargetFeatures(const ArgList &Args,
2242 std::vector<const char *> &Features) {
2243 bool HasHVX = false, HasHVXD = false;
2244
2245 for (auto &A : Args) {
2246 auto &Opt = A->getOption();
2247 if (Opt.matches(options::OPT_mhexagon_hvx))
2248 HasHVX = true;
2249 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2250 HasHVXD = HasHVX = false;
2251 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2252 HasHVXD = HasHVX = true;
2253 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2254 HasHVXD = false;
2255 else
2256 continue;
2257 A->claim();
2258 }
2259
2260 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2261 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2262}
2263
Dan Gohmanc2853072015-09-03 22:51:53 +00002264static void getWebAssemblyTargetFeatures(const ArgList &Args,
2265 std::vector<const char *> &Features) {
2266 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2267 StringRef Name = A->getOption().getName();
2268 A->claim();
2269
2270 // Skip over "-m".
2271 assert(Name.startswith("m") && "Invalid feature name.");
2272 Name = Name.substr(1);
2273
2274 bool IsNegative = Name.startswith("no-");
2275 if (IsNegative)
2276 Name = Name.substr(3);
2277
2278 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2279 }
2280}
2281
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002282static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002283 const ArgList &Args, ArgStringList &CmdArgs,
2284 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002285 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002286 std::vector<const char *> Features;
2287 switch (Triple.getArch()) {
2288 default:
2289 break;
2290 case llvm::Triple::mips:
2291 case llvm::Triple::mipsel:
2292 case llvm::Triple::mips64:
2293 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002294 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002295 break;
2296
2297 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002298 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002299 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002300 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002301 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002302 break;
2303
2304 case llvm::Triple::ppc:
2305 case llvm::Triple::ppc64:
2306 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002307 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002308 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002309 case llvm::Triple::systemz:
2310 getSystemZTargetFeatures(Args, Features);
2311 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002312 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002313 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002314 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002315 break;
2316 case llvm::Triple::x86:
2317 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002318 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002319 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002320 case llvm::Triple::hexagon:
2321 getHexagonTargetFeatures(Args, Features);
2322 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002323 case llvm::Triple::wasm32:
2324 case llvm::Triple::wasm64:
2325 getWebAssemblyTargetFeatures(Args, Features);
2326 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002327 }
Rafael Espindola43964802013-08-21 17:34:32 +00002328
2329 // Find the last of each feature.
2330 llvm::StringMap<unsigned> LastOpt;
2331 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2332 const char *Name = Features[I];
2333 assert(Name[0] == '-' || Name[0] == '+');
2334 LastOpt[Name + 1] = I;
2335 }
2336
2337 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2338 // If this feature was overridden, ignore it.
2339 const char *Name = Features[I];
2340 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2341 assert(LastI != LastOpt.end());
2342 unsigned Last = LastI->second;
2343 if (Last != I)
2344 continue;
2345
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002346 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002347 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002348 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002349}
2350
David Majnemerae394812014-12-09 00:12:30 +00002351static bool
2352shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2353 const llvm::Triple &Triple) {
2354 // We use the zero-cost exception tables for Objective-C if the non-fragile
2355 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2356 // later.
2357 if (runtime.isNonFragile())
2358 return true;
2359
2360 if (!Triple.isMacOSX())
2361 return false;
2362
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002363 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002364 (Triple.getArch() == llvm::Triple::x86_64 ||
2365 Triple.getArch() == llvm::Triple::arm));
2366}
2367
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002368/// Adds exception related arguments to the driver command arguments. There's a
2369/// master flag, -fexceptions and also language specific flags to enable/disable
2370/// C++ and Objective-C exceptions. This makes it possible to for example
2371/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002372static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002373 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002374 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002375 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002376 const Driver &D = TC.getDriver();
2377 const llvm::Triple &Triple = TC.getTriple();
2378
Chad Rosier4fab82c2012-03-26 22:04:46 +00002379 if (KernelOrKext) {
2380 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2381 // arguments now to avoid warnings about unused arguments.
2382 Args.ClaimAllArgs(options::OPT_fexceptions);
2383 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2384 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2385 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2386 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2387 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002388 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002389 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002390
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002391 // See if the user explicitly enabled exceptions.
2392 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2393 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002394
David Majnemerae394812014-12-09 00:12:30 +00002395 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2396 // is not necessarily sensible, but follows GCC.
2397 if (types::isObjC(InputType) &&
2398 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002399 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002400 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002401
David Majnemerae394812014-12-09 00:12:30 +00002402 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002403 }
2404
2405 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002406 // Disable C++ EH by default on XCore, PS4, and MSVC.
2407 // FIXME: Remove MSVC from this list once things work.
2408 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2409 !Triple.isPS4CPU() &&
2410 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002411 Arg *ExceptionArg = Args.getLastArg(
2412 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2413 options::OPT_fexceptions, options::OPT_fno_exceptions);
2414 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002415 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002416 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2417 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002418
2419 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002420 if (Triple.isPS4CPU()) {
2421 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2422 assert(ExceptionArg &&
2423 "On the PS4 exceptions should only be enabled if passing "
2424 "an argument");
2425 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2426 const Arg *RTTIArg = TC.getRTTIArg();
2427 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2428 D.Diag(diag::err_drv_argument_not_allowed_with)
2429 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2430 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2431 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2432 } else
2433 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2434
Anders Carlssone96ab552011-02-28 02:27:16 +00002435 CmdArgs.push_back("-fcxx-exceptions");
2436
David Majnemer8de68642014-12-05 08:11:58 +00002437 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002438 }
2439 }
2440
David Majnemer8de68642014-12-05 08:11:58 +00002441 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002442 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002443}
2444
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002445static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002446 bool Default = true;
2447 if (TC.getTriple().isOSDarwin()) {
2448 // The native darwin assembler doesn't support the linker_option directives,
2449 // so we disable them if we think the .s file will be passed to it.
2450 Default = TC.useIntegratedAs();
2451 }
2452 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2453 Default);
2454}
2455
Ted Kremenek62093662013-03-12 17:02:12 +00002456static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2457 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002458 bool UseDwarfDirectory =
2459 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2460 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002461 return !UseDwarfDirectory;
2462}
2463
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002464/// \brief Check whether the given input tree contains any compilation actions.
2465static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002466 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002467 return true;
2468
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002469 for (const auto &Act : *A)
2470 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002471 return true;
2472
2473 return false;
2474}
2475
2476/// \brief Check if -relax-all should be passed to the internal assembler.
2477/// This is done by default when compiling non-assembler source with -O0.
2478static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2479 bool RelaxDefault = true;
2480
2481 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2482 RelaxDefault = A->getOption().matches(options::OPT_O0);
2483
2484 if (RelaxDefault) {
2485 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002486 for (const auto &Act : C.getActions()) {
2487 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002488 RelaxDefault = true;
2489 break;
2490 }
2491 }
2492 }
2493
2494 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002495 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002496}
2497
Douglas Katzman3459ce22015-10-08 04:24:12 +00002498// Extract the integer N from a string spelled "-dwarf-N", returning 0
2499// on mismatch. The StringRef input (rather than an Arg) allows
2500// for use by the "-Xassembler" option parser.
2501static unsigned DwarfVersionNum(StringRef ArgValue) {
2502 return llvm::StringSwitch<unsigned>(ArgValue)
2503 .Case("-gdwarf-2", 2)
2504 .Case("-gdwarf-3", 3)
2505 .Case("-gdwarf-4", 4)
2506 .Default(0);
2507}
2508
2509static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2510 CodeGenOptions::DebugInfoKind DebugInfoKind,
2511 unsigned DwarfVersion) {
2512 switch (DebugInfoKind) {
2513 case CodeGenOptions::DebugLineTablesOnly:
2514 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2515 break;
2516 case CodeGenOptions::LimitedDebugInfo:
2517 CmdArgs.push_back("-debug-info-kind=limited");
2518 break;
2519 case CodeGenOptions::FullDebugInfo:
2520 CmdArgs.push_back("-debug-info-kind=standalone");
2521 break;
2522 default:
2523 break;
2524 }
2525 if (DwarfVersion > 0)
2526 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002527 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002528}
2529
David Blaikie9260ed62013-07-25 21:19:01 +00002530static void CollectArgsForIntegratedAssembler(Compilation &C,
2531 const ArgList &Args,
2532 ArgStringList &CmdArgs,
2533 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002534 if (UseRelaxAll(C, Args))
2535 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002536
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002537 // When passing -I arguments to the assembler we sometimes need to
2538 // unconditionally take the next argument. For example, when parsing
2539 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2540 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2541 // arg after parsing the '-I' arg.
2542 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002543
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002544 // When using an integrated assembler, translate -Wa, and -Xassembler
2545 // options.
2546 bool CompressDebugSections = false;
2547 for (const Arg *A :
2548 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2549 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002550
Benjamin Kramer72e64312015-09-24 14:48:49 +00002551 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002552 if (TakeNextArg) {
2553 CmdArgs.push_back(Value.data());
2554 TakeNextArg = false;
2555 continue;
2556 }
David Blaikie9260ed62013-07-25 21:19:01 +00002557
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002558 switch (C.getDefaultToolChain().getArch()) {
2559 default:
2560 break;
2561 case llvm::Triple::mips:
2562 case llvm::Triple::mipsel:
2563 case llvm::Triple::mips64:
2564 case llvm::Triple::mips64el:
2565 if (Value == "--trap") {
2566 CmdArgs.push_back("-target-feature");
2567 CmdArgs.push_back("+use-tcc-in-div");
2568 continue;
2569 }
2570 if (Value == "--break") {
2571 CmdArgs.push_back("-target-feature");
2572 CmdArgs.push_back("-use-tcc-in-div");
2573 continue;
2574 }
2575 if (Value.startswith("-msoft-float")) {
2576 CmdArgs.push_back("-target-feature");
2577 CmdArgs.push_back("+soft-float");
2578 continue;
2579 }
2580 if (Value.startswith("-mhard-float")) {
2581 CmdArgs.push_back("-target-feature");
2582 CmdArgs.push_back("-soft-float");
2583 continue;
2584 }
2585 break;
2586 }
2587
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002588 if (Value == "-force_cpusubtype_ALL") {
2589 // Do nothing, this is the default and we don't support anything else.
2590 } else if (Value == "-L") {
2591 CmdArgs.push_back("-msave-temp-labels");
2592 } else if (Value == "--fatal-warnings") {
2593 CmdArgs.push_back("-massembler-fatal-warnings");
2594 } else if (Value == "--noexecstack") {
2595 CmdArgs.push_back("-mnoexecstack");
2596 } else if (Value == "-compress-debug-sections" ||
2597 Value == "--compress-debug-sections") {
2598 CompressDebugSections = true;
2599 } else if (Value == "-nocompress-debug-sections" ||
2600 Value == "--nocompress-debug-sections") {
2601 CompressDebugSections = false;
2602 } else if (Value.startswith("-I")) {
2603 CmdArgs.push_back(Value.data());
2604 // We need to consume the next argument if the current arg is a plain
2605 // -I. The next arg will be the include directory.
2606 if (Value == "-I")
2607 TakeNextArg = true;
2608 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002609 // "-gdwarf-N" options are not cc1as options.
2610 unsigned DwarfVersion = DwarfVersionNum(Value);
2611 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2612 CmdArgs.push_back(Value.data());
2613 } else {
2614 RenderDebugEnablingArgs(
2615 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2616 }
Renato Golin7c542b42015-07-27 23:44:45 +00002617 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2618 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2619 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002620 } else {
2621 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002622 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002623 }
2624 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002625 }
2626 if (CompressDebugSections) {
2627 if (llvm::zlib::isAvailable())
2628 CmdArgs.push_back("-compress-debug-sections");
2629 else
2630 D.Diag(diag::warn_debug_compression_unavailable);
2631 }
David Blaikie9260ed62013-07-25 21:19:01 +00002632}
2633
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002634// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002635// FIXME: Make sure we can also emit shared objects if they're requested
2636// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002637static void addClangRT(const ToolChain &TC, const ArgList &Args,
2638 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002639 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002640}
2641
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002642namespace {
2643enum OpenMPRuntimeKind {
2644 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2645 /// without knowing what runtime to target.
2646 OMPRT_Unknown,
2647
2648 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2649 /// the default for Clang.
2650 OMPRT_OMP,
2651
2652 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2653 /// this runtime but can swallow the pragmas, and find and link against the
2654 /// runtime library itself.
2655 OMPRT_GOMP,
2656
Chandler Carruthc6625c62015-05-28 21:10:31 +00002657 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002658 /// OpenMP runtime. We support this mode for users with existing dependencies
2659 /// on this runtime library name.
2660 OMPRT_IOMP5
2661};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002662}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002663
2664/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002665static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2666 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002667 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2668
2669 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2670 if (A)
2671 RuntimeName = A->getValue();
2672
2673 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002674 .Case("libomp", OMPRT_OMP)
2675 .Case("libgomp", OMPRT_GOMP)
2676 .Case("libiomp5", OMPRT_IOMP5)
2677 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002678
2679 if (RT == OMPRT_Unknown) {
2680 if (A)
2681 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002682 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002683 else
2684 // FIXME: We could use a nicer diagnostic here.
2685 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2686 }
2687
2688 return RT;
2689}
2690
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002691static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2692 const ArgList &Args) {
2693 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2694 options::OPT_fno_openmp, false))
2695 return;
2696
2697 switch (getOpenMPRuntime(TC, Args)) {
2698 case OMPRT_OMP:
2699 CmdArgs.push_back("-lomp");
2700 break;
2701 case OMPRT_GOMP:
2702 CmdArgs.push_back("-lgomp");
2703 break;
2704 case OMPRT_IOMP5:
2705 CmdArgs.push_back("-liomp5");
2706 break;
2707 case OMPRT_Unknown:
2708 // Already diagnosed.
2709 break;
2710 }
2711}
2712
Alexey Samsonov52550342014-09-15 19:58:40 +00002713static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2714 ArgStringList &CmdArgs, StringRef Sanitizer,
2715 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002716 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002717 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002718 if (!IsShared) CmdArgs.push_back("-whole-archive");
2719 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2720 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002721}
2722
Alexey Samsonov52550342014-09-15 19:58:40 +00002723// Tries to use a file with the list of dynamic symbols that need to be exported
2724// from the runtime library. Returns true if the file was found.
2725static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2726 ArgStringList &CmdArgs,
2727 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002728 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002729 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2730 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002731 return true;
2732 }
2733 return false;
2734}
2735
2736static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2737 ArgStringList &CmdArgs) {
2738 // Force linking against the system libraries sanitizers depends on
2739 // (see PR15823 why this is necessary).
2740 CmdArgs.push_back("--no-as-needed");
2741 CmdArgs.push_back("-lpthread");
2742 CmdArgs.push_back("-lrt");
2743 CmdArgs.push_back("-lm");
2744 // There's no libdl on FreeBSD.
2745 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2746 CmdArgs.push_back("-ldl");
2747}
2748
2749static void
2750collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2751 SmallVectorImpl<StringRef> &SharedRuntimes,
2752 SmallVectorImpl<StringRef> &StaticRuntimes,
2753 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2754 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2755 // Collect shared runtimes.
2756 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2757 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002758 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002759
Alexey Samsonov52550342014-09-15 19:58:40 +00002760 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002761 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002762 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002763 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002764 }
2765 if (SanArgs.needsAsanRt()) {
2766 if (SanArgs.needsSharedAsanRt()) {
2767 HelperStaticRuntimes.push_back("asan-preinit");
2768 } else {
2769 StaticRuntimes.push_back("asan");
2770 if (SanArgs.linkCXXRuntimes())
2771 StaticRuntimes.push_back("asan_cxx");
2772 }
2773 }
2774 if (SanArgs.needsDfsanRt())
2775 StaticRuntimes.push_back("dfsan");
2776 if (SanArgs.needsLsanRt())
2777 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002778 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002779 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002780 if (SanArgs.linkCXXRuntimes())
2781 StaticRuntimes.push_back("msan_cxx");
2782 }
2783 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002784 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002785 if (SanArgs.linkCXXRuntimes())
2786 StaticRuntimes.push_back("tsan_cxx");
2787 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002788 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002789 StaticRuntimes.push_back("ubsan_standalone");
2790 if (SanArgs.linkCXXRuntimes())
2791 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002792 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002793 if (SanArgs.needsSafeStackRt())
2794 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002795 if (SanArgs.needsCfiRt())
2796 StaticRuntimes.push_back("cfi");
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002797 if (SanArgs.needsCfiDiagRt())
2798 StaticRuntimes.push_back("cfi_diag");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002799}
2800
Alexey Samsonov52550342014-09-15 19:58:40 +00002801// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2802// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2803static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002804 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002805 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2806 HelperStaticRuntimes;
2807 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2808 HelperStaticRuntimes);
2809 for (auto RT : SharedRuntimes)
2810 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2811 for (auto RT : HelperStaticRuntimes)
2812 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2813 bool AddExportDynamic = false;
2814 for (auto RT : StaticRuntimes) {
2815 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2816 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2817 }
2818 // If there is a static runtime with no dynamic list, force all the symbols
2819 // to be dynamic to be sure we export sanitizer interface functions.
2820 if (AddExportDynamic)
2821 CmdArgs.push_back("-export-dynamic");
2822 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002823}
2824
Reid Kleckner86ea7702015-02-04 23:45:07 +00002825static bool areOptimizationsEnabled(const ArgList &Args) {
2826 // Find the last -O arg and see if it is non-zero.
2827 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2828 return !A->getOption().matches(options::OPT_O0);
2829 // Defaults to -O0.
2830 return false;
2831}
2832
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002833static bool shouldUseFramePointerForTarget(const ArgList &Args,
2834 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002835 switch (Triple.getArch()) {
2836 case llvm::Triple::xcore:
2837 case llvm::Triple::wasm32:
2838 case llvm::Triple::wasm64:
2839 // XCore never wants frame pointers, regardless of OS.
2840 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002841 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002842 default:
2843 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002844 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002845
2846 if (Triple.isOSLinux()) {
2847 switch (Triple.getArch()) {
2848 // Don't use a frame pointer on linux if optimizing for certain targets.
2849 case llvm::Triple::mips64:
2850 case llvm::Triple::mips64el:
2851 case llvm::Triple::mips:
2852 case llvm::Triple::mipsel:
2853 case llvm::Triple::systemz:
2854 case llvm::Triple::x86:
2855 case llvm::Triple::x86_64:
2856 return !areOptimizationsEnabled(Args);
2857 default:
2858 return true;
2859 }
2860 }
2861
2862 if (Triple.isOSWindows()) {
2863 switch (Triple.getArch()) {
2864 case llvm::Triple::x86:
2865 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002866 case llvm::Triple::arm:
2867 case llvm::Triple::thumb:
2868 // Windows on ARM builds with FPO disabled to aid fast stack walking
2869 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002870 default:
2871 // All other supported Windows ISAs use xdata unwind information, so frame
2872 // pointers are not generally useful.
2873 return false;
2874 }
2875 }
2876
2877 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002878}
2879
Rafael Espindola224dd632011-12-14 21:02:23 +00002880static bool shouldUseFramePointer(const ArgList &Args,
2881 const llvm::Triple &Triple) {
2882 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2883 options::OPT_fomit_frame_pointer))
2884 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002885 if (Args.hasArg(options::OPT_pg))
2886 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002887
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002888 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002889}
2890
Eric Christopherb7d97e92013-04-03 01:58:53 +00002891static bool shouldUseLeafFramePointer(const ArgList &Args,
2892 const llvm::Triple &Triple) {
2893 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2894 options::OPT_momit_leaf_frame_pointer))
2895 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002896 if (Args.hasArg(options::OPT_pg))
2897 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002898
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002899 if (Triple.isPS4CPU())
2900 return false;
2901
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002902 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002903}
2904
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002905/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002906static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002907 SmallString<128> cwd;
2908 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002909 CmdArgs.push_back("-fdebug-compilation-dir");
2910 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002911 }
2912}
2913
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002914static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002915 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2916 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2917 SmallString<128> T(FinalOutput->getValue());
2918 llvm::sys::path::replace_extension(T, "dwo");
2919 return Args.MakeArgString(T);
2920 } else {
2921 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002922 SmallString<128> T(
2923 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002924 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002925 llvm::sys::path::replace_extension(F, "dwo");
2926 T += F;
2927 return Args.MakeArgString(F);
2928 }
2929}
2930
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002931static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2932 const JobAction &JA, const ArgList &Args,
2933 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002934 ArgStringList ExtractArgs;
2935 ExtractArgs.push_back("--extract-dwo");
2936
2937 ArgStringList StripArgs;
2938 StripArgs.push_back("--strip-dwo");
2939
2940 // Grabbing the output of the earlier compile step.
2941 StripArgs.push_back(Output.getFilename());
2942 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002943 ExtractArgs.push_back(OutFile);
2944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002945 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002946 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002947
2948 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002949 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002950
2951 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002952 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002953}
2954
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002955/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002956/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2957static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002958 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002959 if (A->getOption().matches(options::OPT_O4) ||
2960 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002961 return true;
2962
2963 if (A->getOption().matches(options::OPT_O0))
2964 return false;
2965
2966 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2967
Rafael Espindola91780de2013-08-26 14:05:41 +00002968 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002969 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002970 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002971 return true;
2972
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002973 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002974 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002975 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002976
2977 unsigned OptLevel = 0;
2978 if (S.getAsInteger(10, OptLevel))
2979 return false;
2980
2981 return OptLevel > 1;
2982 }
2983
2984 return false;
2985}
2986
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002987/// Add -x lang to \p CmdArgs for \p Input.
2988static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2989 ArgStringList &CmdArgs) {
2990 // When using -verify-pch, we don't want to provide the type
2991 // 'precompiled-header' if it was inferred from the file extension
2992 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2993 return;
2994
2995 CmdArgs.push_back("-x");
2996 if (Args.hasArg(options::OPT_rewrite_objc))
2997 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2998 else
2999 CmdArgs.push_back(types::getTypeName(Input.getType()));
3000}
3001
David Majnemerc371ff02015-03-22 08:39:22 +00003002static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003003 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003004 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003005
3006 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003007 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003008
3009 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003010 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003011 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003012 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003013}
3014
Rafael Espindola577637a2015-01-03 00:06:04 +00003015// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003016// options that build systems might add but are unused when assembling or only
3017// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003018static void claimNoWarnArgs(const ArgList &Args) {
3019 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003020 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003021 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003022 Args.ClaimAllArgs(options::OPT_flto);
3023 Args.ClaimAllArgs(options::OPT_fno_lto);
3024}
3025
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003026static void appendUserToPath(SmallVectorImpl<char> &Result) {
3027#ifdef LLVM_ON_UNIX
3028 const char *Username = getenv("LOGNAME");
3029#else
3030 const char *Username = getenv("USERNAME");
3031#endif
3032 if (Username) {
3033 // Validate that LoginName can be used in a path, and get its length.
3034 size_t Len = 0;
3035 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003036 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003037 Username = nullptr;
3038 break;
3039 }
3040 }
3041
3042 if (Username && Len > 0) {
3043 Result.append(Username, Username + Len);
3044 return;
3045 }
3046 }
3047
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003048// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003049#ifdef LLVM_ON_UNIX
3050 std::string UID = llvm::utostr(getuid());
3051#else
3052 // FIXME: Windows seems to have an 'SID' that might work.
3053 std::string UID = "9999";
3054#endif
3055 Result.append(UID.begin(), UID.end());
3056}
3057
David Majnemere11d3732015-06-08 00:22:46 +00003058VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3059 const llvm::Triple &Triple,
3060 const llvm::opt::ArgList &Args,
3061 bool IsWindowsMSVC) {
3062 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3063 IsWindowsMSVC) ||
3064 Args.hasArg(options::OPT_fmsc_version) ||
3065 Args.hasArg(options::OPT_fms_compatibility_version)) {
3066 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3067 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003068 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003069
3070 if (MSCVersion && MSCompatibilityVersion) {
3071 if (D)
3072 D->Diag(diag::err_drv_argument_not_allowed_with)
3073 << MSCVersion->getAsString(Args)
3074 << MSCompatibilityVersion->getAsString(Args);
3075 return VersionTuple();
3076 }
3077
3078 if (MSCompatibilityVersion) {
3079 VersionTuple MSVT;
3080 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3081 D->Diag(diag::err_drv_invalid_value)
3082 << MSCompatibilityVersion->getAsString(Args)
3083 << MSCompatibilityVersion->getValue();
3084 return MSVT;
3085 }
3086
3087 if (MSCVersion) {
3088 unsigned Version = 0;
3089 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3090 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3091 << MSCVersion->getValue();
3092 return getMSCompatibilityVersion(Version);
3093 }
3094
3095 unsigned Major, Minor, Micro;
3096 Triple.getEnvironmentVersion(Major, Minor, Micro);
3097 if (Major || Minor || Micro)
3098 return VersionTuple(Major, Minor, Micro);
3099
3100 return VersionTuple(18);
3101 }
3102 return VersionTuple();
3103}
3104
Diego Novilloa0545962015-07-10 18:00:07 +00003105static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3106 const InputInfo &Output, const ArgList &Args,
3107 ArgStringList &CmdArgs) {
3108 auto *ProfileGenerateArg = Args.getLastArg(
3109 options::OPT_fprofile_instr_generate,
3110 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003111 options::OPT_fprofile_generate_EQ,
3112 options::OPT_fno_profile_instr_generate);
3113 if (ProfileGenerateArg &&
3114 ProfileGenerateArg->getOption().matches(
3115 options::OPT_fno_profile_instr_generate))
3116 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003117
3118 auto *ProfileUseArg = Args.getLastArg(
3119 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003120 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3121 options::OPT_fno_profile_instr_use);
3122 if (ProfileUseArg &&
3123 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3124 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003125
3126 if (ProfileGenerateArg && ProfileUseArg)
3127 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003128 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003129
Diego Novillo758f3f52015-08-05 21:49:51 +00003130 if (ProfileGenerateArg) {
3131 if (ProfileGenerateArg->getOption().matches(
3132 options::OPT_fprofile_instr_generate_EQ))
3133 ProfileGenerateArg->render(Args, CmdArgs);
3134 else if (ProfileGenerateArg->getOption().matches(
3135 options::OPT_fprofile_generate_EQ)) {
3136 SmallString<128> Path(ProfileGenerateArg->getValue());
3137 llvm::sys::path::append(Path, "default.profraw");
3138 CmdArgs.push_back(
3139 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3140 } else
3141 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3142 }
Diego Novilloa0545962015-07-10 18:00:07 +00003143
Diego Novillo758f3f52015-08-05 21:49:51 +00003144 if (ProfileUseArg) {
3145 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3146 ProfileUseArg->render(Args, CmdArgs);
3147 else if ((ProfileUseArg->getOption().matches(
3148 options::OPT_fprofile_use_EQ) ||
3149 ProfileUseArg->getOption().matches(
3150 options::OPT_fprofile_instr_use))) {
3151 SmallString<128> Path(
3152 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3153 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3154 llvm::sys::path::append(Path, "default.profdata");
3155 CmdArgs.push_back(
3156 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3157 }
Diego Novilloa0545962015-07-10 18:00:07 +00003158 }
3159
3160 if (Args.hasArg(options::OPT_ftest_coverage) ||
3161 Args.hasArg(options::OPT_coverage))
3162 CmdArgs.push_back("-femit-coverage-notes");
3163 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3164 false) ||
3165 Args.hasArg(options::OPT_coverage))
3166 CmdArgs.push_back("-femit-coverage-data");
3167
Diego Novilloc4b94da2015-08-05 23:27:40 +00003168 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3169 options::OPT_fno_coverage_mapping, false) &&
3170 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003171 D.Diag(diag::err_drv_argument_only_allowed_with)
3172 << "-fcoverage-mapping"
3173 << "-fprofile-instr-generate";
3174
Diego Novilloc4b94da2015-08-05 23:27:40 +00003175 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3176 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003177 CmdArgs.push_back("-fcoverage-mapping");
3178
3179 if (C.getArgs().hasArg(options::OPT_c) ||
3180 C.getArgs().hasArg(options::OPT_S)) {
3181 if (Output.isFilename()) {
3182 CmdArgs.push_back("-coverage-file");
3183 SmallString<128> CoverageFilename;
3184 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3185 CoverageFilename = FinalOutput->getValue();
3186 } else {
3187 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3188 }
3189 if (llvm::sys::path::is_relative(CoverageFilename)) {
3190 SmallString<128> Pwd;
3191 if (!llvm::sys::fs::current_path(Pwd)) {
3192 llvm::sys::path::append(Pwd, CoverageFilename);
3193 CoverageFilename.swap(Pwd);
3194 }
3195 }
3196 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3197 }
3198 }
3199}
3200
Paul Robinsond083b9a2015-12-16 17:25:27 +00003201static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3202 ArgStringList &CmdArgs) {
3203 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3204 false) ||
3205 Args.hasFlag(options::OPT_fprofile_generate,
3206 options::OPT_fno_profile_instr_generate, false) ||
3207 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3208 options::OPT_fno_profile_instr_generate, false) ||
3209 Args.hasFlag(options::OPT_fprofile_instr_generate,
3210 options::OPT_fno_profile_instr_generate, false) ||
3211 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3212 options::OPT_fno_profile_instr_generate, false) ||
3213 Args.hasArg(options::OPT_fcreate_profile) ||
3214 Args.hasArg(options::OPT_coverage)))
3215 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3216}
3217
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003218/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3219/// smooshes them together with platform defaults, to decide whether
3220/// this compile should be using PIC mode or not. Returns a tuple of
3221/// (RelocationModel, PICLevel, IsPIE).
3222static std::tuple<llvm::Reloc::Model, unsigned, bool>
3223ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3224 const ArgList &Args) {
3225 // FIXME: why does this code...and so much everywhere else, use both
3226 // ToolChain.getTriple() and Triple?
3227 bool PIE = ToolChain.isPIEDefault();
3228 bool PIC = PIE || ToolChain.isPICDefault();
3229 bool IsPICLevelTwo = PIC;
3230
3231 bool KernelOrKext =
3232 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3233
3234 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003235 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003236 switch (ToolChain.getArch()) {
3237 case llvm::Triple::arm:
3238 case llvm::Triple::armeb:
3239 case llvm::Triple::thumb:
3240 case llvm::Triple::thumbeb:
3241 case llvm::Triple::aarch64:
3242 case llvm::Triple::mips:
3243 case llvm::Triple::mipsel:
3244 case llvm::Triple::mips64:
3245 case llvm::Triple::mips64el:
3246 PIC = true; // "-fpic"
3247 break;
3248
3249 case llvm::Triple::x86:
3250 case llvm::Triple::x86_64:
3251 PIC = true; // "-fPIC"
3252 IsPICLevelTwo = true;
3253 break;
3254
3255 default:
3256 break;
3257 }
3258 }
3259
3260 // OpenBSD-specific defaults for PIE
3261 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3262 switch (ToolChain.getArch()) {
3263 case llvm::Triple::mips64:
3264 case llvm::Triple::mips64el:
3265 case llvm::Triple::sparcel:
3266 case llvm::Triple::x86:
3267 case llvm::Triple::x86_64:
3268 IsPICLevelTwo = false; // "-fpie"
3269 break;
3270
3271 case llvm::Triple::ppc:
3272 case llvm::Triple::sparc:
3273 case llvm::Triple::sparcv9:
3274 IsPICLevelTwo = true; // "-fPIE"
3275 break;
3276
3277 default:
3278 break;
3279 }
3280 }
3281
3282 // The last argument relating to either PIC or PIE wins, and no
3283 // other argument is used. If the last argument is any flavor of the
3284 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3285 // option implicitly enables PIC at the same level.
3286 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3287 options::OPT_fpic, options::OPT_fno_pic,
3288 options::OPT_fPIE, options::OPT_fno_PIE,
3289 options::OPT_fpie, options::OPT_fno_pie);
3290 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3291 // is forced, then neither PIC nor PIE flags will have no effect.
3292 if (!ToolChain.isPICDefaultForced()) {
3293 if (LastPICArg) {
3294 Option O = LastPICArg->getOption();
3295 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3296 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3297 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3298 PIC =
3299 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3300 IsPICLevelTwo =
3301 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3302 } else {
3303 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003304 if (Triple.isPS4CPU()) {
3305 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3306 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3307 if (Model != "kernel") {
3308 PIC = true;
3309 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3310 << LastPICArg->getSpelling();
3311 }
3312 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003313 }
3314 }
3315 }
3316
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003317 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3318 // PIC level would've been set to level 1, force it back to level 2 PIC
3319 // instead.
3320 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003321 IsPICLevelTwo |= ToolChain.isPICDefault();
3322
James Y Knightc4015d32015-08-21 04:14:55 +00003323 // This kernel flags are a trump-card: they will disable PIC/PIE
3324 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003325 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3326 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003327 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003328
3329 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3330 // This is a very special mode. It trumps the other modes, almost no one
3331 // uses it, and it isn't even valid on any OS but Darwin.
3332 if (!ToolChain.getTriple().isOSDarwin())
3333 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3334 << A->getSpelling() << ToolChain.getTriple().str();
3335
3336 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3337
3338 // Only a forced PIC mode can cause the actual compile to have PIC defines
3339 // etc., no flags are sufficient. This behavior was selected to closely
3340 // match that of llvm-gcc and Apple GCC before that.
3341 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3342
3343 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3344 }
3345
3346 if (PIC)
3347 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3348
3349 return std::make_tuple(llvm::Reloc::Static, 0, false);
3350}
3351
3352static const char *RelocationModelName(llvm::Reloc::Model Model) {
3353 switch (Model) {
3354 case llvm::Reloc::Default:
3355 return nullptr;
3356 case llvm::Reloc::Static:
3357 return "static";
3358 case llvm::Reloc::PIC_:
3359 return "pic";
3360 case llvm::Reloc::DynamicNoPIC:
3361 return "dynamic-no-pic";
3362 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003363 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003364}
3365
3366static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3367 ArgStringList &CmdArgs) {
3368 llvm::Reloc::Model RelocationModel;
3369 unsigned PICLevel;
3370 bool IsPIE;
3371 std::tie(RelocationModel, PICLevel, IsPIE) =
3372 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3373
3374 if (RelocationModel != llvm::Reloc::Static)
3375 CmdArgs.push_back("-KPIC");
3376}
3377
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003378void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003379 const InputInfo &Output, const InputInfoList &Inputs,
3380 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003381 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3382 const llvm::Triple Triple(TripleStr);
3383
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003384 bool KernelOrKext =
3385 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003386 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003387 ArgStringList CmdArgs;
3388
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003389 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003390 bool IsWindowsCygnus =
3391 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003392 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003393 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003394
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003395 // Check number of inputs for sanity. We need at least one input.
3396 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003397 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003398 // CUDA compilation may have multiple inputs (source file + results of
3399 // device-side compilations). All other jobs are expected to have exactly one
3400 // input.
3401 bool IsCuda = types::isCuda(Input.getType());
3402 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003403
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003404 // Invoke ourselves in -cc1 mode.
3405 //
3406 // FIXME: Implement custom jobs for internal actions.
3407 CmdArgs.push_back("-cc1");
3408
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003409 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003410 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003411 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003412
Artem Belevichfa11ab52015-11-17 22:28:46 +00003413 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003414 if (IsCuda) {
3415 // FIXME: We need a (better) way to pass information about
3416 // particular compilation pass we're constructing here. For now we
3417 // can check which toolchain we're using and pick the other one to
3418 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003419 if (&getToolChain() == C.getCudaDeviceToolChain())
3420 AuxToolChain = C.getCudaHostToolChain();
3421 else if (&getToolChain() == C.getCudaHostToolChain())
3422 AuxToolChain = C.getCudaDeviceToolChain();
3423 else
3424 llvm_unreachable("Can't figure out CUDA compilation mode.");
3425 assert(AuxToolChain != nullptr && "No aux toolchain.");
3426 CmdArgs.push_back("-aux-triple");
3427 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003428 CmdArgs.push_back("-fcuda-target-overloads");
3429 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003430 }
3431
James Y Knight2db38f32015-08-15 03:45:25 +00003432 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3433 Triple.getArch() == llvm::Triple::thumb)) {
3434 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003435 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003436 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003437 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003438 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003439 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003440 }
3441
Tim Northover336f1892014-03-29 13:16:12 +00003442 // Push all default warning arguments that are specific to
3443 // the given target. These come before user provided warning options
3444 // are provided.
3445 getToolChain().addClangWarningOptions(CmdArgs);
3446
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003447 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003448 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003449
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003450 if (isa<AnalyzeJobAction>(JA)) {
3451 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3452 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003453 } else if (isa<MigrateJobAction>(JA)) {
3454 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003455 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003456 if (Output.getType() == types::TY_Dependencies)
3457 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003458 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003459 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003460 if (Args.hasArg(options::OPT_rewrite_objc) &&
3461 !Args.hasArg(options::OPT_g_Group))
3462 CmdArgs.push_back("-P");
3463 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003464 } else if (isa<AssembleJobAction>(JA)) {
3465 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003466
David Blaikie9260ed62013-07-25 21:19:01 +00003467 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003468
3469 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003470 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003471 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003472 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003473 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003474
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003475 if (JA.getType() == types::TY_Nothing)
3476 CmdArgs.push_back("-fsyntax-only");
3477 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003478 CmdArgs.push_back("-emit-pch");
3479 else
3480 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003481 } else if (isa<VerifyPCHJobAction>(JA)) {
3482 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003483 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003484 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3485 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003486 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003487 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003488 } else if (JA.getType() == types::TY_LLVM_IR ||
3489 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003490 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003491 } else if (JA.getType() == types::TY_LLVM_BC ||
3492 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003493 CmdArgs.push_back("-emit-llvm-bc");
3494 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003495 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003496 } else if (JA.getType() == types::TY_AST) {
3497 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003498 } else if (JA.getType() == types::TY_ModuleFile) {
3499 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003500 } else if (JA.getType() == types::TY_RewrittenObjC) {
3501 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003502 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003503 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3504 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003505 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003506 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003507 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003508 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003509
3510 // Preserve use-list order by default when emitting bitcode, so that
3511 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3512 // same result as running passes here. For LTO, we don't need to preserve
3513 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003514 if (JA.getType() == types::TY_LLVM_BC)
3515 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003516
3517 if (D.isUsingLTO())
3518 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003519 }
3520
Teresa Johnsonaff22322015-12-07 19:21:34 +00003521 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3522 if (!types::isLLVMIR(Input.getType()))
3523 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3524 << "-x ir";
3525 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3526 }
3527
Justin Bognera88f0122014-06-20 22:59:50 +00003528 // We normally speed up the clang process a bit by skipping destructors at
3529 // exit, but when we're generating diagnostics we can rely on some of the
3530 // cleanup.
3531 if (!C.isForDiagnostics())
3532 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003533
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003534// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003535#ifdef NDEBUG
3536 CmdArgs.push_back("-disable-llvm-verifier");
3537#endif
3538
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003539 // Set the main file name, so that debug info works even with
3540 // -save-temps.
3541 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003542 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003543
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003544 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003545 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003546 if (Args.hasArg(options::OPT_static))
3547 CmdArgs.push_back("-static-define");
3548
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003549 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003550 // Enable region store model by default.
3551 CmdArgs.push_back("-analyzer-store=region");
3552
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003553 // Treat blocks as analysis entry points.
3554 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3555
Ted Kremenek49c79792011-03-24 00:28:47 +00003556 CmdArgs.push_back("-analyzer-eagerly-assume");
3557
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003558 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003559 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003560 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003561
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003562 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003563 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003564
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003565 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003566 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003567
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003568 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003569
Artem Belevichba558952015-05-06 18:20:23 +00003570 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003571 CmdArgs.push_back("-analyzer-checker=cplusplus");
3572
Nico Webere8e53112014-05-11 01:04:02 +00003573 // Enable the following experimental checkers for testing.
3574 CmdArgs.push_back(
3575 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003576 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3577 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003578 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003579 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3580 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003581
3582 // Default nullability checks.
3583 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3584 CmdArgs.push_back(
3585 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003586 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003587
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003588 // Set the output format. The default is plist, for (lame) historical
3589 // reasons.
3590 CmdArgs.push_back("-analyzer-output");
3591 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003592 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003593 else
3594 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003595
Ted Kremenekfe449a22010-03-22 22:32:05 +00003596 // Disable the presentation of standard compiler warnings when
3597 // using --analyze. We only want to show static analyzer diagnostics
3598 // or frontend errors.
3599 CmdArgs.push_back("-w");
3600
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003601 // Add -Xanalyzer arguments when running as analyzer.
3602 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003603 }
3604
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003605 CheckCodeGenerationOptions(D, Args);
3606
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003607 llvm::Reloc::Model RelocationModel;
3608 unsigned PICLevel;
3609 bool IsPIE;
3610 std::tie(RelocationModel, PICLevel, IsPIE) =
3611 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003612
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003613 const char *RMName = RelocationModelName(RelocationModel);
3614 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003615 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003616 CmdArgs.push_back(RMName);
3617 }
3618 if (PICLevel > 0) {
3619 CmdArgs.push_back("-pic-level");
3620 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3621 if (IsPIE) {
3622 CmdArgs.push_back("-pie-level");
3623 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003624 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003625 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003626
Renato Golin4854d802015-11-09 12:40:41 +00003627 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3628 CmdArgs.push_back("-meabi");
3629 CmdArgs.push_back(A->getValue());
3630 }
3631
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003632 CmdArgs.push_back("-mthread-model");
3633 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3634 CmdArgs.push_back(A->getValue());
3635 else
3636 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3637
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003638 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3639
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003640 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3641 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003642 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003643
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003644 // LLVM Code Generator Options.
3645
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003646 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3647 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003648 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3649 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003650 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003651 CmdArgs.push_back(A->getValue());
3652 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003653 }
3654 }
3655
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003656 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3657 StringRef v = A->getValue();
3658 CmdArgs.push_back("-mllvm");
3659 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3660 A->claim();
3661 }
3662
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003663 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3664 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003665 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003666 }
3667
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003668 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3669 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003670 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003671 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003672 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003673 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3674 CmdArgs.push_back("-fpcc-struct-return");
3675 } else {
3676 assert(A->getOption().matches(options::OPT_freg_struct_return));
3677 CmdArgs.push_back("-freg-struct-return");
3678 }
3679 }
3680
Roman Divacky65b88cd2011-03-01 17:40:53 +00003681 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3682 CmdArgs.push_back("-mrtd");
3683
Rafael Espindola224dd632011-12-14 21:02:23 +00003684 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003685 CmdArgs.push_back("-mdisable-fp-elim");
3686 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3687 options::OPT_fno_zero_initialized_in_bss))
3688 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003689
3690 bool OFastEnabled = isOptimizationLevelFast(Args);
3691 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3692 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003693 OptSpecifier StrictAliasingAliasOption =
3694 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003695 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3696 // doesn't do any TBAA.
3697 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003698 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003699 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003700 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003701 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3702 options::OPT_fno_struct_path_tbaa))
3703 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003704 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3705 false))
3706 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003707 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3708 options::OPT_fno_strict_vtable_pointers,
3709 false))
3710 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003711 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3712 options::OPT_fno_optimize_sibling_calls))
3713 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003714
Eric Christopher006208c2013-04-04 06:29:47 +00003715 // Handle segmented stacks.
3716 if (Args.hasArg(options::OPT_fsplit_stack))
3717 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003718
3719 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3720 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003721 OptSpecifier FastMathAliasOption =
3722 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3723
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003724 // Handle various floating point optimization flags, mapping them to the
3725 // appropriate LLVM code generation flags. The pattern for all of these is to
3726 // default off the codegen optimizations, and if any flag enables them and no
3727 // flag disables them after the flag enabling them, enable the codegen
3728 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003729 if (Arg *A = Args.getLastArg(
3730 options::OPT_ffast_math, FastMathAliasOption,
3731 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3732 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3733 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003734 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3735 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003736 A->getOption().getID() != options::OPT_fhonor_infinities)
3737 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003738 if (Arg *A = Args.getLastArg(
3739 options::OPT_ffast_math, FastMathAliasOption,
3740 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3741 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3742 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003743 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3744 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003745 A->getOption().getID() != options::OPT_fhonor_nans)
3746 CmdArgs.push_back("-menable-no-nans");
3747
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003748 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3749 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003750 if (Arg *A =
3751 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3752 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3753 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003754 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3755 // However, turning *off* -ffast_math merely restores the toolchain default
3756 // (which may be false).
3757 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3758 A->getOption().getID() == options::OPT_ffast_math ||
3759 A->getOption().getID() == options::OPT_Ofast)
3760 MathErrno = false;
3761 else if (A->getOption().getID() == options::OPT_fmath_errno)
3762 MathErrno = true;
3763 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003764 if (MathErrno)
3765 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003766
3767 // There are several flags which require disabling very specific
3768 // optimizations. Any of these being disabled forces us to turn off the
3769 // entire set of LLVM optimizations, so collect them through all the flag
3770 // madness.
3771 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003772 if (Arg *A = Args.getLastArg(
3773 options::OPT_ffast_math, FastMathAliasOption,
3774 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3775 options::OPT_fno_unsafe_math_optimizations,
3776 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003777 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3778 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003779 A->getOption().getID() != options::OPT_fno_associative_math)
3780 AssociativeMath = true;
3781 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003782 if (Arg *A = Args.getLastArg(
3783 options::OPT_ffast_math, FastMathAliasOption,
3784 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3785 options::OPT_fno_unsafe_math_optimizations,
3786 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003787 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3788 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003789 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3790 ReciprocalMath = true;
3791 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003792 if (Arg *A = Args.getLastArg(
3793 options::OPT_ffast_math, FastMathAliasOption,
3794 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3795 options::OPT_fno_unsafe_math_optimizations,
3796 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003797 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3798 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003799 A->getOption().getID() != options::OPT_fsigned_zeros)
3800 SignedZeros = false;
3801 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003802 if (Arg *A = Args.getLastArg(
3803 options::OPT_ffast_math, FastMathAliasOption,
3804 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3805 options::OPT_fno_unsafe_math_optimizations,
3806 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003807 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3808 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003809 A->getOption().getID() != options::OPT_ftrapping_math)
3810 TrappingMath = false;
3811 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3812 !TrappingMath)
3813 CmdArgs.push_back("-menable-unsafe-fp-math");
3814
Sanjay Patel76c9e092015-01-23 16:40:50 +00003815 if (!SignedZeros)
3816 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003817
Sanjay Patel359b1052015-04-09 15:03:23 +00003818 if (ReciprocalMath)
3819 CmdArgs.push_back("-freciprocal-math");
3820
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003821 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003822 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003823 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003824 options::OPT_ffp_contract)) {
3825 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003826 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003827 if (Val == "fast" || Val == "on" || Val == "off") {
3828 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3829 } else {
3830 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003831 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003832 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003833 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3834 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003835 // If fast-math is set then set the fp-contract mode to fast.
3836 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3837 }
3838 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003839
Sanjay Patel2987c292015-06-11 14:53:41 +00003840 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003841
Bob Wilson6a039162012-07-19 03:52:53 +00003842 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3843 // and if we find them, tell the frontend to provide the appropriate
3844 // preprocessor macros. This is distinct from enabling any optimizations as
3845 // these options induce language changes which must survive serialization
3846 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003847 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3848 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003849 if (!A->getOption().matches(options::OPT_fno_fast_math))
3850 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003851 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3852 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003853 if (A->getOption().matches(options::OPT_ffinite_math_only))
3854 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003855
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003856 // Decide whether to use verbose asm. Verbose assembly is the default on
3857 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003858 bool IsIntegratedAssemblerDefault =
3859 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003860 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003861 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003862 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003863 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003864
Rafael Espindolab8a12932015-05-22 20:44:03 +00003865 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3866 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003867 CmdArgs.push_back("-no-integrated-as");
3868
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003869 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3870 CmdArgs.push_back("-mdebug-pass");
3871 CmdArgs.push_back("Structure");
3872 }
3873 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3874 CmdArgs.push_back("-mdebug-pass");
3875 CmdArgs.push_back("Arguments");
3876 }
3877
John McCall8517abc2010-02-19 02:45:38 +00003878 // Enable -mconstructor-aliases except on darwin, where we have to
3879 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003880 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003881 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003882
John McCall7ef5cb32011-03-18 02:56:14 +00003883 // Darwin's kernel doesn't support guard variables; just die if we
3884 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003885 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003886 CmdArgs.push_back("-fforbid-guard-variables");
3887
Akira Hatanaka02028482015-11-12 17:21:22 +00003888 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3889 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003890 CmdArgs.push_back("-mms-bitfields");
3891 }
John McCall8517abc2010-02-19 02:45:38 +00003892
Daniel Dunbar306945d2009-09-16 06:17:29 +00003893 // This is a coarse approximation of what llvm-gcc actually does, both
3894 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3895 // complicated ways.
3896 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003897 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3898 options::OPT_fno_asynchronous_unwind_tables,
3899 (getToolChain().IsUnwindTablesDefault() ||
3900 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3901 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003902 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3903 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003904 CmdArgs.push_back("-munwind-tables");
3905
Chandler Carruth05fb5852012-11-21 23:40:23 +00003906 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003907
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003908 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3909 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003910 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003911 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003912
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003913 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003914 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003915
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003916 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003917 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003918 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003919 }
3920
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003921 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003922 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003923 if (!CPU.empty()) {
3924 CmdArgs.push_back("-target-cpu");
3925 CmdArgs.push_back(Args.MakeArgString(CPU));
3926 }
3927
Rafael Espindolaeb265472013-08-21 21:59:03 +00003928 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3929 CmdArgs.push_back("-mfpmath");
3930 CmdArgs.push_back(A->getValue());
3931 }
3932
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003933 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003934 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003935
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003936 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003938 default:
3939 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003940
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003941 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003942 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003943 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003944 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003945 // Use the effective triple, which takes into account the deployment target.
3946 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003947 break;
3948
Tim Northover573cbee2014-05-24 12:52:07 +00003949 case llvm::Triple::aarch64:
3950 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003951 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003952 break;
3953
Eric Christopher0b26a612010-03-02 02:41:08 +00003954 case llvm::Triple::mips:
3955 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003956 case llvm::Triple::mips64:
3957 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003958 AddMIPSTargetArgs(Args, CmdArgs);
3959 break;
3960
Ulrich Weigand8afad612014-07-28 13:17:52 +00003961 case llvm::Triple::ppc:
3962 case llvm::Triple::ppc64:
3963 case llvm::Triple::ppc64le:
3964 AddPPCTargetArgs(Args, CmdArgs);
3965 break;
3966
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003967 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003968 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003969 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003970 AddSparcTargetArgs(Args, CmdArgs);
3971 break;
3972
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003973 case llvm::Triple::x86:
3974 case llvm::Triple::x86_64:
3975 AddX86TargetArgs(Args, CmdArgs);
3976 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003977
3978 case llvm::Triple::hexagon:
3979 AddHexagonTargetArgs(Args, CmdArgs);
3980 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003981 }
3982
Douglas Katzman3459ce22015-10-08 04:24:12 +00003983 // The 'g' groups options involve a somewhat intricate sequence of decisions
3984 // about what to pass from the driver to the frontend, but by the time they
3985 // reach cc1 they've been factored into two well-defined orthogonal choices:
3986 // * what level of debug info to generate
3987 // * what dwarf version to write
3988 // This avoids having to monkey around further in cc1 other than to disable
3989 // codeview if not running in a Windows environment. Perhaps even that
3990 // decision should be made in the driver as well though.
3991 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3992 CodeGenOptions::NoDebugInfo;
3993 // These two are potentially updated by AddClangCLArgs.
3994 unsigned DwarfVersion = 0;
3995 bool EmitCodeView = false;
3996
Hans Wennborg75958c42013-08-08 00:17:41 +00003997 // Add clang-cl arguments.
3998 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003999 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004000
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004001 // Pass the linker version in use.
4002 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4003 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004004 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004005 }
4006
Eric Christopherb7d97e92013-04-03 01:58:53 +00004007 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004008 CmdArgs.push_back("-momit-leaf-frame-pointer");
4009
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004010 // Explicitly error on some things we know we don't support and can't just
4011 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004012 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004013 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4014 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004015 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004016 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004017 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4018 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004019 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004020 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004021 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004022 }
4023
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004024 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004025 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004026 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004027 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004028 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4029 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004030 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004031 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004032 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004033
Chad Rosierbe10f982011-08-02 17:58:04 +00004034 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004035 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004036 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4037 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004038 }
4039
Rafael Espindola08a692a2010-03-07 04:46:18 +00004040 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004041 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004042 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004043 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
4044 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
4045 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00004046 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00004047 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004048 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00004049 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00004050 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004051 // Some 'g' group option other than one expressly disabling debug info
4052 // must have been the final (winning) one. They're all equivalent.
4053 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00004054 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004055 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004056
Douglas Katzman3459ce22015-10-08 04:24:12 +00004057 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
4058 // (because that would mean that "-g0" was the rightmost 'g' group option).
4059 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
4060 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
4061 // exists of removing the gdwarf options from the g_group.
4062 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
4063 options::OPT_gdwarf_4))
4064 DwarfVersion = DwarfVersionNum(A->getSpelling());
4065
Reid Kleckner124955a2015-08-05 18:51:13 +00004066 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004067 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4068 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4069 // DwarfVersion remains at 0 if no explicit choice was made.
4070 CmdArgs.push_back("-gcodeview");
4071 } else if (DwarfVersion == 0 &&
4072 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4073 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4074 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004075
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004076 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4077 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004078
4079 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004080 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004081 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004082 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004083
Eric Christopher138c32b2013-09-13 22:37:55 +00004084 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004085 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004086 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004087 CmdArgs.push_back("-dwarf-ext-refs");
4088 CmdArgs.push_back("-fmodule-format=obj");
4089 }
4090
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004091 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4092 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004093 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004094 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004095 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004096 CmdArgs.push_back("-backend-option");
4097 CmdArgs.push_back("-split-dwarf=Enable");
4098 }
4099
Douglas Katzman3459ce22015-10-08 04:24:12 +00004100 // After we've dealt with all combinations of things that could
4101 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4102 // figure out if we need to "upgrade" it to standalone debug info.
4103 // We parse these two '-f' options whether or not they will be used,
4104 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4105 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4106 options::OPT_fno_standalone_debug,
4107 getToolChain().GetDefaultStandaloneDebug());
4108 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4109 DebugInfoKind = CodeGenOptions::FullDebugInfo;
4110 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
4111
Eric Christopher138c32b2013-09-13 22:37:55 +00004112 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4113 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4114 CmdArgs.push_back("-backend-option");
4115 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4116 }
Eric Christophereec89c22013-06-18 00:03:50 +00004117
Eric Christopher0d403d22014-02-14 01:27:03 +00004118 // -gdwarf-aranges turns on the emission of the aranges section in the
4119 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004120 // Always enabled on the PS4.
4121 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004122 CmdArgs.push_back("-backend-option");
4123 CmdArgs.push_back("-generate-arange-section");
4124 }
4125
David Blaikief36d9ba2014-01-27 18:52:43 +00004126 if (Args.hasFlag(options::OPT_fdebug_types_section,
4127 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004128 CmdArgs.push_back("-backend-option");
4129 CmdArgs.push_back("-generate-type-units");
4130 }
Eric Christophereec89c22013-06-18 00:03:50 +00004131
Ed Schouten6e576152015-03-26 17:50:28 +00004132 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4133 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4134
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004135 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004136 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004137 CmdArgs.push_back("-ffunction-sections");
4138 }
4139
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004140 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4141 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004142 CmdArgs.push_back("-fdata-sections");
4143 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004144
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004145 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004146 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004147 CmdArgs.push_back("-fno-unique-section-names");
4148
Chris Lattner3c77a352010-06-22 00:03:40 +00004149 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4150
Diego Novilloa0545962015-07-10 18:00:07 +00004151 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004152
Paul Robinsond083b9a2015-12-16 17:25:27 +00004153 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4154 if (getToolChain().getTriple().isPS4CPU())
4155 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4156
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004157 // Pass options for controlling the default header search paths.
4158 if (Args.hasArg(options::OPT_nostdinc)) {
4159 CmdArgs.push_back("-nostdsysteminc");
4160 CmdArgs.push_back("-nobuiltininc");
4161 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004162 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004163 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004164 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4165 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4166 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004167
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004168 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004169 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004170 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004171
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004172 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4173
Ted Kremenekf7639e12012-03-06 20:06:33 +00004174 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004175 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004176 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004177 options::OPT_ccc_arcmt_modify,
4178 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004179 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004180 switch (A->getOption().getID()) {
4181 default:
4182 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004183 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004184 CmdArgs.push_back("-arcmt-check");
4185 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004186 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004187 CmdArgs.push_back("-arcmt-modify");
4188 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004189 case options::OPT_ccc_arcmt_migrate:
4190 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004191 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004192 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004193
4194 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4195 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004196 break;
John McCalld70fb982011-06-15 23:25:17 +00004197 }
4198 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004199 } else {
4200 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4201 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4202 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004203 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004204
Ted Kremenekf7639e12012-03-06 20:06:33 +00004205 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4206 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004207 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4208 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004209 }
4210 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004211 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004212
4213 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004214 options::OPT_objcmt_migrate_subscripting,
4215 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004216 // None specified, means enable them all.
4217 CmdArgs.push_back("-objcmt-migrate-literals");
4218 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004219 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004220 } else {
4221 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4222 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004223 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004224 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004225 } else {
4226 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4227 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4228 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4229 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4230 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4231 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004232 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004233 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4234 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4235 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4236 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4237 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4238 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4239 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004240 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004241 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004242 }
4243
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004244 // Add preprocessing options like -I, -D, etc. if we are using the
4245 // preprocessor.
4246 //
4247 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004248 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004249 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4250 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004251
Rafael Espindolaa7431922011-07-21 23:40:37 +00004252 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4253 // that "The compiler can only warn and ignore the option if not recognized".
4254 // When building with ccache, it will pass -D options to clang even on
4255 // preprocessed inputs and configure concludes that -fPIC is not supported.
4256 Args.ClaimAllArgs(options::OPT_D);
4257
Alp Toker7874bdc2013-11-15 20:40:58 +00004258 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004259 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4260 if (A->getOption().matches(options::OPT_O4)) {
4261 CmdArgs.push_back("-O3");
4262 D.Diag(diag::warn_O4_is_O3);
4263 } else {
4264 A->render(Args, CmdArgs);
4265 }
4266 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004267
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004268 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004269 for (const Arg *A :
4270 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4271 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004272 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004273 }
4274
Rafael Espindola577637a2015-01-03 00:06:04 +00004275 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004276
Richard Smith3be1cb22014-08-07 00:24:21 +00004277 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004278 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004279 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4280 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004281 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004282 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004283
4284 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004285 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004286 //
4287 // If a std is supplied, only add -trigraphs if it follows the
4288 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004289 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004290 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4291 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004292 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004293 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004294 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004295 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004296 else
4297 Std->render(Args, CmdArgs);
4298
Nico Weber00721502014-12-23 22:32:37 +00004299 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004300 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004301 options::OPT_ftrigraphs,
4302 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004303 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004304 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004305 } else {
4306 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004307 //
4308 // FIXME: Clang doesn't correctly handle -std= when the input language
4309 // doesn't match. For the time being just ignore this for C++ inputs;
4310 // eventually we want to do all the standard defaulting here instead of
4311 // splitting it between the driver and clang -cc1.
4312 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004313 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4314 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004315 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004316 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004317
Nico Weber00721502014-12-23 22:32:37 +00004318 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4319 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004320 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004321
Richard Smith282b4492013-09-04 22:50:31 +00004322 // GCC's behavior for -Wwrite-strings is a bit strange:
4323 // * In C, this "warning flag" changes the types of string literals from
4324 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4325 // for the discarded qualifier.
4326 // * In C++, this is just a normal warning flag.
4327 //
4328 // Implementing this warning correctly in C is hard, so we follow GCC's
4329 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4330 // a non-const char* in C, rather than using this crude hack.
4331 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004332 // FIXME: This should behave just like a warning flag, and thus should also
4333 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4334 Arg *WriteStrings =
4335 Args.getLastArg(options::OPT_Wwrite_strings,
4336 options::OPT_Wno_write_strings, options::OPT_w);
4337 if (WriteStrings &&
4338 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004339 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004340 }
4341
Chandler Carruth61fbf622011-04-23 09:27:53 +00004342 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004343 // during C++ compilation, which it is by default. GCC keeps this define even
4344 // in the presence of '-w', match this behavior bug-for-bug.
4345 if (types::isCXX(InputType) &&
4346 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4347 true)) {
4348 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004349 }
4350
Chandler Carruthe0391482010-05-22 02:21:53 +00004351 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4352 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4353 if (Asm->getOption().matches(options::OPT_fasm))
4354 CmdArgs.push_back("-fgnu-keywords");
4355 else
4356 CmdArgs.push_back("-fno-gnu-keywords");
4357 }
4358
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004359 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4360 CmdArgs.push_back("-fno-dwarf-directory-asm");
4361
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004362 if (ShouldDisableAutolink(Args, getToolChain()))
4363 CmdArgs.push_back("-fno-autolink");
4364
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004365 // Add in -fdebug-compilation-dir if necessary.
4366 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004367
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004368 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4369 StringRef Map = A->getValue();
4370 if (Map.find('=') == StringRef::npos)
4371 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4372 else
4373 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4374 A->claim();
4375 }
4376
Richard Smith9a568822011-11-21 19:36:32 +00004377 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4378 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004379 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004380 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004381 }
4382
Richard Smith79c927b2013-11-06 19:31:51 +00004383 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4384 CmdArgs.push_back("-foperator-arrow-depth");
4385 CmdArgs.push_back(A->getValue());
4386 }
4387
Richard Smith9a568822011-11-21 19:36:32 +00004388 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4389 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004390 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004391 }
4392
Richard Smitha3d3bd22013-05-08 02:12:03 +00004393 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4394 CmdArgs.push_back("-fconstexpr-steps");
4395 CmdArgs.push_back(A->getValue());
4396 }
4397
Richard Smithb3a14522013-02-22 01:59:51 +00004398 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4399 CmdArgs.push_back("-fbracket-depth");
4400 CmdArgs.push_back(A->getValue());
4401 }
4402
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004403 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4404 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004405 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004406 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004407 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4408 } else
4409 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004410 }
4411
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004412 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004413 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004414
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004415 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4416 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004417 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004418 }
David Chisnall5778fce2009-08-31 16:41:57 +00004419
Chris Lattnere23003d2010-01-09 21:54:33 +00004420 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4421 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004422 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004423 }
4424
Chris Lattnerb35583d2010-04-07 20:49:23 +00004425 CmdArgs.push_back("-ferror-limit");
4426 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004427 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004428 else
4429 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004430
Chandler Carrutha77a7272010-05-06 04:55:18 +00004431 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4432 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004433 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004434 }
4435
4436 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4437 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004438 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004439 }
4440
Richard Smithf6f003a2011-12-16 19:06:07 +00004441 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4442 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004443 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004444 }
4445
Nick Lewycky24653262014-12-16 21:39:02 +00004446 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4447 CmdArgs.push_back("-fspell-checking-limit");
4448 CmdArgs.push_back(A->getValue());
4449 }
4450
Daniel Dunbar2c978472009-11-04 06:24:47 +00004451 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004452 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004453 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004454 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004455 } else {
4456 // If -fmessage-length=N was not specified, determine whether this is a
4457 // terminal and, if so, implicitly define -fmessage-length appropriately.
4458 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004459 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004460 }
4461
John McCallb4a99d32013-02-19 01:57:35 +00004462 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4463 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4464 options::OPT_fvisibility_ms_compat)) {
4465 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4466 CmdArgs.push_back("-fvisibility");
4467 CmdArgs.push_back(A->getValue());
4468 } else {
4469 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4470 CmdArgs.push_back("-fvisibility");
4471 CmdArgs.push_back("hidden");
4472 CmdArgs.push_back("-ftype-visibility");
4473 CmdArgs.push_back("default");
4474 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004475 }
4476
Douglas Gregor08329632010-06-15 17:05:35 +00004477 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004478
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004479 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4480
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004481 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004482 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4483 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004484 CmdArgs.push_back("-ffreestanding");
4485
Daniel Dunbare357d562009-12-03 18:42:11 +00004486 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004487 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004488 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004489 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004490 // Emulated TLS is enabled by default on Android, and can be enabled manually
4491 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004492 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004493 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4494 EmulatedTLSDefault))
4495 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004496 // AltiVec-like language extensions aren't relevant for assembling.
4497 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004498 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004499 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4500 }
Richard Trieu91844232012-06-26 18:18:47 +00004501 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4502 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004503
Alexey Bataevdb390212015-05-20 04:24:19 +00004504 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004505 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4506 options::OPT_fno_openmp, false))
4507 switch (getOpenMPRuntime(getToolChain(), Args)) {
4508 case OMPRT_OMP:
4509 case OMPRT_IOMP5:
4510 // Clang can generate useful OpenMP code for these two runtime libraries.
4511 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004512
4513 // If no option regarding the use of TLS in OpenMP codegeneration is
4514 // given, decide a default based on the target. Otherwise rely on the
4515 // options and pass the right information to the frontend.
4516 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004517 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004518 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004519 break;
4520 default:
4521 // By default, if Clang doesn't know how to generate useful OpenMP code
4522 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4523 // down to the actual compilation.
4524 // FIXME: It would be better to have a mode which *only* omits IR
4525 // generation based on the OpenMP support so that we get consistent
4526 // semantic analysis, etc.
4527 break;
4528 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004529
Peter Collingbourne32701642013-11-01 18:16:25 +00004530 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004531 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004532
Eric Christopher459d2712013-02-19 06:16:53 +00004533 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004534 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4535 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4536 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4537 Arch == llvm::Triple::ppc64le))
4538 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4539 << "ppc/ppc64/ppc64le";
4540 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004541
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004542 // -fzvector is incompatible with -faltivec.
4543 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4544 if (Args.hasArg(options::OPT_faltivec))
4545 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4546 << "-faltivec";
4547
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004548 if (getToolChain().SupportsProfiling())
4549 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004550
4551 // -flax-vector-conversions is default.
4552 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4553 options::OPT_fno_lax_vector_conversions))
4554 CmdArgs.push_back("-fno-lax-vector-conversions");
4555
John Brawna7b4ec02015-08-10 11:11:28 +00004556 if (Args.getLastArg(options::OPT_fapple_kext) ||
4557 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004558 CmdArgs.push_back("-fapple-kext");
4559
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004560 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004561 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004562 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004563 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4564 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004565
4566 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4567 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004568 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004569 }
4570
Bob Wilson14adb362012-02-03 06:27:22 +00004571 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004572
Chandler Carruth6e501032011-03-27 00:04:55 +00004573 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4574 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004575 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004576 if (A->getOption().matches(options::OPT_fwrapv))
4577 CmdArgs.push_back("-fwrapv");
4578 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4579 options::OPT_fno_strict_overflow)) {
4580 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4581 CmdArgs.push_back("-fwrapv");
4582 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004583
4584 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4585 options::OPT_fno_reroll_loops))
4586 if (A->getOption().matches(options::OPT_freroll_loops))
4587 CmdArgs.push_back("-freroll-loops");
4588
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004589 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004590 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4591 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004592
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004593 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4594
Daniel Dunbar4930e332009-11-17 08:07:36 +00004595 // -stack-protector=0 is default.
4596 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004597 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4598 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4599 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4600 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4601 Args.ClaimAllArgs(options::OPT_fstack_protector);
4602 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004603 options::OPT_fstack_protector_all,
4604 options::OPT_fstack_protector_strong,
4605 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004606 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004607 StackProtectorLevel = std::max<unsigned>(
4608 LangOptions::SSPOn,
4609 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004610 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004611 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004612 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004613 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004614 } else {
4615 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004616 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004617 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004618 if (StackProtectorLevel) {
4619 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004620 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004621 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004622
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004623 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004624 for (const Arg *A : Args.filtered(options::OPT__param)) {
4625 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004626 if (Str.startswith("ssp-buffer-size=")) {
4627 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004628 CmdArgs.push_back("-stack-protector-buffer-size");
4629 // FIXME: Verify the argument is a valid integer.
4630 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004631 }
Sean Silva14facf32015-06-09 01:57:17 +00004632 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004633 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004634 }
4635
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004636 // Translate -mstackrealign
4637 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004638 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004639 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004640
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004641 if (Args.hasArg(options::OPT_mstack_alignment)) {
4642 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4643 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004644 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004645
Hans Wennborg77dc2362015-01-20 19:45:50 +00004646 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4647 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4648
4649 if (!Size.empty())
4650 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4651 else
4652 CmdArgs.push_back("-mstack-probe-size=0");
4653 }
4654
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004655 switch (getToolChain().getArch()) {
4656 case llvm::Triple::aarch64:
4657 case llvm::Triple::aarch64_be:
4658 case llvm::Triple::arm:
4659 case llvm::Triple::armeb:
4660 case llvm::Triple::thumb:
4661 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004662 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004663 break;
4664
4665 default:
4666 break;
4667 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004668
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004669 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4670 options::OPT_mno_restrict_it)) {
4671 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4672 CmdArgs.push_back("-backend-option");
4673 CmdArgs.push_back("-arm-restrict-it");
4674 } else {
4675 CmdArgs.push_back("-backend-option");
4676 CmdArgs.push_back("-arm-no-restrict-it");
4677 }
James Y Knight2db38f32015-08-15 03:45:25 +00004678 } else if (Triple.isOSWindows() &&
4679 (Triple.getArch() == llvm::Triple::arm ||
4680 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004681 // Windows on ARM expects restricted IT blocks
4682 CmdArgs.push_back("-backend-option");
4683 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004684 }
4685
Daniel Dunbard18049a2009-04-07 21:16:11 +00004686 // Forward -f options with positive and negative forms; we translate
4687 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004688 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4689 StringRef fname = A->getValue();
4690 if (!llvm::sys::fs::exists(fname))
4691 D.Diag(diag::err_drv_no_such_file) << fname;
4692 else
4693 A->render(Args, CmdArgs);
4694 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004695
John Brawna7b4ec02015-08-10 11:11:28 +00004696 // -fbuiltin is default unless -mkernel is used
4697 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4698 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004699 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004700
Nuno Lopes13c88c72009-12-16 16:59:22 +00004701 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4702 options::OPT_fno_assume_sane_operator_new))
4703 CmdArgs.push_back("-fno-assume-sane-operator-new");
4704
Daniel Dunbar4930e332009-11-17 08:07:36 +00004705 // -fblocks=0 is default.
4706 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004707 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004708 (Args.hasArg(options::OPT_fgnu_runtime) &&
4709 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4710 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004711 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004712
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004713 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004714 !getToolChain().hasBlocksRuntime())
4715 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004716 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004717
Richard Smith47972af2015-06-16 00:08:24 +00004718 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004719 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004720 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004721 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004722 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004723 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4724 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004725 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004726 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004727 HaveModules = true;
4728 }
4729 }
4730
Richard Smith47972af2015-06-16 00:08:24 +00004731 // -fmodule-maps enables implicit reading of module map files. By default,
4732 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004733 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4734 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004735 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004736 }
4737
Daniel Jasperac42b752013-10-21 06:34:34 +00004738 // -fmodules-decluse checks that modules used are declared so (off by
4739 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004740 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004741 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004742 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004743 }
4744
Daniel Jasper962b38e2014-04-11 11:47:45 +00004745 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4746 // all #included headers are part of modules.
4747 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004748 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004749 CmdArgs.push_back("-fmodules-strict-decluse");
4750 }
4751
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004752 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4753 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4754 options::OPT_fno_implicit_modules)) {
4755 CmdArgs.push_back("-fno-implicit-modules");
4756 }
4757
Daniel Jasperac42b752013-10-21 06:34:34 +00004758 // -fmodule-name specifies the module that is currently being built (or
4759 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004760 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004761
Richard Smith9887d792014-10-17 01:42:53 +00004762 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004763 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004764 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004765
Richard Smithe842a472014-10-22 02:05:46 +00004766 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004767 if (HaveModules)
4768 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4769 else
4770 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004771
4772 // -fmodule-cache-path specifies where our implicitly-built module files
4773 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004774 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004775 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004776 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004777 if (HaveModules) {
4778 if (C.isForDiagnostics()) {
4779 // When generating crash reports, we want to emit the modules along with
4780 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004781 Path = Output.getFilename();
4782 llvm::sys::path::replace_extension(Path, ".cache");
4783 llvm::sys::path::append(Path, "modules");
4784 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004785 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004786 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004787 llvm::sys::path::append(Path, "org.llvm.clang.");
4788 appendUserToPath(Path);
4789 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004790 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004791 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004792 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4793 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004794 }
4795
4796 // When building modules and generating crashdumps, we need to dump a module
4797 // dependency VFS alongside the output.
4798 if (HaveModules && C.isForDiagnostics()) {
4799 SmallString<128> VFSDir(Output.getFilename());
4800 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004801 // Add the cache directory as a temp so the crash diagnostics pick it up.
4802 C.addTempFile(Args.MakeArgString(VFSDir));
4803
Justin Bognera88f0122014-06-20 22:59:50 +00004804 llvm::sys::path::append(VFSDir, "vfs");
4805 CmdArgs.push_back("-module-dependency-dir");
4806 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004807 }
4808
Richard Smith9887d792014-10-17 01:42:53 +00004809 if (HaveModules)
4810 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004811
Douglas Gregor35b04d62013-02-07 19:01:24 +00004812 // Pass through all -fmodules-ignore-macro arguments.
4813 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004814 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4815 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004816
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004817 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4818
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004819 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4820 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4821 D.Diag(diag::err_drv_argument_not_allowed_with)
4822 << A->getAsString(Args) << "-fbuild-session-timestamp";
4823
4824 llvm::sys::fs::file_status Status;
4825 if (llvm::sys::fs::status(A->getValue(), Status))
4826 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004827 CmdArgs.push_back(Args.MakeArgString(
4828 "-fbuild-session-timestamp=" +
4829 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004830 }
4831
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004832 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004833 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4834 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004835 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4836
4837 Args.AddLastArg(CmdArgs,
4838 options::OPT_fmodules_validate_once_per_build_session);
4839 }
4840
Ben Langmuirdcf73862014-03-12 00:06:17 +00004841 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4842
John McCalldfea9982010-04-09 19:12:06 +00004843 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004844 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004845 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004846 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004847
Anders Carlssond470fef2010-11-21 00:09:52 +00004848 // -felide-constructors is the default.
4849 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004850 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004851 CmdArgs.push_back("-fno-elide-constructors");
4852
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004853 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004854
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004855 if (KernelOrKext || (types::isCXX(InputType) &&
4856 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4857 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004858 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004859
Tony Linthicum76329bf2011-12-12 21:14:55 +00004860 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004861 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4862 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004863 CmdArgs.push_back("-fshort-enums");
4864
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004865 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004866 if (Arg *A = Args.getLastArg(
4867 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4868 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4869 if (A->getOption().matches(options::OPT_funsigned_char) ||
4870 A->getOption().matches(options::OPT_fno_signed_char)) {
4871 CmdArgs.push_back("-fno-signed-char");
4872 }
4873 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004874 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004875 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004876
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004877 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004878 if (!Args.hasFlag(
4879 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4880 !IsWindowsCygnus && !IsWindowsGNU &&
4881 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4882 getToolChain().getArch() != llvm::Triple::hexagon &&
4883 getToolChain().getArch() != llvm::Triple::xcore &&
4884 ((getToolChain().getTriple().getVendor() !=
4885 llvm::Triple::MipsTechnologies) ||
4886 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004887 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004888 CmdArgs.push_back("-fno-use-cxa-atexit");
4889
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004890 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004891 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004892 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004893 CmdArgs.push_back("-fms-extensions");
4894
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004895 // -fno-use-line-directives is default.
4896 if (Args.hasFlag(options::OPT_fuse_line_directives,
4897 options::OPT_fno_use_line_directives, false))
4898 CmdArgs.push_back("-fuse-line-directives");
4899
Francois Pichet1b4f1632011-09-17 04:32:15 +00004900 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004901 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004902 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004903 (IsWindowsMSVC &&
4904 Args.hasFlag(options::OPT_fms_extensions,
4905 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004906 CmdArgs.push_back("-fms-compatibility");
4907
David Majnemerc371ff02015-03-22 08:39:22 +00004908 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004909 VersionTuple MSVT = visualstudio::getMSVCVersion(
4910 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4911 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004912 CmdArgs.push_back(
4913 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004914
David Majnemer8db91762015-05-18 04:49:30 +00004915 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4916 if (ImplyVCPPCXXVer) {
4917 if (IsMSVC2015Compatible)
4918 CmdArgs.push_back("-std=c++14");
4919 else
4920 CmdArgs.push_back("-std=c++11");
4921 }
4922
Eric Christopher5ecce122013-02-18 00:38:31 +00004923 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004924 if (Args.hasFlag(options::OPT_fborland_extensions,
4925 options::OPT_fno_borland_extensions, false))
4926 CmdArgs.push_back("-fborland-extensions");
4927
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004928 // -fno-declspec is default, except for PS4.
4929 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4930 getToolChain().getTriple().isPS4()))
4931 CmdArgs.push_back("-fdeclspec");
4932 else if (Args.hasArg(options::OPT_fno_declspec))
4933 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4934
David Majnemerc371ff02015-03-22 08:39:22 +00004935 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4936 // than 19.
4937 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4938 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004939 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004940 CmdArgs.push_back("-fno-threadsafe-statics");
4941
Francois Pichet02744872011-09-01 16:38:08 +00004942 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4943 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004944 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004945 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004946 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004947
Chandler Carruthe03aa552010-04-17 20:17:31 +00004948 // -fgnu-keywords default varies depending on language; only pass if
4949 // specified.
4950 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004951 options::OPT_fno_gnu_keywords))
4952 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004953
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004954 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004955 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004956 CmdArgs.push_back("-fgnu89-inline");
4957
Chad Rosier9c76d242012-03-15 22:31:42 +00004958 if (Args.hasArg(options::OPT_fno_inline))
4959 CmdArgs.push_back("-fno-inline");
4960
Chad Rosier64d6be92012-03-06 21:17:19 +00004961 if (Args.hasArg(options::OPT_fno_inline_functions))
4962 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004963
John McCall5fb5df92012-06-20 06:18:46 +00004964 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004965
John McCall5fb5df92012-06-20 06:18:46 +00004966 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004967 // legacy is the default. Except for deployment taget of 10.5,
4968 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4969 // gets ignored silently.
4970 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004971 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4972 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004973 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004974 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004975 if (getToolChain().UseObjCMixedDispatch())
4976 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4977 else
4978 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4979 }
4980 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004981
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004982 // When ObjectiveC legacy runtime is in effect on MacOSX,
4983 // turn on the option to do Array/Dictionary subscripting
4984 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004985 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004986 getToolChain().getTriple().isMacOSX() &&
4987 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4988 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004989 objcRuntime.isNeXTFamily())
4990 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004991
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004992 // -fencode-extended-block-signature=1 is default.
4993 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4994 CmdArgs.push_back("-fencode-extended-block-signature");
4995 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004996
John McCall24fc0de2011-07-06 00:26:06 +00004997 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4998 // NOTE: This logic is duplicated in ToolChains.cpp.
4999 bool ARC = isObjCAutoRefCount(Args);
5000 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005001 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005002
John McCall24fc0de2011-07-06 00:26:06 +00005003 CmdArgs.push_back("-fobjc-arc");
5004
Chandler Carruth491db322011-11-04 07:34:47 +00005005 // FIXME: It seems like this entire block, and several around it should be
5006 // wrapped in isObjC, but for now we just use it here as this is where it
5007 // was being used previously.
5008 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5009 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5010 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5011 else
5012 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5013 }
5014
John McCall24fc0de2011-07-06 00:26:06 +00005015 // Allow the user to enable full exceptions code emission.
5016 // We define off for Objective-CC, on for Objective-C++.
5017 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5018 options::OPT_fno_objc_arc_exceptions,
5019 /*default*/ types::isCXX(InputType)))
5020 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005021
John McCall24fc0de2011-07-06 00:26:06 +00005022 }
5023
5024 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5025 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005026 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005027 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005028
John McCall24fc0de2011-07-06 00:26:06 +00005029 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5030 // takes precedence.
5031 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5032 if (!GCArg)
5033 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5034 if (GCArg) {
5035 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005036 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005037 } else if (getToolChain().SupportsObjCGC()) {
5038 GCArg->render(Args, CmdArgs);
5039 } else {
5040 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005041 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005042 }
5043 }
5044
John McCallfbe5ed72015-11-05 19:19:56 +00005045 // Pass down -fobjc-weak or -fno-objc-weak if present.
5046 if (types::isObjC(InputType)) {
5047 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5048 options::OPT_fno_objc_weak);
5049 if (!WeakArg) {
5050 // nothing to do
5051 } else if (GCArg) {
5052 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5053 D.Diag(diag::err_objc_weak_with_gc);
5054 } else if (!objcRuntime.allowsWeak()) {
5055 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5056 D.Diag(diag::err_objc_weak_unsupported);
5057 } else {
5058 WeakArg->render(Args, CmdArgs);
5059 }
5060 }
5061
Bob Wilsonb111ec92015-03-02 19:01:14 +00005062 if (Args.hasFlag(options::OPT_fapplication_extension,
5063 options::OPT_fno_application_extension, false))
5064 CmdArgs.push_back("-fapplication-extension");
5065
Reid Klecknerc542d372014-06-27 17:02:02 +00005066 // Handle GCC-style exception args.
5067 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005068 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5069 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005070
Tim Northovere931f9f2015-10-30 16:30:41 +00005071 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005072 CmdArgs.push_back("-fsjlj-exceptions");
5073
5074 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005075 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5076 options::OPT_fno_assume_sane_operator_new))
5077 CmdArgs.push_back("-fno-assume-sane-operator-new");
5078
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005079 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5080 // most platforms.
5081 if (Args.hasFlag(options::OPT_fsized_deallocation,
5082 options::OPT_fno_sized_deallocation, false))
5083 CmdArgs.push_back("-fsized-deallocation");
5084
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005085 // -fconstant-cfstrings is default, and may be subject to argument translation
5086 // on Darwin.
5087 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5088 options::OPT_fno_constant_cfstrings) ||
5089 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5090 options::OPT_mno_constant_cfstrings))
5091 CmdArgs.push_back("-fno-constant-cfstrings");
5092
John Thompsoned4e2952009-11-05 20:14:16 +00005093 // -fshort-wchar default varies depending on platform; only
5094 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005095 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5096 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005097 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005098
Hans Wennborg28c96312013-07-31 23:39:13 +00005099 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005100 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005101 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005102 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005103
Daniel Dunbar096ed292011-10-05 21:04:55 +00005104 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5105 // -fno-pack-struct doesn't apply to -fpack-struct=.
5106 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005107 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005108 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005109 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005110 } else if (Args.hasFlag(options::OPT_fpack_struct,
5111 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005112 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005113 }
5114
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005115 // Handle -fmax-type-align=N and -fno-type-align
5116 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5117 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5118 if (!SkipMaxTypeAlign) {
5119 std::string MaxTypeAlignStr = "-fmax-type-align=";
5120 MaxTypeAlignStr += A->getValue();
5121 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5122 }
5123 } else if (getToolChain().getTriple().isOSDarwin()) {
5124 if (!SkipMaxTypeAlign) {
5125 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5126 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5127 }
5128 }
5129
John Brawna7b4ec02015-08-10 11:11:28 +00005130 // -fcommon is the default unless compiling kernel code or the target says so
5131 bool NoCommonDefault =
5132 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5133 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5134 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005135 CmdArgs.push_back("-fno-common");
5136
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005137 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005138 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005139 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005140 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005141 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005142 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005143
Daniel Dunbar6358d682010-10-15 22:30:42 +00005144 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005145 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005146 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005147 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005148
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005149 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005150 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5151 StringRef value = inputCharset->getValue();
5152 if (value != "UTF-8")
5153 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5154 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005155 }
5156
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005157 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005158 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5159 StringRef value = execCharset->getValue();
5160 if (value != "UTF-8")
5161 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5162 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005163 }
5164
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005165 // -fcaret-diagnostics is default.
5166 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5167 options::OPT_fno_caret_diagnostics, true))
5168 CmdArgs.push_back("-fno-caret-diagnostics");
5169
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005170 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005171 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005172 options::OPT_fno_diagnostics_fixit_info))
5173 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005174
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005175 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005176 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005177 options::OPT_fno_diagnostics_show_option))
5178 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005179
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005180 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005181 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005182 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005183 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005184 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005185
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005186 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005187 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005188 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005189 }
5190
Chandler Carruthb6766f02011-03-27 01:50:55 +00005191 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005192 options::OPT_fdiagnostics_show_note_include_stack,
5193 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005194 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005195 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005196 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5197 else
5198 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5199 }
5200
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005201 // Color diagnostics are the default, unless the terminal doesn't support
5202 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005203 // Support both clang's -f[no-]color-diagnostics and gcc's
5204 // -f[no-]diagnostics-colors[=never|always|auto].
5205 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005206 for (const auto &Arg : Args) {
5207 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005208 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5209 !O.matches(options::OPT_fdiagnostics_color) &&
5210 !O.matches(options::OPT_fno_color_diagnostics) &&
5211 !O.matches(options::OPT_fno_diagnostics_color) &&
5212 !O.matches(options::OPT_fdiagnostics_color_EQ))
5213 continue;
5214
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005215 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005216 if (O.matches(options::OPT_fcolor_diagnostics) ||
5217 O.matches(options::OPT_fdiagnostics_color)) {
5218 ShowColors = Colors_On;
5219 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5220 O.matches(options::OPT_fno_diagnostics_color)) {
5221 ShowColors = Colors_Off;
5222 } else {
5223 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005224 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005225 if (value == "always")
5226 ShowColors = Colors_On;
5227 else if (value == "never")
5228 ShowColors = Colors_Off;
5229 else if (value == "auto")
5230 ShowColors = Colors_Auto;
5231 else
5232 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005233 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005234 }
5235 }
5236 if (ShowColors == Colors_On ||
5237 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005238 CmdArgs.push_back("-fcolor-diagnostics");
5239
Nico Rieck7857d462013-09-11 00:38:02 +00005240 if (Args.hasArg(options::OPT_fansi_escape_codes))
5241 CmdArgs.push_back("-fansi-escape-codes");
5242
Daniel Dunbardb097022009-06-08 21:13:54 +00005243 if (!Args.hasFlag(options::OPT_fshow_source_location,
5244 options::OPT_fno_show_source_location))
5245 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005246
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005247 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005248 true))
5249 CmdArgs.push_back("-fno-show-column");
5250
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005251 if (!Args.hasFlag(options::OPT_fspell_checking,
5252 options::OPT_fno_spell_checking))
5253 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005254
Chad Rosierc8e56e82012-12-05 21:08:21 +00005255 // -fno-asm-blocks is default.
5256 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5257 false))
5258 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005259
Steven Wucb0d13f2015-01-16 23:05:28 +00005260 // -fgnu-inline-asm is default.
5261 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5262 options::OPT_fno_gnu_inline_asm, true))
5263 CmdArgs.push_back("-fno-gnu-inline-asm");
5264
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005265 // Enable vectorization per default according to the optimization level
5266 // selected. For optimization levels that want vectorization we use the alias
5267 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005268 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005269 OptSpecifier VectorizeAliasOption =
5270 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005271 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005272 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005273 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005274
Chad Rosier136d67d2014-04-28 19:30:57 +00005275 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005276 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005277 OptSpecifier SLPVectAliasOption =
5278 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005279 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005280 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005281 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005282
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005283 // -fno-slp-vectorize-aggressive is default.
5284 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005285 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005286 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005287
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005288 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5289 A->render(Args, CmdArgs);
5290
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005291 // -fdollars-in-identifiers default varies depending on platform and
5292 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005293 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005294 options::OPT_fno_dollars_in_identifiers)) {
5295 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005296 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005297 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005298 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005299 }
5300
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005301 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5302 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005303 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005304 options::OPT_fno_unit_at_a_time)) {
5305 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005306 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005307 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005308
Eli Friedman055c9702011-11-02 01:53:16 +00005309 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5310 options::OPT_fno_apple_pragma_pack, false))
5311 CmdArgs.push_back("-fapple-pragma-pack");
5312
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005313 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005314 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5315 // by default.
5316 if (getToolChain().getArch() == llvm::Triple::le32) {
5317 CmdArgs.push_back("-fno-math-builtin");
5318 }
5319
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005320// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5321//
5322// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005323#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005324 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005325 (getToolChain().getArch() == llvm::Triple::arm ||
5326 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005327 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5328 CmdArgs.push_back("-fno-builtin-strcat");
5329 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5330 CmdArgs.push_back("-fno-builtin-strcpy");
5331 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005332#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005333
Justin Bognera88f0122014-06-20 22:59:50 +00005334 // Enable rewrite includes if the user's asked for it or if we're generating
5335 // diagnostics.
5336 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5337 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005338 if (Args.hasFlag(options::OPT_frewrite_includes,
5339 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005340 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005341 CmdArgs.push_back("-frewrite-includes");
5342
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005343 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005344 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005345 options::OPT_traditional_cpp)) {
5346 if (isa<PreprocessJobAction>(JA))
5347 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005348 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005349 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005350 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005351
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005352 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005353 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005354
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005355 // Handle serialized diagnostics.
5356 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5357 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005358 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005359 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005360
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005361 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5362 CmdArgs.push_back("-fretain-comments-from-system-headers");
5363
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005364 // Forward -fcomment-block-commands to -cc1.
5365 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005366 // Forward -fparse-all-comments to -cc1.
5367 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005368
John Brawnad31ace2015-09-23 13:55:40 +00005369 // Turn -fplugin=name.so into -load name.so
5370 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5371 CmdArgs.push_back("-load");
5372 CmdArgs.push_back(A->getValue());
5373 A->claim();
5374 }
5375
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005376 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5377 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005378 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005379 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5380 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005381
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005382 // We translate this by hand to the -cc1 argument, since nightly test uses
5383 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005384 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005385 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005386 } else
Sean Silva14facf32015-06-09 01:57:17 +00005387 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005388 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005389
Bob Wilson23a55f12014-12-21 07:00:00 +00005390 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005391 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5392 // by the frontend.
5393 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5394 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005395
Daniel Dunbard67a3222009-03-30 06:36:42 +00005396 if (Output.getType() == types::TY_Dependencies) {
5397 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005398 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005399 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005400 CmdArgs.push_back(Output.getFilename());
5401 } else {
5402 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005403 }
5404
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005405 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005406
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005407 if (Input.isFilename())
5408 CmdArgs.push_back(Input.getFilename());
5409 else
5410 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005411
Chris Lattnere9d7d782009-11-03 19:50:27 +00005412 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5413
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005414 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005415
5416 // Optionally embed the -cc1 level arguments into the debug info, for build
5417 // analysis.
5418 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005419 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005420 for (const auto &Arg : Args)
5421 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005422
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005423 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005424 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005425 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005426 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005427 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005428 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005429 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005430 }
5431 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005432 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005433 }
5434
Eric Christopherd3804002013-02-22 20:12:52 +00005435 // Add the split debug info name to the command lines here so we
5436 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005437 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005438 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5439 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005440 const char *SplitDwarfOut;
5441 if (SplitDwarf) {
5442 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005443 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005444 CmdArgs.push_back(SplitDwarfOut);
5445 }
5446
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005447 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5448 // Include them with -fcuda-include-gpubinary.
5449 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005450 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005451 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005452 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005453 }
5454
Eric Christopherd3804002013-02-22 20:12:52 +00005455 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005456 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005457 Output.getType() == types::TY_Object &&
5458 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005459 auto CLCommand =
5460 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005461 C.addCommand(llvm::make_unique<FallbackCommand>(
5462 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005463 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005464 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005465 }
5466
Eric Christopherf1545832013-02-22 23:50:16 +00005467 // Handle the debug info splitting at object creation time if we're
5468 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005469 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005470 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005471 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005472
Roman Divacky178e01602011-02-10 16:52:03 +00005473 if (Arg *A = Args.getLastArg(options::OPT_pg))
5474 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005475 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5476 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005477
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005478 // Claim some arguments which clang supports automatically.
5479
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005480 // -fpch-preprocess is used with gcc to add a special marker in the output to
5481 // include the PCH file. Clang's PTH solution is completely transparent, so we
5482 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005483 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005484
Daniel Dunbar17731772009-03-23 19:03:36 +00005485 // Claim some arguments which clang doesn't support, but we don't
5486 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005487 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5488 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005489
Rafael Espindolab0092d72013-09-04 19:37:35 +00005490 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005491 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005492}
5493
John McCall5fb5df92012-06-20 06:18:46 +00005494/// Add options related to the Objective-C runtime/ABI.
5495///
5496/// Returns true if the runtime is non-fragile.
5497ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5498 ArgStringList &cmdArgs,
5499 RewriteKind rewriteKind) const {
5500 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005501 Arg *runtimeArg =
5502 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5503 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005504
5505 // Just forward -fobjc-runtime= to the frontend. This supercedes
5506 // options about fragility.
5507 if (runtimeArg &&
5508 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5509 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005510 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005511 if (runtime.tryParse(value)) {
5512 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005513 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005514 }
5515
5516 runtimeArg->render(args, cmdArgs);
5517 return runtime;
5518 }
5519
5520 // Otherwise, we'll need the ABI "version". Version numbers are
5521 // slightly confusing for historical reasons:
5522 // 1 - Traditional "fragile" ABI
5523 // 2 - Non-fragile ABI, version 1
5524 // 3 - Non-fragile ABI, version 2
5525 unsigned objcABIVersion = 1;
5526 // If -fobjc-abi-version= is present, use that to set the version.
5527 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005528 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005529 if (value == "1")
5530 objcABIVersion = 1;
5531 else if (value == "2")
5532 objcABIVersion = 2;
5533 else if (value == "3")
5534 objcABIVersion = 3;
5535 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005536 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005537 } else {
5538 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005539 bool nonFragileABIIsDefault =
5540 (rewriteKind == RK_NonFragile ||
5541 (rewriteKind == RK_None &&
5542 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005543 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5544 options::OPT_fno_objc_nonfragile_abi,
5545 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005546// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005547#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5548 unsigned nonFragileABIVersion = 1;
5549#else
5550 unsigned nonFragileABIVersion = 2;
5551#endif
5552
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005553 if (Arg *abiArg =
5554 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005555 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005556 if (value == "1")
5557 nonFragileABIVersion = 1;
5558 else if (value == "2")
5559 nonFragileABIVersion = 2;
5560 else
5561 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005562 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005563 }
5564
5565 objcABIVersion = 1 + nonFragileABIVersion;
5566 } else {
5567 objcABIVersion = 1;
5568 }
5569 }
5570
5571 // We don't actually care about the ABI version other than whether
5572 // it's non-fragile.
5573 bool isNonFragile = objcABIVersion != 1;
5574
5575 // If we have no runtime argument, ask the toolchain for its default runtime.
5576 // However, the rewriter only really supports the Mac runtime, so assume that.
5577 ObjCRuntime runtime;
5578 if (!runtimeArg) {
5579 switch (rewriteKind) {
5580 case RK_None:
5581 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5582 break;
5583 case RK_Fragile:
5584 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5585 break;
5586 case RK_NonFragile:
5587 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5588 break;
5589 }
5590
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005591 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005592 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5593 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005594 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005595 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5596
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005597 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005598 } else {
5599 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5600 }
5601
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005602 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005603 } else {
5604 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005605 // Legacy behaviour is to target the gnustep runtime if we are i
5606 // non-fragile mode or the GCC runtime in fragile mode.
5607 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005608 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005609 else
5610 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005611 }
5612
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005613 cmdArgs.push_back(
5614 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005615 return runtime;
5616}
5617
Reid Klecknerc542d372014-06-27 17:02:02 +00005618static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5619 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5620 I += HaveDash;
5621 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005622}
Reid Klecknerc542d372014-06-27 17:02:02 +00005623
Benjamin Kramere003ca22015-10-28 13:54:16 +00005624namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005625struct EHFlags {
5626 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5627 bool Synch;
5628 bool Asynch;
5629 bool NoExceptC;
5630};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005631} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005632
5633/// /EH controls whether to run destructor cleanups when exceptions are
5634/// thrown. There are three modifiers:
5635/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5636/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5637/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5638/// - c: Assume that extern "C" functions are implicitly noexcept. This
5639/// modifier is an optimization, so we ignore it for now.
5640/// The default is /EHs-c-, meaning cleanups are disabled.
5641static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5642 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005644 std::vector<std::string> EHArgs =
5645 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005646 for (auto EHVal : EHArgs) {
5647 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5648 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005649 case 'a':
5650 EH.Asynch = maybeConsumeDash(EHVal, I);
5651 continue;
5652 case 'c':
5653 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5654 continue;
5655 case 's':
5656 EH.Synch = maybeConsumeDash(EHVal, I);
5657 continue;
5658 default:
5659 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005660 }
5661 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5662 break;
5663 }
5664 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005665
Reid Klecknerc542d372014-06-27 17:02:02 +00005666 return EH;
5667}
5668
Douglas Katzman3459ce22015-10-08 04:24:12 +00005669void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5670 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5671 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005672 unsigned RTOptionID = options::OPT__SLASH_MT;
5673
Hans Wennborgf1a74252013-09-10 20:18:04 +00005674 if (Args.hasArg(options::OPT__SLASH_LDd))
5675 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5676 // but defining _DEBUG is sticky.
5677 RTOptionID = options::OPT__SLASH_MTd;
5678
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005679 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005680 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005681
David Majnemere2afb472015-07-24 06:49:13 +00005682 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005683 switch (RTOptionID) {
5684 case options::OPT__SLASH_MD:
5685 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005686 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005687 CmdArgs.push_back("-D_MT");
5688 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005689 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005690 break;
5691 case options::OPT__SLASH_MDd:
5692 CmdArgs.push_back("-D_DEBUG");
5693 CmdArgs.push_back("-D_MT");
5694 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005695 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005696 break;
5697 case options::OPT__SLASH_MT:
5698 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005699 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005700 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005701 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005702 break;
5703 case options::OPT__SLASH_MTd:
5704 CmdArgs.push_back("-D_DEBUG");
5705 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005706 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005707 break;
5708 default:
5709 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005710 }
5711
David Majnemere2afb472015-07-24 06:49:13 +00005712 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5713 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5714 } else {
5715 CmdArgs.push_back(FlagForCRT.data());
5716
5717 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5718 // users want. The /Za flag to cl.exe turns this off, but it's not
5719 // implemented in clang.
5720 CmdArgs.push_back("--dependent-lib=oldnames");
5721 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005722
Hans Wennborg8858a032014-07-21 23:42:07 +00005723 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5724 // would produce interleaved output, so ignore /showIncludes in such cases.
5725 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5726 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5727 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005728
David Majnemerf6072342014-07-01 22:24:56 +00005729 // This controls whether or not we emit RTTI data for polymorphic types.
5730 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5731 /*default=*/false))
5732 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005733
Reid Kleckner124955a2015-08-05 18:51:13 +00005734 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005735 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005736 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5737 // If we are emitting CV but not DWARF, don't build information that LLVM
5738 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005739 if (*EmitCodeView && !EmitDwarf)
5740 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5741 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005742 CmdArgs.push_back("-gcodeview");
5743
Reid Klecknerc542d372014-06-27 17:02:02 +00005744 const Driver &D = getToolChain().getDriver();
5745 EHFlags EH = parseClangCLEHFlags(D, Args);
5746 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005747 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005748 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005749 CmdArgs.push_back("-fexceptions");
5750 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005751
Hans Wennborge50cec32014-06-13 20:59:54 +00005752 // /EP should expand to -E -P.
5753 if (Args.hasArg(options::OPT__SLASH_EP)) {
5754 CmdArgs.push_back("-E");
5755 CmdArgs.push_back("-P");
5756 }
5757
David Majnemera5b195a2015-02-14 01:35:12 +00005758 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005759 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5760 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005761 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5762 else
5763 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5764
5765 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5766 VolatileOptionID = A->getOption().getID();
5767
5768 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5769 CmdArgs.push_back("-fms-volatile");
5770
David Majnemer86c318f2014-02-11 21:05:00 +00005771 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5772 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5773 if (MostGeneralArg && BestCaseArg)
5774 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5775 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5776
5777 if (MostGeneralArg) {
5778 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5779 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5780 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5781
5782 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5783 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5784 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5785 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5786 << FirstConflict->getAsString(Args)
5787 << SecondConflict->getAsString(Args);
5788
5789 if (SingleArg)
5790 CmdArgs.push_back("-fms-memptr-rep=single");
5791 else if (MultipleArg)
5792 CmdArgs.push_back("-fms-memptr-rep=multiple");
5793 else
5794 CmdArgs.push_back("-fms-memptr-rep=virtual");
5795 }
5796
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005797 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5798 A->render(Args, CmdArgs);
5799
Hans Wennborg81f74482013-09-10 01:07:07 +00005800 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5801 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005802 if (Args.hasArg(options::OPT__SLASH_fallback))
5803 CmdArgs.push_back("msvc-fallback");
5804 else
5805 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005806 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005807}
5808
Douglas Katzman95354292015-06-23 20:42:09 +00005809visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005810 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005811 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005812 return CLFallback.get();
5813}
5814
Daniel Sanders7f933f42015-01-30 17:35:23 +00005815void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5816 ArgStringList &CmdArgs) const {
5817 StringRef CPUName;
5818 StringRef ABIName;
5819 const llvm::Triple &Triple = getToolChain().getTriple();
5820 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5821
5822 CmdArgs.push_back("-target-abi");
5823 CmdArgs.push_back(ABIName.data());
5824}
5825
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005826void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005827 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005828 const ArgList &Args,
5829 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005830 ArgStringList CmdArgs;
5831
5832 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5833 const InputInfo &Input = Inputs[0];
5834
James Y Knight2db38f32015-08-15 03:45:25 +00005835 std::string TripleStr =
5836 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5837 const llvm::Triple Triple(TripleStr);
5838
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005839 // Don't warn about "clang -w -c foo.s"
5840 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005841 // and "clang -emit-llvm -c foo.s"
5842 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005843
Rafael Espindola577637a2015-01-03 00:06:04 +00005844 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005845
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005846 // Invoke ourselves in -cc1as mode.
5847 //
5848 // FIXME: Implement custom jobs for internal actions.
5849 CmdArgs.push_back("-cc1as");
5850
5851 // Add the "effective" target triple.
5852 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005853 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5854
5855 // Set the output mode, we currently only expect to be used as a real
5856 // assembler.
5857 CmdArgs.push_back("-filetype");
5858 CmdArgs.push_back("obj");
5859
Eric Christopher45f2e712012-12-18 00:31:10 +00005860 // Set the main file name, so that debug info works even with
5861 // -save-temps or preprocessed assembly.
5862 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005863 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005864
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005865 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005866 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005867 if (!CPU.empty()) {
5868 CmdArgs.push_back("-target-cpu");
5869 CmdArgs.push_back(Args.MakeArgString(CPU));
5870 }
5871
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005872 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005873 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005874
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005875 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005876 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005877
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005878 // Pass along any -I options so we get proper .include search paths.
5879 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5880
Eric Christopherfc3ee562012-01-10 00:38:01 +00005881 // Determine the original source input.
5882 const Action *SourceAction = &JA;
5883 while (SourceAction->getKind() != Action::InputClass) {
5884 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5885 SourceAction = SourceAction->getInputs()[0];
5886 }
5887
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005888 // Forward -g and handle debug info related flags, assuming we are dealing
5889 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005890 if (SourceAction->getType() == types::TY_Asm ||
5891 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005892 bool WantDebug = false;
5893 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005894 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005895 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5896 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005897 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005898 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005899 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005900 if (DwarfVersion == 0)
5901 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005902 RenderDebugEnablingArgs(Args, CmdArgs,
5903 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5904 : CodeGenOptions::NoDebugInfo),
5905 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005906
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005907 // Add the -fdebug-compilation-dir flag if needed.
5908 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005909
5910 // Set the AT_producer to the clang version when using the integrated
5911 // assembler on assembly source files.
5912 CmdArgs.push_back("-dwarf-debug-producer");
5913 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005914
5915 // And pass along -I options
5916 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005917 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005918
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005919 // Handle -fPIC et al -- the relocation-model affects the assembler
5920 // for some targets.
5921 llvm::Reloc::Model RelocationModel;
5922 unsigned PICLevel;
5923 bool IsPIE;
5924 std::tie(RelocationModel, PICLevel, IsPIE) =
5925 ParsePICArgs(getToolChain(), Triple, Args);
5926
5927 const char *RMName = RelocationModelName(RelocationModel);
5928 if (RMName) {
5929 CmdArgs.push_back("-mrelocation-model");
5930 CmdArgs.push_back(RMName);
5931 }
5932
Kevin Enderby292dc082011-12-22 19:31:58 +00005933 // Optionally embed the -cc1as level arguments into the debug info, for build
5934 // analysis.
5935 if (getToolChain().UseDwarfDebugFlags()) {
5936 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005937 for (const auto &Arg : Args)
5938 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005939
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005940 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005941 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5942 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005943 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005944 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005945 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005946 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005947 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005948 }
5949 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005950 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005951 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005952
5953 // FIXME: Add -static support, once we have it.
5954
Daniel Sanders7f933f42015-01-30 17:35:23 +00005955 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005956 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005957 default:
5958 break;
5959
5960 case llvm::Triple::mips:
5961 case llvm::Triple::mipsel:
5962 case llvm::Triple::mips64:
5963 case llvm::Triple::mips64el:
5964 AddMIPSTargetArgs(Args, CmdArgs);
5965 break;
5966 }
5967
David Blaikie372d9502014-01-17 03:17:40 +00005968 // Consume all the warning flags. Usually this would be handled more
5969 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5970 // doesn't handle that so rather than warning about unused flags that are
5971 // actually used, we'll lie by omission instead.
5972 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005973 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5974 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005975
David Blaikie9260ed62013-07-25 21:19:01 +00005976 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5977 getToolChain().getDriver());
5978
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005979 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005980
5981 assert(Output.isFilename() && "Unexpected lipo output.");
5982 CmdArgs.push_back("-o");
5983 CmdArgs.push_back(Output.getFilename());
5984
Daniel Dunbarb440f562010-08-02 02:38:21 +00005985 assert(Input.isFilename() && "Invalid input.");
5986 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005987
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005988 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005989 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005990
5991 // Handle the debug info splitting at object creation time if we're
5992 // creating an object.
5993 // TODO: Currently only works on linux with newer objcopy.
5994 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005995 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005996 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005997 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005998}
5999
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006000void GnuTool::anchor() {}
6001
Daniel Dunbara3246a02009-03-18 08:07:30 +00006002void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006003 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006004 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006005 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006006 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006007 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006008
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006009 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006010 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00006011 // Don't forward any -g arguments to assembly steps.
6012 if (isa<AssembleJobAction>(JA) &&
6013 A->getOption().matches(options::OPT_g_Group))
6014 continue;
6015
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006016 // Don't forward any -W arguments to assembly and link steps.
6017 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6018 A->getOption().matches(options::OPT_W_Group))
6019 continue;
6020
Daniel Dunbar2da02722009-03-19 07:55:12 +00006021 // It is unfortunate that we have to claim here, as this means
6022 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00006023 // platforms using a generic gcc, even if we are just using gcc
6024 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00006025 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006026 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006027 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006028 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006029
Daniel Dunbar4e295052010-01-25 22:35:08 +00006030 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006031
6032 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006033 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006034 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006035 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006036 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006037 }
6038
Daniel Dunbar5716d872009-05-02 21:41:52 +00006039 // Try to force gcc to match the tool chain we want, if we recognize
6040 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006041 //
6042 // FIXME: The triple class should directly provide the information we want
6043 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006044 switch (getToolChain().getArch()) {
6045 default:
6046 break;
6047 case llvm::Triple::x86:
6048 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006049 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006050 break;
6051 case llvm::Triple::x86_64:
6052 case llvm::Triple::ppc64:
6053 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006054 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006055 break;
6056 case llvm::Triple::sparcel:
6057 CmdArgs.push_back("-EL");
6058 break;
6059 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006060
Daniel Dunbarb440f562010-08-02 02:38:21 +00006061 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006062 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006063 CmdArgs.push_back(Output.getFilename());
6064 } else {
6065 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006066 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006067 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006068
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006069 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006070
6071 // Only pass -x if gcc will understand it; otherwise hope gcc
6072 // understands the suffix correctly. The main use case this would go
6073 // wrong in is for linker inputs if they happened to have an odd
6074 // suffix; really the only way to get this to happen is a command
6075 // like '-x foobar a.c' which will treat a.c like a linker input.
6076 //
6077 // FIXME: For the linker case specifically, can we safely convert
6078 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006079 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006080 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006081 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006082 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006083 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006084 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006085 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006086 else if (II.getType() == types::TY_ModuleFile)
6087 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006088 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006089
Daniel Dunbara3246a02009-03-18 08:07:30 +00006090 if (types::canTypeBeUserSpecified(II.getType())) {
6091 CmdArgs.push_back("-x");
6092 CmdArgs.push_back(types::getTypeName(II.getType()));
6093 }
6094
Daniel Dunbarb440f562010-08-02 02:38:21 +00006095 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006096 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006097 else {
6098 const Arg &A = II.getInputArg();
6099
6100 // Reverse translate some rewritten options.
6101 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6102 CmdArgs.push_back("-lstdc++");
6103 continue;
6104 }
6105
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006106 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006107 A.render(Args, CmdArgs);
6108 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006109 }
6110
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006111 const std::string customGCCName = D.getCCCGenericGCCName();
6112 const char *GCCName;
6113 if (!customGCCName.empty())
6114 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006115 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006116 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006117 } else
6118 GCCName = "gcc";
6119
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006120 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006121 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006122}
6123
Douglas Katzman95354292015-06-23 20:42:09 +00006124void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6125 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006126 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006127}
6128
Douglas Katzman95354292015-06-23 20:42:09 +00006129void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6130 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006131 const Driver &D = getToolChain().getDriver();
6132
Eric Christophercc7ff502015-01-29 00:56:17 +00006133 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006134 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006135 case types::TY_LLVM_IR:
6136 case types::TY_LTO_IR:
6137 case types::TY_LLVM_BC:
6138 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006139 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006140 break;
6141 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006142 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006143 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006144 case types::TY_Nothing:
6145 CmdArgs.push_back("-fsyntax-only");
6146 break;
6147 default:
6148 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006149 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006150}
6151
Douglas Katzman95354292015-06-23 20:42:09 +00006152void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6153 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006154 // The types are (hopefully) good enough.
6155}
6156
Tony Linthicum76329bf2011-12-12 21:14:55 +00006157// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006158void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006159 ArgStringList &CmdArgs) const {
6160}
6161
Douglas Katzman95354292015-06-23 20:42:09 +00006162void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6163 const InputInfo &Output,
6164 const InputInfoList &Inputs,
6165 const ArgList &Args,
6166 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006167 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006168
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006169 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6170 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006171 ArgStringList CmdArgs;
6172
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006173 std::string MArchString = "-march=hexagon";
6174 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006175
6176 RenderExtraToolArgs(JA, CmdArgs);
6177
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006178 std::string AsName = "hexagon-llvm-mc";
6179 std::string MCpuString = "-mcpu=hexagon" +
6180 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6181 CmdArgs.push_back("-filetype=obj");
6182 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6183
Tony Linthicum76329bf2011-12-12 21:14:55 +00006184 if (Output.isFilename()) {
6185 CmdArgs.push_back("-o");
6186 CmdArgs.push_back(Output.getFilename());
6187 } else {
6188 assert(Output.isNothing() && "Unexpected output");
6189 CmdArgs.push_back("-fsyntax-only");
6190 }
6191
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006192 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6193 std::string N = llvm::utostr(G.getValue());
6194 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6195 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006196
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006197 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006198
Tony Linthicum76329bf2011-12-12 21:14:55 +00006199 // Only pass -x if gcc will understand it; otherwise hope gcc
6200 // understands the suffix correctly. The main use case this would go
6201 // wrong in is for linker inputs if they happened to have an odd
6202 // suffix; really the only way to get this to happen is a command
6203 // like '-x foobar a.c' which will treat a.c like a linker input.
6204 //
6205 // FIXME: For the linker case specifically, can we safely convert
6206 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006207 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006208 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006209 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006210 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006211 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006212 else if (II.getType() == types::TY_AST)
6213 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006214 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006215 else if (II.getType() == types::TY_ModuleFile)
6216 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006217 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006218
6219 if (II.isFilename())
6220 CmdArgs.push_back(II.getFilename());
6221 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006222 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006223 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006224 II.getInputArg().render(Args, CmdArgs);
6225 }
6226
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006227 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006228 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006229}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006230
Douglas Katzman95354292015-06-23 20:42:09 +00006231void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6232 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006233}
6234
Douglas Katzman54366072015-07-27 16:53:08 +00006235static void
6236constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006237 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006238 const InputInfo &Output, const InputInfoList &Inputs,
6239 const ArgList &Args, ArgStringList &CmdArgs,
6240 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006241
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006242 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006243
Matthew Curtise689b052012-12-06 15:46:07 +00006244 //----------------------------------------------------------------------------
6245 //
6246 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006247 bool IsStatic = Args.hasArg(options::OPT_static);
6248 bool IsShared = Args.hasArg(options::OPT_shared);
6249 bool IsPIE = Args.hasArg(options::OPT_pie);
6250 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6251 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6252 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6253 bool UseG0 = false;
6254 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006255
Matthew Curtise689b052012-12-06 15:46:07 +00006256 //----------------------------------------------------------------------------
6257 // Silence warnings for various options
6258 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006259 Args.ClaimAllArgs(options::OPT_g_Group);
6260 Args.ClaimAllArgs(options::OPT_emit_llvm);
6261 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6262 // handled somewhere else.
6263 Args.ClaimAllArgs(options::OPT_static_libgcc);
6264
6265 //----------------------------------------------------------------------------
6266 //
6267 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006268 if (Args.hasArg(options::OPT_s))
6269 CmdArgs.push_back("-s");
6270
6271 if (Args.hasArg(options::OPT_r))
6272 CmdArgs.push_back("-r");
6273
6274 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006275 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006276
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006277 CmdArgs.push_back("-march=hexagon");
6278 std::string CpuVer =
6279 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6280 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6281 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006282
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006283 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006284 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006285 // The following should be the default, but doing as hexagon-gcc does.
6286 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006287 }
6288
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006289 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006290 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006291
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006292 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006293 CmdArgs.push_back("-pie");
6294
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006295 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6296 std::string N = llvm::utostr(G.getValue());
6297 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6298 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006299 }
6300
Matthew Curtise689b052012-12-06 15:46:07 +00006301 //----------------------------------------------------------------------------
6302 //
6303 //----------------------------------------------------------------------------
6304 CmdArgs.push_back("-o");
6305 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006306
Matthew Curtise689b052012-12-06 15:46:07 +00006307 //----------------------------------------------------------------------------
6308 // moslib
6309 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006310 std::vector<std::string> OsLibs;
6311 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006312
Sean Silva14facf32015-06-09 01:57:17 +00006313 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6314 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006315 OsLibs.emplace_back(A->getValue());
6316 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006317 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006318 if (OsLibs.empty()) {
6319 OsLibs.push_back("standalone");
6320 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006321 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006322
Matthew Curtise689b052012-12-06 15:46:07 +00006323 //----------------------------------------------------------------------------
6324 // Start Files
6325 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006326 const std::string MCpuSuffix = "/" + CpuVer;
6327 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6328 const std::string RootDir =
6329 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6330 const std::string StartSubDir =
6331 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006332
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006333 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6334 const char *Name) -> std::string {
6335 std::string RelName = SubDir + Name;
6336 std::string P = HTC.GetFilePath(RelName.c_str());
6337 if (llvm::sys::fs::exists(P))
6338 return P;
6339 return RootDir + RelName;
6340 };
6341
6342 if (IncStdLib && IncStartFiles) {
6343 if (!IsShared) {
6344 if (HasStandalone) {
6345 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6346 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006347 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006348 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6349 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006350 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006351 std::string Init = UseShared
6352 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6353 : Find(RootDir, StartSubDir, "/init.o");
6354 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006355 }
6356
6357 //----------------------------------------------------------------------------
6358 // Library Search Paths
6359 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006360 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6361 for (const auto &LibPath : LibPaths)
6362 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006363
6364 //----------------------------------------------------------------------------
6365 //
6366 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006367 Args.AddAllArgs(CmdArgs,
6368 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6369 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006370
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006371 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006372
6373 //----------------------------------------------------------------------------
6374 // Libraries
6375 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006376 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006377 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006378 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006379 CmdArgs.push_back("-lm");
6380 }
6381
6382 CmdArgs.push_back("--start-group");
6383
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006384 if (!IsShared) {
6385 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006386 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006387 CmdArgs.push_back("-lc");
6388 }
6389 CmdArgs.push_back("-lgcc");
6390
6391 CmdArgs.push_back("--end-group");
6392 }
6393
6394 //----------------------------------------------------------------------------
6395 // End files
6396 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006397 if (IncStdLib && IncStartFiles) {
6398 std::string Fini = UseShared
6399 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6400 : Find(RootDir, StartSubDir, "/fini.o");
6401 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006402 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006403}
6404
Douglas Katzman95354292015-06-23 20:42:09 +00006405void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6406 const InputInfo &Output,
6407 const InputInfoList &Inputs,
6408 const ArgList &Args,
6409 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006410 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006411
6412 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006413 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006414 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006415
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006416 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006417 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006418 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006419}
6420// Hexagon tools end.
6421
Tom Stellard8fa33092015-07-18 01:49:05 +00006422void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6423 const InputInfo &Output,
6424 const InputInfoList &Inputs,
6425 const ArgList &Args,
6426 const char *LinkingOutput) const {
6427
6428 std::string Linker = getToolChain().GetProgramPath(getShortName());
6429 ArgStringList CmdArgs;
6430 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006431 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006432 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006433 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006434 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6435 CmdArgs.push_back("-o");
6436 CmdArgs.push_back(Output.getFilename());
6437 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6438 CmdArgs, Inputs));
6439}
6440// AMDGPU tools end.
6441
Renato Golin7c542b42015-07-27 23:44:45 +00006442const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006443 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006444 if (!Arch.empty())
6445 MArch = Arch;
6446 else
Bernard Ogden31561762013-12-12 13:27:11 +00006447 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006448 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006449
6450 // Handle -march=native.
6451 if (MArch == "native") {
6452 std::string CPU = llvm::sys::getHostCPUName();
6453 if (CPU != "generic") {
6454 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006455 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006456 // If there is no valid architecture suffix for this CPU we don't know how
6457 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006458 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006459 MArch = "";
6460 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006461 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006462 }
6463 }
6464
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006465 return MArch;
6466}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006467
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006468/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006469StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006470 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006471 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6472 // here means an -march=native that we can't handle, so instead return no CPU.
6473 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006474 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006475
John Brawna95c1a82015-05-08 12:52:18 +00006476 // We need to return an empty string here on invalid MArch values as the
6477 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006478 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006479}
6480
6481/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006482std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006483 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006484 // FIXME: Warn on inconsistent use of -mcpu and -march.
6485 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006486 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006487 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006488 // Handle -mcpu=native.
6489 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006490 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006491 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006492 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006493 }
6494
Renato Goline17c5802015-07-27 23:44:42 +00006495 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006496}
6497
6498/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006499/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006500// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006501StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6502 const llvm::Triple &Triple) {
6503 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006504 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006505 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006506 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006507 if (ArchKind == llvm::ARM::AK_INVALID)
6508 // In case of generic Arch, i.e. "arm",
6509 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006510 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006511 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006512 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6513 // armv7k triple if it's actually been specified via "-arch armv7k".
6514 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006515 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006516 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006517 }
Renato Golin3c007252015-05-28 15:05:53 +00006518 if (ArchKind == llvm::ARM::AK_INVALID)
6519 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006520 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006521}
6522
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006523void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006524 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006525 if (Args.hasArg(options::OPT_r))
6526 return;
6527
John Brawn94fd9632015-05-21 12:19:49 +00006528 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6529 // to generate BE-8 executables.
6530 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6531 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006532}
6533
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006534mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006535 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6536 // was first introduced in Release 3. However, other compilers have
6537 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006538 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6539 .Case("mips1", NanLegacy)
6540 .Case("mips2", NanLegacy)
6541 .Case("mips3", NanLegacy)
6542 .Case("mips4", NanLegacy)
6543 .Case("mips5", NanLegacy)
6544 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006545 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006546 .Case("mips32r3", NanLegacy | Nan2008)
6547 .Case("mips32r5", NanLegacy | Nan2008)
6548 .Case("mips32r6", Nan2008)
6549 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006550 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006551 .Case("mips64r3", NanLegacy | Nan2008)
6552 .Case("mips64r5", NanLegacy | Nan2008)
6553 .Case("mips64r6", Nan2008)
6554 .Default(NanLegacy);
6555}
6556
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006557bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6558 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6559 return A && (A->getValue() == StringRef(Value));
6560}
6561
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006562bool mips::isUCLibc(const ArgList &Args) {
6563 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006564 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006565}
6566
Daniel Sanders2bf13662014-07-10 14:40:57 +00006567bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006568 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6569 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006570 .Case("2008", true)
6571 .Case("legacy", false)
6572 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006573
6574 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006575 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006576 .Cases("mips32r6", "mips64r6", true)
6577 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006578
6579 return false;
6580}
6581
Daniel Sanders379d44b2014-07-16 11:52:23 +00006582bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006583 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006584 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006585 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006586 return false;
6587
6588 if (ABIName != "32")
6589 return false;
6590
Toma Tabacu94ea6862015-06-16 13:54:13 +00006591 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6592 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006593 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006594 return false;
6595
Daniel Sanders379d44b2014-07-16 11:52:23 +00006596 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006597 .Cases("mips2", "mips3", "mips4", "mips5", true)
6598 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6599 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6600 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006601}
6602
Toma Tabacu94ea6862015-06-16 13:54:13 +00006603bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6604 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006605 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006606 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6607
6608 // FPXX shouldn't be used if -msingle-float is present.
6609 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6610 options::OPT_mdouble_float))
6611 if (A->getOption().matches(options::OPT_msingle_float))
6612 UseFPXX = false;
6613
6614 return UseFPXX;
6615}
6616
Tim Northover157d9112014-01-16 08:48:16 +00006617llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006618 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6619 // archs which Darwin doesn't use.
6620
6621 // The matching this routine does is fairly pointless, since it is neither the
6622 // complete architecture list, nor a reasonable subset. The problem is that
6623 // historically the driver driver accepts this and also ties its -march=
6624 // handling to the architecture name, so we need to be careful before removing
6625 // support for it.
6626
6627 // This code must be kept in sync with Clang's Darwin specific argument
6628 // translation.
6629
6630 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006631 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6632 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6633 .Case("ppc64", llvm::Triple::ppc64)
6634 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6635 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6636 llvm::Triple::x86)
6637 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6638 // This is derived from the driver driver.
6639 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6640 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6641 .Cases("armv7s", "xscale", llvm::Triple::arm)
6642 .Case("arm64", llvm::Triple::aarch64)
6643 .Case("r600", llvm::Triple::r600)
6644 .Case("amdgcn", llvm::Triple::amdgcn)
6645 .Case("nvptx", llvm::Triple::nvptx)
6646 .Case("nvptx64", llvm::Triple::nvptx64)
6647 .Case("amdil", llvm::Triple::amdil)
6648 .Case("spir", llvm::Triple::spir)
6649 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006650}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006651
Tim Northover157d9112014-01-16 08:48:16 +00006652void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006653 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006654 T.setArch(Arch);
6655
6656 if (Str == "x86_64h")
6657 T.setArchName(Str);
6658 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6659 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006660 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006661 }
6662}
6663
Bob Wilsondecc03e2012-11-23 06:14:39 +00006664const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006665 const InputInfo &Input) {
6666 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006667}
6668
Bob Wilsondecc03e2012-11-23 06:14:39 +00006669const char *Clang::getBaseInputStem(const ArgList &Args,
6670 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006671 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006672
Chris Lattner906bb902011-01-16 08:14:11 +00006673 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006674 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006675
6676 return Str;
6677}
6678
Bob Wilsondecc03e2012-11-23 06:14:39 +00006679const char *Clang::getDependencyFileName(const ArgList &Args,
6680 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006681 // FIXME: Think about this more.
6682 std::string Res;
6683
6684 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006685 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006686 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006687 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006688 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006689 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006690 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006691}
6692
Douglas Katzman95354292015-06-23 20:42:09 +00006693void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6694 const InputInfo &Output,
6695 const InputInfoList &Inputs,
6696 const ArgList &Args,
6697 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006698 const ToolChain &ToolChain = getToolChain();
6699 const Driver &D = ToolChain.getDriver();
6700 ArgStringList CmdArgs;
6701
6702 // Silence warning for "clang -g foo.o -o foo"
6703 Args.ClaimAllArgs(options::OPT_g_Group);
6704 // and "clang -emit-llvm foo.o -o foo"
6705 Args.ClaimAllArgs(options::OPT_emit_llvm);
6706 // and for "clang -w foo.o -o foo". Other warning options are already
6707 // handled somewhere else.
6708 Args.ClaimAllArgs(options::OPT_w);
6709
6710 if (!D.SysRoot.empty())
6711 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6712
6713 // CloudABI only supports static linkage.
6714 CmdArgs.push_back("-Bstatic");
6715 CmdArgs.push_back("--eh-frame-hdr");
6716 CmdArgs.push_back("--gc-sections");
6717
6718 if (Output.isFilename()) {
6719 CmdArgs.push_back("-o");
6720 CmdArgs.push_back(Output.getFilename());
6721 } else {
6722 assert(Output.isNothing() && "Invalid output.");
6723 }
6724
Douglas Katzman78b37b02015-11-17 20:28:07 +00006725 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006726 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6727 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6728 }
6729
6730 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006731 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006732 Args.AddAllArgs(CmdArgs,
6733 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6734 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006735
Teresa Johnson945bc502015-10-15 20:35:53 +00006736 if (D.isUsingLTO())
6737 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006738
6739 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6740
Douglas Katzman78b37b02015-11-17 20:28:07 +00006741 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006742 if (D.CCCIsCXX())
6743 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6744 CmdArgs.push_back("-lc");
6745 CmdArgs.push_back("-lcompiler_rt");
6746 }
6747
Douglas Katzman78b37b02015-11-17 20:28:07 +00006748 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006749 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6750
6751 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006752 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006753}
6754
Douglas Katzman95354292015-06-23 20:42:09 +00006755void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6756 const InputInfo &Output,
6757 const InputInfoList &Inputs,
6758 const ArgList &Args,
6759 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006760 ArgStringList CmdArgs;
6761
6762 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6763 const InputInfo &Input = Inputs[0];
6764
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006765 // Determine the original source input.
6766 const Action *SourceAction = &JA;
6767 while (SourceAction->getKind() != Action::InputClass) {
6768 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6769 SourceAction = SourceAction->getInputs()[0];
6770 }
6771
Eric Christopherf5a8f492015-12-08 00:10:10 +00006772 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006773 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006774 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6775 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006776 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006777 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006778 const llvm::Triple &T(getToolChain().getTriple());
6779 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006780 CmdArgs.push_back("-Q");
6781 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006782
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006783 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006784 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006785 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006786 if (Args.hasArg(options::OPT_gstabs))
6787 CmdArgs.push_back("--gstabs");
6788 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006789 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006790 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006791
Daniel Dunbarbe220842009-03-20 16:06:39 +00006792 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006793 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006794
Daniel Dunbar6d484762010-07-22 01:47:22 +00006795 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006796 if (getToolChain().getArch() == llvm::Triple::x86 ||
6797 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006798 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6799 CmdArgs.push_back("-force_cpusubtype_ALL");
6800
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006801 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006802 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006803 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006804 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006805 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006806 CmdArgs.push_back("-static");
6807
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006808 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006809
6810 assert(Output.isFilename() && "Unexpected lipo output.");
6811 CmdArgs.push_back("-o");
6812 CmdArgs.push_back(Output.getFilename());
6813
Daniel Dunbarb440f562010-08-02 02:38:21 +00006814 assert(Input.isFilename() && "Invalid input.");
6815 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006816
6817 // asm_final spec is empty.
6818
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006819 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006820 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006821}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006822
Tim Northover157d9112014-01-16 08:48:16 +00006823void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006824
Tim Northover157d9112014-01-16 08:48:16 +00006825void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6826 ArgStringList &CmdArgs) const {
6827 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006828
Daniel Dunbarc1964212009-03-26 16:23:12 +00006829 // Derived from darwin_arch spec.
6830 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006831 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006832
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006833 // FIXME: Is this needed anymore?
6834 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006835 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006836}
6837
Douglas Katzman95354292015-06-23 20:42:09 +00006838bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006839 // We only need to generate a temp path for LTO if we aren't compiling object
6840 // files. When compiling source files, we run 'dsymutil' after linking. We
6841 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006842 for (const auto &Input : Inputs)
6843 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006844 return true;
6845
6846 return false;
6847}
6848
Douglas Katzman95354292015-06-23 20:42:09 +00006849void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6850 ArgStringList &CmdArgs,
6851 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006852 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006853 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006854
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006855 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006856 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6857 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006858 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6859 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006860 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006861 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006862 }
6863
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006864 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006865 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006866 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6867 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006868
Bob Wilson3d27dad2013-08-02 22:25:34 +00006869 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6870 CmdArgs.push_back("-export_dynamic");
6871
Bob Wilsonb111ec92015-03-02 19:01:14 +00006872 // If we are using App Extension restrictions, pass a flag to the linker
6873 // telling it that the compiled code has been audited.
6874 if (Args.hasFlag(options::OPT_fapplication_extension,
6875 options::OPT_fno_application_extension, false))
6876 CmdArgs.push_back("-application_extension");
6877
Teresa Johnson945bc502015-10-15 20:35:53 +00006878 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006879 // If we are using LTO, then automatically create a temporary file path for
6880 // the linker to use, so that it's lifetime will extend past a possible
6881 // dsymutil step.
6882 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6883 const char *TmpPath = C.getArgs().MakeArgString(
6884 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6885 C.addTempFile(TmpPath);
6886 CmdArgs.push_back("-object_path_lto");
6887 CmdArgs.push_back(TmpPath);
6888 }
6889
6890 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6891 // it in clang installed libraries. If not found, the option is not used
6892 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6893 if (Version[0] >= 133) {
6894 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6895 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6896 SmallString<128> LibLTOPath(P);
6897 llvm::sys::path::append(LibLTOPath, "lib");
6898 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6899 if (llvm::sys::fs::exists(LibLTOPath)) {
6900 CmdArgs.push_back("-lto_library");
6901 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6902 } else {
6903 D.Diag(diag::warn_drv_lto_libpath);
6904 }
6905 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006906 }
6907
Daniel Dunbarc1964212009-03-26 16:23:12 +00006908 // Derived from the "link" spec.
6909 Args.AddAllArgs(CmdArgs, options::OPT_static);
6910 if (!Args.hasArg(options::OPT_static))
6911 CmdArgs.push_back("-dynamic");
6912 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6913 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6914 // here. How do we wish to handle such things?
6915 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006916
Daniel Dunbarc1964212009-03-26 16:23:12 +00006917 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006918 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006919 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006920 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006921
6922 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6923 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6924 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6925
6926 Arg *A;
6927 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6928 (A = Args.getLastArg(options::OPT_current__version)) ||
6929 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006930 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6931 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006932
6933 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6934 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6935 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6936 } else {
6937 CmdArgs.push_back("-dylib");
6938
6939 Arg *A;
6940 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6941 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6942 (A = Args.getLastArg(options::OPT_client__name)) ||
6943 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6944 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6945 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006946 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6947 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006948
Daniel Dunbarc1964212009-03-26 16:23:12 +00006949 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6950 "-dylib_compatibility_version");
6951 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6952 "-dylib_current_version");
6953
Tim Northover157d9112014-01-16 08:48:16 +00006954 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006955
6956 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6957 "-dylib_install_name");
6958 }
6959
6960 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6961 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6962 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006963 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006964 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006965 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6966 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6967 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6968 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6969 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6970 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006971 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006972 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6973 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6974 Args.AddAllArgs(CmdArgs, options::OPT_init);
6975
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006976 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006977 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006978
Daniel Dunbarc1964212009-03-26 16:23:12 +00006979 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6980 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6981 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6982 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6983 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006984
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006985 if (const Arg *A =
6986 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6987 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006988 if (A->getOption().matches(options::OPT_fpie) ||
6989 A->getOption().matches(options::OPT_fPIE))
6990 CmdArgs.push_back("-pie");
6991 else
6992 CmdArgs.push_back("-no_pie");
6993 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006994
6995 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6996 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6997 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6998 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6999 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7000 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7001 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7002 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7003 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7004 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7005 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7006 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7007 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7008 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7009 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7010 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007011
Daniel Dunbar84384642011-05-02 21:03:47 +00007012 // Give --sysroot= preference, over the Apple specific behavior to also use
7013 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007014 StringRef sysroot = C.getSysRoot();
7015 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007016 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007017 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007018 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7019 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007020 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007021 }
7022
Daniel Dunbarc1964212009-03-26 16:23:12 +00007023 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7024 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7025 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7026 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7027 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007028 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007029 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7030 Args.AddAllArgs(CmdArgs, options::OPT_y);
7031 Args.AddLastArg(CmdArgs, options::OPT_w);
7032 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7033 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7034 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7035 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7036 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7037 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7038 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7039 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7040 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7041 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7042 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7043 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7044}
7045
Douglas Katzman95354292015-06-23 20:42:09 +00007046void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7047 const InputInfo &Output,
7048 const InputInfoList &Inputs,
7049 const ArgList &Args,
7050 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007051 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007052
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007053 // If the number of arguments surpasses the system limits, we will encode the
7054 // input files in a separate file, shortening the command line. To this end,
7055 // build a list of input file names that can be passed via a file with the
7056 // -filelist linker option.
7057 llvm::opt::ArgStringList InputFileList;
7058
Daniel Dunbarc1964212009-03-26 16:23:12 +00007059 // The logic here is derived from gcc's behavior; most of which
7060 // comes from specs (starting with link_command). Consult gcc for
7061 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007062 ArgStringList CmdArgs;
7063
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007064 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7065 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7066 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007067 for (const auto &Arg : Args)
7068 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007069 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007070 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007071 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007072 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007073 return;
7074 }
7075
Daniel Dunbarc1964212009-03-26 16:23:12 +00007076 // I'm not sure why this particular decomposition exists in gcc, but
7077 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007078 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007079
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007080 // It seems that the 'e' option is completely ignored for dynamic executables
7081 // (the default), and with static executables, the last one wins, as expected.
7082 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7083 options::OPT_Z_Flag, options::OPT_u_Group,
7084 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007085
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007086 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7087 // members of static archive libraries which implement Objective-C classes or
7088 // categories.
7089 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7090 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007091
Daniel Dunbarc1964212009-03-26 16:23:12 +00007092 CmdArgs.push_back("-o");
7093 CmdArgs.push_back(Output.getFilename());
7094
Douglas Katzman78b37b02015-11-17 20:28:07 +00007095 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007096 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007097
Peter Collingbournec4122c12015-06-15 21:08:13 +00007098 // SafeStack requires its own runtime libraries
7099 // These libraries should be linked first, to make sure the
7100 // __safestack_init constructor executes before everything else
7101 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7102 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7103 "libclang_rt.safestack_osx.a",
7104 /*AlwaysLink=*/true);
7105 }
7106
Daniel Dunbarc1964212009-03-26 16:23:12 +00007107 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007108
Douglas Gregor9295df02012-05-15 21:00:27 +00007109 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007110 // Build the input file for -filelist (list of linker input files) in case we
7111 // need it later
7112 for (const auto &II : Inputs) {
7113 if (!II.isFilename()) {
7114 // This is a linker input argument.
7115 // We cannot mix input arguments and file names in a -filelist input, thus
7116 // we prematurely stop our list (remaining files shall be passed as
7117 // arguments).
7118 if (InputFileList.size() > 0)
7119 break;
7120
7121 continue;
7122 }
7123
7124 InputFileList.push_back(II.getFilename());
7125 }
7126
Douglas Katzman78b37b02015-11-17 20:28:07 +00007127 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007128 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7129
Douglas Katzman78b37b02015-11-17 20:28:07 +00007130 if (isObjCRuntimeLinked(Args) &&
7131 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007132 // We use arclite library for both ARC and subscripting support.
7133 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7134
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007135 CmdArgs.push_back("-framework");
7136 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007137 // Link libobj.
7138 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007139 }
John McCall31168b02011-06-15 23:02:42 +00007140
Daniel Dunbarc1964212009-03-26 16:23:12 +00007141 if (LinkingOutput) {
7142 CmdArgs.push_back("-arch_multiple");
7143 CmdArgs.push_back("-final_output");
7144 CmdArgs.push_back(LinkingOutput);
7145 }
7146
Daniel Dunbarc1964212009-03-26 16:23:12 +00007147 if (Args.hasArg(options::OPT_fnested_functions))
7148 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007149
Justin Bognerc7701242015-05-12 05:44:36 +00007150 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7151
Douglas Katzman78b37b02015-11-17 20:28:07 +00007152 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007153 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007154 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007155
Daniel Dunbarc1964212009-03-26 16:23:12 +00007156 // link_ssp spec is empty.
7157
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007158 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007159 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007160 }
7161
Douglas Katzman78b37b02015-11-17 20:28:07 +00007162 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007163 // endfile_spec is empty.
7164 }
7165
7166 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7167 Args.AddAllArgs(CmdArgs, options::OPT_F);
7168
Steven Wu3ffb61b2015-02-06 18:08:29 +00007169 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007170 for (const Arg *A : Args.filtered(options::OPT_iframework))
7171 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007172
Douglas Katzman78b37b02015-11-17 20:28:07 +00007173 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007174 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7175 if (A->getValue() == StringRef("Accelerate")) {
7176 CmdArgs.push_back("-framework");
7177 CmdArgs.push_back("Accelerate");
7178 }
7179 }
7180 }
7181
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007182 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007183 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007184 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007185 Cmd->setInputFileList(std::move(InputFileList));
7186 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007187}
7188
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007189void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007190 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007191 const InputInfoList &Inputs,
7192 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007193 const char *LinkingOutput) const {
7194 ArgStringList CmdArgs;
7195
7196 CmdArgs.push_back("-create");
7197 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007198
7199 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007200 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007202 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007203 assert(II.isFilename() && "Unexpected lipo input.");
7204 CmdArgs.push_back(II.getFilename());
7205 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007206
7207 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007208 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007209}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007210
Daniel Dunbar88299622010-06-04 18:28:36 +00007211void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007212 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007213 const InputInfoList &Inputs,
7214 const ArgList &Args,
7215 const char *LinkingOutput) const {
7216 ArgStringList CmdArgs;
7217
Daniel Dunbareb86b042011-05-09 17:23:16 +00007218 CmdArgs.push_back("-o");
7219 CmdArgs.push_back(Output.getFilename());
7220
Daniel Dunbar88299622010-06-04 18:28:36 +00007221 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7222 const InputInfo &Input = Inputs[0];
7223 assert(Input.isFilename() && "Unexpected dsymutil input.");
7224 CmdArgs.push_back(Input.getFilename());
7225
Daniel Dunbar88299622010-06-04 18:28:36 +00007226 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007227 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007228 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007229}
7230
Eric Christopher551ef452011-08-23 17:56:55 +00007231void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007232 const InputInfo &Output,
7233 const InputInfoList &Inputs,
7234 const ArgList &Args,
7235 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007236 ArgStringList CmdArgs;
7237 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007238 CmdArgs.push_back("--debug-info");
7239 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007240 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007241
7242 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7243 const InputInfo &Input = Inputs[0];
7244 assert(Input.isFilename() && "Unexpected verify input");
7245
7246 // Grabbing the output of the earlier dsymutil run.
7247 CmdArgs.push_back(Input.getFilename());
7248
7249 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007250 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007251 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007252}
7253
Douglas Katzman95354292015-06-23 20:42:09 +00007254void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007255 const InputInfo &Output,
7256 const InputInfoList &Inputs,
7257 const ArgList &Args,
7258 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007259 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007260 ArgStringList CmdArgs;
7261
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007262 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007263
7264 CmdArgs.push_back("-o");
7265 CmdArgs.push_back(Output.getFilename());
7266
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007267 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007268 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007269
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007270 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007271 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007272}
7273
Douglas Katzman95354292015-06-23 20:42:09 +00007274void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7275 const InputInfo &Output,
7276 const InputInfoList &Inputs,
7277 const ArgList &Args,
7278 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007279 ArgStringList CmdArgs;
7280
David Chisnall272a0712012-02-29 15:06:12 +00007281 // Demangle C++ names in errors
7282 CmdArgs.push_back("-C");
7283
Douglas Katzman78b37b02015-11-17 20:28:07 +00007284 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007285 CmdArgs.push_back("-e");
7286 CmdArgs.push_back("_start");
7287 }
7288
7289 if (Args.hasArg(options::OPT_static)) {
7290 CmdArgs.push_back("-Bstatic");
7291 CmdArgs.push_back("-dn");
7292 } else {
7293 CmdArgs.push_back("-Bdynamic");
7294 if (Args.hasArg(options::OPT_shared)) {
7295 CmdArgs.push_back("-shared");
7296 } else {
7297 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007298 CmdArgs.push_back(
7299 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007300 }
7301 }
7302
7303 if (Output.isFilename()) {
7304 CmdArgs.push_back("-o");
7305 CmdArgs.push_back(Output.getFilename());
7306 } else {
7307 assert(Output.isNothing() && "Invalid output.");
7308 }
7309
Douglas Katzman78b37b02015-11-17 20:28:07 +00007310 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007311 if (!Args.hasArg(options::OPT_shared))
7312 CmdArgs.push_back(
7313 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7314
7315 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7316 CmdArgs.push_back(
7317 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7318 CmdArgs.push_back(
7319 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007320 }
7321
Douglas Katzman6059ef92015-11-17 17:41:23 +00007322 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007323
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007324 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7325 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007326
7327 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7328
Douglas Katzman78b37b02015-11-17 20:28:07 +00007329 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007330 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007331 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007332 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007333 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007334 if (!Args.hasArg(options::OPT_shared)) {
7335 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007336 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007337 }
David Chisnallf571cde2012-02-15 13:39:01 +00007338 }
7339
Douglas Katzman78b37b02015-11-17 20:28:07 +00007340 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007341 CmdArgs.push_back(
7342 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007343 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007344 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007345
Xinliang David Li69306c02015-10-22 06:15:31 +00007346 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007347
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007348 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007349 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007350}
7351
Douglas Katzman95354292015-06-23 20:42:09 +00007352void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7353 const InputInfo &Output,
7354 const InputInfoList &Inputs,
7355 const ArgList &Args,
7356 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007357 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007358 ArgStringList CmdArgs;
7359
Rafael Espindolacc126272014-02-28 01:55:21 +00007360 switch (getToolChain().getArch()) {
7361 case llvm::Triple::x86:
7362 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7363 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007364 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007365 break;
7366
7367 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007368 CmdArgs.push_back("-mppc");
7369 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007370 break;
7371
7372 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007373 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007374 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007375 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7376 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7377 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007378 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007379 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007380
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007381 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007382 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007383 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7384 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7385 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007386 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007387 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007388
7389 case llvm::Triple::mips64:
7390 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007391 StringRef CPUName;
7392 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007393 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007394
7395 CmdArgs.push_back("-mabi");
7396 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7397
7398 if (getToolChain().getArch() == llvm::Triple::mips64)
7399 CmdArgs.push_back("-EB");
7400 else
7401 CmdArgs.push_back("-EL");
7402
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007403 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007404 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007405 }
7406
Rafael Espindolacc126272014-02-28 01:55:21 +00007407 default:
7408 break;
7409 }
7410
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007411 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007412
7413 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007414 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007415
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007416 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007417 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007418
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007419 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007420 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007421}
7422
Douglas Katzman95354292015-06-23 20:42:09 +00007423void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7424 const InputInfo &Output,
7425 const InputInfoList &Inputs,
7426 const ArgList &Args,
7427 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007428 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007429 ArgStringList CmdArgs;
7430
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007431 // Silence warning for "clang -g foo.o -o foo"
7432 Args.ClaimAllArgs(options::OPT_g_Group);
7433 // and "clang -emit-llvm foo.o -o foo"
7434 Args.ClaimAllArgs(options::OPT_emit_llvm);
7435 // and for "clang -w foo.o -o foo". Other warning options are already
7436 // handled somewhere else.
7437 Args.ClaimAllArgs(options::OPT_w);
7438
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007439 if (getToolChain().getArch() == llvm::Triple::mips64)
7440 CmdArgs.push_back("-EB");
7441 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7442 CmdArgs.push_back("-EL");
7443
Douglas Katzman78b37b02015-11-17 20:28:07 +00007444 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007445 CmdArgs.push_back("-e");
7446 CmdArgs.push_back("__start");
7447 }
7448
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007449 if (Args.hasArg(options::OPT_static)) {
7450 CmdArgs.push_back("-Bstatic");
7451 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007452 if (Args.hasArg(options::OPT_rdynamic))
7453 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007454 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007455 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007456 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007457 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007458 } else {
7459 CmdArgs.push_back("-dynamic-linker");
7460 CmdArgs.push_back("/usr/libexec/ld.so");
7461 }
7462 }
7463
Rafael Espindola044f7832013-06-05 04:28:55 +00007464 if (Args.hasArg(options::OPT_nopie))
7465 CmdArgs.push_back("-nopie");
7466
Daniel Dunbarb440f562010-08-02 02:38:21 +00007467 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007468 CmdArgs.push_back("-o");
7469 CmdArgs.push_back(Output.getFilename());
7470 } else {
7471 assert(Output.isNothing() && "Invalid output.");
7472 }
7473
Douglas Katzman78b37b02015-11-17 20:28:07 +00007474 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007475 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007476 if (Args.hasArg(options::OPT_pg))
7477 CmdArgs.push_back(
7478 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007479 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007480 CmdArgs.push_back(
7481 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7482 CmdArgs.push_back(
7483 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007484 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007485 CmdArgs.push_back(
7486 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007487 }
7488 }
7489
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007490 std::string Triple = getToolChain().getTripleString();
7491 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007492 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007493 CmdArgs.push_back(
7494 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007495
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007496 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7497 options::OPT_e, options::OPT_s, options::OPT_t,
7498 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007499
Daniel Dunbar54423b22010-09-17 00:24:54 +00007500 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007501
Douglas Katzman78b37b02015-11-17 20:28:07 +00007502 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007503 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007504 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007505 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007506 CmdArgs.push_back("-lm_p");
7507 else
7508 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007509 }
7510
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007511 // FIXME: For some reason GCC passes -lgcc before adding
7512 // the default system libraries. Just mimic this for now.
7513 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007514
Eric Christopher17674ec2012-09-13 06:32:34 +00007515 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007516 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7517 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007518 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007519 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007520 }
7521
Chandler Carruth45661652011-12-17 22:32:42 +00007522 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007523 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007524 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007525 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007526 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007527 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007528
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007529 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007530 }
7531
Douglas Katzman78b37b02015-11-17 20:28:07 +00007532 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007533 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007534 CmdArgs.push_back(
7535 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007536 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007537 CmdArgs.push_back(
7538 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007539 }
7540
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007541 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007542 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007543}
Ed Schoutene33194b2009-04-02 19:13:12 +00007544
Douglas Katzman95354292015-06-23 20:42:09 +00007545void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7546 const InputInfo &Output,
7547 const InputInfoList &Inputs,
7548 const ArgList &Args,
7549 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007550 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007551 ArgStringList CmdArgs;
7552
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007553 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007554
7555 CmdArgs.push_back("-o");
7556 CmdArgs.push_back(Output.getFilename());
7557
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007558 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007559 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007560
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007561 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007562 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007563}
7564
Douglas Katzman95354292015-06-23 20:42:09 +00007565void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7566 const InputInfo &Output,
7567 const InputInfoList &Inputs,
7568 const ArgList &Args,
7569 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007570 const Driver &D = getToolChain().getDriver();
7571 ArgStringList CmdArgs;
7572
Douglas Katzman78b37b02015-11-17 20:28:07 +00007573 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007574 CmdArgs.push_back("-e");
7575 CmdArgs.push_back("__start");
7576 }
7577
7578 if (Args.hasArg(options::OPT_static)) {
7579 CmdArgs.push_back("-Bstatic");
7580 } else {
7581 if (Args.hasArg(options::OPT_rdynamic))
7582 CmdArgs.push_back("-export-dynamic");
7583 CmdArgs.push_back("--eh-frame-hdr");
7584 CmdArgs.push_back("-Bdynamic");
7585 if (Args.hasArg(options::OPT_shared)) {
7586 CmdArgs.push_back("-shared");
7587 } else {
7588 CmdArgs.push_back("-dynamic-linker");
7589 CmdArgs.push_back("/usr/libexec/ld.so");
7590 }
7591 }
7592
7593 if (Output.isFilename()) {
7594 CmdArgs.push_back("-o");
7595 CmdArgs.push_back(Output.getFilename());
7596 } else {
7597 assert(Output.isNothing() && "Invalid output.");
7598 }
7599
Douglas Katzman78b37b02015-11-17 20:28:07 +00007600 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007601 if (!Args.hasArg(options::OPT_shared)) {
7602 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007603 CmdArgs.push_back(
7604 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007605 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007606 CmdArgs.push_back(
7607 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7608 CmdArgs.push_back(
7609 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007610 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007611 CmdArgs.push_back(
7612 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007613 }
7614 }
7615
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007616 Args.AddAllArgs(CmdArgs,
7617 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007618
7619 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7620
Douglas Katzman78b37b02015-11-17 20:28:07 +00007621 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007622 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007623 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7624 if (Args.hasArg(options::OPT_pg))
7625 CmdArgs.push_back("-lm_p");
7626 else
7627 CmdArgs.push_back("-lm");
7628 }
7629
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007630 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007631 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007632 CmdArgs.push_back("-lpthread_p");
7633 else
7634 CmdArgs.push_back("-lpthread");
7635 }
7636
Eli Friedman9fa28852012-08-08 23:57:20 +00007637 if (!Args.hasArg(options::OPT_shared)) {
7638 if (Args.hasArg(options::OPT_pg))
7639 CmdArgs.push_back("-lc_p");
7640 else
7641 CmdArgs.push_back("-lc");
7642 }
7643
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007644 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007645 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007646 case llvm::Triple::arm:
7647 MyArch = "arm";
7648 break;
7649 case llvm::Triple::x86:
7650 MyArch = "i386";
7651 break;
7652 case llvm::Triple::x86_64:
7653 MyArch = "amd64";
7654 break;
7655 default:
7656 llvm_unreachable("Unsupported architecture");
7657 }
7658 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007659 }
7660
Douglas Katzman78b37b02015-11-17 20:28:07 +00007661 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007662 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007663 CmdArgs.push_back(
7664 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007665 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007666 CmdArgs.push_back(
7667 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007668 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007669
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007670 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007671 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007672}
7673
Douglas Katzman95354292015-06-23 20:42:09 +00007674void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7675 const InputInfo &Output,
7676 const InputInfoList &Inputs,
7677 const ArgList &Args,
7678 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007679 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007680 ArgStringList CmdArgs;
7681
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007682 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7683 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007684 switch (getToolChain().getArch()) {
7685 default:
7686 break;
7687 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007688 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007689 break;
7690 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007691 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007692 break;
7693 case llvm::Triple::mips:
7694 case llvm::Triple::mipsel:
7695 case llvm::Triple::mips64:
7696 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007697 StringRef CPUName;
7698 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007699 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007700
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007701 CmdArgs.push_back("-march");
7702 CmdArgs.push_back(CPUName.data());
7703
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007704 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007705 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007706
7707 if (getToolChain().getArch() == llvm::Triple::mips ||
7708 getToolChain().getArch() == llvm::Triple::mips64)
7709 CmdArgs.push_back("-EB");
7710 else
7711 CmdArgs.push_back("-EL");
7712
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007713 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007714 break;
7715 }
7716 case llvm::Triple::arm:
7717 case llvm::Triple::armeb:
7718 case llvm::Triple::thumb:
7719 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007720 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007721
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007722 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007723 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007724 else
Renato Golinf4421f72014-02-19 10:44:07 +00007725 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007726
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007727 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007728 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007729 case llvm::Triple::GNUEABI:
7730 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007731 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007732 break;
7733
7734 default:
7735 CmdArgs.push_back("-matpcs");
7736 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007737 break;
7738 }
7739 case llvm::Triple::sparc:
7740 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007741 case llvm::Triple::sparcv9: {
7742 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7743 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007744 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007745 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007746 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007747 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007748
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007749 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007750
7751 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007752 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007753
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007754 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007755 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007756
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007757 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007758 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007759}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007760
Douglas Katzman95354292015-06-23 20:42:09 +00007761void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7762 const InputInfo &Output,
7763 const InputInfoList &Inputs,
7764 const ArgList &Args,
7765 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007766 const toolchains::FreeBSD &ToolChain =
7767 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007768 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007769 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007770 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007771 !Args.hasArg(options::OPT_shared) &&
7772 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007773 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007774
7775 // Silence warning for "clang -g foo.o -o foo"
7776 Args.ClaimAllArgs(options::OPT_g_Group);
7777 // and "clang -emit-llvm foo.o -o foo"
7778 Args.ClaimAllArgs(options::OPT_emit_llvm);
7779 // and for "clang -w foo.o -o foo". Other warning options are already
7780 // handled somewhere else.
7781 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007782
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007783 if (!D.SysRoot.empty())
7784 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7785
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007786 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007787 CmdArgs.push_back("-pie");
7788
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007789 if (Args.hasArg(options::OPT_static)) {
7790 CmdArgs.push_back("-Bstatic");
7791 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007792 if (Args.hasArg(options::OPT_rdynamic))
7793 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007794 CmdArgs.push_back("--eh-frame-hdr");
7795 if (Args.hasArg(options::OPT_shared)) {
7796 CmdArgs.push_back("-Bshareable");
7797 } else {
7798 CmdArgs.push_back("-dynamic-linker");
7799 CmdArgs.push_back("/libexec/ld-elf.so.1");
7800 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007801 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007802 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7803 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7804 CmdArgs.push_back("--hash-style=both");
7805 }
7806 }
7807 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007808 }
7809
7810 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7811 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007812 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007813 CmdArgs.push_back("-m");
7814 CmdArgs.push_back("elf_i386_fbsd");
7815 }
7816
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007817 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007818 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007819 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007820 }
7821
Daniel Dunbarb440f562010-08-02 02:38:21 +00007822 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007823 CmdArgs.push_back("-o");
7824 CmdArgs.push_back(Output.getFilename());
7825 } else {
7826 assert(Output.isNothing() && "Invalid output.");
7827 }
7828
Douglas Katzman78b37b02015-11-17 20:28:07 +00007829 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007830 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007831 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007832 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007833 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007834 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007835 crt1 = "Scrt1.o";
7836 else
7837 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007838 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007839 if (crt1)
7840 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7841
7842 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7843
Craig Topper92fc2df2014-05-17 16:56:41 +00007844 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007845 if (Args.hasArg(options::OPT_static))
7846 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007847 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007848 crtbegin = "crtbeginS.o";
7849 else
7850 crtbegin = "crtbegin.o";
7851
7852 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007853 }
7854
7855 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007856 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007857 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7858 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007859 Args.AddAllArgs(CmdArgs, options::OPT_s);
7860 Args.AddAllArgs(CmdArgs, options::OPT_t);
7861 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7862 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007863
Teresa Johnson945bc502015-10-15 20:35:53 +00007864 if (D.isUsingLTO())
7865 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007866
Alexey Samsonov52550342014-09-15 19:58:40 +00007867 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007868 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007869
Douglas Katzman78b37b02015-11-17 20:28:07 +00007870 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007871 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007872 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007873 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007874 if (Args.hasArg(options::OPT_pg))
7875 CmdArgs.push_back("-lm_p");
7876 else
7877 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007878 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007879 if (NeedsSanitizerDeps)
7880 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007881 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7882 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007883 if (Args.hasArg(options::OPT_pg))
7884 CmdArgs.push_back("-lgcc_p");
7885 else
7886 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007887 if (Args.hasArg(options::OPT_static)) {
7888 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007889 } else if (Args.hasArg(options::OPT_pg)) {
7890 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007891 } else {
7892 CmdArgs.push_back("--as-needed");
7893 CmdArgs.push_back("-lgcc_s");
7894 CmdArgs.push_back("--no-as-needed");
7895 }
7896
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007897 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007898 if (Args.hasArg(options::OPT_pg))
7899 CmdArgs.push_back("-lpthread_p");
7900 else
7901 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007902 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007903
Roman Divacky66f22762011-02-10 16:59:40 +00007904 if (Args.hasArg(options::OPT_pg)) {
7905 if (Args.hasArg(options::OPT_shared))
7906 CmdArgs.push_back("-lc");
7907 else
7908 CmdArgs.push_back("-lc_p");
7909 CmdArgs.push_back("-lgcc_p");
7910 } else {
7911 CmdArgs.push_back("-lc");
7912 CmdArgs.push_back("-lgcc");
7913 }
7914
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007915 if (Args.hasArg(options::OPT_static)) {
7916 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007917 } else if (Args.hasArg(options::OPT_pg)) {
7918 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007919 } else {
7920 CmdArgs.push_back("--as-needed");
7921 CmdArgs.push_back("-lgcc_s");
7922 CmdArgs.push_back("--no-as-needed");
7923 }
7924 }
7925
Douglas Katzman78b37b02015-11-17 20:28:07 +00007926 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007927 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007928 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007929 else
7930 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007931 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007932 }
7933
Xinliang David Li69306c02015-10-22 06:15:31 +00007934 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007935
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007936 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007937 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007938}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007939
Douglas Katzman95354292015-06-23 20:42:09 +00007940void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007941 const InputInfo &Output,
7942 const InputInfoList &Inputs,
7943 const ArgList &Args,
7944 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007945 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007946 ArgStringList CmdArgs;
7947
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007948 // GNU as needs different flags for creating the correct output format
7949 // on architectures with different ABIs or optional feature sets.
7950 switch (getToolChain().getArch()) {
7951 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007952 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007953 break;
7954 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007955 case llvm::Triple::armeb:
7956 case llvm::Triple::thumb:
7957 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007958 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007959 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7960 std::string Arch =
7961 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007962 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007963 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007964 }
7965
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007966 case llvm::Triple::mips:
7967 case llvm::Triple::mipsel:
7968 case llvm::Triple::mips64:
7969 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007970 StringRef CPUName;
7971 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007972 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007973
7974 CmdArgs.push_back("-march");
7975 CmdArgs.push_back(CPUName.data());
7976
7977 CmdArgs.push_back("-mabi");
7978 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7979
7980 if (getToolChain().getArch() == llvm::Triple::mips ||
7981 getToolChain().getArch() == llvm::Triple::mips64)
7982 CmdArgs.push_back("-EB");
7983 else
7984 CmdArgs.push_back("-EL");
7985
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007986 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007987 break;
7988 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007989
7990 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007991 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007992 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007993 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7994 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007995 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007996 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007997 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007998
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007999 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008000 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008001 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8002 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008003 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008004 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008005 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008006
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008007 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008008 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008009 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008010
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008011 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008012
8013 CmdArgs.push_back("-o");
8014 CmdArgs.push_back(Output.getFilename());
8015
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008016 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008017 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008018
David Chisnallddbd68f2011-09-27 22:03:18 +00008019 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008020 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008021}
8022
Douglas Katzman95354292015-06-23 20:42:09 +00008023void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8024 const InputInfo &Output,
8025 const InputInfoList &Inputs,
8026 const ArgList &Args,
8027 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008028 const Driver &D = getToolChain().getDriver();
8029 ArgStringList CmdArgs;
8030
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008031 if (!D.SysRoot.empty())
8032 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8033
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008034 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008035 if (Args.hasArg(options::OPT_static)) {
8036 CmdArgs.push_back("-Bstatic");
8037 } else {
8038 if (Args.hasArg(options::OPT_rdynamic))
8039 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008040 if (Args.hasArg(options::OPT_shared)) {
8041 CmdArgs.push_back("-Bshareable");
8042 } else {
8043 CmdArgs.push_back("-dynamic-linker");
8044 CmdArgs.push_back("/libexec/ld.elf_so");
8045 }
8046 }
8047
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008048 // Many NetBSD architectures support more than one ABI.
8049 // Determine the correct emulation for ld.
8050 switch (getToolChain().getArch()) {
8051 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008052 CmdArgs.push_back("-m");
8053 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008054 break;
8055 case llvm::Triple::arm:
8056 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008057 CmdArgs.push_back("-m");
8058 switch (getToolChain().getTriple().getEnvironment()) {
8059 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008060 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008061 CmdArgs.push_back("armelf_nbsd_eabi");
8062 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008063 case llvm::Triple::EABIHF:
8064 case llvm::Triple::GNUEABIHF:
8065 CmdArgs.push_back("armelf_nbsd_eabihf");
8066 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008067 default:
8068 CmdArgs.push_back("armelf_nbsd");
8069 break;
8070 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008071 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008072 case llvm::Triple::armeb:
8073 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008074 arm::appendEBLinkFlags(
8075 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008076 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008077 CmdArgs.push_back("-m");
8078 switch (getToolChain().getTriple().getEnvironment()) {
8079 case llvm::Triple::EABI:
8080 case llvm::Triple::GNUEABI:
8081 CmdArgs.push_back("armelfb_nbsd_eabi");
8082 break;
8083 case llvm::Triple::EABIHF:
8084 case llvm::Triple::GNUEABIHF:
8085 CmdArgs.push_back("armelfb_nbsd_eabihf");
8086 break;
8087 default:
8088 CmdArgs.push_back("armelfb_nbsd");
8089 break;
8090 }
8091 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008092 case llvm::Triple::mips64:
8093 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008094 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008095 CmdArgs.push_back("-m");
8096 if (getToolChain().getArch() == llvm::Triple::mips64)
8097 CmdArgs.push_back("elf32btsmip");
8098 else
8099 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008100 } else if (mips::hasMipsAbiArg(Args, "64")) {
8101 CmdArgs.push_back("-m");
8102 if (getToolChain().getArch() == llvm::Triple::mips64)
8103 CmdArgs.push_back("elf64btsmip");
8104 else
8105 CmdArgs.push_back("elf64ltsmip");
8106 }
8107 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008108 case llvm::Triple::ppc:
8109 CmdArgs.push_back("-m");
8110 CmdArgs.push_back("elf32ppc_nbsd");
8111 break;
8112
8113 case llvm::Triple::ppc64:
8114 case llvm::Triple::ppc64le:
8115 CmdArgs.push_back("-m");
8116 CmdArgs.push_back("elf64ppc");
8117 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008118
8119 case llvm::Triple::sparc:
8120 CmdArgs.push_back("-m");
8121 CmdArgs.push_back("elf32_sparc");
8122 break;
8123
8124 case llvm::Triple::sparcv9:
8125 CmdArgs.push_back("-m");
8126 CmdArgs.push_back("elf64_sparc");
8127 break;
8128
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008129 default:
8130 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008131 }
8132
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008133 if (Output.isFilename()) {
8134 CmdArgs.push_back("-o");
8135 CmdArgs.push_back(Output.getFilename());
8136 } else {
8137 assert(Output.isNothing() && "Invalid output.");
8138 }
8139
Douglas Katzman78b37b02015-11-17 20:28:07 +00008140 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008141 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008142 CmdArgs.push_back(
8143 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8144 CmdArgs.push_back(
8145 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8146 CmdArgs.push_back(
8147 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008148 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008149 CmdArgs.push_back(
8150 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8151 CmdArgs.push_back(
8152 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008153 }
8154 }
8155
8156 Args.AddAllArgs(CmdArgs, options::OPT_L);
8157 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8158 Args.AddAllArgs(CmdArgs, options::OPT_e);
8159 Args.AddAllArgs(CmdArgs, options::OPT_s);
8160 Args.AddAllArgs(CmdArgs, options::OPT_t);
8161 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8162 Args.AddAllArgs(CmdArgs, options::OPT_r);
8163
8164 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8165
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008166 unsigned Major, Minor, Micro;
8167 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8168 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008169 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008170 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008171 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008172 case llvm::Triple::arm:
8173 case llvm::Triple::armeb:
8174 case llvm::Triple::thumb:
8175 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008176 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008177 case llvm::Triple::ppc64:
8178 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008179 case llvm::Triple::x86:
8180 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008181 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008182 break;
8183 default:
8184 break;
8185 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008186 }
8187
Douglas Katzman78b37b02015-11-17 20:28:07 +00008188 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008189 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008190 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008191 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8192 CmdArgs.push_back("-lm");
8193 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008194 if (Args.hasArg(options::OPT_pthread))
8195 CmdArgs.push_back("-lpthread");
8196 CmdArgs.push_back("-lc");
8197
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008198 if (useLibgcc) {
8199 if (Args.hasArg(options::OPT_static)) {
8200 // libgcc_eh depends on libc, so resolve as much as possible,
8201 // pull in any new requirements from libc and then get the rest
8202 // of libgcc.
8203 CmdArgs.push_back("-lgcc_eh");
8204 CmdArgs.push_back("-lc");
8205 CmdArgs.push_back("-lgcc");
8206 } else {
8207 CmdArgs.push_back("-lgcc");
8208 CmdArgs.push_back("--as-needed");
8209 CmdArgs.push_back("-lgcc_s");
8210 CmdArgs.push_back("--no-as-needed");
8211 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008212 }
8213 }
8214
Douglas Katzman78b37b02015-11-17 20:28:07 +00008215 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008216 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008217 CmdArgs.push_back(
8218 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008219 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008220 CmdArgs.push_back(
8221 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8222 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008223 }
8224
Xinliang David Li69306c02015-10-22 06:15:31 +00008225 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008226
Logan Chieneb9162f2014-06-26 14:23:45 +00008227 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008228 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008229}
8230
Douglas Katzman95354292015-06-23 20:42:09 +00008231void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8232 const InputInfo &Output,
8233 const InputInfoList &Inputs,
8234 const ArgList &Args,
8235 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008236 claimNoWarnArgs(Args);
8237
James Y Knight2db38f32015-08-15 03:45:25 +00008238 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8239 llvm::Triple Triple = llvm::Triple(TripleStr);
8240
Rafael Espindola92b00932010-08-10 00:25:48 +00008241 ArgStringList CmdArgs;
8242
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008243 llvm::Reloc::Model RelocationModel;
8244 unsigned PICLevel;
8245 bool IsPIE;
8246 std::tie(RelocationModel, PICLevel, IsPIE) =
8247 ParsePICArgs(getToolChain(), Triple, Args);
8248
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008249 switch (getToolChain().getArch()) {
8250 default:
8251 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008252 // Add --32/--64 to make sure we get the format we want.
8253 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008254 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008255 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008256 break;
8257 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008258 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8259 CmdArgs.push_back("--x32");
8260 else
8261 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008262 break;
8263 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008264 CmdArgs.push_back("-a32");
8265 CmdArgs.push_back("-mppc");
8266 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008267 break;
8268 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008269 CmdArgs.push_back("-a64");
8270 CmdArgs.push_back("-mppc64");
8271 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008272 break;
8273 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008274 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008275 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008276 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008277 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008278 break;
8279 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008280 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008281 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008282 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8283 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8284 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008285 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008286 }
8287 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008288 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008289 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8290 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8291 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008292 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008293 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008294 case llvm::Triple::arm:
8295 case llvm::Triple::armeb:
8296 case llvm::Triple::thumb:
8297 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008298 const llvm::Triple &Triple2 = getToolChain().getTriple();
8299 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008300 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008301 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008302 break;
8303 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008304 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008305 break;
8306 default:
8307 break;
8308 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008309
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008310 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008311 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8312 case arm::FloatABI::Soft:
8313 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8314 break;
8315 case arm::FloatABI::SoftFP:
8316 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8317 break;
8318 case arm::FloatABI::Hard:
8319 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8320 break;
8321 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008322
8323 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008324
8325 // FIXME: remove krait check when GNU tools support krait cpu
8326 // for now replace it with -march=armv7-a to avoid a lower
8327 // march from being picked in the absence of a cpu flag.
8328 Arg *A;
8329 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008330 StringRef(A->getValue()).lower() == "krait")
8331 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008332 else
8333 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008334 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008335 break;
8336 }
8337 case llvm::Triple::mips:
8338 case llvm::Triple::mipsel:
8339 case llvm::Triple::mips64:
8340 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008341 StringRef CPUName;
8342 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008343 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008344 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008345
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008346 CmdArgs.push_back("-march");
8347 CmdArgs.push_back(CPUName.data());
8348
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008349 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008350 CmdArgs.push_back(ABIName.data());
8351
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008352 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8353 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008354 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008355 CmdArgs.push_back("-mno-shared");
8356
Daniel Sanders379d44b2014-07-16 11:52:23 +00008357 // LLVM doesn't support -mplt yet and acts as if it is always given.
8358 // However, -mplt has no effect with the N64 ABI.
8359 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008360
8361 if (getToolChain().getArch() == llvm::Triple::mips ||
8362 getToolChain().getArch() == llvm::Triple::mips64)
8363 CmdArgs.push_back("-EB");
8364 else
8365 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008366
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008367 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8368 if (StringRef(A->getValue()) == "2008")
8369 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8370 }
8371
Daniel Sanders379d44b2014-07-16 11:52:23 +00008372 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8373 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8374 options::OPT_mfp64)) {
8375 A->claim();
8376 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008377 } else if (mips::shouldUseFPXX(
8378 Args, getToolChain().getTriple(), CPUName, ABIName,
8379 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008380 CmdArgs.push_back("-mfpxx");
8381
8382 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8383 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008384 if (Arg *A =
8385 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008386 if (A->getOption().matches(options::OPT_mips16)) {
8387 A->claim();
8388 A->render(Args, CmdArgs);
8389 } else {
8390 A->claim();
8391 CmdArgs.push_back("-no-mips16");
8392 }
8393 }
8394
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008395 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8396 options::OPT_mno_micromips);
8397 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8398 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8399
Simon Atanasyanbd986632013-11-26 11:58:04 +00008400 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8401 // Do not use AddLastArg because not all versions of MIPS assembler
8402 // support -mmsa / -mno-msa options.
8403 if (A->getOption().matches(options::OPT_mmsa))
8404 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8405 }
8406
Daniel Sanders379d44b2014-07-16 11:52:23 +00008407 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8408 options::OPT_msoft_float);
8409
Toma Tabacub36d6102015-06-11 12:13:18 +00008410 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8411 options::OPT_msingle_float);
8412
Daniel Sanders379d44b2014-07-16 11:52:23 +00008413 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8414 options::OPT_mno_odd_spreg);
8415
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008416 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008417 break;
8418 }
8419 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008420 // Always pass an -march option, since our default of z10 is later
8421 // than the GNU assembler's default.
8422 StringRef CPUName = getSystemZTargetCPU(Args);
8423 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008424 break;
8425 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008426 }
8427
Renato Golina74bbc72015-07-22 15:32:36 +00008428 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008429 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008430
8431 CmdArgs.push_back("-o");
8432 CmdArgs.push_back(Output.getFilename());
8433
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008434 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008435 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008436
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008437 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008438 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008439
8440 // Handle the debug info splitting at object creation time if we're
8441 // creating an object.
8442 // TODO: Currently only works on linux with newer objcopy.
8443 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008444 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008445 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008446 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008447}
8448
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008449static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008450 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008451 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008452 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008453 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8454 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008455 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008456 CmdArgs.push_back("-lgcc");
8457
Logan Chien3d3373c2012-11-19 12:04:11 +00008458 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008459 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008460 CmdArgs.push_back("-lgcc");
8461 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008462 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008463 CmdArgs.push_back("--as-needed");
8464 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008465 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008466 CmdArgs.push_back("--no-as-needed");
8467 }
8468
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008469 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008470 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008471 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008472 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008473
8474 // According to Android ABI, we have to link with libdl if we are
8475 // linking with non-static libgcc.
8476 //
8477 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8478 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8479 if (isAndroid && !StaticLibgcc)
8480 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008481}
8482
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008483static std::string getLinuxDynamicLinker(const ArgList &Args,
8484 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008485 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8486
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008487 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008488 if (ToolChain.getTriple().isArch64Bit())
8489 return "/system/bin/linker64";
8490 else
8491 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008492 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8493 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008494 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008495 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008496 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008497 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008498 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008499 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008500 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008501 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008502 return "/lib/ld-linux-armhf.so.3";
8503 else
8504 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008505 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8506 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008507 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008508 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008509 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008510 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008511 return "/lib/ld-linux.so.3";
8512 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8513 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008514 std::string LibDir =
8515 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008516 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008517 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008518 if (mips::isUCLibc(Args))
8519 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008520 else if (!ToolChain.getTriple().hasEnvironment()) {
8521 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8522 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8523 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8524 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008525 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008526
8527 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008528 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008529 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008530 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008531 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8532 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008533 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008534 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008535 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8536 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008537 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008538 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008539 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008540 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008541 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008542 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008543 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8544 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008545 else
8546 return "/lib64/ld-linux-x86-64.so.2";
8547}
8548
Renato Golinc4b49242014-02-13 10:01:16 +00008549static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008550 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008551 // Make use of compiler-rt if --rtlib option is used
8552 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8553
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008554 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008555 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008556 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008557 default:
8558 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008559 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008560 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008561 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008562 break;
8563 }
Renato Golinc4b49242014-02-13 10:01:16 +00008564 break;
8565 case ToolChain::RLT_Libgcc:
8566 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8567 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008568 }
8569}
8570
Rafael Espindola1e085772014-08-15 17:14:35 +00008571static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8572 switch (T.getArch()) {
8573 case llvm::Triple::x86:
8574 return "elf_i386";
8575 case llvm::Triple::aarch64:
8576 return "aarch64linux";
8577 case llvm::Triple::aarch64_be:
8578 return "aarch64_be_linux";
8579 case llvm::Triple::arm:
8580 case llvm::Triple::thumb:
8581 return "armelf_linux_eabi";
8582 case llvm::Triple::armeb:
8583 case llvm::Triple::thumbeb:
8584 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8585 case llvm::Triple::ppc:
8586 return "elf32ppclinux";
8587 case llvm::Triple::ppc64:
8588 return "elf64ppc";
8589 case llvm::Triple::ppc64le:
8590 return "elf64lppc";
8591 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008592 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008593 return "elf32_sparc";
8594 case llvm::Triple::sparcv9:
8595 return "elf64_sparc";
8596 case llvm::Triple::mips:
8597 return "elf32btsmip";
8598 case llvm::Triple::mipsel:
8599 return "elf32ltsmip";
8600 case llvm::Triple::mips64:
8601 if (mips::hasMipsAbiArg(Args, "n32"))
8602 return "elf32btsmipn32";
8603 return "elf64btsmip";
8604 case llvm::Triple::mips64el:
8605 if (mips::hasMipsAbiArg(Args, "n32"))
8606 return "elf32ltsmipn32";
8607 return "elf64ltsmip";
8608 case llvm::Triple::systemz:
8609 return "elf64_s390";
8610 case llvm::Triple::x86_64:
8611 if (T.getEnvironment() == llvm::Triple::GNUX32)
8612 return "elf32_x86_64";
8613 return "elf_x86_64";
8614 default:
8615 llvm_unreachable("Unexpected arch");
8616 }
8617}
8618
Douglas Katzman95354292015-06-23 20:42:09 +00008619void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8620 const InputInfo &Output,
8621 const InputInfoList &Inputs,
8622 const ArgList &Args,
8623 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008624 const toolchains::Linux &ToolChain =
8625 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008626 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008627
8628 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8629 llvm::Triple Triple = llvm::Triple(TripleStr);
8630
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008631 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008632 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008633 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008634 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8635 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008636 const bool HasCRTBeginEndFiles =
8637 ToolChain.getTriple().hasEnvironment() ||
8638 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008639
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008640 ArgStringList CmdArgs;
8641
Rafael Espindolad1002f62010-11-15 18:28:16 +00008642 // Silence warning for "clang -g foo.o -o foo"
8643 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008644 // and "clang -emit-llvm foo.o -o foo"
8645 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008646 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008647 // handled somewhere else.
8648 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008649
Peter Collingbourne39719a72015-11-20 20:49:39 +00008650 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8651 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008652 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008653 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008654 CmdArgs.push_back("-target");
8655 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8656 }
8657
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008658 if (!D.SysRoot.empty())
8659 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008660
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008661 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008662 CmdArgs.push_back("-pie");
8663
Rafael Espindola1c76c592010-11-07 22:57:16 +00008664 if (Args.hasArg(options::OPT_rdynamic))
8665 CmdArgs.push_back("-export-dynamic");
8666
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008667 if (Args.hasArg(options::OPT_s))
8668 CmdArgs.push_back("-s");
8669
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008670 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008671 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008672
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008673 for (const auto &Opt : ToolChain.ExtraOpts)
8674 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008675
8676 if (!Args.hasArg(options::OPT_static)) {
8677 CmdArgs.push_back("--eh-frame-hdr");
8678 }
8679
8680 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008681 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008682
8683 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008684 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8685 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008686 CmdArgs.push_back("-Bstatic");
8687 else
8688 CmdArgs.push_back("-static");
8689 } else if (Args.hasArg(options::OPT_shared)) {
8690 CmdArgs.push_back("-shared");
8691 }
8692
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008693 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8694 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008695 (!Args.hasArg(options::OPT_static) &&
8696 !Args.hasArg(options::OPT_shared))) {
8697 CmdArgs.push_back("-dynamic-linker");
8698 CmdArgs.push_back(Args.MakeArgString(
8699 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8700 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008701
8702 CmdArgs.push_back("-o");
8703 CmdArgs.push_back(Output.getFilename());
8704
Douglas Katzman78b37b02015-11-17 20:28:07 +00008705 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008706 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008707 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008708 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008709 if (Args.hasArg(options::OPT_pg))
8710 crt1 = "gcrt1.o";
8711 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008712 crt1 = "Scrt1.o";
8713 else
8714 crt1 = "crt1.o";
8715 }
8716 if (crt1)
8717 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008718
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008719 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8720 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008721
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008722 const char *crtbegin;
8723 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008724 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008725 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008726 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008727 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008728 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008729 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008730 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008731
8732 if (HasCRTBeginEndFiles)
8733 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008734
8735 // Add crtfastmath.o if available and fast math is enabled.
8736 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008737 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008738
8739 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008740 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008741
Douglas Katzman6059ef92015-11-17 17:41:23 +00008742 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008743
Teresa Johnson945bc502015-10-15 20:35:53 +00008744 if (D.isUsingLTO())
8745 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008746
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008747 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8748 CmdArgs.push_back("--no-demangle");
8749
Alexey Samsonov52550342014-09-15 19:58:40 +00008750 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008751 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008752 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008753 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008754
Douglas Katzman78b37b02015-11-17 20:28:07 +00008755 if (D.CCCIsCXX() &&
8756 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008757 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008758 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008759 if (OnlyLibstdcxxStatic)
8760 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008761 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008762 if (OnlyLibstdcxxStatic)
8763 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008764 CmdArgs.push_back("-lm");
8765 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008766 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8767 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008768
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008769 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008770 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8771 if (Args.hasArg(options::OPT_static))
8772 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008773
Alexey Samsonov52550342014-09-15 19:58:40 +00008774 if (NeedsSanitizerDeps)
8775 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8776
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008777 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8778 Args.hasArg(options::OPT_pthreads);
8779
8780 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8781 options::OPT_fno_openmp, false)) {
8782 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8783 // FIXME: Does this really make sense for all GNU toolchains?
8784 WantPthread = true;
8785
8786 // Also link the particular OpenMP runtimes.
8787 switch (getOpenMPRuntime(ToolChain, Args)) {
8788 case OMPRT_OMP:
8789 CmdArgs.push_back("-lomp");
8790 break;
8791 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008792 CmdArgs.push_back("-lgomp");
8793
8794 // FIXME: Exclude this for platforms with libgomp that don't require
8795 // librt. Most modern Linux platforms require it, but some may not.
8796 CmdArgs.push_back("-lrt");
8797 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008798 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008799 CmdArgs.push_back("-liomp5");
8800 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008801 case OMPRT_Unknown:
8802 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008803 break;
8804 }
Chandler Carruth01538002013-01-17 13:19:29 +00008805 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008806
Renato Golinc4b49242014-02-13 10:01:16 +00008807 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008808
Richard Smith31d1de22015-05-20 22:48:44 +00008809 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008810 CmdArgs.push_back("-lpthread");
8811
8812 CmdArgs.push_back("-lc");
8813
8814 if (Args.hasArg(options::OPT_static))
8815 CmdArgs.push_back("--end-group");
8816 else
Renato Golinc4b49242014-02-13 10:01:16 +00008817 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008818 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008819
Rafael Espindola81937ec2010-12-01 01:52:43 +00008820 if (!Args.hasArg(options::OPT_nostartfiles)) {
8821 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008822 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008823 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008824 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008825 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008826 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008827 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008828
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008829 if (HasCRTBeginEndFiles)
8830 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008831 if (!isAndroid)
8832 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008833 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00008834 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008835
Peter Collingbourne39719a72015-11-20 20:49:39 +00008836 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008837}
8838
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008839// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8840// for the various SFI requirements like register masking. The assembly tool
8841// inserts the file containing the macros as an input into all the assembly
8842// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008843void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8844 const InputInfo &Output,
8845 const InputInfoList &Inputs,
8846 const ArgList &Args,
8847 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008848 const toolchains::NaClToolChain &ToolChain =
8849 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008850 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8851 "nacl-arm-macros.s");
8852 InputInfoList NewInputs;
8853 NewInputs.push_back(NaClMacros);
8854 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008855 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8856 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008857}
8858
Douglas Katzman750cfc52015-06-29 18:42:16 +00008859// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008860// we use static by default, do not yet support sanitizers or LTO, and a few
8861// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008862// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008863void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8864 const InputInfo &Output,
8865 const InputInfoList &Inputs,
8866 const ArgList &Args,
8867 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008868
Douglas Katzman54366072015-07-27 16:53:08 +00008869 const toolchains::NaClToolChain &ToolChain =
8870 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008871 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008872 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008873 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008874 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008875
8876 ArgStringList CmdArgs;
8877
8878 // Silence warning for "clang -g foo.o -o foo"
8879 Args.ClaimAllArgs(options::OPT_g_Group);
8880 // and "clang -emit-llvm foo.o -o foo"
8881 Args.ClaimAllArgs(options::OPT_emit_llvm);
8882 // and for "clang -w foo.o -o foo". Other warning options are already
8883 // handled somewhere else.
8884 Args.ClaimAllArgs(options::OPT_w);
8885
8886 if (!D.SysRoot.empty())
8887 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8888
8889 if (Args.hasArg(options::OPT_rdynamic))
8890 CmdArgs.push_back("-export-dynamic");
8891
8892 if (Args.hasArg(options::OPT_s))
8893 CmdArgs.push_back("-s");
8894
Douglas Katzman54366072015-07-27 16:53:08 +00008895 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8896 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008897 CmdArgs.push_back("--build-id");
8898
8899 if (!IsStatic)
8900 CmdArgs.push_back("--eh-frame-hdr");
8901
8902 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008903 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008904 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008905 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008906 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008907 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008908 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008909 else if (Arch == llvm::Triple::mipsel)
8910 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008911 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008912 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8913 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008914
8915 if (IsStatic)
8916 CmdArgs.push_back("-static");
8917 else if (Args.hasArg(options::OPT_shared))
8918 CmdArgs.push_back("-shared");
8919
8920 CmdArgs.push_back("-o");
8921 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00008922 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008923 if (!Args.hasArg(options::OPT_shared))
8924 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8925 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8926
8927 const char *crtbegin;
8928 if (IsStatic)
8929 crtbegin = "crtbeginT.o";
8930 else if (Args.hasArg(options::OPT_shared))
8931 crtbegin = "crtbeginS.o";
8932 else
8933 crtbegin = "crtbegin.o";
8934 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8935 }
8936
8937 Args.AddAllArgs(CmdArgs, options::OPT_L);
8938 Args.AddAllArgs(CmdArgs, options::OPT_u);
8939
Douglas Katzman6059ef92015-11-17 17:41:23 +00008940 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008941
8942 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8943 CmdArgs.push_back("--no-demangle");
8944
8945 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8946
Douglas Katzman78b37b02015-11-17 20:28:07 +00008947 if (D.CCCIsCXX() &&
8948 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008949 bool OnlyLibstdcxxStatic =
8950 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008951 if (OnlyLibstdcxxStatic)
8952 CmdArgs.push_back("-Bstatic");
8953 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8954 if (OnlyLibstdcxxStatic)
8955 CmdArgs.push_back("-Bdynamic");
8956 CmdArgs.push_back("-lm");
8957 }
8958
8959 if (!Args.hasArg(options::OPT_nostdlib)) {
8960 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8961 // Always use groups, since it has no effect on dynamic libraries.
8962 CmdArgs.push_back("--start-group");
8963 CmdArgs.push_back("-lc");
8964 // NaCl's libc++ currently requires libpthread, so just always include it
8965 // in the group for C++.
8966 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008967 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008968 // Gold, used by Mips, handles nested groups differently than ld, and
8969 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8970 // which is not a desired behaviour here.
8971 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8972 if (getToolChain().getArch() == llvm::Triple::mipsel)
8973 CmdArgs.push_back("-lnacl");
8974
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008975 CmdArgs.push_back("-lpthread");
8976 }
8977
8978 CmdArgs.push_back("-lgcc");
8979 CmdArgs.push_back("--as-needed");
8980 if (IsStatic)
8981 CmdArgs.push_back("-lgcc_eh");
8982 else
8983 CmdArgs.push_back("-lgcc_s");
8984 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008985
8986 // Mips needs to create and use pnacl_legacy library that contains
8987 // definitions from bitcode/pnaclmm.c and definitions for
8988 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8989 if (getToolChain().getArch() == llvm::Triple::mipsel)
8990 CmdArgs.push_back("-lpnacl_legacy");
8991
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008992 CmdArgs.push_back("--end-group");
8993 }
8994
8995 if (!Args.hasArg(options::OPT_nostartfiles)) {
8996 const char *crtend;
8997 if (Args.hasArg(options::OPT_shared))
8998 crtend = "crtendS.o";
8999 else
9000 crtend = "crtend.o";
9001
9002 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9003 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9004 }
9005 }
9006
Peter Collingbourne39719a72015-11-20 20:49:39 +00009007 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9008 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009009}
9010
Douglas Katzman95354292015-06-23 20:42:09 +00009011void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9012 const InputInfo &Output,
9013 const InputInfoList &Inputs,
9014 const ArgList &Args,
9015 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009016 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009017 ArgStringList CmdArgs;
9018
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009019 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009020
9021 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009022 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009023
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009024 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009025 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009026
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009027 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009028 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009029}
9030
Douglas Katzman95354292015-06-23 20:42:09 +00009031void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9032 const InputInfo &Output,
9033 const InputInfoList &Inputs,
9034 const ArgList &Args,
9035 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009036 const Driver &D = getToolChain().getDriver();
9037 ArgStringList CmdArgs;
9038
Daniel Dunbarb440f562010-08-02 02:38:21 +00009039 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009040 CmdArgs.push_back("-o");
9041 CmdArgs.push_back(Output.getFilename());
9042 } else {
9043 assert(Output.isNothing() && "Invalid output.");
9044 }
9045
Douglas Katzman78b37b02015-11-17 20:28:07 +00009046 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009047 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9048 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9049 CmdArgs.push_back(
9050 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9051 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009052 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009053
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009054 Args.AddAllArgs(CmdArgs,
9055 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009056
Daniel Dunbar54423b22010-09-17 00:24:54 +00009057 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009058
Xinliang David Li69306c02015-10-22 06:15:31 +00009059 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009060
Douglas Katzman78b37b02015-11-17 20:28:07 +00009061 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009062 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009063 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009064 CmdArgs.push_back("-lm");
9065 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009066 }
9067
Douglas Katzman78b37b02015-11-17 20:28:07 +00009068 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009069 if (Args.hasArg(options::OPT_pthread))
9070 CmdArgs.push_back("-lpthread");
9071 CmdArgs.push_back("-lc");
9072 CmdArgs.push_back("-lCompilerRT-Generic");
9073 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9074 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009075 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009076 }
9077
Logan Chieneb9162f2014-06-26 14:23:45 +00009078 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009079 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009080}
9081
Daniel Dunbarcc912342009-05-02 18:28:39 +00009082/// DragonFly Tools
9083
9084// For now, DragonFly Assemble does just about the same as for
9085// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009086void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9087 const InputInfo &Output,
9088 const InputInfoList &Inputs,
9089 const ArgList &Args,
9090 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009091 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009092 ArgStringList CmdArgs;
9093
9094 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9095 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009096 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009097 CmdArgs.push_back("--32");
9098
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009099 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009100
9101 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009102 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009103
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009104 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009105 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009106
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009107 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009108 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009109}
9110
Douglas Katzman95354292015-06-23 20:42:09 +00009111void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9112 const InputInfo &Output,
9113 const InputInfoList &Inputs,
9114 const ArgList &Args,
9115 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009116 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009117 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00009118 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00009119
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009120 if (!D.SysRoot.empty())
9121 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9122
John McCall65b8da02013-04-11 22:55:55 +00009123 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009124 if (Args.hasArg(options::OPT_static)) {
9125 CmdArgs.push_back("-Bstatic");
9126 } else {
John McCall65b8da02013-04-11 22:55:55 +00009127 if (Args.hasArg(options::OPT_rdynamic))
9128 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009129 if (Args.hasArg(options::OPT_shared))
9130 CmdArgs.push_back("-Bshareable");
9131 else {
9132 CmdArgs.push_back("-dynamic-linker");
9133 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9134 }
John McCall65b8da02013-04-11 22:55:55 +00009135 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009136 }
9137
9138 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9139 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009140 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009141 CmdArgs.push_back("-m");
9142 CmdArgs.push_back("elf_i386");
9143 }
9144
Daniel Dunbarb440f562010-08-02 02:38:21 +00009145 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009146 CmdArgs.push_back("-o");
9147 CmdArgs.push_back(Output.getFilename());
9148 } else {
9149 assert(Output.isNothing() && "Invalid output.");
9150 }
9151
Douglas Katzman78b37b02015-11-17 20:28:07 +00009152 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009153 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009154 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009155 CmdArgs.push_back(
9156 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009157 else {
9158 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009159 CmdArgs.push_back(
9160 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009161 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009162 CmdArgs.push_back(
9163 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009164 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009165 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009166 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009167 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009168 CmdArgs.push_back(
9169 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009170 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009171 CmdArgs.push_back(
9172 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009173 }
9174
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009175 Args.AddAllArgs(CmdArgs,
9176 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009177
Daniel Dunbar54423b22010-09-17 00:24:54 +00009178 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009179
Douglas Katzman78b37b02015-11-17 20:28:07 +00009180 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009181 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9182 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009183 if (UseGCC47)
9184 CmdArgs.push_back("-L/usr/lib/gcc47");
9185 else
9186 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009187
9188 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009189 if (UseGCC47) {
9190 CmdArgs.push_back("-rpath");
9191 CmdArgs.push_back("/usr/lib/gcc47");
9192 } else {
9193 CmdArgs.push_back("-rpath");
9194 CmdArgs.push_back("/usr/lib/gcc44");
9195 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009196 }
9197
Hans Wennborg70850d82013-07-18 20:29:38 +00009198 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009199 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009200 CmdArgs.push_back("-lm");
9201 }
9202
Daniel Dunbarcc912342009-05-02 18:28:39 +00009203 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009204 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009205
9206 if (!Args.hasArg(options::OPT_nolibc)) {
9207 CmdArgs.push_back("-lc");
9208 }
9209
John McCall65b8da02013-04-11 22:55:55 +00009210 if (UseGCC47) {
9211 if (Args.hasArg(options::OPT_static) ||
9212 Args.hasArg(options::OPT_static_libgcc)) {
9213 CmdArgs.push_back("-lgcc");
9214 CmdArgs.push_back("-lgcc_eh");
9215 } else {
9216 if (Args.hasArg(options::OPT_shared_libgcc)) {
9217 CmdArgs.push_back("-lgcc_pic");
9218 if (!Args.hasArg(options::OPT_shared))
9219 CmdArgs.push_back("-lgcc");
9220 } else {
9221 CmdArgs.push_back("-lgcc");
9222 CmdArgs.push_back("--as-needed");
9223 CmdArgs.push_back("-lgcc_pic");
9224 CmdArgs.push_back("--no-as-needed");
9225 }
9226 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009227 } else {
John McCall65b8da02013-04-11 22:55:55 +00009228 if (Args.hasArg(options::OPT_shared)) {
9229 CmdArgs.push_back("-lgcc_pic");
9230 } else {
9231 CmdArgs.push_back("-lgcc");
9232 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009233 }
9234 }
9235
Douglas Katzman78b37b02015-11-17 20:28:07 +00009236 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009237 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009238 CmdArgs.push_back(
9239 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009240 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009241 CmdArgs.push_back(
9242 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9243 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009244 }
9245
Xinliang David Li69306c02015-10-22 06:15:31 +00009246 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009247
Logan Chieneb9162f2014-06-26 14:23:45 +00009248 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009249 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009250}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009251
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009252// Try to find Exe from a Visual Studio distribution. This first tries to find
9253// an installed copy of Visual Studio and, failing that, looks in the PATH,
9254// making sure that whatever executable that's found is not a same-named exe
9255// from clang itself to prevent clang from falling back to itself.
9256static std::string FindVisualStudioExecutable(const ToolChain &TC,
9257 const char *Exe,
9258 const char *ClangProgramPath) {
9259 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9260 std::string visualStudioBinDir;
9261 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9262 visualStudioBinDir)) {
9263 SmallString<128> FilePath(visualStudioBinDir);
9264 llvm::sys::path::append(FilePath, Exe);
9265 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9266 return FilePath.str();
9267 }
9268
9269 return Exe;
9270}
9271
Douglas Katzman95354292015-06-23 20:42:09 +00009272void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9273 const InputInfo &Output,
9274 const InputInfoList &Inputs,
9275 const ArgList &Args,
9276 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009277 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009278 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009279
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009280 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9281 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009282 CmdArgs.push_back(
9283 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009284
Douglas Katzman78b37b02015-11-17 20:28:07 +00009285 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9286 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009287 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009288
Zachary Turner10d75b22014-10-22 20:40:43 +00009289 if (!llvm::sys::Process::GetEnv("LIB")) {
9290 // If the VC environment hasn't been configured (perhaps because the user
9291 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009292 // the environment variable is set however, assume the user knows what
9293 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009294 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009295 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009296 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9297 SmallString<128> LibDir(VisualStudioDir);
9298 llvm::sys::path::append(LibDir, "VC", "lib");
9299 switch (MSVC.getArch()) {
9300 case llvm::Triple::x86:
9301 // x86 just puts the libraries directly in lib
9302 break;
9303 case llvm::Triple::x86_64:
9304 llvm::sys::path::append(LibDir, "amd64");
9305 break;
9306 case llvm::Triple::arm:
9307 llvm::sys::path::append(LibDir, "arm");
9308 break;
9309 default:
9310 break;
9311 }
9312 CmdArgs.push_back(
9313 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009314
9315 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9316 std::string UniversalCRTLibPath;
9317 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9318 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9319 UniversalCRTLibPath.c_str()));
9320 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009321 }
9322
9323 std::string WindowsSdkLibPath;
9324 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9325 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9326 WindowsSdkLibPath.c_str()));
9327 }
9328
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009329 CmdArgs.push_back("-nologo");
9330
Reid Kleckner124955a2015-08-05 18:51:13 +00009331 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009332 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009333
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009334 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009335 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009336 if (DLL) {
9337 CmdArgs.push_back(Args.MakeArgString("-dll"));
9338
9339 SmallString<128> ImplibName(Output.getFilename());
9340 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009341 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009342 }
9343
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009344 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009345 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009346 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009347 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009348 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9349 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009350 // Make sure the dynamic runtime thunk is not optimized out at link time
9351 // to ensure proper SEH handling.
9352 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009353 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009354 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009355 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009356 for (const auto &Lib : {"asan", "asan_cxx"})
9357 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009358 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009359 }
9360
Hans Wennborg2e274592013-08-13 23:38:57 +00009361 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009362
Alexey Bataevc7e84352015-08-19 04:49:01 +00009363 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9364 options::OPT_fno_openmp, false)) {
9365 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9366 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9367 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9368 TC.getDriver().Dir + "/../lib"));
9369 switch (getOpenMPRuntime(getToolChain(), Args)) {
9370 case OMPRT_OMP:
9371 CmdArgs.push_back("-defaultlib:libomp.lib");
9372 break;
9373 case OMPRT_IOMP5:
9374 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9375 break;
9376 case OMPRT_GOMP:
9377 break;
9378 case OMPRT_Unknown:
9379 // Already diagnosed.
9380 break;
9381 }
9382 }
9383
Reid Kleckner337188f2014-09-16 19:22:00 +00009384 // Add filenames, libraries, and other linker inputs.
9385 for (const auto &Input : Inputs) {
9386 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009387 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009388 continue;
9389 }
9390
9391 const Arg &A = Input.getInputArg();
9392
9393 // Render -l options differently for the MSVC linker.
9394 if (A.getOption().matches(options::OPT_l)) {
9395 StringRef Lib = A.getValue();
9396 const char *LinkLibArg;
9397 if (Lib.endswith(".lib"))
9398 LinkLibArg = Args.MakeArgString(Lib);
9399 else
9400 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9401 CmdArgs.push_back(LinkLibArg);
9402 continue;
9403 }
9404
9405 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9406 // or -L. Render it, even if MSVC doesn't understand it.
9407 A.renderAsInput(Args, CmdArgs);
9408 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009409
Zachary Turner719f58c2014-12-01 23:06:47 +00009410 // We need to special case some linker paths. In the case of lld, we need to
9411 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9412 // linker, we need to use a special search algorithm.
9413 llvm::SmallString<128> linkPath;
9414 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9415 if (Linker.equals_lower("lld"))
9416 Linker = "lld-link";
9417
9418 if (Linker.equals_lower("link")) {
9419 // If we're using the MSVC linker, it's not sufficient to just use link
9420 // from the program PATH, because other environments like GnuWin32 install
9421 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009422 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009423 C.getDriver().getClangProgramPath());
9424 } else {
9425 linkPath = Linker;
9426 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009427 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009428 }
9429
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009430 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009431 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009432}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009433
Douglas Katzman95354292015-06-23 20:42:09 +00009434void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9435 const InputInfo &Output,
9436 const InputInfoList &Inputs,
9437 const ArgList &Args,
9438 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009439 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9440}
9441
Douglas Katzman95354292015-06-23 20:42:09 +00009442std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009443 Compilation &C, const JobAction &JA, const InputInfo &Output,
9444 const InputInfoList &Inputs, const ArgList &Args,
9445 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009446 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009447 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009448 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009449 CmdArgs.push_back("/W0"); // No warnings.
9450
9451 // The goal is to be able to invoke this tool correctly based on
9452 // any flag accepted by clang-cl.
9453
9454 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009455 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009456
9457 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009458 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9459 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9460 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009461 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9462 if (A->getOption().getID() == options::OPT_O0) {
9463 CmdArgs.push_back("/Od");
9464 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009465 CmdArgs.push_back("/Og");
9466
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009467 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009468 if (OptLevel == "s" || OptLevel == "z")
9469 CmdArgs.push_back("/Os");
9470 else
9471 CmdArgs.push_back("/Ot");
9472
9473 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009474 }
9475 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009476 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9477 options::OPT_fno_omit_frame_pointer))
9478 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9479 ? "/Oy"
9480 : "/Oy-");
9481 if (!Args.hasArg(options::OPT_fwritable_strings))
9482 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009483
Nico Weber3f8dafb2015-03-12 19:37:10 +00009484 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009485 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9486
David Majnemerf6072342014-07-01 22:24:56 +00009487 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9488 /*default=*/false))
9489 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009490 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9491 options::OPT_fno_function_sections))
9492 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9493 ? "/Gy"
9494 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009495 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9496 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009497 CmdArgs.push_back(
9498 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009499 if (Args.hasArg(options::OPT_fsyntax_only))
9500 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009501 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9502 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009503 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009504
Nico Weber3f8dafb2015-03-12 19:37:10 +00009505 std::vector<std::string> Includes =
9506 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009507 for (const auto &Include : Includes)
9508 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009509
Hans Wennborg87cfa712013-09-19 20:32:16 +00009510 // Flags that can simply be passed through.
9511 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9512 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009513 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009514 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009515
9516 // The order of these flags is relevant, so pick the last one.
9517 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9518 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9519 A->render(Args, CmdArgs);
9520
Hans Wennborg87cfa712013-09-19 20:32:16 +00009521 // Input filename.
9522 assert(Inputs.size() == 1);
9523 const InputInfo &II = Inputs[0];
9524 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9525 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9526 if (II.isFilename())
9527 CmdArgs.push_back(II.getFilename());
9528 else
9529 II.getInputArg().renderAsInput(Args, CmdArgs);
9530
9531 // Output filename.
9532 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009533 const char *Fo =
9534 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009535 CmdArgs.push_back(Fo);
9536
Hans Wennborg188382e2013-09-20 18:16:35 +00009537 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009538 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9539 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009540 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009541 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009542}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009543
Yaron Keren1c0070c2015-07-02 04:45:27 +00009544/// MinGW Tools
9545void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9546 const InputInfo &Output,
9547 const InputInfoList &Inputs,
9548 const ArgList &Args,
9549 const char *LinkingOutput) const {
9550 claimNoWarnArgs(Args);
9551 ArgStringList CmdArgs;
9552
9553 if (getToolChain().getArch() == llvm::Triple::x86) {
9554 CmdArgs.push_back("--32");
9555 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9556 CmdArgs.push_back("--64");
9557 }
9558
9559 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9560
9561 CmdArgs.push_back("-o");
9562 CmdArgs.push_back(Output.getFilename());
9563
9564 for (const auto &II : Inputs)
9565 CmdArgs.push_back(II.getFilename());
9566
9567 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009568 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009569
9570 if (Args.hasArg(options::OPT_gsplit_dwarf))
9571 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9572 SplitDebugName(Args, Inputs[0]));
9573}
9574
9575void MinGW::Linker::AddLibGCC(const ArgList &Args,
9576 ArgStringList &CmdArgs) const {
9577 if (Args.hasArg(options::OPT_mthreads))
9578 CmdArgs.push_back("-lmingwthrd");
9579 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009580
Yaron Kerenaa281332015-08-09 00:24:07 +00009581 // Make use of compiler-rt if --rtlib option is used
9582 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9583 if (RLT == ToolChain::RLT_Libgcc) {
9584 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9585 Args.hasArg(options::OPT_static);
9586 bool Shared = Args.hasArg(options::OPT_shared);
9587 bool CXX = getToolChain().getDriver().CCCIsCXX();
9588
9589 if (Static || (!CXX && !Shared)) {
9590 CmdArgs.push_back("-lgcc");
9591 CmdArgs.push_back("-lgcc_eh");
9592 } else {
9593 CmdArgs.push_back("-lgcc_s");
9594 CmdArgs.push_back("-lgcc");
9595 }
9596 } else {
9597 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9598 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009599
Yaron Keren1c0070c2015-07-02 04:45:27 +00009600 CmdArgs.push_back("-lmoldname");
9601 CmdArgs.push_back("-lmingwex");
9602 CmdArgs.push_back("-lmsvcrt");
9603}
9604
9605void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9606 const InputInfo &Output,
9607 const InputInfoList &Inputs,
9608 const ArgList &Args,
9609 const char *LinkingOutput) const {
9610 const ToolChain &TC = getToolChain();
9611 const Driver &D = TC.getDriver();
9612 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9613
9614 ArgStringList CmdArgs;
9615
9616 // Silence warning for "clang -g foo.o -o foo"
9617 Args.ClaimAllArgs(options::OPT_g_Group);
9618 // and "clang -emit-llvm foo.o -o foo"
9619 Args.ClaimAllArgs(options::OPT_emit_llvm);
9620 // and for "clang -w foo.o -o foo". Other warning options are already
9621 // handled somewhere else.
9622 Args.ClaimAllArgs(options::OPT_w);
9623
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009624 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9625 if (LinkerName.equals_lower("lld")) {
9626 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009627 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009628 } else if (!LinkerName.equals_lower("ld")) {
9629 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009630 }
9631
Yaron Keren1c0070c2015-07-02 04:45:27 +00009632 if (!D.SysRoot.empty())
9633 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9634
9635 if (Args.hasArg(options::OPT_s))
9636 CmdArgs.push_back("-s");
9637
9638 CmdArgs.push_back("-m");
9639 if (TC.getArch() == llvm::Triple::x86)
9640 CmdArgs.push_back("i386pe");
9641 if (TC.getArch() == llvm::Triple::x86_64)
9642 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009643 if (TC.getArch() == llvm::Triple::arm)
9644 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009645
9646 if (Args.hasArg(options::OPT_mwindows)) {
9647 CmdArgs.push_back("--subsystem");
9648 CmdArgs.push_back("windows");
9649 } else if (Args.hasArg(options::OPT_mconsole)) {
9650 CmdArgs.push_back("--subsystem");
9651 CmdArgs.push_back("console");
9652 }
9653
9654 if (Args.hasArg(options::OPT_static))
9655 CmdArgs.push_back("-Bstatic");
9656 else {
9657 if (Args.hasArg(options::OPT_mdll))
9658 CmdArgs.push_back("--dll");
9659 else if (Args.hasArg(options::OPT_shared))
9660 CmdArgs.push_back("--shared");
9661 CmdArgs.push_back("-Bdynamic");
9662 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9663 CmdArgs.push_back("-e");
9664 if (TC.getArch() == llvm::Triple::x86)
9665 CmdArgs.push_back("_DllMainCRTStartup@12");
9666 else
9667 CmdArgs.push_back("DllMainCRTStartup");
9668 CmdArgs.push_back("--enable-auto-image-base");
9669 }
9670 }
9671
9672 CmdArgs.push_back("-o");
9673 CmdArgs.push_back(Output.getFilename());
9674
9675 Args.AddAllArgs(CmdArgs, options::OPT_e);
9676 // FIXME: add -N, -n flags
9677 Args.AddLastArg(CmdArgs, options::OPT_r);
9678 Args.AddLastArg(CmdArgs, options::OPT_s);
9679 Args.AddLastArg(CmdArgs, options::OPT_t);
9680 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9681 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9682
Douglas Katzman78b37b02015-11-17 20:28:07 +00009683 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009684 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9685 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9686 } else {
9687 if (Args.hasArg(options::OPT_municode))
9688 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9689 else
9690 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9691 }
9692 if (Args.hasArg(options::OPT_pg))
9693 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9694 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9695 }
9696
9697 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009698 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009699 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9700
9701 // TODO: Add ASan stuff here
9702
9703 // TODO: Add profile stuff here
9704
Douglas Katzman78b37b02015-11-17 20:28:07 +00009705 if (D.CCCIsCXX() &&
9706 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009707 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9708 !Args.hasArg(options::OPT_static);
9709 if (OnlyLibstdcxxStatic)
9710 CmdArgs.push_back("-Bstatic");
9711 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9712 if (OnlyLibstdcxxStatic)
9713 CmdArgs.push_back("-Bdynamic");
9714 }
9715
9716 if (!Args.hasArg(options::OPT_nostdlib)) {
9717 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9718 if (Args.hasArg(options::OPT_static))
9719 CmdArgs.push_back("--start-group");
9720
9721 if (Args.hasArg(options::OPT_fstack_protector) ||
9722 Args.hasArg(options::OPT_fstack_protector_strong) ||
9723 Args.hasArg(options::OPT_fstack_protector_all)) {
9724 CmdArgs.push_back("-lssp_nonshared");
9725 CmdArgs.push_back("-lssp");
9726 }
9727 if (Args.hasArg(options::OPT_fopenmp))
9728 CmdArgs.push_back("-lgomp");
9729
9730 AddLibGCC(Args, CmdArgs);
9731
9732 if (Args.hasArg(options::OPT_pg))
9733 CmdArgs.push_back("-lgmon");
9734
Yaron Kerenadce68e2015-07-06 18:52:19 +00009735 if (Args.hasArg(options::OPT_pthread))
9736 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009737
9738 // add system libraries
9739 if (Args.hasArg(options::OPT_mwindows)) {
9740 CmdArgs.push_back("-lgdi32");
9741 CmdArgs.push_back("-lcomdlg32");
9742 }
9743 CmdArgs.push_back("-ladvapi32");
9744 CmdArgs.push_back("-lshell32");
9745 CmdArgs.push_back("-luser32");
9746 CmdArgs.push_back("-lkernel32");
9747
9748 if (Args.hasArg(options::OPT_static))
9749 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009750 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009751 AddLibGCC(Args, CmdArgs);
9752 }
9753
9754 if (!Args.hasArg(options::OPT_nostartfiles)) {
9755 // Add crtfastmath.o if available and fast math is enabled.
9756 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9757
9758 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9759 }
9760 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009761 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009762 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009763}
9764
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009765/// XCore Tools
9766// We pass assemble and link construction to the xcc tool.
9767
Douglas Katzman95354292015-06-23 20:42:09 +00009768void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9769 const InputInfo &Output,
9770 const InputInfoList &Inputs,
9771 const ArgList &Args,
9772 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009773 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009774 ArgStringList CmdArgs;
9775
9776 CmdArgs.push_back("-o");
9777 CmdArgs.push_back(Output.getFilename());
9778
9779 CmdArgs.push_back("-c");
9780
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009781 if (Args.hasArg(options::OPT_v))
9782 CmdArgs.push_back("-v");
9783
Robert Lytton894d25c2014-05-02 09:33:25 +00009784 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9785 if (!A->getOption().matches(options::OPT_g0))
9786 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009787
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009788 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9789 false))
9790 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009791
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009792 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009793
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009794 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009795 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009796
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009797 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009798 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009799}
9800
Douglas Katzman95354292015-06-23 20:42:09 +00009801void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9802 const InputInfo &Output,
9803 const InputInfoList &Inputs,
9804 const ArgList &Args,
9805 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009806 ArgStringList CmdArgs;
9807
9808 if (Output.isFilename()) {
9809 CmdArgs.push_back("-o");
9810 CmdArgs.push_back(Output.getFilename());
9811 } else {
9812 assert(Output.isNothing() && "Invalid output.");
9813 }
9814
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009815 if (Args.hasArg(options::OPT_v))
9816 CmdArgs.push_back("-v");
9817
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009818 // Pass -fexceptions through to the linker if it was present.
9819 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9820 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009821 CmdArgs.push_back("-fexceptions");
9822
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009823 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9824
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009825 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009826 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009827}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009828
Douglas Katzman95354292015-06-23 20:42:09 +00009829void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9830 const InputInfo &Output,
9831 const InputInfoList &Inputs,
9832 const ArgList &Args,
9833 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009834 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009835 const auto &TC =
9836 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9837 ArgStringList CmdArgs;
9838 const char *Exec;
9839
9840 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009841 default:
9842 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009843 case llvm::Triple::arm:
9844 case llvm::Triple::thumb:
9845 break;
9846 case llvm::Triple::x86:
9847 CmdArgs.push_back("--32");
9848 break;
9849 case llvm::Triple::x86_64:
9850 CmdArgs.push_back("--64");
9851 break;
9852 }
9853
9854 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9855
9856 CmdArgs.push_back("-o");
9857 CmdArgs.push_back(Output.getFilename());
9858
9859 for (const auto &Input : Inputs)
9860 CmdArgs.push_back(Input.getFilename());
9861
9862 const std::string Assembler = TC.GetProgramPath("as");
9863 Exec = Args.MakeArgString(Assembler);
9864
Justin Bognerd3371d82015-07-17 03:35:54 +00009865 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009866}
9867
Douglas Katzman95354292015-06-23 20:42:09 +00009868void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9869 const InputInfo &Output,
9870 const InputInfoList &Inputs,
9871 const ArgList &Args,
9872 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009873 const auto &TC =
9874 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9875 const llvm::Triple &T = TC.getTriple();
9876 const Driver &D = TC.getDriver();
9877 SmallString<128> EntryPoint;
9878 ArgStringList CmdArgs;
9879 const char *Exec;
9880
9881 // Silence warning for "clang -g foo.o -o foo"
9882 Args.ClaimAllArgs(options::OPT_g_Group);
9883 // and "clang -emit-llvm foo.o -o foo"
9884 Args.ClaimAllArgs(options::OPT_emit_llvm);
9885 // and for "clang -w foo.o -o foo"
9886 Args.ClaimAllArgs(options::OPT_w);
9887 // Other warning options are already handled somewhere else.
9888
9889 if (!D.SysRoot.empty())
9890 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9891
9892 if (Args.hasArg(options::OPT_pie))
9893 CmdArgs.push_back("-pie");
9894 if (Args.hasArg(options::OPT_rdynamic))
9895 CmdArgs.push_back("-export-dynamic");
9896 if (Args.hasArg(options::OPT_s))
9897 CmdArgs.push_back("--strip-all");
9898
9899 CmdArgs.push_back("-m");
9900 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009901 default:
9902 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009903 case llvm::Triple::arm:
9904 case llvm::Triple::thumb:
9905 // FIXME: this is incorrect for WinCE
9906 CmdArgs.push_back("thumb2pe");
9907 break;
9908 case llvm::Triple::x86:
9909 CmdArgs.push_back("i386pe");
9910 EntryPoint.append("_");
9911 break;
9912 case llvm::Triple::x86_64:
9913 CmdArgs.push_back("i386pep");
9914 break;
9915 }
9916
9917 if (Args.hasArg(options::OPT_shared)) {
9918 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009919 default:
9920 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009921 case llvm::Triple::arm:
9922 case llvm::Triple::thumb:
9923 case llvm::Triple::x86_64:
9924 EntryPoint.append("_DllMainCRTStartup");
9925 break;
9926 case llvm::Triple::x86:
9927 EntryPoint.append("_DllMainCRTStartup@12");
9928 break;
9929 }
9930
9931 CmdArgs.push_back("-shared");
9932 CmdArgs.push_back("-Bdynamic");
9933
9934 CmdArgs.push_back("--enable-auto-image-base");
9935
9936 CmdArgs.push_back("--entry");
9937 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9938 } else {
9939 EntryPoint.append("mainCRTStartup");
9940
9941 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9942 : "-Bdynamic");
9943
Douglas Katzman78b37b02015-11-17 20:28:07 +00009944 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009945 CmdArgs.push_back("--entry");
9946 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9947 }
9948
9949 // FIXME: handle subsystem
9950 }
9951
9952 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009953 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009954
9955 CmdArgs.push_back("-o");
9956 CmdArgs.push_back(Output.getFilename());
9957
9958 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9959 SmallString<261> ImpLib(Output.getFilename());
9960 llvm::sys::path::replace_extension(ImpLib, ".lib");
9961
9962 CmdArgs.push_back("--out-implib");
9963 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9964 }
9965
Douglas Katzman78b37b02015-11-17 20:28:07 +00009966 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009967 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9968 const char *CRTBegin;
9969
9970 CRTBegin =
9971 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9972 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9973 }
9974
9975 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009976 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009977 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9978
9979 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9980 !Args.hasArg(options::OPT_nodefaultlibs)) {
9981 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9982 !Args.hasArg(options::OPT_static);
9983 if (StaticCXX)
9984 CmdArgs.push_back("-Bstatic");
9985 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9986 if (StaticCXX)
9987 CmdArgs.push_back("-Bdynamic");
9988 }
9989
9990 if (!Args.hasArg(options::OPT_nostdlib)) {
9991 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9992 // TODO handle /MT[d] /MD[d]
9993 CmdArgs.push_back("-lmsvcrt");
9994 AddRunTimeLibs(TC, D, CmdArgs, Args);
9995 }
9996 }
9997
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009998 if (TC.getSanitizerArgs().needsAsanRt()) {
9999 // TODO handle /MT[d] /MD[d]
10000 if (Args.hasArg(options::OPT_shared)) {
10001 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10002 } else {
10003 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10004 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10005 // Make sure the dynamic runtime thunk is not optimized out at link time
10006 // to ensure proper SEH handling.
10007 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10008 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10009 ? "___asan_seh_interceptor"
10010 : "__asan_seh_interceptor"));
10011 }
10012 }
10013
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010014 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010015
Justin Bognerd3371d82015-07-17 03:35:54 +000010016 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010017}
Douglas Katzman84a75642015-06-19 14:55:19 +000010018
Douglas Katzman95354292015-06-23 20:42:09 +000010019void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10020 const InputInfo &Output,
10021 const InputInfoList &Inputs,
10022 const ArgList &Args,
10023 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010024 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010025 assert(Inputs.size() == 1);
10026 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010027 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10028 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010029
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010030 if (JA.getKind() == Action::PreprocessJobClass) {
10031 Args.ClaimAllArgs();
10032 CmdArgs.push_back("-E");
10033 } else {
10034 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10035 CmdArgs.push_back("-S");
10036 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10037 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010038 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010039 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010040
Douglas Katzmanf6071112015-08-03 14:34:22 +000010041 // Append all -I, -iquote, -isystem paths, defines/undefines,
10042 // 'f' flags, optimize flags, and warning options.
10043 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010044 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010045 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010046 options::OPT_f_Group, options::OPT_f_clang_Group,
10047 options::OPT_g_Group, options::OPT_M_Group,
10048 options::OPT_O_Group, options::OPT_W_Group});
10049
10050 // If we're producing a dependency file, and assembly is the final action,
10051 // then the name of the target in the dependency file should be the '.o'
10052 // file, not the '.s' file produced by this step. For example, instead of
10053 // /tmp/mumble.s: mumble.c .../someheader.h
10054 // the filename on the lefthand side should be "mumble.o"
10055 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10056 C.getActions().size() == 1 &&
10057 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10058 Arg *A = Args.getLastArg(options::OPT_o);
10059 if (A) {
10060 CmdArgs.push_back("-MT");
10061 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10062 }
10063 }
10064
Douglas Katzman84a75642015-06-19 14:55:19 +000010065 CmdArgs.push_back(II.getFilename());
10066 CmdArgs.push_back("-o");
10067 CmdArgs.push_back(Output.getFilename());
10068
10069 std::string Exec =
10070 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010071 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10072 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010073}
10074
Douglas Katzman95354292015-06-23 20:42:09 +000010075void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10076 const InputInfo &Output,
10077 const InputInfoList &Inputs,
10078 const ArgList &Args,
10079 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010080 ArgStringList CmdArgs;
10081
10082 assert(Inputs.size() == 1);
10083 const InputInfo &II = Inputs[0];
10084 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10085 assert(Output.getType() == types::TY_Object);
10086
10087 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010088 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010089 CmdArgs.push_back("-noSPrefixing");
10090 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010091 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10092 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10093 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010094 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010095 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010096 }
10097 CmdArgs.push_back("-elf"); // Output format.
10098 CmdArgs.push_back(II.getFilename());
10099 CmdArgs.push_back(
10100 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10101
10102 std::string Exec =
10103 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010104 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10105 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010106}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010107
10108void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10109 const InputInfo &Output,
10110 const InputInfoList &Inputs,
10111 const ArgList &Args,
10112 const char *LinkingOutput) const {
10113 const auto &TC =
10114 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10115 const llvm::Triple &T = TC.getTriple();
10116 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010117 bool UseStartfiles =
10118 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010119 bool UseDefaultLibs =
10120 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010121
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010122 if (T.getArch() == llvm::Triple::sparc)
10123 CmdArgs.push_back("-EB");
10124 else // SHAVE assumes little-endian, and sparcel is expressly so.
10125 CmdArgs.push_back("-EL");
10126
10127 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10128 // but we never pass through a --sysroot option and various other bits.
10129 // For example, there are no sanitizers (yet) nor gold linker.
10130
10131 // Eat some arguments that may be present but have no effect.
10132 Args.ClaimAllArgs(options::OPT_g_Group);
10133 Args.ClaimAllArgs(options::OPT_w);
10134 Args.ClaimAllArgs(options::OPT_static_libgcc);
10135
10136 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10137 CmdArgs.push_back("-s");
10138
10139 CmdArgs.push_back("-o");
10140 CmdArgs.push_back(Output.getFilename());
10141
10142 if (UseStartfiles) {
10143 // If you want startfiles, it means you want the builtin crti and crtbegin,
10144 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010145 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10146 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010147 }
10148
10149 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10150 options::OPT_e, options::OPT_s, options::OPT_t,
10151 options::OPT_Z_Flag, options::OPT_r});
10152
Douglas Katzman674a3122015-11-18 16:24:46 +000010153 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010154
10155 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10156
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010157 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010158 if (C.getDriver().CCCIsCXX())
10159 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010160 if (T.getOS() == llvm::Triple::RTEMS) {
10161 CmdArgs.push_back("--start-group");
10162 CmdArgs.push_back("-lc");
10163 // You must provide your own "-L" option to enable finding these.
10164 CmdArgs.push_back("-lrtemscpu");
10165 CmdArgs.push_back("-lrtemsbsp");
10166 CmdArgs.push_back("--end-group");
10167 } else {
10168 CmdArgs.push_back("-lc");
10169 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010170 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010171 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010172 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010173 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10174 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010175 }
10176
10177 std::string Exec =
10178 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10179 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10180 CmdArgs, Inputs));
10181}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010182
10183void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10184 const InputInfo &Output,
10185 const InputInfoList &Inputs,
10186 const ArgList &Args,
10187 const char *LinkingOutput) const {
10188 claimNoWarnArgs(Args);
10189 ArgStringList CmdArgs;
10190
10191 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10192
10193 CmdArgs.push_back("-o");
10194 CmdArgs.push_back(Output.getFilename());
10195
10196 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10197 const InputInfo &Input = Inputs[0];
10198 assert(Input.isFilename() && "Invalid input.");
10199 CmdArgs.push_back(Input.getFilename());
10200
10201 const char *Exec =
10202 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10203 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10204}
10205
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010206static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10207 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10208 if (SanArgs.needsUbsanRt()) {
10209 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10210 }
10211 if (SanArgs.needsAsanRt()) {
10212 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10213 }
10214}
10215
10216static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10217 const JobAction &JA, const InputInfo &Output,
10218 const InputInfoList &Inputs,
10219 const ArgList &Args,
10220 const char *LinkingOutput) {
10221 const toolchains::FreeBSD &ToolChain =
10222 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10223 const Driver &D = ToolChain.getDriver();
10224 ArgStringList CmdArgs;
10225
10226 // Silence warning for "clang -g foo.o -o foo"
10227 Args.ClaimAllArgs(options::OPT_g_Group);
10228 // and "clang -emit-llvm foo.o -o foo"
10229 Args.ClaimAllArgs(options::OPT_emit_llvm);
10230 // and for "clang -w foo.o -o foo". Other warning options are already
10231 // handled somewhere else.
10232 Args.ClaimAllArgs(options::OPT_w);
10233
10234 if (!D.SysRoot.empty())
10235 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10236
10237 if (Args.hasArg(options::OPT_pie))
10238 CmdArgs.push_back("-pie");
10239
10240 if (Args.hasArg(options::OPT_rdynamic))
10241 CmdArgs.push_back("-export-dynamic");
10242 if (Args.hasArg(options::OPT_shared))
10243 CmdArgs.push_back("--oformat=so");
10244
10245 if (Output.isFilename()) {
10246 CmdArgs.push_back("-o");
10247 CmdArgs.push_back(Output.getFilename());
10248 } else {
10249 assert(Output.isNothing() && "Invalid output.");
10250 }
10251
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010252 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10253
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010254 Args.AddAllArgs(CmdArgs, options::OPT_L);
10255 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10256 Args.AddAllArgs(CmdArgs, options::OPT_e);
10257 Args.AddAllArgs(CmdArgs, options::OPT_s);
10258 Args.AddAllArgs(CmdArgs, options::OPT_t);
10259 Args.AddAllArgs(CmdArgs, options::OPT_r);
10260
10261 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10262 CmdArgs.push_back("--no-demangle");
10263
10264 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10265
10266 if (Args.hasArg(options::OPT_pthread)) {
10267 CmdArgs.push_back("-lpthread");
10268 }
10269
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010270 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10271
10272 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10273}
10274
10275static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10276 const JobAction &JA, const InputInfo &Output,
10277 const InputInfoList &Inputs,
10278 const ArgList &Args,
10279 const char *LinkingOutput) {
10280 const toolchains::FreeBSD &ToolChain =
10281 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10282 const Driver &D = ToolChain.getDriver();
10283 ArgStringList CmdArgs;
10284
10285 // Silence warning for "clang -g foo.o -o foo"
10286 Args.ClaimAllArgs(options::OPT_g_Group);
10287 // and "clang -emit-llvm foo.o -o foo"
10288 Args.ClaimAllArgs(options::OPT_emit_llvm);
10289 // and for "clang -w foo.o -o foo". Other warning options are already
10290 // handled somewhere else.
10291 Args.ClaimAllArgs(options::OPT_w);
10292
10293 if (!D.SysRoot.empty())
10294 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10295
10296 if (Args.hasArg(options::OPT_pie))
10297 CmdArgs.push_back("-pie");
10298
10299 if (Args.hasArg(options::OPT_static)) {
10300 CmdArgs.push_back("-Bstatic");
10301 } else {
10302 if (Args.hasArg(options::OPT_rdynamic))
10303 CmdArgs.push_back("-export-dynamic");
10304 CmdArgs.push_back("--eh-frame-hdr");
10305 if (Args.hasArg(options::OPT_shared)) {
10306 CmdArgs.push_back("-Bshareable");
10307 } else {
10308 CmdArgs.push_back("-dynamic-linker");
10309 CmdArgs.push_back("/libexec/ld-elf.so.1");
10310 }
10311 CmdArgs.push_back("--enable-new-dtags");
10312 }
10313
10314 if (Output.isFilename()) {
10315 CmdArgs.push_back("-o");
10316 CmdArgs.push_back(Output.getFilename());
10317 } else {
10318 assert(Output.isNothing() && "Invalid output.");
10319 }
10320
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010321 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10322
Douglas Katzman78b37b02015-11-17 20:28:07 +000010323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010324 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010325 if (!Args.hasArg(options::OPT_shared)) {
10326 if (Args.hasArg(options::OPT_pg))
10327 crt1 = "gcrt1.o";
10328 else if (Args.hasArg(options::OPT_pie))
10329 crt1 = "Scrt1.o";
10330 else
10331 crt1 = "crt1.o";
10332 }
10333 if (crt1)
10334 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10335
10336 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10337
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010338 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010339 if (Args.hasArg(options::OPT_static))
10340 crtbegin = "crtbeginT.o";
10341 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10342 crtbegin = "crtbeginS.o";
10343 else
10344 crtbegin = "crtbegin.o";
10345
10346 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10347 }
10348
10349 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010350 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010351 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10352 Args.AddAllArgs(CmdArgs, options::OPT_e);
10353 Args.AddAllArgs(CmdArgs, options::OPT_s);
10354 Args.AddAllArgs(CmdArgs, options::OPT_t);
10355 Args.AddAllArgs(CmdArgs, options::OPT_r);
10356
10357 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10358 CmdArgs.push_back("--no-demangle");
10359
10360 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10361
Douglas Katzman78b37b02015-11-17 20:28:07 +000010362 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010363 // For PS4, we always want to pass libm, libstdc++ and libkernel
10364 // libraries for both C and C++ compilations.
10365 CmdArgs.push_back("-lkernel");
10366 if (D.CCCIsCXX()) {
10367 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10368 if (Args.hasArg(options::OPT_pg))
10369 CmdArgs.push_back("-lm_p");
10370 else
10371 CmdArgs.push_back("-lm");
10372 }
10373 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10374 // the default system libraries. Just mimic this for now.
10375 if (Args.hasArg(options::OPT_pg))
10376 CmdArgs.push_back("-lgcc_p");
10377 else
10378 CmdArgs.push_back("-lcompiler_rt");
10379 if (Args.hasArg(options::OPT_static)) {
10380 CmdArgs.push_back("-lstdc++");
10381 } else if (Args.hasArg(options::OPT_pg)) {
10382 CmdArgs.push_back("-lgcc_eh_p");
10383 } else {
10384 CmdArgs.push_back("--as-needed");
10385 CmdArgs.push_back("-lstdc++");
10386 CmdArgs.push_back("--no-as-needed");
10387 }
10388
10389 if (Args.hasArg(options::OPT_pthread)) {
10390 if (Args.hasArg(options::OPT_pg))
10391 CmdArgs.push_back("-lpthread_p");
10392 else
10393 CmdArgs.push_back("-lpthread");
10394 }
10395
10396 if (Args.hasArg(options::OPT_pg)) {
10397 if (Args.hasArg(options::OPT_shared))
10398 CmdArgs.push_back("-lc");
10399 else {
10400 if (Args.hasArg(options::OPT_static)) {
10401 CmdArgs.push_back("--start-group");
10402 CmdArgs.push_back("-lc_p");
10403 CmdArgs.push_back("-lpthread_p");
10404 CmdArgs.push_back("--end-group");
10405 } else {
10406 CmdArgs.push_back("-lc_p");
10407 }
10408 }
10409 CmdArgs.push_back("-lgcc_p");
10410 } else {
10411 if (Args.hasArg(options::OPT_static)) {
10412 CmdArgs.push_back("--start-group");
10413 CmdArgs.push_back("-lc");
10414 CmdArgs.push_back("-lpthread");
10415 CmdArgs.push_back("--end-group");
10416 } else {
10417 CmdArgs.push_back("-lc");
10418 }
10419 CmdArgs.push_back("-lcompiler_rt");
10420 }
10421
10422 if (Args.hasArg(options::OPT_static)) {
10423 CmdArgs.push_back("-lstdc++");
10424 } else if (Args.hasArg(options::OPT_pg)) {
10425 CmdArgs.push_back("-lgcc_eh_p");
10426 } else {
10427 CmdArgs.push_back("--as-needed");
10428 CmdArgs.push_back("-lstdc++");
10429 CmdArgs.push_back("--no-as-needed");
10430 }
10431 }
10432
Douglas Katzman78b37b02015-11-17 20:28:07 +000010433 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010434 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10435 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10436 else
10437 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10438 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10439 }
10440
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010441 const char *Exec =
10442#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010443 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010444#else
10445 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10446#endif
10447
10448 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10449}
10450
10451void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10452 const InputInfo &Output,
10453 const InputInfoList &Inputs,
10454 const ArgList &Args,
10455 const char *LinkingOutput) const {
10456 const toolchains::FreeBSD &ToolChain =
10457 static_cast<const toolchains::FreeBSD &>(getToolChain());
10458 const Driver &D = ToolChain.getDriver();
10459 bool PS4Linker;
10460 StringRef LinkerOptName;
10461 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10462 LinkerOptName = A->getValue();
10463 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10464 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10465 }
10466
10467 if (LinkerOptName == "gold")
10468 PS4Linker = false;
10469 else if (LinkerOptName == "ps4")
10470 PS4Linker = true;
10471 else
10472 PS4Linker = !Args.hasArg(options::OPT_shared);
10473
10474 if (PS4Linker)
10475 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10476 else
10477 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10478}