blob: f843ec4a0c71c1175679221f64b67e65ee959b8e [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");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002795}
2796
Alexey Samsonov52550342014-09-15 19:58:40 +00002797// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2798// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2799static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002800 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002801 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2802 HelperStaticRuntimes;
2803 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2804 HelperStaticRuntimes);
2805 for (auto RT : SharedRuntimes)
2806 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2807 for (auto RT : HelperStaticRuntimes)
2808 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2809 bool AddExportDynamic = false;
2810 for (auto RT : StaticRuntimes) {
2811 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2812 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2813 }
2814 // If there is a static runtime with no dynamic list, force all the symbols
2815 // to be dynamic to be sure we export sanitizer interface functions.
2816 if (AddExportDynamic)
2817 CmdArgs.push_back("-export-dynamic");
2818 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002819}
2820
Reid Kleckner86ea7702015-02-04 23:45:07 +00002821static bool areOptimizationsEnabled(const ArgList &Args) {
2822 // Find the last -O arg and see if it is non-zero.
2823 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2824 return !A->getOption().matches(options::OPT_O0);
2825 // Defaults to -O0.
2826 return false;
2827}
2828
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002829static bool shouldUseFramePointerForTarget(const ArgList &Args,
2830 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002831 switch (Triple.getArch()) {
2832 case llvm::Triple::xcore:
2833 case llvm::Triple::wasm32:
2834 case llvm::Triple::wasm64:
2835 // XCore never wants frame pointers, regardless of OS.
2836 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002837 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002838 default:
2839 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002840 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002841
2842 if (Triple.isOSLinux()) {
2843 switch (Triple.getArch()) {
2844 // Don't use a frame pointer on linux if optimizing for certain targets.
2845 case llvm::Triple::mips64:
2846 case llvm::Triple::mips64el:
2847 case llvm::Triple::mips:
2848 case llvm::Triple::mipsel:
2849 case llvm::Triple::systemz:
2850 case llvm::Triple::x86:
2851 case llvm::Triple::x86_64:
2852 return !areOptimizationsEnabled(Args);
2853 default:
2854 return true;
2855 }
2856 }
2857
2858 if (Triple.isOSWindows()) {
2859 switch (Triple.getArch()) {
2860 case llvm::Triple::x86:
2861 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002862 case llvm::Triple::arm:
2863 case llvm::Triple::thumb:
2864 // Windows on ARM builds with FPO disabled to aid fast stack walking
2865 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002866 default:
2867 // All other supported Windows ISAs use xdata unwind information, so frame
2868 // pointers are not generally useful.
2869 return false;
2870 }
2871 }
2872
2873 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002874}
2875
Rafael Espindola224dd632011-12-14 21:02:23 +00002876static bool shouldUseFramePointer(const ArgList &Args,
2877 const llvm::Triple &Triple) {
2878 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2879 options::OPT_fomit_frame_pointer))
2880 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002881 if (Args.hasArg(options::OPT_pg))
2882 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002883
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002884 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002885}
2886
Eric Christopherb7d97e92013-04-03 01:58:53 +00002887static bool shouldUseLeafFramePointer(const ArgList &Args,
2888 const llvm::Triple &Triple) {
2889 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2890 options::OPT_momit_leaf_frame_pointer))
2891 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002892 if (Args.hasArg(options::OPT_pg))
2893 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002894
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002895 if (Triple.isPS4CPU())
2896 return false;
2897
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002898 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002899}
2900
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002901/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002902static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002903 SmallString<128> cwd;
2904 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002905 CmdArgs.push_back("-fdebug-compilation-dir");
2906 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002907 }
2908}
2909
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002910static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002911 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2912 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2913 SmallString<128> T(FinalOutput->getValue());
2914 llvm::sys::path::replace_extension(T, "dwo");
2915 return Args.MakeArgString(T);
2916 } else {
2917 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002918 SmallString<128> T(
2919 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002920 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002921 llvm::sys::path::replace_extension(F, "dwo");
2922 T += F;
2923 return Args.MakeArgString(F);
2924 }
2925}
2926
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002927static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2928 const JobAction &JA, const ArgList &Args,
2929 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002930 ArgStringList ExtractArgs;
2931 ExtractArgs.push_back("--extract-dwo");
2932
2933 ArgStringList StripArgs;
2934 StripArgs.push_back("--strip-dwo");
2935
2936 // Grabbing the output of the earlier compile step.
2937 StripArgs.push_back(Output.getFilename());
2938 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002939 ExtractArgs.push_back(OutFile);
2940
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002941 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002942 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002943
2944 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002945 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002946
2947 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002948 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002949}
2950
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002951/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002952/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2953static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002954 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002955 if (A->getOption().matches(options::OPT_O4) ||
2956 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002957 return true;
2958
2959 if (A->getOption().matches(options::OPT_O0))
2960 return false;
2961
2962 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2963
Rafael Espindola91780de2013-08-26 14:05:41 +00002964 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002965 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002966 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002967 return true;
2968
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002969 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002970 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002971 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002972
2973 unsigned OptLevel = 0;
2974 if (S.getAsInteger(10, OptLevel))
2975 return false;
2976
2977 return OptLevel > 1;
2978 }
2979
2980 return false;
2981}
2982
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002983/// Add -x lang to \p CmdArgs for \p Input.
2984static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2985 ArgStringList &CmdArgs) {
2986 // When using -verify-pch, we don't want to provide the type
2987 // 'precompiled-header' if it was inferred from the file extension
2988 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2989 return;
2990
2991 CmdArgs.push_back("-x");
2992 if (Args.hasArg(options::OPT_rewrite_objc))
2993 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2994 else
2995 CmdArgs.push_back(types::getTypeName(Input.getType()));
2996}
2997
David Majnemerc371ff02015-03-22 08:39:22 +00002998static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002999 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003000 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003001
3002 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003003 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003004
3005 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003006 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003007 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003008 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003009}
3010
Rafael Espindola577637a2015-01-03 00:06:04 +00003011// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003012// options that build systems might add but are unused when assembling or only
3013// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003014static void claimNoWarnArgs(const ArgList &Args) {
3015 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003016 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003017 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003018 Args.ClaimAllArgs(options::OPT_flto);
3019 Args.ClaimAllArgs(options::OPT_fno_lto);
3020}
3021
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003022static void appendUserToPath(SmallVectorImpl<char> &Result) {
3023#ifdef LLVM_ON_UNIX
3024 const char *Username = getenv("LOGNAME");
3025#else
3026 const char *Username = getenv("USERNAME");
3027#endif
3028 if (Username) {
3029 // Validate that LoginName can be used in a path, and get its length.
3030 size_t Len = 0;
3031 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003032 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003033 Username = nullptr;
3034 break;
3035 }
3036 }
3037
3038 if (Username && Len > 0) {
3039 Result.append(Username, Username + Len);
3040 return;
3041 }
3042 }
3043
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003044// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003045#ifdef LLVM_ON_UNIX
3046 std::string UID = llvm::utostr(getuid());
3047#else
3048 // FIXME: Windows seems to have an 'SID' that might work.
3049 std::string UID = "9999";
3050#endif
3051 Result.append(UID.begin(), UID.end());
3052}
3053
David Majnemere11d3732015-06-08 00:22:46 +00003054VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3055 const llvm::Triple &Triple,
3056 const llvm::opt::ArgList &Args,
3057 bool IsWindowsMSVC) {
3058 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3059 IsWindowsMSVC) ||
3060 Args.hasArg(options::OPT_fmsc_version) ||
3061 Args.hasArg(options::OPT_fms_compatibility_version)) {
3062 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3063 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003064 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003065
3066 if (MSCVersion && MSCompatibilityVersion) {
3067 if (D)
3068 D->Diag(diag::err_drv_argument_not_allowed_with)
3069 << MSCVersion->getAsString(Args)
3070 << MSCompatibilityVersion->getAsString(Args);
3071 return VersionTuple();
3072 }
3073
3074 if (MSCompatibilityVersion) {
3075 VersionTuple MSVT;
3076 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3077 D->Diag(diag::err_drv_invalid_value)
3078 << MSCompatibilityVersion->getAsString(Args)
3079 << MSCompatibilityVersion->getValue();
3080 return MSVT;
3081 }
3082
3083 if (MSCVersion) {
3084 unsigned Version = 0;
3085 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3086 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3087 << MSCVersion->getValue();
3088 return getMSCompatibilityVersion(Version);
3089 }
3090
3091 unsigned Major, Minor, Micro;
3092 Triple.getEnvironmentVersion(Major, Minor, Micro);
3093 if (Major || Minor || Micro)
3094 return VersionTuple(Major, Minor, Micro);
3095
3096 return VersionTuple(18);
3097 }
3098 return VersionTuple();
3099}
3100
Diego Novilloa0545962015-07-10 18:00:07 +00003101static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3102 const InputInfo &Output, const ArgList &Args,
3103 ArgStringList &CmdArgs) {
3104 auto *ProfileGenerateArg = Args.getLastArg(
3105 options::OPT_fprofile_instr_generate,
3106 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003107 options::OPT_fprofile_generate_EQ,
3108 options::OPT_fno_profile_instr_generate);
3109 if (ProfileGenerateArg &&
3110 ProfileGenerateArg->getOption().matches(
3111 options::OPT_fno_profile_instr_generate))
3112 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003113
3114 auto *ProfileUseArg = Args.getLastArg(
3115 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003116 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3117 options::OPT_fno_profile_instr_use);
3118 if (ProfileUseArg &&
3119 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3120 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003121
3122 if (ProfileGenerateArg && ProfileUseArg)
3123 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003124 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003125
Diego Novillo758f3f52015-08-05 21:49:51 +00003126 if (ProfileGenerateArg) {
3127 if (ProfileGenerateArg->getOption().matches(
3128 options::OPT_fprofile_instr_generate_EQ))
3129 ProfileGenerateArg->render(Args, CmdArgs);
3130 else if (ProfileGenerateArg->getOption().matches(
3131 options::OPT_fprofile_generate_EQ)) {
3132 SmallString<128> Path(ProfileGenerateArg->getValue());
3133 llvm::sys::path::append(Path, "default.profraw");
3134 CmdArgs.push_back(
3135 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3136 } else
3137 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3138 }
Diego Novilloa0545962015-07-10 18:00:07 +00003139
Diego Novillo758f3f52015-08-05 21:49:51 +00003140 if (ProfileUseArg) {
3141 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3142 ProfileUseArg->render(Args, CmdArgs);
3143 else if ((ProfileUseArg->getOption().matches(
3144 options::OPT_fprofile_use_EQ) ||
3145 ProfileUseArg->getOption().matches(
3146 options::OPT_fprofile_instr_use))) {
3147 SmallString<128> Path(
3148 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3149 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3150 llvm::sys::path::append(Path, "default.profdata");
3151 CmdArgs.push_back(
3152 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3153 }
Diego Novilloa0545962015-07-10 18:00:07 +00003154 }
3155
3156 if (Args.hasArg(options::OPT_ftest_coverage) ||
3157 Args.hasArg(options::OPT_coverage))
3158 CmdArgs.push_back("-femit-coverage-notes");
3159 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3160 false) ||
3161 Args.hasArg(options::OPT_coverage))
3162 CmdArgs.push_back("-femit-coverage-data");
3163
Diego Novilloc4b94da2015-08-05 23:27:40 +00003164 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3165 options::OPT_fno_coverage_mapping, false) &&
3166 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003167 D.Diag(diag::err_drv_argument_only_allowed_with)
3168 << "-fcoverage-mapping"
3169 << "-fprofile-instr-generate";
3170
Diego Novilloc4b94da2015-08-05 23:27:40 +00003171 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3172 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003173 CmdArgs.push_back("-fcoverage-mapping");
3174
3175 if (C.getArgs().hasArg(options::OPT_c) ||
3176 C.getArgs().hasArg(options::OPT_S)) {
3177 if (Output.isFilename()) {
3178 CmdArgs.push_back("-coverage-file");
3179 SmallString<128> CoverageFilename;
3180 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3181 CoverageFilename = FinalOutput->getValue();
3182 } else {
3183 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3184 }
3185 if (llvm::sys::path::is_relative(CoverageFilename)) {
3186 SmallString<128> Pwd;
3187 if (!llvm::sys::fs::current_path(Pwd)) {
3188 llvm::sys::path::append(Pwd, CoverageFilename);
3189 CoverageFilename.swap(Pwd);
3190 }
3191 }
3192 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3193 }
3194 }
3195}
3196
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003197/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3198/// smooshes them together with platform defaults, to decide whether
3199/// this compile should be using PIC mode or not. Returns a tuple of
3200/// (RelocationModel, PICLevel, IsPIE).
3201static std::tuple<llvm::Reloc::Model, unsigned, bool>
3202ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3203 const ArgList &Args) {
3204 // FIXME: why does this code...and so much everywhere else, use both
3205 // ToolChain.getTriple() and Triple?
3206 bool PIE = ToolChain.isPIEDefault();
3207 bool PIC = PIE || ToolChain.isPICDefault();
3208 bool IsPICLevelTwo = PIC;
3209
3210 bool KernelOrKext =
3211 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3212
3213 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003214 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003215 switch (ToolChain.getArch()) {
3216 case llvm::Triple::arm:
3217 case llvm::Triple::armeb:
3218 case llvm::Triple::thumb:
3219 case llvm::Triple::thumbeb:
3220 case llvm::Triple::aarch64:
3221 case llvm::Triple::mips:
3222 case llvm::Triple::mipsel:
3223 case llvm::Triple::mips64:
3224 case llvm::Triple::mips64el:
3225 PIC = true; // "-fpic"
3226 break;
3227
3228 case llvm::Triple::x86:
3229 case llvm::Triple::x86_64:
3230 PIC = true; // "-fPIC"
3231 IsPICLevelTwo = true;
3232 break;
3233
3234 default:
3235 break;
3236 }
3237 }
3238
3239 // OpenBSD-specific defaults for PIE
3240 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3241 switch (ToolChain.getArch()) {
3242 case llvm::Triple::mips64:
3243 case llvm::Triple::mips64el:
3244 case llvm::Triple::sparcel:
3245 case llvm::Triple::x86:
3246 case llvm::Triple::x86_64:
3247 IsPICLevelTwo = false; // "-fpie"
3248 break;
3249
3250 case llvm::Triple::ppc:
3251 case llvm::Triple::sparc:
3252 case llvm::Triple::sparcv9:
3253 IsPICLevelTwo = true; // "-fPIE"
3254 break;
3255
3256 default:
3257 break;
3258 }
3259 }
3260
3261 // The last argument relating to either PIC or PIE wins, and no
3262 // other argument is used. If the last argument is any flavor of the
3263 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3264 // option implicitly enables PIC at the same level.
3265 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3266 options::OPT_fpic, options::OPT_fno_pic,
3267 options::OPT_fPIE, options::OPT_fno_PIE,
3268 options::OPT_fpie, options::OPT_fno_pie);
3269 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3270 // is forced, then neither PIC nor PIE flags will have no effect.
3271 if (!ToolChain.isPICDefaultForced()) {
3272 if (LastPICArg) {
3273 Option O = LastPICArg->getOption();
3274 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3275 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3276 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3277 PIC =
3278 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3279 IsPICLevelTwo =
3280 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3281 } else {
3282 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003283 if (Triple.isPS4CPU()) {
3284 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3285 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3286 if (Model != "kernel") {
3287 PIC = true;
3288 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3289 << LastPICArg->getSpelling();
3290 }
3291 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003292 }
3293 }
3294 }
3295
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003296 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3297 // PIC level would've been set to level 1, force it back to level 2 PIC
3298 // instead.
3299 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003300 IsPICLevelTwo |= ToolChain.isPICDefault();
3301
James Y Knightc4015d32015-08-21 04:14:55 +00003302 // This kernel flags are a trump-card: they will disable PIC/PIE
3303 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003304 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3305 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003306 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003307
3308 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3309 // This is a very special mode. It trumps the other modes, almost no one
3310 // uses it, and it isn't even valid on any OS but Darwin.
3311 if (!ToolChain.getTriple().isOSDarwin())
3312 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3313 << A->getSpelling() << ToolChain.getTriple().str();
3314
3315 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3316
3317 // Only a forced PIC mode can cause the actual compile to have PIC defines
3318 // etc., no flags are sufficient. This behavior was selected to closely
3319 // match that of llvm-gcc and Apple GCC before that.
3320 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3321
3322 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3323 }
3324
3325 if (PIC)
3326 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3327
3328 return std::make_tuple(llvm::Reloc::Static, 0, false);
3329}
3330
3331static const char *RelocationModelName(llvm::Reloc::Model Model) {
3332 switch (Model) {
3333 case llvm::Reloc::Default:
3334 return nullptr;
3335 case llvm::Reloc::Static:
3336 return "static";
3337 case llvm::Reloc::PIC_:
3338 return "pic";
3339 case llvm::Reloc::DynamicNoPIC:
3340 return "dynamic-no-pic";
3341 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003342 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003343}
3344
3345static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3346 ArgStringList &CmdArgs) {
3347 llvm::Reloc::Model RelocationModel;
3348 unsigned PICLevel;
3349 bool IsPIE;
3350 std::tie(RelocationModel, PICLevel, IsPIE) =
3351 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3352
3353 if (RelocationModel != llvm::Reloc::Static)
3354 CmdArgs.push_back("-KPIC");
3355}
3356
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003357void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003358 const InputInfo &Output, const InputInfoList &Inputs,
3359 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003360 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3361 const llvm::Triple Triple(TripleStr);
3362
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003363 bool KernelOrKext =
3364 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003365 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003366 ArgStringList CmdArgs;
3367
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003368 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003369 bool IsWindowsCygnus =
3370 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003371 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003372 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003373
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003374 // Check number of inputs for sanity. We need at least one input.
3375 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003376 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003377 // CUDA compilation may have multiple inputs (source file + results of
3378 // device-side compilations). All other jobs are expected to have exactly one
3379 // input.
3380 bool IsCuda = types::isCuda(Input.getType());
3381 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003382
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003383 // Invoke ourselves in -cc1 mode.
3384 //
3385 // FIXME: Implement custom jobs for internal actions.
3386 CmdArgs.push_back("-cc1");
3387
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003388 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003389 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003390 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003391
Artem Belevichfa11ab52015-11-17 22:28:46 +00003392 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003393 if (IsCuda) {
3394 // FIXME: We need a (better) way to pass information about
3395 // particular compilation pass we're constructing here. For now we
3396 // can check which toolchain we're using and pick the other one to
3397 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003398 if (&getToolChain() == C.getCudaDeviceToolChain())
3399 AuxToolChain = C.getCudaHostToolChain();
3400 else if (&getToolChain() == C.getCudaHostToolChain())
3401 AuxToolChain = C.getCudaDeviceToolChain();
3402 else
3403 llvm_unreachable("Can't figure out CUDA compilation mode.");
3404 assert(AuxToolChain != nullptr && "No aux toolchain.");
3405 CmdArgs.push_back("-aux-triple");
3406 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003407 CmdArgs.push_back("-fcuda-target-overloads");
3408 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003409 }
3410
James Y Knight2db38f32015-08-15 03:45:25 +00003411 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3412 Triple.getArch() == llvm::Triple::thumb)) {
3413 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003414 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003415 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003416 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003417 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003418 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003419 }
3420
Tim Northover336f1892014-03-29 13:16:12 +00003421 // Push all default warning arguments that are specific to
3422 // the given target. These come before user provided warning options
3423 // are provided.
3424 getToolChain().addClangWarningOptions(CmdArgs);
3425
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003426 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003427 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003428
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003429 if (isa<AnalyzeJobAction>(JA)) {
3430 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3431 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003432 } else if (isa<MigrateJobAction>(JA)) {
3433 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003434 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003435 if (Output.getType() == types::TY_Dependencies)
3436 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003437 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003438 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003439 if (Args.hasArg(options::OPT_rewrite_objc) &&
3440 !Args.hasArg(options::OPT_g_Group))
3441 CmdArgs.push_back("-P");
3442 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003443 } else if (isa<AssembleJobAction>(JA)) {
3444 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003445
David Blaikie9260ed62013-07-25 21:19:01 +00003446 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003447
3448 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003449 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003450 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003451 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003452 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003453
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003454 if (JA.getType() == types::TY_Nothing)
3455 CmdArgs.push_back("-fsyntax-only");
3456 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003457 CmdArgs.push_back("-emit-pch");
3458 else
3459 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003460 } else if (isa<VerifyPCHJobAction>(JA)) {
3461 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003462 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003463 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3464 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003465 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003466 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003467 } else if (JA.getType() == types::TY_LLVM_IR ||
3468 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003469 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003470 } else if (JA.getType() == types::TY_LLVM_BC ||
3471 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003472 CmdArgs.push_back("-emit-llvm-bc");
3473 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003474 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003475 } else if (JA.getType() == types::TY_AST) {
3476 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003477 } else if (JA.getType() == types::TY_ModuleFile) {
3478 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003479 } else if (JA.getType() == types::TY_RewrittenObjC) {
3480 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003481 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003482 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3483 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003484 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003485 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003486 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003487 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003488
3489 // Preserve use-list order by default when emitting bitcode, so that
3490 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3491 // same result as running passes here. For LTO, we don't need to preserve
3492 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003493 if (JA.getType() == types::TY_LLVM_BC)
3494 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003495
3496 if (D.isUsingLTO())
3497 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003498 }
3499
Teresa Johnsonaff22322015-12-07 19:21:34 +00003500 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3501 if (!types::isLLVMIR(Input.getType()))
3502 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3503 << "-x ir";
3504 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3505 }
3506
Justin Bognera88f0122014-06-20 22:59:50 +00003507 // We normally speed up the clang process a bit by skipping destructors at
3508 // exit, but when we're generating diagnostics we can rely on some of the
3509 // cleanup.
3510 if (!C.isForDiagnostics())
3511 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003512
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003513// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003514#ifdef NDEBUG
3515 CmdArgs.push_back("-disable-llvm-verifier");
3516#endif
3517
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003518 // Set the main file name, so that debug info works even with
3519 // -save-temps.
3520 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003521 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003522
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003523 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003524 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003525 if (Args.hasArg(options::OPT_static))
3526 CmdArgs.push_back("-static-define");
3527
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003528 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003529 // Enable region store model by default.
3530 CmdArgs.push_back("-analyzer-store=region");
3531
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003532 // Treat blocks as analysis entry points.
3533 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3534
Ted Kremenek49c79792011-03-24 00:28:47 +00003535 CmdArgs.push_back("-analyzer-eagerly-assume");
3536
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003537 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003538 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003539 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003540
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003541 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003542 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003543
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003544 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003545 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003546
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003547 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003548
Artem Belevichba558952015-05-06 18:20:23 +00003549 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003550 CmdArgs.push_back("-analyzer-checker=cplusplus");
3551
Nico Webere8e53112014-05-11 01:04:02 +00003552 // Enable the following experimental checkers for testing.
3553 CmdArgs.push_back(
3554 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003555 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3556 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003557 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003558 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3559 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003560
3561 // Default nullability checks.
3562 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3563 CmdArgs.push_back(
3564 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003565 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003566
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003567 // Set the output format. The default is plist, for (lame) historical
3568 // reasons.
3569 CmdArgs.push_back("-analyzer-output");
3570 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003571 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003572 else
3573 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003574
Ted Kremenekfe449a22010-03-22 22:32:05 +00003575 // Disable the presentation of standard compiler warnings when
3576 // using --analyze. We only want to show static analyzer diagnostics
3577 // or frontend errors.
3578 CmdArgs.push_back("-w");
3579
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003580 // Add -Xanalyzer arguments when running as analyzer.
3581 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003582 }
3583
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003584 CheckCodeGenerationOptions(D, Args);
3585
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003586 llvm::Reloc::Model RelocationModel;
3587 unsigned PICLevel;
3588 bool IsPIE;
3589 std::tie(RelocationModel, PICLevel, IsPIE) =
3590 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003591
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003592 const char *RMName = RelocationModelName(RelocationModel);
3593 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003594 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003595 CmdArgs.push_back(RMName);
3596 }
3597 if (PICLevel > 0) {
3598 CmdArgs.push_back("-pic-level");
3599 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3600 if (IsPIE) {
3601 CmdArgs.push_back("-pie-level");
3602 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003603 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003604 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003605
Renato Golin4854d802015-11-09 12:40:41 +00003606 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3607 CmdArgs.push_back("-meabi");
3608 CmdArgs.push_back(A->getValue());
3609 }
3610
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003611 CmdArgs.push_back("-mthread-model");
3612 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3613 CmdArgs.push_back(A->getValue());
3614 else
3615 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3616
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003617 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3618
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003619 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3620 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003621 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003622
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003623 // LLVM Code Generator Options.
3624
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003625 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3626 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003627 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3628 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003629 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003630 CmdArgs.push_back(A->getValue());
3631 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003632 }
3633 }
3634
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003635 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3636 StringRef v = A->getValue();
3637 CmdArgs.push_back("-mllvm");
3638 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3639 A->claim();
3640 }
3641
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003642 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3643 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003644 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003645 }
3646
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003647 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3648 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003649 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003650 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003651 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003652 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3653 CmdArgs.push_back("-fpcc-struct-return");
3654 } else {
3655 assert(A->getOption().matches(options::OPT_freg_struct_return));
3656 CmdArgs.push_back("-freg-struct-return");
3657 }
3658 }
3659
Roman Divacky65b88cd2011-03-01 17:40:53 +00003660 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3661 CmdArgs.push_back("-mrtd");
3662
Rafael Espindola224dd632011-12-14 21:02:23 +00003663 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003664 CmdArgs.push_back("-mdisable-fp-elim");
3665 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3666 options::OPT_fno_zero_initialized_in_bss))
3667 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003668
3669 bool OFastEnabled = isOptimizationLevelFast(Args);
3670 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3671 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003672 OptSpecifier StrictAliasingAliasOption =
3673 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003674 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3675 // doesn't do any TBAA.
3676 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003677 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003678 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003679 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003680 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3681 options::OPT_fno_struct_path_tbaa))
3682 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003683 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3684 false))
3685 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003686 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3687 options::OPT_fno_strict_vtable_pointers,
3688 false))
3689 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003690 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3691 options::OPT_fno_optimize_sibling_calls))
3692 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003693
Eric Christopher006208c2013-04-04 06:29:47 +00003694 // Handle segmented stacks.
3695 if (Args.hasArg(options::OPT_fsplit_stack))
3696 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003697
3698 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3699 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003700 OptSpecifier FastMathAliasOption =
3701 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3702
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003703 // Handle various floating point optimization flags, mapping them to the
3704 // appropriate LLVM code generation flags. The pattern for all of these is to
3705 // default off the codegen optimizations, and if any flag enables them and no
3706 // flag disables them after the flag enabling them, enable the codegen
3707 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003708 if (Arg *A = Args.getLastArg(
3709 options::OPT_ffast_math, FastMathAliasOption,
3710 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3711 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3712 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003713 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3714 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003715 A->getOption().getID() != options::OPT_fhonor_infinities)
3716 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003717 if (Arg *A = Args.getLastArg(
3718 options::OPT_ffast_math, FastMathAliasOption,
3719 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3720 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3721 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003722 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3723 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003724 A->getOption().getID() != options::OPT_fhonor_nans)
3725 CmdArgs.push_back("-menable-no-nans");
3726
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003727 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3728 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003729 if (Arg *A =
3730 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3731 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3732 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003733 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3734 // However, turning *off* -ffast_math merely restores the toolchain default
3735 // (which may be false).
3736 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3737 A->getOption().getID() == options::OPT_ffast_math ||
3738 A->getOption().getID() == options::OPT_Ofast)
3739 MathErrno = false;
3740 else if (A->getOption().getID() == options::OPT_fmath_errno)
3741 MathErrno = true;
3742 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003743 if (MathErrno)
3744 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003745
3746 // There are several flags which require disabling very specific
3747 // optimizations. Any of these being disabled forces us to turn off the
3748 // entire set of LLVM optimizations, so collect them through all the flag
3749 // madness.
3750 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003751 if (Arg *A = Args.getLastArg(
3752 options::OPT_ffast_math, FastMathAliasOption,
3753 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3754 options::OPT_fno_unsafe_math_optimizations,
3755 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003756 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3757 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003758 A->getOption().getID() != options::OPT_fno_associative_math)
3759 AssociativeMath = true;
3760 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003761 if (Arg *A = Args.getLastArg(
3762 options::OPT_ffast_math, FastMathAliasOption,
3763 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3764 options::OPT_fno_unsafe_math_optimizations,
3765 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003766 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3767 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003768 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3769 ReciprocalMath = true;
3770 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003771 if (Arg *A = Args.getLastArg(
3772 options::OPT_ffast_math, FastMathAliasOption,
3773 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3774 options::OPT_fno_unsafe_math_optimizations,
3775 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003776 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3777 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003778 A->getOption().getID() != options::OPT_fsigned_zeros)
3779 SignedZeros = false;
3780 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003781 if (Arg *A = Args.getLastArg(
3782 options::OPT_ffast_math, FastMathAliasOption,
3783 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3784 options::OPT_fno_unsafe_math_optimizations,
3785 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003786 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3787 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003788 A->getOption().getID() != options::OPT_ftrapping_math)
3789 TrappingMath = false;
3790 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3791 !TrappingMath)
3792 CmdArgs.push_back("-menable-unsafe-fp-math");
3793
Sanjay Patel76c9e092015-01-23 16:40:50 +00003794 if (!SignedZeros)
3795 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003796
Sanjay Patel359b1052015-04-09 15:03:23 +00003797 if (ReciprocalMath)
3798 CmdArgs.push_back("-freciprocal-math");
3799
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003800 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003801 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003802 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003803 options::OPT_ffp_contract)) {
3804 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003805 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003806 if (Val == "fast" || Val == "on" || Val == "off") {
3807 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3808 } else {
3809 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003810 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003811 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003812 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3813 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003814 // If fast-math is set then set the fp-contract mode to fast.
3815 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3816 }
3817 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003818
Sanjay Patel2987c292015-06-11 14:53:41 +00003819 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003820
Bob Wilson6a039162012-07-19 03:52:53 +00003821 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3822 // and if we find them, tell the frontend to provide the appropriate
3823 // preprocessor macros. This is distinct from enabling any optimizations as
3824 // these options induce language changes which must survive serialization
3825 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003826 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3827 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003828 if (!A->getOption().matches(options::OPT_fno_fast_math))
3829 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003830 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3831 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003832 if (A->getOption().matches(options::OPT_ffinite_math_only))
3833 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003834
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003835 // Decide whether to use verbose asm. Verbose assembly is the default on
3836 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003837 bool IsIntegratedAssemblerDefault =
3838 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003839 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003840 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003841 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003842 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003843
Rafael Espindolab8a12932015-05-22 20:44:03 +00003844 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3845 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003846 CmdArgs.push_back("-no-integrated-as");
3847
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003848 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3849 CmdArgs.push_back("-mdebug-pass");
3850 CmdArgs.push_back("Structure");
3851 }
3852 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3853 CmdArgs.push_back("-mdebug-pass");
3854 CmdArgs.push_back("Arguments");
3855 }
3856
John McCall8517abc2010-02-19 02:45:38 +00003857 // Enable -mconstructor-aliases except on darwin, where we have to
3858 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003859 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003860 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003861
John McCall7ef5cb32011-03-18 02:56:14 +00003862 // Darwin's kernel doesn't support guard variables; just die if we
3863 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003864 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003865 CmdArgs.push_back("-fforbid-guard-variables");
3866
Akira Hatanaka02028482015-11-12 17:21:22 +00003867 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3868 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003869 CmdArgs.push_back("-mms-bitfields");
3870 }
John McCall8517abc2010-02-19 02:45:38 +00003871
Daniel Dunbar306945d2009-09-16 06:17:29 +00003872 // This is a coarse approximation of what llvm-gcc actually does, both
3873 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3874 // complicated ways.
3875 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003876 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3877 options::OPT_fno_asynchronous_unwind_tables,
3878 (getToolChain().IsUnwindTablesDefault() ||
3879 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3880 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003881 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3882 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003883 CmdArgs.push_back("-munwind-tables");
3884
Chandler Carruth05fb5852012-11-21 23:40:23 +00003885 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003886
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003887 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3888 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003889 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003890 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003891
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003892 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003893 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003894
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003895 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003896 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003897 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003898 }
3899
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003900 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003901 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003902 if (!CPU.empty()) {
3903 CmdArgs.push_back("-target-cpu");
3904 CmdArgs.push_back(Args.MakeArgString(CPU));
3905 }
3906
Rafael Espindolaeb265472013-08-21 21:59:03 +00003907 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3908 CmdArgs.push_back("-mfpmath");
3909 CmdArgs.push_back(A->getValue());
3910 }
3911
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003912 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003913 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003914
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003915 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003916 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003917 default:
3918 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003919
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003920 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003921 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003922 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003923 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003924 // Use the effective triple, which takes into account the deployment target.
3925 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003926 break;
3927
Tim Northover573cbee2014-05-24 12:52:07 +00003928 case llvm::Triple::aarch64:
3929 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003930 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003931 break;
3932
Eric Christopher0b26a612010-03-02 02:41:08 +00003933 case llvm::Triple::mips:
3934 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003935 case llvm::Triple::mips64:
3936 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003937 AddMIPSTargetArgs(Args, CmdArgs);
3938 break;
3939
Ulrich Weigand8afad612014-07-28 13:17:52 +00003940 case llvm::Triple::ppc:
3941 case llvm::Triple::ppc64:
3942 case llvm::Triple::ppc64le:
3943 AddPPCTargetArgs(Args, CmdArgs);
3944 break;
3945
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003946 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003947 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003948 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003949 AddSparcTargetArgs(Args, CmdArgs);
3950 break;
3951
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003952 case llvm::Triple::x86:
3953 case llvm::Triple::x86_64:
3954 AddX86TargetArgs(Args, CmdArgs);
3955 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003956
3957 case llvm::Triple::hexagon:
3958 AddHexagonTargetArgs(Args, CmdArgs);
3959 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003960 }
3961
Douglas Katzman3459ce22015-10-08 04:24:12 +00003962 // The 'g' groups options involve a somewhat intricate sequence of decisions
3963 // about what to pass from the driver to the frontend, but by the time they
3964 // reach cc1 they've been factored into two well-defined orthogonal choices:
3965 // * what level of debug info to generate
3966 // * what dwarf version to write
3967 // This avoids having to monkey around further in cc1 other than to disable
3968 // codeview if not running in a Windows environment. Perhaps even that
3969 // decision should be made in the driver as well though.
3970 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3971 CodeGenOptions::NoDebugInfo;
3972 // These two are potentially updated by AddClangCLArgs.
3973 unsigned DwarfVersion = 0;
3974 bool EmitCodeView = false;
3975
Hans Wennborg75958c42013-08-08 00:17:41 +00003976 // Add clang-cl arguments.
3977 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003978 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003979
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003980 // Pass the linker version in use.
3981 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3982 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003983 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003984 }
3985
Eric Christopherb7d97e92013-04-03 01:58:53 +00003986 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003987 CmdArgs.push_back("-momit-leaf-frame-pointer");
3988
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003989 // Explicitly error on some things we know we don't support and can't just
3990 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003991 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003992 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3993 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003994 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003995 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003996 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3997 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003998 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003999 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004000 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004001 }
4002
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004003 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004004 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004005 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004006 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004007 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4008 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004009 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004010 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004011 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004012
Chad Rosierbe10f982011-08-02 17:58:04 +00004013 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004014 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004015 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4016 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004017 }
4018
Rafael Espindola08a692a2010-03-07 04:46:18 +00004019 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004020 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004021 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004022 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
4023 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
4024 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00004025 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00004026 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004027 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00004028 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00004029 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004030 // Some 'g' group option other than one expressly disabling debug info
4031 // must have been the final (winning) one. They're all equivalent.
4032 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00004033 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004034 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004035
Douglas Katzman3459ce22015-10-08 04:24:12 +00004036 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
4037 // (because that would mean that "-g0" was the rightmost 'g' group option).
4038 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
4039 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
4040 // exists of removing the gdwarf options from the g_group.
4041 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
4042 options::OPT_gdwarf_4))
4043 DwarfVersion = DwarfVersionNum(A->getSpelling());
4044
Reid Kleckner124955a2015-08-05 18:51:13 +00004045 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004046 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4047 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4048 // DwarfVersion remains at 0 if no explicit choice was made.
4049 CmdArgs.push_back("-gcodeview");
4050 } else if (DwarfVersion == 0 &&
4051 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4052 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4053 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004054
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004055 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4056 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004057
4058 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004059 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004060 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004061 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004062
Eric Christopher138c32b2013-09-13 22:37:55 +00004063 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004064 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004065 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004066 CmdArgs.push_back("-dwarf-ext-refs");
4067 CmdArgs.push_back("-fmodule-format=obj");
4068 }
4069
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004070 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4071 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004072 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004073 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004074 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004075 CmdArgs.push_back("-backend-option");
4076 CmdArgs.push_back("-split-dwarf=Enable");
4077 }
4078
Douglas Katzman3459ce22015-10-08 04:24:12 +00004079 // After we've dealt with all combinations of things that could
4080 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4081 // figure out if we need to "upgrade" it to standalone debug info.
4082 // We parse these two '-f' options whether or not they will be used,
4083 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4084 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4085 options::OPT_fno_standalone_debug,
4086 getToolChain().GetDefaultStandaloneDebug());
4087 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4088 DebugInfoKind = CodeGenOptions::FullDebugInfo;
4089 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
4090
Eric Christopher138c32b2013-09-13 22:37:55 +00004091 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4092 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4093 CmdArgs.push_back("-backend-option");
4094 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4095 }
Eric Christophereec89c22013-06-18 00:03:50 +00004096
Eric Christopher0d403d22014-02-14 01:27:03 +00004097 // -gdwarf-aranges turns on the emission of the aranges section in the
4098 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004099 // Always enabled on the PS4.
4100 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004101 CmdArgs.push_back("-backend-option");
4102 CmdArgs.push_back("-generate-arange-section");
4103 }
4104
David Blaikief36d9ba2014-01-27 18:52:43 +00004105 if (Args.hasFlag(options::OPT_fdebug_types_section,
4106 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004107 CmdArgs.push_back("-backend-option");
4108 CmdArgs.push_back("-generate-type-units");
4109 }
Eric Christophereec89c22013-06-18 00:03:50 +00004110
Ed Schouten6e576152015-03-26 17:50:28 +00004111 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4112 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4113
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004114 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004115 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004116 CmdArgs.push_back("-ffunction-sections");
4117 }
4118
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004119 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4120 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004121 CmdArgs.push_back("-fdata-sections");
4122 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004123
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004124 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004125 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004126 CmdArgs.push_back("-fno-unique-section-names");
4127
Chris Lattner3c77a352010-06-22 00:03:40 +00004128 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4129
Diego Novilloa0545962015-07-10 18:00:07 +00004130 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004131
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004132 // Pass options for controlling the default header search paths.
4133 if (Args.hasArg(options::OPT_nostdinc)) {
4134 CmdArgs.push_back("-nostdsysteminc");
4135 CmdArgs.push_back("-nobuiltininc");
4136 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004137 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004138 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004139 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4140 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4141 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004142
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004143 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004144 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004145 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004146
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004147 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4148
Ted Kremenekf7639e12012-03-06 20:06:33 +00004149 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004150 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004151 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004152 options::OPT_ccc_arcmt_modify,
4153 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004154 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004155 switch (A->getOption().getID()) {
4156 default:
4157 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004158 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004159 CmdArgs.push_back("-arcmt-check");
4160 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004161 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004162 CmdArgs.push_back("-arcmt-modify");
4163 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004164 case options::OPT_ccc_arcmt_migrate:
4165 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004166 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004167 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004168
4169 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4170 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004171 break;
John McCalld70fb982011-06-15 23:25:17 +00004172 }
4173 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004174 } else {
4175 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4176 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4177 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004178 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004179
Ted Kremenekf7639e12012-03-06 20:06:33 +00004180 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4181 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004182 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4183 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004184 }
4185 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004186 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004187
4188 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004189 options::OPT_objcmt_migrate_subscripting,
4190 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004191 // None specified, means enable them all.
4192 CmdArgs.push_back("-objcmt-migrate-literals");
4193 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004194 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004195 } else {
4196 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4197 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004198 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004199 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004200 } else {
4201 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4202 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4203 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4204 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4205 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4206 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004207 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004208 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4209 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4210 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4211 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4212 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4213 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4214 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004215 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004216 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004217 }
4218
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004219 // Add preprocessing options like -I, -D, etc. if we are using the
4220 // preprocessor.
4221 //
4222 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004223 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004224 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4225 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004226
Rafael Espindolaa7431922011-07-21 23:40:37 +00004227 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4228 // that "The compiler can only warn and ignore the option if not recognized".
4229 // When building with ccache, it will pass -D options to clang even on
4230 // preprocessed inputs and configure concludes that -fPIC is not supported.
4231 Args.ClaimAllArgs(options::OPT_D);
4232
Alp Toker7874bdc2013-11-15 20:40:58 +00004233 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004234 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4235 if (A->getOption().matches(options::OPT_O4)) {
4236 CmdArgs.push_back("-O3");
4237 D.Diag(diag::warn_O4_is_O3);
4238 } else {
4239 A->render(Args, CmdArgs);
4240 }
4241 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004242
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004243 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004244 for (const Arg *A :
4245 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4246 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004247 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004248 }
4249
Rafael Espindola577637a2015-01-03 00:06:04 +00004250 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004251
Richard Smith3be1cb22014-08-07 00:24:21 +00004252 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004253 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004254 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4255 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004256 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004257 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004258
4259 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004260 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004261 //
4262 // If a std is supplied, only add -trigraphs if it follows the
4263 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004264 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004265 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4266 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004267 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004268 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004269 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004270 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004271 else
4272 Std->render(Args, CmdArgs);
4273
Nico Weber00721502014-12-23 22:32:37 +00004274 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004275 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004276 options::OPT_ftrigraphs,
4277 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004278 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004279 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004280 } else {
4281 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004282 //
4283 // FIXME: Clang doesn't correctly handle -std= when the input language
4284 // doesn't match. For the time being just ignore this for C++ inputs;
4285 // eventually we want to do all the standard defaulting here instead of
4286 // splitting it between the driver and clang -cc1.
4287 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004288 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4289 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004290 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004291 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004292
Nico Weber00721502014-12-23 22:32:37 +00004293 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4294 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004295 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004296
Richard Smith282b4492013-09-04 22:50:31 +00004297 // GCC's behavior for -Wwrite-strings is a bit strange:
4298 // * In C, this "warning flag" changes the types of string literals from
4299 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4300 // for the discarded qualifier.
4301 // * In C++, this is just a normal warning flag.
4302 //
4303 // Implementing this warning correctly in C is hard, so we follow GCC's
4304 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4305 // a non-const char* in C, rather than using this crude hack.
4306 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004307 // FIXME: This should behave just like a warning flag, and thus should also
4308 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4309 Arg *WriteStrings =
4310 Args.getLastArg(options::OPT_Wwrite_strings,
4311 options::OPT_Wno_write_strings, options::OPT_w);
4312 if (WriteStrings &&
4313 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004314 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004315 }
4316
Chandler Carruth61fbf622011-04-23 09:27:53 +00004317 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004318 // during C++ compilation, which it is by default. GCC keeps this define even
4319 // in the presence of '-w', match this behavior bug-for-bug.
4320 if (types::isCXX(InputType) &&
4321 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4322 true)) {
4323 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004324 }
4325
Chandler Carruthe0391482010-05-22 02:21:53 +00004326 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4327 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4328 if (Asm->getOption().matches(options::OPT_fasm))
4329 CmdArgs.push_back("-fgnu-keywords");
4330 else
4331 CmdArgs.push_back("-fno-gnu-keywords");
4332 }
4333
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004334 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4335 CmdArgs.push_back("-fno-dwarf-directory-asm");
4336
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004337 if (ShouldDisableAutolink(Args, getToolChain()))
4338 CmdArgs.push_back("-fno-autolink");
4339
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004340 // Add in -fdebug-compilation-dir if necessary.
4341 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004342
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004343 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4344 StringRef Map = A->getValue();
4345 if (Map.find('=') == StringRef::npos)
4346 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4347 else
4348 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4349 A->claim();
4350 }
4351
Richard Smith9a568822011-11-21 19:36:32 +00004352 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4353 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004354 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004355 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004356 }
4357
Richard Smith79c927b2013-11-06 19:31:51 +00004358 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4359 CmdArgs.push_back("-foperator-arrow-depth");
4360 CmdArgs.push_back(A->getValue());
4361 }
4362
Richard Smith9a568822011-11-21 19:36:32 +00004363 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4364 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004365 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004366 }
4367
Richard Smitha3d3bd22013-05-08 02:12:03 +00004368 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4369 CmdArgs.push_back("-fconstexpr-steps");
4370 CmdArgs.push_back(A->getValue());
4371 }
4372
Richard Smithb3a14522013-02-22 01:59:51 +00004373 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4374 CmdArgs.push_back("-fbracket-depth");
4375 CmdArgs.push_back(A->getValue());
4376 }
4377
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004378 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4379 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004380 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004381 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004382 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4383 } else
4384 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004385 }
4386
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004387 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004388 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004389
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004390 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4391 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004392 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004393 }
David Chisnall5778fce2009-08-31 16:41:57 +00004394
Chris Lattnere23003d2010-01-09 21:54:33 +00004395 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4396 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004397 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004398 }
4399
Chris Lattnerb35583d2010-04-07 20:49:23 +00004400 CmdArgs.push_back("-ferror-limit");
4401 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004402 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004403 else
4404 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004405
Chandler Carrutha77a7272010-05-06 04:55:18 +00004406 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4407 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004408 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004409 }
4410
4411 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4412 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004413 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004414 }
4415
Richard Smithf6f003a2011-12-16 19:06:07 +00004416 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4417 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004418 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004419 }
4420
Nick Lewycky24653262014-12-16 21:39:02 +00004421 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4422 CmdArgs.push_back("-fspell-checking-limit");
4423 CmdArgs.push_back(A->getValue());
4424 }
4425
Daniel Dunbar2c978472009-11-04 06:24:47 +00004426 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004427 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004428 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004429 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004430 } else {
4431 // If -fmessage-length=N was not specified, determine whether this is a
4432 // terminal and, if so, implicitly define -fmessage-length appropriately.
4433 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004434 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004435 }
4436
John McCallb4a99d32013-02-19 01:57:35 +00004437 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4438 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4439 options::OPT_fvisibility_ms_compat)) {
4440 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4441 CmdArgs.push_back("-fvisibility");
4442 CmdArgs.push_back(A->getValue());
4443 } else {
4444 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4445 CmdArgs.push_back("-fvisibility");
4446 CmdArgs.push_back("hidden");
4447 CmdArgs.push_back("-ftype-visibility");
4448 CmdArgs.push_back("default");
4449 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004450 }
4451
Douglas Gregor08329632010-06-15 17:05:35 +00004452 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004453
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004454 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4455
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004456 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004457 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4458 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004459 CmdArgs.push_back("-ffreestanding");
4460
Daniel Dunbare357d562009-12-03 18:42:11 +00004461 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004462 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004463 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004464 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004465 // Emulated TLS is enabled by default on Android, and can be enabled manually
4466 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004467 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004468 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4469 EmulatedTLSDefault))
4470 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004471 // AltiVec-like language extensions aren't relevant for assembling.
4472 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004473 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004474 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4475 }
Richard Trieu91844232012-06-26 18:18:47 +00004476 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4477 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004478
Alexey Bataevdb390212015-05-20 04:24:19 +00004479 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004480 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4481 options::OPT_fno_openmp, false))
4482 switch (getOpenMPRuntime(getToolChain(), Args)) {
4483 case OMPRT_OMP:
4484 case OMPRT_IOMP5:
4485 // Clang can generate useful OpenMP code for these two runtime libraries.
4486 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004487
4488 // If no option regarding the use of TLS in OpenMP codegeneration is
4489 // given, decide a default based on the target. Otherwise rely on the
4490 // options and pass the right information to the frontend.
4491 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004492 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004493 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004494 break;
4495 default:
4496 // By default, if Clang doesn't know how to generate useful OpenMP code
4497 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4498 // down to the actual compilation.
4499 // FIXME: It would be better to have a mode which *only* omits IR
4500 // generation based on the OpenMP support so that we get consistent
4501 // semantic analysis, etc.
4502 break;
4503 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004504
Peter Collingbourne32701642013-11-01 18:16:25 +00004505 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004506 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004507
Eric Christopher459d2712013-02-19 06:16:53 +00004508 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004509 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4510 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4511 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4512 Arch == llvm::Triple::ppc64le))
4513 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4514 << "ppc/ppc64/ppc64le";
4515 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004516
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004517 // -fzvector is incompatible with -faltivec.
4518 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4519 if (Args.hasArg(options::OPT_faltivec))
4520 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4521 << "-faltivec";
4522
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004523 if (getToolChain().SupportsProfiling())
4524 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004525
4526 // -flax-vector-conversions is default.
4527 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4528 options::OPT_fno_lax_vector_conversions))
4529 CmdArgs.push_back("-fno-lax-vector-conversions");
4530
John Brawna7b4ec02015-08-10 11:11:28 +00004531 if (Args.getLastArg(options::OPT_fapple_kext) ||
4532 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004533 CmdArgs.push_back("-fapple-kext");
4534
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004535 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004536 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004537 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004538 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4539 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004540
4541 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4542 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004543 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004544 }
4545
Bob Wilson14adb362012-02-03 06:27:22 +00004546 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004547
Chandler Carruth6e501032011-03-27 00:04:55 +00004548 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4549 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004550 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004551 if (A->getOption().matches(options::OPT_fwrapv))
4552 CmdArgs.push_back("-fwrapv");
4553 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4554 options::OPT_fno_strict_overflow)) {
4555 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4556 CmdArgs.push_back("-fwrapv");
4557 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004558
4559 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4560 options::OPT_fno_reroll_loops))
4561 if (A->getOption().matches(options::OPT_freroll_loops))
4562 CmdArgs.push_back("-freroll-loops");
4563
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004564 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004565 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4566 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004567
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004568 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4569
Daniel Dunbar4930e332009-11-17 08:07:36 +00004570 // -stack-protector=0 is default.
4571 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004572 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4573 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4574 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4575 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4576 Args.ClaimAllArgs(options::OPT_fstack_protector);
4577 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004578 options::OPT_fstack_protector_all,
4579 options::OPT_fstack_protector_strong,
4580 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004581 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004582 StackProtectorLevel = std::max<unsigned>(
4583 LangOptions::SSPOn,
4584 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004585 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004586 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004587 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004588 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004589 } else {
4590 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004591 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004592 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004593 if (StackProtectorLevel) {
4594 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004595 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004596 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004597
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004598 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004599 for (const Arg *A : Args.filtered(options::OPT__param)) {
4600 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004601 if (Str.startswith("ssp-buffer-size=")) {
4602 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004603 CmdArgs.push_back("-stack-protector-buffer-size");
4604 // FIXME: Verify the argument is a valid integer.
4605 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004606 }
Sean Silva14facf32015-06-09 01:57:17 +00004607 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004608 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004609 }
4610
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004611 // Translate -mstackrealign
4612 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004613 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004614 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004615
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004616 if (Args.hasArg(options::OPT_mstack_alignment)) {
4617 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4618 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004619 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004620
Hans Wennborg77dc2362015-01-20 19:45:50 +00004621 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4622 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4623
4624 if (!Size.empty())
4625 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4626 else
4627 CmdArgs.push_back("-mstack-probe-size=0");
4628 }
4629
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004630 switch (getToolChain().getArch()) {
4631 case llvm::Triple::aarch64:
4632 case llvm::Triple::aarch64_be:
4633 case llvm::Triple::arm:
4634 case llvm::Triple::armeb:
4635 case llvm::Triple::thumb:
4636 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004637 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004638 break;
4639
4640 default:
4641 break;
4642 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004643
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004644 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4645 options::OPT_mno_restrict_it)) {
4646 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4647 CmdArgs.push_back("-backend-option");
4648 CmdArgs.push_back("-arm-restrict-it");
4649 } else {
4650 CmdArgs.push_back("-backend-option");
4651 CmdArgs.push_back("-arm-no-restrict-it");
4652 }
James Y Knight2db38f32015-08-15 03:45:25 +00004653 } else if (Triple.isOSWindows() &&
4654 (Triple.getArch() == llvm::Triple::arm ||
4655 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004656 // Windows on ARM expects restricted IT blocks
4657 CmdArgs.push_back("-backend-option");
4658 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004659 }
4660
Daniel Dunbard18049a2009-04-07 21:16:11 +00004661 // Forward -f options with positive and negative forms; we translate
4662 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004663 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4664 StringRef fname = A->getValue();
4665 if (!llvm::sys::fs::exists(fname))
4666 D.Diag(diag::err_drv_no_such_file) << fname;
4667 else
4668 A->render(Args, CmdArgs);
4669 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004670
John Brawna7b4ec02015-08-10 11:11:28 +00004671 // -fbuiltin is default unless -mkernel is used
4672 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4673 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004674 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004675
Nuno Lopes13c88c72009-12-16 16:59:22 +00004676 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4677 options::OPT_fno_assume_sane_operator_new))
4678 CmdArgs.push_back("-fno-assume-sane-operator-new");
4679
Daniel Dunbar4930e332009-11-17 08:07:36 +00004680 // -fblocks=0 is default.
4681 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004682 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004683 (Args.hasArg(options::OPT_fgnu_runtime) &&
4684 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4685 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004686 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004687
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004688 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004689 !getToolChain().hasBlocksRuntime())
4690 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004691 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004692
Richard Smith47972af2015-06-16 00:08:24 +00004693 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004694 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004695 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004696 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004697 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004698 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4699 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004700 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004701 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004702 HaveModules = true;
4703 }
4704 }
4705
Richard Smith47972af2015-06-16 00:08:24 +00004706 // -fmodule-maps enables implicit reading of module map files. By default,
4707 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004708 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4709 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004710 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004711 }
4712
Daniel Jasperac42b752013-10-21 06:34:34 +00004713 // -fmodules-decluse checks that modules used are declared so (off by
4714 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004715 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004716 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004717 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004718 }
4719
Daniel Jasper962b38e2014-04-11 11:47:45 +00004720 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4721 // all #included headers are part of modules.
4722 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004723 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004724 CmdArgs.push_back("-fmodules-strict-decluse");
4725 }
4726
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004727 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4728 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4729 options::OPT_fno_implicit_modules)) {
4730 CmdArgs.push_back("-fno-implicit-modules");
4731 }
4732
Daniel Jasperac42b752013-10-21 06:34:34 +00004733 // -fmodule-name specifies the module that is currently being built (or
4734 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004735 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004736
Richard Smith9887d792014-10-17 01:42:53 +00004737 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004738 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004739 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004740
Richard Smithe842a472014-10-22 02:05:46 +00004741 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004742 if (HaveModules)
4743 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4744 else
4745 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004746
4747 // -fmodule-cache-path specifies where our implicitly-built module files
4748 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004749 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004750 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004751 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004752 if (HaveModules) {
4753 if (C.isForDiagnostics()) {
4754 // When generating crash reports, we want to emit the modules along with
4755 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004756 Path = Output.getFilename();
4757 llvm::sys::path::replace_extension(Path, ".cache");
4758 llvm::sys::path::append(Path, "modules");
4759 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004760 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004761 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004762 llvm::sys::path::append(Path, "org.llvm.clang.");
4763 appendUserToPath(Path);
4764 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004765 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004766 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004767 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4768 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004769 }
4770
4771 // When building modules and generating crashdumps, we need to dump a module
4772 // dependency VFS alongside the output.
4773 if (HaveModules && C.isForDiagnostics()) {
4774 SmallString<128> VFSDir(Output.getFilename());
4775 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004776 // Add the cache directory as a temp so the crash diagnostics pick it up.
4777 C.addTempFile(Args.MakeArgString(VFSDir));
4778
Justin Bognera88f0122014-06-20 22:59:50 +00004779 llvm::sys::path::append(VFSDir, "vfs");
4780 CmdArgs.push_back("-module-dependency-dir");
4781 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004782 }
4783
Richard Smith9887d792014-10-17 01:42:53 +00004784 if (HaveModules)
4785 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004786
Douglas Gregor35b04d62013-02-07 19:01:24 +00004787 // Pass through all -fmodules-ignore-macro arguments.
4788 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004789 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4790 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004791
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004792 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4793
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004794 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4795 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4796 D.Diag(diag::err_drv_argument_not_allowed_with)
4797 << A->getAsString(Args) << "-fbuild-session-timestamp";
4798
4799 llvm::sys::fs::file_status Status;
4800 if (llvm::sys::fs::status(A->getValue(), Status))
4801 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004802 CmdArgs.push_back(Args.MakeArgString(
4803 "-fbuild-session-timestamp=" +
4804 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004805 }
4806
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004807 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004808 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4809 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004810 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4811
4812 Args.AddLastArg(CmdArgs,
4813 options::OPT_fmodules_validate_once_per_build_session);
4814 }
4815
Ben Langmuirdcf73862014-03-12 00:06:17 +00004816 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4817
John McCalldfea9982010-04-09 19:12:06 +00004818 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004819 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004820 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004821 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004822
Anders Carlssond470fef2010-11-21 00:09:52 +00004823 // -felide-constructors is the default.
4824 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004825 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004826 CmdArgs.push_back("-fno-elide-constructors");
4827
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004828 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004829
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004830 if (KernelOrKext || (types::isCXX(InputType) &&
4831 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4832 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004833 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004834
Tony Linthicum76329bf2011-12-12 21:14:55 +00004835 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004836 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4837 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004838 CmdArgs.push_back("-fshort-enums");
4839
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004840 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004841 if (Arg *A = Args.getLastArg(
4842 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4843 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4844 if (A->getOption().matches(options::OPT_funsigned_char) ||
4845 A->getOption().matches(options::OPT_fno_signed_char)) {
4846 CmdArgs.push_back("-fno-signed-char");
4847 }
4848 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004849 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004850 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004851
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004852 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004853 if (!Args.hasFlag(
4854 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4855 !IsWindowsCygnus && !IsWindowsGNU &&
4856 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4857 getToolChain().getArch() != llvm::Triple::hexagon &&
4858 getToolChain().getArch() != llvm::Triple::xcore &&
4859 ((getToolChain().getTriple().getVendor() !=
4860 llvm::Triple::MipsTechnologies) ||
4861 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004862 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004863 CmdArgs.push_back("-fno-use-cxa-atexit");
4864
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004865 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004866 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004867 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004868 CmdArgs.push_back("-fms-extensions");
4869
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004870 // -fno-use-line-directives is default.
4871 if (Args.hasFlag(options::OPT_fuse_line_directives,
4872 options::OPT_fno_use_line_directives, false))
4873 CmdArgs.push_back("-fuse-line-directives");
4874
Francois Pichet1b4f1632011-09-17 04:32:15 +00004875 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004876 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004877 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004878 (IsWindowsMSVC &&
4879 Args.hasFlag(options::OPT_fms_extensions,
4880 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004881 CmdArgs.push_back("-fms-compatibility");
4882
David Majnemerc371ff02015-03-22 08:39:22 +00004883 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004884 VersionTuple MSVT = visualstudio::getMSVCVersion(
4885 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4886 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004887 CmdArgs.push_back(
4888 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004889
David Majnemer8db91762015-05-18 04:49:30 +00004890 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4891 if (ImplyVCPPCXXVer) {
4892 if (IsMSVC2015Compatible)
4893 CmdArgs.push_back("-std=c++14");
4894 else
4895 CmdArgs.push_back("-std=c++11");
4896 }
4897
Eric Christopher5ecce122013-02-18 00:38:31 +00004898 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004899 if (Args.hasFlag(options::OPT_fborland_extensions,
4900 options::OPT_fno_borland_extensions, false))
4901 CmdArgs.push_back("-fborland-extensions");
4902
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004903 // -fno-declspec is default, except for PS4.
4904 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4905 getToolChain().getTriple().isPS4()))
4906 CmdArgs.push_back("-fdeclspec");
4907 else if (Args.hasArg(options::OPT_fno_declspec))
4908 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4909
David Majnemerc371ff02015-03-22 08:39:22 +00004910 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4911 // than 19.
4912 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4913 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004914 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004915 CmdArgs.push_back("-fno-threadsafe-statics");
4916
Francois Pichet02744872011-09-01 16:38:08 +00004917 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4918 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004919 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004920 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004921 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004922
Chandler Carruthe03aa552010-04-17 20:17:31 +00004923 // -fgnu-keywords default varies depending on language; only pass if
4924 // specified.
4925 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004926 options::OPT_fno_gnu_keywords))
4927 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004928
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004929 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004930 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004931 CmdArgs.push_back("-fgnu89-inline");
4932
Chad Rosier9c76d242012-03-15 22:31:42 +00004933 if (Args.hasArg(options::OPT_fno_inline))
4934 CmdArgs.push_back("-fno-inline");
4935
Chad Rosier64d6be92012-03-06 21:17:19 +00004936 if (Args.hasArg(options::OPT_fno_inline_functions))
4937 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004938
John McCall5fb5df92012-06-20 06:18:46 +00004939 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004940
John McCall5fb5df92012-06-20 06:18:46 +00004941 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004942 // legacy is the default. Except for deployment taget of 10.5,
4943 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4944 // gets ignored silently.
4945 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004946 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4947 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004948 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004949 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004950 if (getToolChain().UseObjCMixedDispatch())
4951 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4952 else
4953 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4954 }
4955 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004956
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004957 // When ObjectiveC legacy runtime is in effect on MacOSX,
4958 // turn on the option to do Array/Dictionary subscripting
4959 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004960 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004961 getToolChain().getTriple().isMacOSX() &&
4962 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4963 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004964 objcRuntime.isNeXTFamily())
4965 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004966
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004967 // -fencode-extended-block-signature=1 is default.
4968 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4969 CmdArgs.push_back("-fencode-extended-block-signature");
4970 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004971
John McCall24fc0de2011-07-06 00:26:06 +00004972 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4973 // NOTE: This logic is duplicated in ToolChains.cpp.
4974 bool ARC = isObjCAutoRefCount(Args);
4975 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004976 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004977
John McCall24fc0de2011-07-06 00:26:06 +00004978 CmdArgs.push_back("-fobjc-arc");
4979
Chandler Carruth491db322011-11-04 07:34:47 +00004980 // FIXME: It seems like this entire block, and several around it should be
4981 // wrapped in isObjC, but for now we just use it here as this is where it
4982 // was being used previously.
4983 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4984 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4985 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4986 else
4987 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4988 }
4989
John McCall24fc0de2011-07-06 00:26:06 +00004990 // Allow the user to enable full exceptions code emission.
4991 // We define off for Objective-CC, on for Objective-C++.
4992 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4993 options::OPT_fno_objc_arc_exceptions,
4994 /*default*/ types::isCXX(InputType)))
4995 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00004996
John McCall24fc0de2011-07-06 00:26:06 +00004997 }
4998
4999 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5000 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005001 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005002 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005003
John McCall24fc0de2011-07-06 00:26:06 +00005004 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5005 // takes precedence.
5006 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5007 if (!GCArg)
5008 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5009 if (GCArg) {
5010 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005011 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005012 } else if (getToolChain().SupportsObjCGC()) {
5013 GCArg->render(Args, CmdArgs);
5014 } else {
5015 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005016 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005017 }
5018 }
5019
John McCallfbe5ed72015-11-05 19:19:56 +00005020 // Pass down -fobjc-weak or -fno-objc-weak if present.
5021 if (types::isObjC(InputType)) {
5022 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5023 options::OPT_fno_objc_weak);
5024 if (!WeakArg) {
5025 // nothing to do
5026 } else if (GCArg) {
5027 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5028 D.Diag(diag::err_objc_weak_with_gc);
5029 } else if (!objcRuntime.allowsWeak()) {
5030 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5031 D.Diag(diag::err_objc_weak_unsupported);
5032 } else {
5033 WeakArg->render(Args, CmdArgs);
5034 }
5035 }
5036
Bob Wilsonb111ec92015-03-02 19:01:14 +00005037 if (Args.hasFlag(options::OPT_fapplication_extension,
5038 options::OPT_fno_application_extension, false))
5039 CmdArgs.push_back("-fapplication-extension");
5040
Reid Klecknerc542d372014-06-27 17:02:02 +00005041 // Handle GCC-style exception args.
5042 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005043 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5044 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005045
Tim Northovere931f9f2015-10-30 16:30:41 +00005046 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005047 CmdArgs.push_back("-fsjlj-exceptions");
5048
5049 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005050 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5051 options::OPT_fno_assume_sane_operator_new))
5052 CmdArgs.push_back("-fno-assume-sane-operator-new");
5053
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005054 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5055 // most platforms.
5056 if (Args.hasFlag(options::OPT_fsized_deallocation,
5057 options::OPT_fno_sized_deallocation, false))
5058 CmdArgs.push_back("-fsized-deallocation");
5059
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005060 // -fconstant-cfstrings is default, and may be subject to argument translation
5061 // on Darwin.
5062 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5063 options::OPT_fno_constant_cfstrings) ||
5064 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5065 options::OPT_mno_constant_cfstrings))
5066 CmdArgs.push_back("-fno-constant-cfstrings");
5067
John Thompsoned4e2952009-11-05 20:14:16 +00005068 // -fshort-wchar default varies depending on platform; only
5069 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005070 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5071 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005072 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005073
Hans Wennborg28c96312013-07-31 23:39:13 +00005074 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005075 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005076 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005077 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005078
Daniel Dunbar096ed292011-10-05 21:04:55 +00005079 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5080 // -fno-pack-struct doesn't apply to -fpack-struct=.
5081 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005082 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005083 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005084 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005085 } else if (Args.hasFlag(options::OPT_fpack_struct,
5086 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005087 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005088 }
5089
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005090 // Handle -fmax-type-align=N and -fno-type-align
5091 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5092 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5093 if (!SkipMaxTypeAlign) {
5094 std::string MaxTypeAlignStr = "-fmax-type-align=";
5095 MaxTypeAlignStr += A->getValue();
5096 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5097 }
5098 } else if (getToolChain().getTriple().isOSDarwin()) {
5099 if (!SkipMaxTypeAlign) {
5100 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5101 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5102 }
5103 }
5104
John Brawna7b4ec02015-08-10 11:11:28 +00005105 // -fcommon is the default unless compiling kernel code or the target says so
5106 bool NoCommonDefault =
5107 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5108 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5109 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005110 CmdArgs.push_back("-fno-common");
5111
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005112 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005113 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005114 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005115 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005116 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005117 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005118
Daniel Dunbar6358d682010-10-15 22:30:42 +00005119 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005120 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005121 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005122 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005123
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005124 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005125 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5126 StringRef value = inputCharset->getValue();
5127 if (value != "UTF-8")
5128 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5129 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005130 }
5131
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005132 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005133 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5134 StringRef value = execCharset->getValue();
5135 if (value != "UTF-8")
5136 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5137 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005138 }
5139
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005140 // -fcaret-diagnostics is default.
5141 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5142 options::OPT_fno_caret_diagnostics, true))
5143 CmdArgs.push_back("-fno-caret-diagnostics");
5144
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005145 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005146 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005147 options::OPT_fno_diagnostics_fixit_info))
5148 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005149
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005150 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005151 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005152 options::OPT_fno_diagnostics_show_option))
5153 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005154
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005155 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005156 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005157 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005158 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005159 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005160
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005161 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005162 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005163 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005164 }
5165
Chandler Carruthb6766f02011-03-27 01:50:55 +00005166 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005167 options::OPT_fdiagnostics_show_note_include_stack,
5168 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005169 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005170 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005171 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5172 else
5173 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5174 }
5175
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005176 // Color diagnostics are the default, unless the terminal doesn't support
5177 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005178 // Support both clang's -f[no-]color-diagnostics and gcc's
5179 // -f[no-]diagnostics-colors[=never|always|auto].
5180 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005181 for (const auto &Arg : Args) {
5182 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005183 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5184 !O.matches(options::OPT_fdiagnostics_color) &&
5185 !O.matches(options::OPT_fno_color_diagnostics) &&
5186 !O.matches(options::OPT_fno_diagnostics_color) &&
5187 !O.matches(options::OPT_fdiagnostics_color_EQ))
5188 continue;
5189
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005190 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005191 if (O.matches(options::OPT_fcolor_diagnostics) ||
5192 O.matches(options::OPT_fdiagnostics_color)) {
5193 ShowColors = Colors_On;
5194 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5195 O.matches(options::OPT_fno_diagnostics_color)) {
5196 ShowColors = Colors_Off;
5197 } else {
5198 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005199 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005200 if (value == "always")
5201 ShowColors = Colors_On;
5202 else if (value == "never")
5203 ShowColors = Colors_Off;
5204 else if (value == "auto")
5205 ShowColors = Colors_Auto;
5206 else
5207 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005208 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005209 }
5210 }
5211 if (ShowColors == Colors_On ||
5212 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005213 CmdArgs.push_back("-fcolor-diagnostics");
5214
Nico Rieck7857d462013-09-11 00:38:02 +00005215 if (Args.hasArg(options::OPT_fansi_escape_codes))
5216 CmdArgs.push_back("-fansi-escape-codes");
5217
Daniel Dunbardb097022009-06-08 21:13:54 +00005218 if (!Args.hasFlag(options::OPT_fshow_source_location,
5219 options::OPT_fno_show_source_location))
5220 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005221
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005222 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005223 true))
5224 CmdArgs.push_back("-fno-show-column");
5225
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005226 if (!Args.hasFlag(options::OPT_fspell_checking,
5227 options::OPT_fno_spell_checking))
5228 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005229
Chad Rosierc8e56e82012-12-05 21:08:21 +00005230 // -fno-asm-blocks is default.
5231 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5232 false))
5233 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005234
Steven Wucb0d13f2015-01-16 23:05:28 +00005235 // -fgnu-inline-asm is default.
5236 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5237 options::OPT_fno_gnu_inline_asm, true))
5238 CmdArgs.push_back("-fno-gnu-inline-asm");
5239
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005240 // Enable vectorization per default according to the optimization level
5241 // selected. For optimization levels that want vectorization we use the alias
5242 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005243 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005244 OptSpecifier VectorizeAliasOption =
5245 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005246 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005247 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005248 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005249
Chad Rosier136d67d2014-04-28 19:30:57 +00005250 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005251 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005252 OptSpecifier SLPVectAliasOption =
5253 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005254 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005255 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005256 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005257
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005258 // -fno-slp-vectorize-aggressive is default.
5259 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005260 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005261 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005262
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005263 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5264 A->render(Args, CmdArgs);
5265
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005266 // -fdollars-in-identifiers default varies depending on platform and
5267 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005268 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005269 options::OPT_fno_dollars_in_identifiers)) {
5270 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005271 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005272 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005273 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005274 }
5275
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005276 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5277 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005278 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005279 options::OPT_fno_unit_at_a_time)) {
5280 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005281 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005282 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005283
Eli Friedman055c9702011-11-02 01:53:16 +00005284 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5285 options::OPT_fno_apple_pragma_pack, false))
5286 CmdArgs.push_back("-fapple-pragma-pack");
5287
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005288 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005289 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5290 // by default.
5291 if (getToolChain().getArch() == llvm::Triple::le32) {
5292 CmdArgs.push_back("-fno-math-builtin");
5293 }
5294
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005295// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5296//
5297// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005298#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005299 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005300 (getToolChain().getArch() == llvm::Triple::arm ||
5301 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005302 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5303 CmdArgs.push_back("-fno-builtin-strcat");
5304 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5305 CmdArgs.push_back("-fno-builtin-strcpy");
5306 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005307#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005308
Justin Bognera88f0122014-06-20 22:59:50 +00005309 // Enable rewrite includes if the user's asked for it or if we're generating
5310 // diagnostics.
5311 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5312 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005313 if (Args.hasFlag(options::OPT_frewrite_includes,
5314 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005315 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005316 CmdArgs.push_back("-frewrite-includes");
5317
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005318 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005319 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005320 options::OPT_traditional_cpp)) {
5321 if (isa<PreprocessJobAction>(JA))
5322 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005323 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005324 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005325 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005326
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005327 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005328 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005329
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005330 // Handle serialized diagnostics.
5331 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5332 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005333 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005334 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005335
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005336 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5337 CmdArgs.push_back("-fretain-comments-from-system-headers");
5338
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005339 // Forward -fcomment-block-commands to -cc1.
5340 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005341 // Forward -fparse-all-comments to -cc1.
5342 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005343
John Brawnad31ace2015-09-23 13:55:40 +00005344 // Turn -fplugin=name.so into -load name.so
5345 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5346 CmdArgs.push_back("-load");
5347 CmdArgs.push_back(A->getValue());
5348 A->claim();
5349 }
5350
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005351 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5352 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005353 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005354 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5355 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005356
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005357 // We translate this by hand to the -cc1 argument, since nightly test uses
5358 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005359 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005360 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005361 } else
Sean Silva14facf32015-06-09 01:57:17 +00005362 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005363 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005364
Bob Wilson23a55f12014-12-21 07:00:00 +00005365 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005366 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5367 // by the frontend.
5368 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5369 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005370
Daniel Dunbard67a3222009-03-30 06:36:42 +00005371 if (Output.getType() == types::TY_Dependencies) {
5372 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005373 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005374 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005375 CmdArgs.push_back(Output.getFilename());
5376 } else {
5377 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005378 }
5379
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005380 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005381
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005382 if (Input.isFilename())
5383 CmdArgs.push_back(Input.getFilename());
5384 else
5385 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005386
Chris Lattnere9d7d782009-11-03 19:50:27 +00005387 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5388
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005389 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005390
5391 // Optionally embed the -cc1 level arguments into the debug info, for build
5392 // analysis.
5393 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005394 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005395 for (const auto &Arg : Args)
5396 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005397
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005398 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005399 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005400 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005401 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005402 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005403 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005404 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005405 }
5406 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005407 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005408 }
5409
Eric Christopherd3804002013-02-22 20:12:52 +00005410 // Add the split debug info name to the command lines here so we
5411 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005412 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005413 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5414 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005415 const char *SplitDwarfOut;
5416 if (SplitDwarf) {
5417 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005418 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005419 CmdArgs.push_back(SplitDwarfOut);
5420 }
5421
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005422 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5423 // Include them with -fcuda-include-gpubinary.
5424 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005425 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005426 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005427 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005428 }
5429
Eric Christopherd3804002013-02-22 20:12:52 +00005430 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005431 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005432 Output.getType() == types::TY_Object &&
5433 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005434 auto CLCommand =
5435 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005436 C.addCommand(llvm::make_unique<FallbackCommand>(
5437 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005438 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005439 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005440 }
5441
Eric Christopherf1545832013-02-22 23:50:16 +00005442 // Handle the debug info splitting at object creation time if we're
5443 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005444 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005445 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005446 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005447
Roman Divacky178e01602011-02-10 16:52:03 +00005448 if (Arg *A = Args.getLastArg(options::OPT_pg))
5449 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005450 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5451 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005452
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005453 // Claim some arguments which clang supports automatically.
5454
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005455 // -fpch-preprocess is used with gcc to add a special marker in the output to
5456 // include the PCH file. Clang's PTH solution is completely transparent, so we
5457 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005458 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005459
Daniel Dunbar17731772009-03-23 19:03:36 +00005460 // Claim some arguments which clang doesn't support, but we don't
5461 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005462 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5463 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005464
Rafael Espindolab0092d72013-09-04 19:37:35 +00005465 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005466 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005467}
5468
John McCall5fb5df92012-06-20 06:18:46 +00005469/// Add options related to the Objective-C runtime/ABI.
5470///
5471/// Returns true if the runtime is non-fragile.
5472ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5473 ArgStringList &cmdArgs,
5474 RewriteKind rewriteKind) const {
5475 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005476 Arg *runtimeArg =
5477 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5478 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005479
5480 // Just forward -fobjc-runtime= to the frontend. This supercedes
5481 // options about fragility.
5482 if (runtimeArg &&
5483 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5484 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005485 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005486 if (runtime.tryParse(value)) {
5487 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005488 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005489 }
5490
5491 runtimeArg->render(args, cmdArgs);
5492 return runtime;
5493 }
5494
5495 // Otherwise, we'll need the ABI "version". Version numbers are
5496 // slightly confusing for historical reasons:
5497 // 1 - Traditional "fragile" ABI
5498 // 2 - Non-fragile ABI, version 1
5499 // 3 - Non-fragile ABI, version 2
5500 unsigned objcABIVersion = 1;
5501 // If -fobjc-abi-version= is present, use that to set the version.
5502 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005503 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005504 if (value == "1")
5505 objcABIVersion = 1;
5506 else if (value == "2")
5507 objcABIVersion = 2;
5508 else if (value == "3")
5509 objcABIVersion = 3;
5510 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005511 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005512 } else {
5513 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005514 bool nonFragileABIIsDefault =
5515 (rewriteKind == RK_NonFragile ||
5516 (rewriteKind == RK_None &&
5517 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005518 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5519 options::OPT_fno_objc_nonfragile_abi,
5520 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005521// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005522#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5523 unsigned nonFragileABIVersion = 1;
5524#else
5525 unsigned nonFragileABIVersion = 2;
5526#endif
5527
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005528 if (Arg *abiArg =
5529 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005530 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005531 if (value == "1")
5532 nonFragileABIVersion = 1;
5533 else if (value == "2")
5534 nonFragileABIVersion = 2;
5535 else
5536 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005537 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005538 }
5539
5540 objcABIVersion = 1 + nonFragileABIVersion;
5541 } else {
5542 objcABIVersion = 1;
5543 }
5544 }
5545
5546 // We don't actually care about the ABI version other than whether
5547 // it's non-fragile.
5548 bool isNonFragile = objcABIVersion != 1;
5549
5550 // If we have no runtime argument, ask the toolchain for its default runtime.
5551 // However, the rewriter only really supports the Mac runtime, so assume that.
5552 ObjCRuntime runtime;
5553 if (!runtimeArg) {
5554 switch (rewriteKind) {
5555 case RK_None:
5556 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5557 break;
5558 case RK_Fragile:
5559 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5560 break;
5561 case RK_NonFragile:
5562 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5563 break;
5564 }
5565
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005566 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005567 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5568 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005569 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005570 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5571
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005572 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005573 } else {
5574 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5575 }
5576
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005577 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005578 } else {
5579 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005580 // Legacy behaviour is to target the gnustep runtime if we are i
5581 // non-fragile mode or the GCC runtime in fragile mode.
5582 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005583 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005584 else
5585 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005586 }
5587
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005588 cmdArgs.push_back(
5589 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005590 return runtime;
5591}
5592
Reid Klecknerc542d372014-06-27 17:02:02 +00005593static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5594 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5595 I += HaveDash;
5596 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005597}
Reid Klecknerc542d372014-06-27 17:02:02 +00005598
Benjamin Kramere003ca22015-10-28 13:54:16 +00005599namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005600struct EHFlags {
5601 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5602 bool Synch;
5603 bool Asynch;
5604 bool NoExceptC;
5605};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005606} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005607
5608/// /EH controls whether to run destructor cleanups when exceptions are
5609/// thrown. There are three modifiers:
5610/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5611/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5612/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5613/// - c: Assume that extern "C" functions are implicitly noexcept. This
5614/// modifier is an optimization, so we ignore it for now.
5615/// The default is /EHs-c-, meaning cleanups are disabled.
5616static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5617 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005618
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005619 std::vector<std::string> EHArgs =
5620 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005621 for (auto EHVal : EHArgs) {
5622 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5623 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005624 case 'a':
5625 EH.Asynch = maybeConsumeDash(EHVal, I);
5626 continue;
5627 case 'c':
5628 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5629 continue;
5630 case 's':
5631 EH.Synch = maybeConsumeDash(EHVal, I);
5632 continue;
5633 default:
5634 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005635 }
5636 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5637 break;
5638 }
5639 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005640
Reid Klecknerc542d372014-06-27 17:02:02 +00005641 return EH;
5642}
5643
Douglas Katzman3459ce22015-10-08 04:24:12 +00005644void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5645 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5646 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005647 unsigned RTOptionID = options::OPT__SLASH_MT;
5648
Hans Wennborgf1a74252013-09-10 20:18:04 +00005649 if (Args.hasArg(options::OPT__SLASH_LDd))
5650 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5651 // but defining _DEBUG is sticky.
5652 RTOptionID = options::OPT__SLASH_MTd;
5653
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005654 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005655 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005656
David Majnemere2afb472015-07-24 06:49:13 +00005657 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005658 switch (RTOptionID) {
5659 case options::OPT__SLASH_MD:
5660 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005661 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005662 CmdArgs.push_back("-D_MT");
5663 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005664 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005665 break;
5666 case options::OPT__SLASH_MDd:
5667 CmdArgs.push_back("-D_DEBUG");
5668 CmdArgs.push_back("-D_MT");
5669 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005670 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005671 break;
5672 case options::OPT__SLASH_MT:
5673 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005674 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005675 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005676 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005677 break;
5678 case options::OPT__SLASH_MTd:
5679 CmdArgs.push_back("-D_DEBUG");
5680 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005681 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005682 break;
5683 default:
5684 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005685 }
5686
David Majnemere2afb472015-07-24 06:49:13 +00005687 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5688 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5689 } else {
5690 CmdArgs.push_back(FlagForCRT.data());
5691
5692 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5693 // users want. The /Za flag to cl.exe turns this off, but it's not
5694 // implemented in clang.
5695 CmdArgs.push_back("--dependent-lib=oldnames");
5696 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005697
Hans Wennborg8858a032014-07-21 23:42:07 +00005698 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5699 // would produce interleaved output, so ignore /showIncludes in such cases.
5700 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5701 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5702 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005703
David Majnemerf6072342014-07-01 22:24:56 +00005704 // This controls whether or not we emit RTTI data for polymorphic types.
5705 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5706 /*default=*/false))
5707 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005708
Reid Kleckner124955a2015-08-05 18:51:13 +00005709 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005710 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005711 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5712 // If we are emitting CV but not DWARF, don't build information that LLVM
5713 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005714 if (*EmitCodeView && !EmitDwarf)
5715 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5716 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005717 CmdArgs.push_back("-gcodeview");
5718
Reid Klecknerc542d372014-06-27 17:02:02 +00005719 const Driver &D = getToolChain().getDriver();
5720 EHFlags EH = parseClangCLEHFlags(D, Args);
5721 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005722 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005723 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005724 CmdArgs.push_back("-fexceptions");
5725 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005726
Hans Wennborge50cec32014-06-13 20:59:54 +00005727 // /EP should expand to -E -P.
5728 if (Args.hasArg(options::OPT__SLASH_EP)) {
5729 CmdArgs.push_back("-E");
5730 CmdArgs.push_back("-P");
5731 }
5732
David Majnemera5b195a2015-02-14 01:35:12 +00005733 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005734 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5735 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005736 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5737 else
5738 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5739
5740 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5741 VolatileOptionID = A->getOption().getID();
5742
5743 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5744 CmdArgs.push_back("-fms-volatile");
5745
David Majnemer86c318f2014-02-11 21:05:00 +00005746 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5747 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5748 if (MostGeneralArg && BestCaseArg)
5749 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5750 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5751
5752 if (MostGeneralArg) {
5753 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5754 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5755 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5756
5757 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5758 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5759 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5760 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5761 << FirstConflict->getAsString(Args)
5762 << SecondConflict->getAsString(Args);
5763
5764 if (SingleArg)
5765 CmdArgs.push_back("-fms-memptr-rep=single");
5766 else if (MultipleArg)
5767 CmdArgs.push_back("-fms-memptr-rep=multiple");
5768 else
5769 CmdArgs.push_back("-fms-memptr-rep=virtual");
5770 }
5771
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005772 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5773 A->render(Args, CmdArgs);
5774
Hans Wennborg81f74482013-09-10 01:07:07 +00005775 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5776 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005777 if (Args.hasArg(options::OPT__SLASH_fallback))
5778 CmdArgs.push_back("msvc-fallback");
5779 else
5780 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005781 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005782}
5783
Douglas Katzman95354292015-06-23 20:42:09 +00005784visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005785 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005786 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005787 return CLFallback.get();
5788}
5789
Daniel Sanders7f933f42015-01-30 17:35:23 +00005790void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5791 ArgStringList &CmdArgs) const {
5792 StringRef CPUName;
5793 StringRef ABIName;
5794 const llvm::Triple &Triple = getToolChain().getTriple();
5795 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5796
5797 CmdArgs.push_back("-target-abi");
5798 CmdArgs.push_back(ABIName.data());
5799}
5800
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005801void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005802 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005803 const ArgList &Args,
5804 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005805 ArgStringList CmdArgs;
5806
5807 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5808 const InputInfo &Input = Inputs[0];
5809
James Y Knight2db38f32015-08-15 03:45:25 +00005810 std::string TripleStr =
5811 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5812 const llvm::Triple Triple(TripleStr);
5813
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005814 // Don't warn about "clang -w -c foo.s"
5815 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005816 // and "clang -emit-llvm -c foo.s"
5817 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005818
Rafael Espindola577637a2015-01-03 00:06:04 +00005819 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005820
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005821 // Invoke ourselves in -cc1as mode.
5822 //
5823 // FIXME: Implement custom jobs for internal actions.
5824 CmdArgs.push_back("-cc1as");
5825
5826 // Add the "effective" target triple.
5827 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005828 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5829
5830 // Set the output mode, we currently only expect to be used as a real
5831 // assembler.
5832 CmdArgs.push_back("-filetype");
5833 CmdArgs.push_back("obj");
5834
Eric Christopher45f2e712012-12-18 00:31:10 +00005835 // Set the main file name, so that debug info works even with
5836 // -save-temps or preprocessed assembly.
5837 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005838 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005839
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005840 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005841 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005842 if (!CPU.empty()) {
5843 CmdArgs.push_back("-target-cpu");
5844 CmdArgs.push_back(Args.MakeArgString(CPU));
5845 }
5846
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005847 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005848 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005849
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005850 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005851 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005852
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005853 // Pass along any -I options so we get proper .include search paths.
5854 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5855
Eric Christopherfc3ee562012-01-10 00:38:01 +00005856 // Determine the original source input.
5857 const Action *SourceAction = &JA;
5858 while (SourceAction->getKind() != Action::InputClass) {
5859 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5860 SourceAction = SourceAction->getInputs()[0];
5861 }
5862
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005863 // Forward -g and handle debug info related flags, assuming we are dealing
5864 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005865 if (SourceAction->getType() == types::TY_Asm ||
5866 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005867 bool WantDebug = false;
5868 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005869 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005870 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5871 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005872 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005873 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005874 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005875 if (DwarfVersion == 0)
5876 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005877 RenderDebugEnablingArgs(Args, CmdArgs,
5878 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5879 : CodeGenOptions::NoDebugInfo),
5880 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005881
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005882 // Add the -fdebug-compilation-dir flag if needed.
5883 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005884
5885 // Set the AT_producer to the clang version when using the integrated
5886 // assembler on assembly source files.
5887 CmdArgs.push_back("-dwarf-debug-producer");
5888 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005889
5890 // And pass along -I options
5891 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005892 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005893
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005894 // Handle -fPIC et al -- the relocation-model affects the assembler
5895 // for some targets.
5896 llvm::Reloc::Model RelocationModel;
5897 unsigned PICLevel;
5898 bool IsPIE;
5899 std::tie(RelocationModel, PICLevel, IsPIE) =
5900 ParsePICArgs(getToolChain(), Triple, Args);
5901
5902 const char *RMName = RelocationModelName(RelocationModel);
5903 if (RMName) {
5904 CmdArgs.push_back("-mrelocation-model");
5905 CmdArgs.push_back(RMName);
5906 }
5907
Kevin Enderby292dc082011-12-22 19:31:58 +00005908 // Optionally embed the -cc1as level arguments into the debug info, for build
5909 // analysis.
5910 if (getToolChain().UseDwarfDebugFlags()) {
5911 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005912 for (const auto &Arg : Args)
5913 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005914
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005915 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005916 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5917 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005918 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005919 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005920 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005921 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005922 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005923 }
5924 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005925 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005926 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005927
5928 // FIXME: Add -static support, once we have it.
5929
Daniel Sanders7f933f42015-01-30 17:35:23 +00005930 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005931 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005932 default:
5933 break;
5934
5935 case llvm::Triple::mips:
5936 case llvm::Triple::mipsel:
5937 case llvm::Triple::mips64:
5938 case llvm::Triple::mips64el:
5939 AddMIPSTargetArgs(Args, CmdArgs);
5940 break;
5941 }
5942
David Blaikie372d9502014-01-17 03:17:40 +00005943 // Consume all the warning flags. Usually this would be handled more
5944 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5945 // doesn't handle that so rather than warning about unused flags that are
5946 // actually used, we'll lie by omission instead.
5947 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005948 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5949 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005950
David Blaikie9260ed62013-07-25 21:19:01 +00005951 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5952 getToolChain().getDriver());
5953
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005954 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005955
5956 assert(Output.isFilename() && "Unexpected lipo output.");
5957 CmdArgs.push_back("-o");
5958 CmdArgs.push_back(Output.getFilename());
5959
Daniel Dunbarb440f562010-08-02 02:38:21 +00005960 assert(Input.isFilename() && "Invalid input.");
5961 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005962
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005963 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005964 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005965
5966 // Handle the debug info splitting at object creation time if we're
5967 // creating an object.
5968 // TODO: Currently only works on linux with newer objcopy.
5969 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005970 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005971 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005972 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005973}
5974
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005975void GnuTool::anchor() {}
5976
Daniel Dunbara3246a02009-03-18 08:07:30 +00005977void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005978 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005979 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005980 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005981 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005982 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005983
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005984 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005985 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005986 // Don't forward any -g arguments to assembly steps.
5987 if (isa<AssembleJobAction>(JA) &&
5988 A->getOption().matches(options::OPT_g_Group))
5989 continue;
5990
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005991 // Don't forward any -W arguments to assembly and link steps.
5992 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5993 A->getOption().matches(options::OPT_W_Group))
5994 continue;
5995
Daniel Dunbar2da02722009-03-19 07:55:12 +00005996 // It is unfortunate that we have to claim here, as this means
5997 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005998 // platforms using a generic gcc, even if we are just using gcc
5999 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00006000 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006001 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006002 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006003 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006004
Daniel Dunbar4e295052010-01-25 22:35:08 +00006005 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006006
6007 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006008 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006009 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006010 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006011 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006012 }
6013
Daniel Dunbar5716d872009-05-02 21:41:52 +00006014 // Try to force gcc to match the tool chain we want, if we recognize
6015 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006016 //
6017 // FIXME: The triple class should directly provide the information we want
6018 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006019 switch (getToolChain().getArch()) {
6020 default:
6021 break;
6022 case llvm::Triple::x86:
6023 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006024 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006025 break;
6026 case llvm::Triple::x86_64:
6027 case llvm::Triple::ppc64:
6028 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006029 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006030 break;
6031 case llvm::Triple::sparcel:
6032 CmdArgs.push_back("-EL");
6033 break;
6034 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006035
Daniel Dunbarb440f562010-08-02 02:38:21 +00006036 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006037 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006038 CmdArgs.push_back(Output.getFilename());
6039 } else {
6040 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006041 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006042 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006043
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006044 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006045
6046 // Only pass -x if gcc will understand it; otherwise hope gcc
6047 // understands the suffix correctly. The main use case this would go
6048 // wrong in is for linker inputs if they happened to have an odd
6049 // suffix; really the only way to get this to happen is a command
6050 // like '-x foobar a.c' which will treat a.c like a linker input.
6051 //
6052 // FIXME: For the linker case specifically, can we safely convert
6053 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006054 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006055 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006056 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006057 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006058 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006059 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006060 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006061 else if (II.getType() == types::TY_ModuleFile)
6062 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006063 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006064
Daniel Dunbara3246a02009-03-18 08:07:30 +00006065 if (types::canTypeBeUserSpecified(II.getType())) {
6066 CmdArgs.push_back("-x");
6067 CmdArgs.push_back(types::getTypeName(II.getType()));
6068 }
6069
Daniel Dunbarb440f562010-08-02 02:38:21 +00006070 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006071 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006072 else {
6073 const Arg &A = II.getInputArg();
6074
6075 // Reverse translate some rewritten options.
6076 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6077 CmdArgs.push_back("-lstdc++");
6078 continue;
6079 }
6080
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006081 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006082 A.render(Args, CmdArgs);
6083 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006084 }
6085
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006086 const std::string customGCCName = D.getCCCGenericGCCName();
6087 const char *GCCName;
6088 if (!customGCCName.empty())
6089 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006090 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006091 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006092 } else
6093 GCCName = "gcc";
6094
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006095 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006096 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006097}
6098
Douglas Katzman95354292015-06-23 20:42:09 +00006099void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6100 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006101 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006102}
6103
Douglas Katzman95354292015-06-23 20:42:09 +00006104void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6105 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006106 const Driver &D = getToolChain().getDriver();
6107
Eric Christophercc7ff502015-01-29 00:56:17 +00006108 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006109 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006110 case types::TY_LLVM_IR:
6111 case types::TY_LTO_IR:
6112 case types::TY_LLVM_BC:
6113 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006114 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006115 break;
6116 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006117 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006118 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006119 case types::TY_Nothing:
6120 CmdArgs.push_back("-fsyntax-only");
6121 break;
6122 default:
6123 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006124 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006125}
6126
Douglas Katzman95354292015-06-23 20:42:09 +00006127void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6128 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006129 // The types are (hopefully) good enough.
6130}
6131
Tony Linthicum76329bf2011-12-12 21:14:55 +00006132// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006133void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006134 ArgStringList &CmdArgs) const {
6135}
6136
Douglas Katzman95354292015-06-23 20:42:09 +00006137void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6138 const InputInfo &Output,
6139 const InputInfoList &Inputs,
6140 const ArgList &Args,
6141 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006142 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006143
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006144 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6145 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006146 ArgStringList CmdArgs;
6147
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006148 std::string MArchString = "-march=hexagon";
6149 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006150
6151 RenderExtraToolArgs(JA, CmdArgs);
6152
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006153 std::string AsName = "hexagon-llvm-mc";
6154 std::string MCpuString = "-mcpu=hexagon" +
6155 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6156 CmdArgs.push_back("-filetype=obj");
6157 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6158
Tony Linthicum76329bf2011-12-12 21:14:55 +00006159 if (Output.isFilename()) {
6160 CmdArgs.push_back("-o");
6161 CmdArgs.push_back(Output.getFilename());
6162 } else {
6163 assert(Output.isNothing() && "Unexpected output");
6164 CmdArgs.push_back("-fsyntax-only");
6165 }
6166
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006167 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6168 std::string N = llvm::utostr(G.getValue());
6169 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6170 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006171
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006172 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006173
Tony Linthicum76329bf2011-12-12 21:14:55 +00006174 // Only pass -x if gcc will understand it; otherwise hope gcc
6175 // understands the suffix correctly. The main use case this would go
6176 // wrong in is for linker inputs if they happened to have an odd
6177 // suffix; really the only way to get this to happen is a command
6178 // like '-x foobar a.c' which will treat a.c like a linker input.
6179 //
6180 // FIXME: For the linker case specifically, can we safely convert
6181 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006182 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006183 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006184 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006185 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006186 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006187 else if (II.getType() == types::TY_AST)
6188 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006189 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006190 else if (II.getType() == types::TY_ModuleFile)
6191 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006192 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006193
6194 if (II.isFilename())
6195 CmdArgs.push_back(II.getFilename());
6196 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006197 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006198 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006199 II.getInputArg().render(Args, CmdArgs);
6200 }
6201
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006202 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006203 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006204}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006205
Douglas Katzman95354292015-06-23 20:42:09 +00006206void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6207 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006208}
6209
Douglas Katzman54366072015-07-27 16:53:08 +00006210static void
6211constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006212 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006213 const InputInfo &Output, const InputInfoList &Inputs,
6214 const ArgList &Args, ArgStringList &CmdArgs,
6215 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006216
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006217 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006218
Matthew Curtise689b052012-12-06 15:46:07 +00006219 //----------------------------------------------------------------------------
6220 //
6221 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006222 bool IsStatic = Args.hasArg(options::OPT_static);
6223 bool IsShared = Args.hasArg(options::OPT_shared);
6224 bool IsPIE = Args.hasArg(options::OPT_pie);
6225 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6226 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6227 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6228 bool UseG0 = false;
6229 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006230
Matthew Curtise689b052012-12-06 15:46:07 +00006231 //----------------------------------------------------------------------------
6232 // Silence warnings for various options
6233 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006234 Args.ClaimAllArgs(options::OPT_g_Group);
6235 Args.ClaimAllArgs(options::OPT_emit_llvm);
6236 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6237 // handled somewhere else.
6238 Args.ClaimAllArgs(options::OPT_static_libgcc);
6239
6240 //----------------------------------------------------------------------------
6241 //
6242 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006243 if (Args.hasArg(options::OPT_s))
6244 CmdArgs.push_back("-s");
6245
6246 if (Args.hasArg(options::OPT_r))
6247 CmdArgs.push_back("-r");
6248
6249 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006250 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006251
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006252 CmdArgs.push_back("-march=hexagon");
6253 std::string CpuVer =
6254 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6255 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6256 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006257
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006258 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006259 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006260 // The following should be the default, but doing as hexagon-gcc does.
6261 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006262 }
6263
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006264 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006265 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006266
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006267 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006268 CmdArgs.push_back("-pie");
6269
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006270 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6271 std::string N = llvm::utostr(G.getValue());
6272 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6273 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006274 }
6275
Matthew Curtise689b052012-12-06 15:46:07 +00006276 //----------------------------------------------------------------------------
6277 //
6278 //----------------------------------------------------------------------------
6279 CmdArgs.push_back("-o");
6280 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006281
Matthew Curtise689b052012-12-06 15:46:07 +00006282 //----------------------------------------------------------------------------
6283 // moslib
6284 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006285 std::vector<std::string> OsLibs;
6286 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006287
Sean Silva14facf32015-06-09 01:57:17 +00006288 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6289 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006290 OsLibs.emplace_back(A->getValue());
6291 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006292 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006293 if (OsLibs.empty()) {
6294 OsLibs.push_back("standalone");
6295 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006296 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006297
Matthew Curtise689b052012-12-06 15:46:07 +00006298 //----------------------------------------------------------------------------
6299 // Start Files
6300 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006301 const std::string MCpuSuffix = "/" + CpuVer;
6302 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6303 const std::string RootDir =
6304 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6305 const std::string StartSubDir =
6306 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006307
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006308 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6309 const char *Name) -> std::string {
6310 std::string RelName = SubDir + Name;
6311 std::string P = HTC.GetFilePath(RelName.c_str());
6312 if (llvm::sys::fs::exists(P))
6313 return P;
6314 return RootDir + RelName;
6315 };
6316
6317 if (IncStdLib && IncStartFiles) {
6318 if (!IsShared) {
6319 if (HasStandalone) {
6320 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6321 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006322 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006323 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6324 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006325 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006326 std::string Init = UseShared
6327 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6328 : Find(RootDir, StartSubDir, "/init.o");
6329 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006330 }
6331
6332 //----------------------------------------------------------------------------
6333 // Library Search Paths
6334 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006335 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6336 for (const auto &LibPath : LibPaths)
6337 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006338
6339 //----------------------------------------------------------------------------
6340 //
6341 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006342 Args.AddAllArgs(CmdArgs,
6343 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6344 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006345
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006346 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006347
6348 //----------------------------------------------------------------------------
6349 // Libraries
6350 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006351 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006352 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006353 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006354 CmdArgs.push_back("-lm");
6355 }
6356
6357 CmdArgs.push_back("--start-group");
6358
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006359 if (!IsShared) {
6360 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006361 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006362 CmdArgs.push_back("-lc");
6363 }
6364 CmdArgs.push_back("-lgcc");
6365
6366 CmdArgs.push_back("--end-group");
6367 }
6368
6369 //----------------------------------------------------------------------------
6370 // End files
6371 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006372 if (IncStdLib && IncStartFiles) {
6373 std::string Fini = UseShared
6374 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6375 : Find(RootDir, StartSubDir, "/fini.o");
6376 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006377 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006378}
6379
Douglas Katzman95354292015-06-23 20:42:09 +00006380void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6381 const InputInfo &Output,
6382 const InputInfoList &Inputs,
6383 const ArgList &Args,
6384 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006385 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006386
6387 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006388 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006389 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006390
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006391 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006392 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006393 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006394}
6395// Hexagon tools end.
6396
Tom Stellard8fa33092015-07-18 01:49:05 +00006397void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6398 const InputInfo &Output,
6399 const InputInfoList &Inputs,
6400 const ArgList &Args,
6401 const char *LinkingOutput) const {
6402
6403 std::string Linker = getToolChain().GetProgramPath(getShortName());
6404 ArgStringList CmdArgs;
6405 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006406 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006407 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006408 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006409 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6410 CmdArgs.push_back("-o");
6411 CmdArgs.push_back(Output.getFilename());
6412 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6413 CmdArgs, Inputs));
6414}
6415// AMDGPU tools end.
6416
Renato Golin7c542b42015-07-27 23:44:45 +00006417const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006418 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006419 if (!Arch.empty())
6420 MArch = Arch;
6421 else
Bernard Ogden31561762013-12-12 13:27:11 +00006422 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006423 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006424
6425 // Handle -march=native.
6426 if (MArch == "native") {
6427 std::string CPU = llvm::sys::getHostCPUName();
6428 if (CPU != "generic") {
6429 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006430 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006431 // If there is no valid architecture suffix for this CPU we don't know how
6432 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006433 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006434 MArch = "";
6435 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006436 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006437 }
6438 }
6439
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006440 return MArch;
6441}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006442
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006443/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006444StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006445 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006446 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6447 // here means an -march=native that we can't handle, so instead return no CPU.
6448 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006449 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006450
John Brawna95c1a82015-05-08 12:52:18 +00006451 // We need to return an empty string here on invalid MArch values as the
6452 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006453 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006454}
6455
6456/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006457std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006458 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006459 // FIXME: Warn on inconsistent use of -mcpu and -march.
6460 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006461 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006462 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006463 // Handle -mcpu=native.
6464 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006465 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006466 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006467 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006468 }
6469
Renato Goline17c5802015-07-27 23:44:42 +00006470 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006471}
6472
6473/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006474/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006475// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006476StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6477 const llvm::Triple &Triple) {
6478 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006479 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006480 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006481 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006482 if (ArchKind == llvm::ARM::AK_INVALID)
6483 // In case of generic Arch, i.e. "arm",
6484 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006485 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006486 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006487 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6488 // armv7k triple if it's actually been specified via "-arch armv7k".
6489 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006490 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006491 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006492 }
Renato Golin3c007252015-05-28 15:05:53 +00006493 if (ArchKind == llvm::ARM::AK_INVALID)
6494 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006495 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006496}
6497
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006498void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006499 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006500 if (Args.hasArg(options::OPT_r))
6501 return;
6502
John Brawn94fd9632015-05-21 12:19:49 +00006503 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6504 // to generate BE-8 executables.
6505 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6506 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006507}
6508
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006509mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006510 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6511 // was first introduced in Release 3. However, other compilers have
6512 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006513 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6514 .Case("mips1", NanLegacy)
6515 .Case("mips2", NanLegacy)
6516 .Case("mips3", NanLegacy)
6517 .Case("mips4", NanLegacy)
6518 .Case("mips5", NanLegacy)
6519 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006520 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006521 .Case("mips32r3", NanLegacy | Nan2008)
6522 .Case("mips32r5", NanLegacy | Nan2008)
6523 .Case("mips32r6", Nan2008)
6524 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006525 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006526 .Case("mips64r3", NanLegacy | Nan2008)
6527 .Case("mips64r5", NanLegacy | Nan2008)
6528 .Case("mips64r6", Nan2008)
6529 .Default(NanLegacy);
6530}
6531
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006532bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6533 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6534 return A && (A->getValue() == StringRef(Value));
6535}
6536
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006537bool mips::isUCLibc(const ArgList &Args) {
6538 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006539 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006540}
6541
Daniel Sanders2bf13662014-07-10 14:40:57 +00006542bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006543 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6544 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006545 .Case("2008", true)
6546 .Case("legacy", false)
6547 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006548
6549 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006550 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006551 .Cases("mips32r6", "mips64r6", true)
6552 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006553
6554 return false;
6555}
6556
Daniel Sanders379d44b2014-07-16 11:52:23 +00006557bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006558 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006559 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006560 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006561 return false;
6562
6563 if (ABIName != "32")
6564 return false;
6565
Toma Tabacu94ea6862015-06-16 13:54:13 +00006566 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6567 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006568 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006569 return false;
6570
Daniel Sanders379d44b2014-07-16 11:52:23 +00006571 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006572 .Cases("mips2", "mips3", "mips4", "mips5", true)
6573 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6574 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6575 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006576}
6577
Toma Tabacu94ea6862015-06-16 13:54:13 +00006578bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6579 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006580 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006581 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6582
6583 // FPXX shouldn't be used if -msingle-float is present.
6584 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6585 options::OPT_mdouble_float))
6586 if (A->getOption().matches(options::OPT_msingle_float))
6587 UseFPXX = false;
6588
6589 return UseFPXX;
6590}
6591
Tim Northover157d9112014-01-16 08:48:16 +00006592llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006593 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6594 // archs which Darwin doesn't use.
6595
6596 // The matching this routine does is fairly pointless, since it is neither the
6597 // complete architecture list, nor a reasonable subset. The problem is that
6598 // historically the driver driver accepts this and also ties its -march=
6599 // handling to the architecture name, so we need to be careful before removing
6600 // support for it.
6601
6602 // This code must be kept in sync with Clang's Darwin specific argument
6603 // translation.
6604
6605 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006606 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6607 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6608 .Case("ppc64", llvm::Triple::ppc64)
6609 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6610 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6611 llvm::Triple::x86)
6612 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6613 // This is derived from the driver driver.
6614 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6615 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6616 .Cases("armv7s", "xscale", llvm::Triple::arm)
6617 .Case("arm64", llvm::Triple::aarch64)
6618 .Case("r600", llvm::Triple::r600)
6619 .Case("amdgcn", llvm::Triple::amdgcn)
6620 .Case("nvptx", llvm::Triple::nvptx)
6621 .Case("nvptx64", llvm::Triple::nvptx64)
6622 .Case("amdil", llvm::Triple::amdil)
6623 .Case("spir", llvm::Triple::spir)
6624 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006625}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006626
Tim Northover157d9112014-01-16 08:48:16 +00006627void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006628 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006629 T.setArch(Arch);
6630
6631 if (Str == "x86_64h")
6632 T.setArchName(Str);
6633 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6634 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006635 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006636 }
6637}
6638
Bob Wilsondecc03e2012-11-23 06:14:39 +00006639const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006640 const InputInfo &Input) {
6641 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006642}
6643
Bob Wilsondecc03e2012-11-23 06:14:39 +00006644const char *Clang::getBaseInputStem(const ArgList &Args,
6645 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006646 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006647
Chris Lattner906bb902011-01-16 08:14:11 +00006648 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006649 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006650
6651 return Str;
6652}
6653
Bob Wilsondecc03e2012-11-23 06:14:39 +00006654const char *Clang::getDependencyFileName(const ArgList &Args,
6655 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006656 // FIXME: Think about this more.
6657 std::string Res;
6658
6659 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006660 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006661 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006662 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006663 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006664 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006665 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006666}
6667
Douglas Katzman95354292015-06-23 20:42:09 +00006668void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6669 const InputInfo &Output,
6670 const InputInfoList &Inputs,
6671 const ArgList &Args,
6672 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006673 const ToolChain &ToolChain = getToolChain();
6674 const Driver &D = ToolChain.getDriver();
6675 ArgStringList CmdArgs;
6676
6677 // Silence warning for "clang -g foo.o -o foo"
6678 Args.ClaimAllArgs(options::OPT_g_Group);
6679 // and "clang -emit-llvm foo.o -o foo"
6680 Args.ClaimAllArgs(options::OPT_emit_llvm);
6681 // and for "clang -w foo.o -o foo". Other warning options are already
6682 // handled somewhere else.
6683 Args.ClaimAllArgs(options::OPT_w);
6684
6685 if (!D.SysRoot.empty())
6686 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6687
6688 // CloudABI only supports static linkage.
6689 CmdArgs.push_back("-Bstatic");
6690 CmdArgs.push_back("--eh-frame-hdr");
6691 CmdArgs.push_back("--gc-sections");
6692
6693 if (Output.isFilename()) {
6694 CmdArgs.push_back("-o");
6695 CmdArgs.push_back(Output.getFilename());
6696 } else {
6697 assert(Output.isNothing() && "Invalid output.");
6698 }
6699
Douglas Katzman78b37b02015-11-17 20:28:07 +00006700 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006701 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6702 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6703 }
6704
6705 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006706 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006707 Args.AddAllArgs(CmdArgs,
6708 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6709 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006710
Teresa Johnson945bc502015-10-15 20:35:53 +00006711 if (D.isUsingLTO())
6712 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006713
6714 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6715
Douglas Katzman78b37b02015-11-17 20:28:07 +00006716 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006717 if (D.CCCIsCXX())
6718 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6719 CmdArgs.push_back("-lc");
6720 CmdArgs.push_back("-lcompiler_rt");
6721 }
6722
Douglas Katzman78b37b02015-11-17 20:28:07 +00006723 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006724 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6725
6726 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006727 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006728}
6729
Douglas Katzman95354292015-06-23 20:42:09 +00006730void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6731 const InputInfo &Output,
6732 const InputInfoList &Inputs,
6733 const ArgList &Args,
6734 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006735 ArgStringList CmdArgs;
6736
6737 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6738 const InputInfo &Input = Inputs[0];
6739
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006740 // Determine the original source input.
6741 const Action *SourceAction = &JA;
6742 while (SourceAction->getKind() != Action::InputClass) {
6743 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6744 SourceAction = SourceAction->getInputs()[0];
6745 }
6746
Eric Christopherf5a8f492015-12-08 00:10:10 +00006747 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006748 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006749 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6750 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006751 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006752 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006753 const llvm::Triple &T(getToolChain().getTriple());
6754 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006755 CmdArgs.push_back("-Q");
6756 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006757
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006758 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006759 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006760 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006761 if (Args.hasArg(options::OPT_gstabs))
6762 CmdArgs.push_back("--gstabs");
6763 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006764 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006765 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006766
Daniel Dunbarbe220842009-03-20 16:06:39 +00006767 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006768 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006769
Daniel Dunbar6d484762010-07-22 01:47:22 +00006770 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006771 if (getToolChain().getArch() == llvm::Triple::x86 ||
6772 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006773 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6774 CmdArgs.push_back("-force_cpusubtype_ALL");
6775
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006776 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006777 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006778 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006779 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006780 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006781 CmdArgs.push_back("-static");
6782
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006783 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006784
6785 assert(Output.isFilename() && "Unexpected lipo output.");
6786 CmdArgs.push_back("-o");
6787 CmdArgs.push_back(Output.getFilename());
6788
Daniel Dunbarb440f562010-08-02 02:38:21 +00006789 assert(Input.isFilename() && "Invalid input.");
6790 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006791
6792 // asm_final spec is empty.
6793
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006794 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006795 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006796}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006797
Tim Northover157d9112014-01-16 08:48:16 +00006798void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006799
Tim Northover157d9112014-01-16 08:48:16 +00006800void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6801 ArgStringList &CmdArgs) const {
6802 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006803
Daniel Dunbarc1964212009-03-26 16:23:12 +00006804 // Derived from darwin_arch spec.
6805 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006806 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006807
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006808 // FIXME: Is this needed anymore?
6809 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006810 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006811}
6812
Douglas Katzman95354292015-06-23 20:42:09 +00006813bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006814 // We only need to generate a temp path for LTO if we aren't compiling object
6815 // files. When compiling source files, we run 'dsymutil' after linking. We
6816 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006817 for (const auto &Input : Inputs)
6818 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006819 return true;
6820
6821 return false;
6822}
6823
Douglas Katzman95354292015-06-23 20:42:09 +00006824void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6825 ArgStringList &CmdArgs,
6826 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006827 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006828 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006829
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006830 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006831 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6832 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006833 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6834 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006835 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006836 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006837 }
6838
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006839 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006840 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006841 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6842 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006843
Bob Wilson3d27dad2013-08-02 22:25:34 +00006844 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6845 CmdArgs.push_back("-export_dynamic");
6846
Bob Wilsonb111ec92015-03-02 19:01:14 +00006847 // If we are using App Extension restrictions, pass a flag to the linker
6848 // telling it that the compiled code has been audited.
6849 if (Args.hasFlag(options::OPT_fapplication_extension,
6850 options::OPT_fno_application_extension, false))
6851 CmdArgs.push_back("-application_extension");
6852
Teresa Johnson945bc502015-10-15 20:35:53 +00006853 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006854 // If we are using LTO, then automatically create a temporary file path for
6855 // the linker to use, so that it's lifetime will extend past a possible
6856 // dsymutil step.
6857 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6858 const char *TmpPath = C.getArgs().MakeArgString(
6859 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6860 C.addTempFile(TmpPath);
6861 CmdArgs.push_back("-object_path_lto");
6862 CmdArgs.push_back(TmpPath);
6863 }
6864
6865 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6866 // it in clang installed libraries. If not found, the option is not used
6867 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6868 if (Version[0] >= 133) {
6869 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6870 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6871 SmallString<128> LibLTOPath(P);
6872 llvm::sys::path::append(LibLTOPath, "lib");
6873 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6874 if (llvm::sys::fs::exists(LibLTOPath)) {
6875 CmdArgs.push_back("-lto_library");
6876 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6877 } else {
6878 D.Diag(diag::warn_drv_lto_libpath);
6879 }
6880 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006881 }
6882
Daniel Dunbarc1964212009-03-26 16:23:12 +00006883 // Derived from the "link" spec.
6884 Args.AddAllArgs(CmdArgs, options::OPT_static);
6885 if (!Args.hasArg(options::OPT_static))
6886 CmdArgs.push_back("-dynamic");
6887 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6888 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6889 // here. How do we wish to handle such things?
6890 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006891
Daniel Dunbarc1964212009-03-26 16:23:12 +00006892 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006893 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006894 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006895 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006896
6897 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6898 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6899 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6900
6901 Arg *A;
6902 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6903 (A = Args.getLastArg(options::OPT_current__version)) ||
6904 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006905 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6906 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006907
6908 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6909 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6910 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6911 } else {
6912 CmdArgs.push_back("-dylib");
6913
6914 Arg *A;
6915 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6916 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6917 (A = Args.getLastArg(options::OPT_client__name)) ||
6918 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6919 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6920 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006921 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6922 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006923
Daniel Dunbarc1964212009-03-26 16:23:12 +00006924 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6925 "-dylib_compatibility_version");
6926 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6927 "-dylib_current_version");
6928
Tim Northover157d9112014-01-16 08:48:16 +00006929 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006930
6931 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6932 "-dylib_install_name");
6933 }
6934
6935 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6936 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6937 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006938 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006939 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006940 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6941 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6942 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6943 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6944 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6945 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006946 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006947 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6948 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6949 Args.AddAllArgs(CmdArgs, options::OPT_init);
6950
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006951 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006952 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006953
Daniel Dunbarc1964212009-03-26 16:23:12 +00006954 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6955 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6956 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6957 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6958 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006959
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006960 if (const Arg *A =
6961 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6962 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006963 if (A->getOption().matches(options::OPT_fpie) ||
6964 A->getOption().matches(options::OPT_fPIE))
6965 CmdArgs.push_back("-pie");
6966 else
6967 CmdArgs.push_back("-no_pie");
6968 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006969
6970 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6971 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6972 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6973 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6974 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6975 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6976 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6977 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6978 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6979 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6980 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6981 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6982 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6983 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6984 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6985 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006986
Daniel Dunbar84384642011-05-02 21:03:47 +00006987 // Give --sysroot= preference, over the Apple specific behavior to also use
6988 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006989 StringRef sysroot = C.getSysRoot();
6990 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006991 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006992 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006993 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6994 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006995 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006996 }
6997
Daniel Dunbarc1964212009-03-26 16:23:12 +00006998 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6999 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7000 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7001 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7002 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007003 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007004 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7005 Args.AddAllArgs(CmdArgs, options::OPT_y);
7006 Args.AddLastArg(CmdArgs, options::OPT_w);
7007 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7008 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7009 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7010 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7011 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7012 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7013 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7014 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7015 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7016 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7017 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7018 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7019}
7020
Douglas Katzman95354292015-06-23 20:42:09 +00007021void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7022 const InputInfo &Output,
7023 const InputInfoList &Inputs,
7024 const ArgList &Args,
7025 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007026 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007027
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007028 // If the number of arguments surpasses the system limits, we will encode the
7029 // input files in a separate file, shortening the command line. To this end,
7030 // build a list of input file names that can be passed via a file with the
7031 // -filelist linker option.
7032 llvm::opt::ArgStringList InputFileList;
7033
Daniel Dunbarc1964212009-03-26 16:23:12 +00007034 // The logic here is derived from gcc's behavior; most of which
7035 // comes from specs (starting with link_command). Consult gcc for
7036 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007037 ArgStringList CmdArgs;
7038
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007039 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7040 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7041 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007042 for (const auto &Arg : Args)
7043 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007044 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007045 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007046 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007047 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007048 return;
7049 }
7050
Daniel Dunbarc1964212009-03-26 16:23:12 +00007051 // I'm not sure why this particular decomposition exists in gcc, but
7052 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007053 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007054
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007055 // It seems that the 'e' option is completely ignored for dynamic executables
7056 // (the default), and with static executables, the last one wins, as expected.
7057 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7058 options::OPT_Z_Flag, options::OPT_u_Group,
7059 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007060
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007061 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7062 // members of static archive libraries which implement Objective-C classes or
7063 // categories.
7064 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7065 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007066
Daniel Dunbarc1964212009-03-26 16:23:12 +00007067 CmdArgs.push_back("-o");
7068 CmdArgs.push_back(Output.getFilename());
7069
Douglas Katzman78b37b02015-11-17 20:28:07 +00007070 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007071 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007072
Peter Collingbournec4122c12015-06-15 21:08:13 +00007073 // SafeStack requires its own runtime libraries
7074 // These libraries should be linked first, to make sure the
7075 // __safestack_init constructor executes before everything else
7076 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7077 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7078 "libclang_rt.safestack_osx.a",
7079 /*AlwaysLink=*/true);
7080 }
7081
Daniel Dunbarc1964212009-03-26 16:23:12 +00007082 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007083
Douglas Gregor9295df02012-05-15 21:00:27 +00007084 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007085 // Build the input file for -filelist (list of linker input files) in case we
7086 // need it later
7087 for (const auto &II : Inputs) {
7088 if (!II.isFilename()) {
7089 // This is a linker input argument.
7090 // We cannot mix input arguments and file names in a -filelist input, thus
7091 // we prematurely stop our list (remaining files shall be passed as
7092 // arguments).
7093 if (InputFileList.size() > 0)
7094 break;
7095
7096 continue;
7097 }
7098
7099 InputFileList.push_back(II.getFilename());
7100 }
7101
Douglas Katzman78b37b02015-11-17 20:28:07 +00007102 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007103 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7104
Douglas Katzman78b37b02015-11-17 20:28:07 +00007105 if (isObjCRuntimeLinked(Args) &&
7106 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007107 // We use arclite library for both ARC and subscripting support.
7108 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7109
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007110 CmdArgs.push_back("-framework");
7111 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007112 // Link libobj.
7113 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007114 }
John McCall31168b02011-06-15 23:02:42 +00007115
Daniel Dunbarc1964212009-03-26 16:23:12 +00007116 if (LinkingOutput) {
7117 CmdArgs.push_back("-arch_multiple");
7118 CmdArgs.push_back("-final_output");
7119 CmdArgs.push_back(LinkingOutput);
7120 }
7121
Daniel Dunbarc1964212009-03-26 16:23:12 +00007122 if (Args.hasArg(options::OPT_fnested_functions))
7123 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007124
Justin Bognerc7701242015-05-12 05:44:36 +00007125 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7126
Douglas Katzman78b37b02015-11-17 20:28:07 +00007127 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007128 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007129 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007130
Daniel Dunbarc1964212009-03-26 16:23:12 +00007131 // link_ssp spec is empty.
7132
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007133 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007134 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007135 }
7136
Douglas Katzman78b37b02015-11-17 20:28:07 +00007137 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007138 // endfile_spec is empty.
7139 }
7140
7141 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7142 Args.AddAllArgs(CmdArgs, options::OPT_F);
7143
Steven Wu3ffb61b2015-02-06 18:08:29 +00007144 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007145 for (const Arg *A : Args.filtered(options::OPT_iframework))
7146 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007147
Douglas Katzman78b37b02015-11-17 20:28:07 +00007148 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007149 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7150 if (A->getValue() == StringRef("Accelerate")) {
7151 CmdArgs.push_back("-framework");
7152 CmdArgs.push_back("Accelerate");
7153 }
7154 }
7155 }
7156
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007157 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007158 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007159 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007160 Cmd->setInputFileList(std::move(InputFileList));
7161 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007162}
7163
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007164void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007165 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007166 const InputInfoList &Inputs,
7167 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007168 const char *LinkingOutput) const {
7169 ArgStringList CmdArgs;
7170
7171 CmdArgs.push_back("-create");
7172 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007173
7174 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007175 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007176
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007177 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007178 assert(II.isFilename() && "Unexpected lipo input.");
7179 CmdArgs.push_back(II.getFilename());
7180 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007181
7182 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007183 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007184}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007185
Daniel Dunbar88299622010-06-04 18:28:36 +00007186void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007187 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007188 const InputInfoList &Inputs,
7189 const ArgList &Args,
7190 const char *LinkingOutput) const {
7191 ArgStringList CmdArgs;
7192
Daniel Dunbareb86b042011-05-09 17:23:16 +00007193 CmdArgs.push_back("-o");
7194 CmdArgs.push_back(Output.getFilename());
7195
Daniel Dunbar88299622010-06-04 18:28:36 +00007196 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7197 const InputInfo &Input = Inputs[0];
7198 assert(Input.isFilename() && "Unexpected dsymutil input.");
7199 CmdArgs.push_back(Input.getFilename());
7200
Daniel Dunbar88299622010-06-04 18:28:36 +00007201 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007202 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007203 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007204}
7205
Eric Christopher551ef452011-08-23 17:56:55 +00007206void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007207 const InputInfo &Output,
7208 const InputInfoList &Inputs,
7209 const ArgList &Args,
7210 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007211 ArgStringList CmdArgs;
7212 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007213 CmdArgs.push_back("--debug-info");
7214 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007215 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007216
7217 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7218 const InputInfo &Input = Inputs[0];
7219 assert(Input.isFilename() && "Unexpected verify input");
7220
7221 // Grabbing the output of the earlier dsymutil run.
7222 CmdArgs.push_back(Input.getFilename());
7223
7224 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007225 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007226 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007227}
7228
Douglas Katzman95354292015-06-23 20:42:09 +00007229void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007230 const InputInfo &Output,
7231 const InputInfoList &Inputs,
7232 const ArgList &Args,
7233 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007234 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007235 ArgStringList CmdArgs;
7236
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007237 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007238
7239 CmdArgs.push_back("-o");
7240 CmdArgs.push_back(Output.getFilename());
7241
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007242 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007243 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007244
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007245 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007246 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007247}
7248
Douglas Katzman95354292015-06-23 20:42:09 +00007249void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7250 const InputInfo &Output,
7251 const InputInfoList &Inputs,
7252 const ArgList &Args,
7253 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007254 ArgStringList CmdArgs;
7255
David Chisnall272a0712012-02-29 15:06:12 +00007256 // Demangle C++ names in errors
7257 CmdArgs.push_back("-C");
7258
Douglas Katzman78b37b02015-11-17 20:28:07 +00007259 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007260 CmdArgs.push_back("-e");
7261 CmdArgs.push_back("_start");
7262 }
7263
7264 if (Args.hasArg(options::OPT_static)) {
7265 CmdArgs.push_back("-Bstatic");
7266 CmdArgs.push_back("-dn");
7267 } else {
7268 CmdArgs.push_back("-Bdynamic");
7269 if (Args.hasArg(options::OPT_shared)) {
7270 CmdArgs.push_back("-shared");
7271 } else {
7272 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007273 CmdArgs.push_back(
7274 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007275 }
7276 }
7277
7278 if (Output.isFilename()) {
7279 CmdArgs.push_back("-o");
7280 CmdArgs.push_back(Output.getFilename());
7281 } else {
7282 assert(Output.isNothing() && "Invalid output.");
7283 }
7284
Douglas Katzman78b37b02015-11-17 20:28:07 +00007285 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007286 if (!Args.hasArg(options::OPT_shared))
7287 CmdArgs.push_back(
7288 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7289
7290 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7291 CmdArgs.push_back(
7292 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7293 CmdArgs.push_back(
7294 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007295 }
7296
Douglas Katzman6059ef92015-11-17 17:41:23 +00007297 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007298
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007299 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7300 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007301
7302 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7303
Douglas Katzman78b37b02015-11-17 20:28:07 +00007304 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007305 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007306 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007307 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007308 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007309 if (!Args.hasArg(options::OPT_shared)) {
7310 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007311 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007312 }
David Chisnallf571cde2012-02-15 13:39:01 +00007313 }
7314
Douglas Katzman78b37b02015-11-17 20:28:07 +00007315 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007316 CmdArgs.push_back(
7317 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007318 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007319 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007320
Xinliang David Li69306c02015-10-22 06:15:31 +00007321 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007322
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007323 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007324 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007325}
7326
Douglas Katzman95354292015-06-23 20:42:09 +00007327void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7328 const InputInfo &Output,
7329 const InputInfoList &Inputs,
7330 const ArgList &Args,
7331 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007332 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007333 ArgStringList CmdArgs;
7334
Rafael Espindolacc126272014-02-28 01:55:21 +00007335 switch (getToolChain().getArch()) {
7336 case llvm::Triple::x86:
7337 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7338 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007339 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007340 break;
7341
7342 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007343 CmdArgs.push_back("-mppc");
7344 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007345 break;
7346
7347 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007348 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007349 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007350 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7351 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7352 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007353 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007354 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007355
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007356 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007357 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007358 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7359 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7360 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007361 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007362 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007363
7364 case llvm::Triple::mips64:
7365 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007366 StringRef CPUName;
7367 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007368 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007369
7370 CmdArgs.push_back("-mabi");
7371 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7372
7373 if (getToolChain().getArch() == llvm::Triple::mips64)
7374 CmdArgs.push_back("-EB");
7375 else
7376 CmdArgs.push_back("-EL");
7377
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007378 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007379 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007380 }
7381
Rafael Espindolacc126272014-02-28 01:55:21 +00007382 default:
7383 break;
7384 }
7385
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007386 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007387
7388 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007389 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007390
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007391 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007392 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007393
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007394 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007395 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007396}
7397
Douglas Katzman95354292015-06-23 20:42:09 +00007398void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7399 const InputInfo &Output,
7400 const InputInfoList &Inputs,
7401 const ArgList &Args,
7402 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007403 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007404 ArgStringList CmdArgs;
7405
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007406 // Silence warning for "clang -g foo.o -o foo"
7407 Args.ClaimAllArgs(options::OPT_g_Group);
7408 // and "clang -emit-llvm foo.o -o foo"
7409 Args.ClaimAllArgs(options::OPT_emit_llvm);
7410 // and for "clang -w foo.o -o foo". Other warning options are already
7411 // handled somewhere else.
7412 Args.ClaimAllArgs(options::OPT_w);
7413
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007414 if (getToolChain().getArch() == llvm::Triple::mips64)
7415 CmdArgs.push_back("-EB");
7416 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7417 CmdArgs.push_back("-EL");
7418
Douglas Katzman78b37b02015-11-17 20:28:07 +00007419 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007420 CmdArgs.push_back("-e");
7421 CmdArgs.push_back("__start");
7422 }
7423
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007424 if (Args.hasArg(options::OPT_static)) {
7425 CmdArgs.push_back("-Bstatic");
7426 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007427 if (Args.hasArg(options::OPT_rdynamic))
7428 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007429 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007430 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007431 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007432 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007433 } else {
7434 CmdArgs.push_back("-dynamic-linker");
7435 CmdArgs.push_back("/usr/libexec/ld.so");
7436 }
7437 }
7438
Rafael Espindola044f7832013-06-05 04:28:55 +00007439 if (Args.hasArg(options::OPT_nopie))
7440 CmdArgs.push_back("-nopie");
7441
Daniel Dunbarb440f562010-08-02 02:38:21 +00007442 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007443 CmdArgs.push_back("-o");
7444 CmdArgs.push_back(Output.getFilename());
7445 } else {
7446 assert(Output.isNothing() && "Invalid output.");
7447 }
7448
Douglas Katzman78b37b02015-11-17 20:28:07 +00007449 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007450 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007451 if (Args.hasArg(options::OPT_pg))
7452 CmdArgs.push_back(
7453 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007454 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007455 CmdArgs.push_back(
7456 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7457 CmdArgs.push_back(
7458 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007459 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007460 CmdArgs.push_back(
7461 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007462 }
7463 }
7464
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007465 std::string Triple = getToolChain().getTripleString();
7466 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007467 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007468 CmdArgs.push_back(
7469 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007470
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007471 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7472 options::OPT_e, options::OPT_s, options::OPT_t,
7473 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007474
Daniel Dunbar54423b22010-09-17 00:24:54 +00007475 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007476
Douglas Katzman78b37b02015-11-17 20:28:07 +00007477 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007478 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007479 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007480 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007481 CmdArgs.push_back("-lm_p");
7482 else
7483 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007484 }
7485
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007486 // FIXME: For some reason GCC passes -lgcc before adding
7487 // the default system libraries. Just mimic this for now.
7488 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007489
Eric Christopher17674ec2012-09-13 06:32:34 +00007490 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007491 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7492 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007493 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007494 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007495 }
7496
Chandler Carruth45661652011-12-17 22:32:42 +00007497 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007498 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007499 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007500 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007501 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007502 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007503
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007504 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007505 }
7506
Douglas Katzman78b37b02015-11-17 20:28:07 +00007507 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007508 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007509 CmdArgs.push_back(
7510 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007511 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007512 CmdArgs.push_back(
7513 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007514 }
7515
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007516 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007517 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007518}
Ed Schoutene33194b2009-04-02 19:13:12 +00007519
Douglas Katzman95354292015-06-23 20:42:09 +00007520void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7521 const InputInfo &Output,
7522 const InputInfoList &Inputs,
7523 const ArgList &Args,
7524 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007525 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007526 ArgStringList CmdArgs;
7527
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007528 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007529
7530 CmdArgs.push_back("-o");
7531 CmdArgs.push_back(Output.getFilename());
7532
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007533 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007534 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007535
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007536 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007537 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007538}
7539
Douglas Katzman95354292015-06-23 20:42:09 +00007540void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7541 const InputInfo &Output,
7542 const InputInfoList &Inputs,
7543 const ArgList &Args,
7544 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007545 const Driver &D = getToolChain().getDriver();
7546 ArgStringList CmdArgs;
7547
Douglas Katzman78b37b02015-11-17 20:28:07 +00007548 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007549 CmdArgs.push_back("-e");
7550 CmdArgs.push_back("__start");
7551 }
7552
7553 if (Args.hasArg(options::OPT_static)) {
7554 CmdArgs.push_back("-Bstatic");
7555 } else {
7556 if (Args.hasArg(options::OPT_rdynamic))
7557 CmdArgs.push_back("-export-dynamic");
7558 CmdArgs.push_back("--eh-frame-hdr");
7559 CmdArgs.push_back("-Bdynamic");
7560 if (Args.hasArg(options::OPT_shared)) {
7561 CmdArgs.push_back("-shared");
7562 } else {
7563 CmdArgs.push_back("-dynamic-linker");
7564 CmdArgs.push_back("/usr/libexec/ld.so");
7565 }
7566 }
7567
7568 if (Output.isFilename()) {
7569 CmdArgs.push_back("-o");
7570 CmdArgs.push_back(Output.getFilename());
7571 } else {
7572 assert(Output.isNothing() && "Invalid output.");
7573 }
7574
Douglas Katzman78b37b02015-11-17 20:28:07 +00007575 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007576 if (!Args.hasArg(options::OPT_shared)) {
7577 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007578 CmdArgs.push_back(
7579 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007580 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007581 CmdArgs.push_back(
7582 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7583 CmdArgs.push_back(
7584 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007585 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007586 CmdArgs.push_back(
7587 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007588 }
7589 }
7590
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007591 Args.AddAllArgs(CmdArgs,
7592 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007593
7594 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7595
Douglas Katzman78b37b02015-11-17 20:28:07 +00007596 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007597 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007598 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7599 if (Args.hasArg(options::OPT_pg))
7600 CmdArgs.push_back("-lm_p");
7601 else
7602 CmdArgs.push_back("-lm");
7603 }
7604
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007605 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007606 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007607 CmdArgs.push_back("-lpthread_p");
7608 else
7609 CmdArgs.push_back("-lpthread");
7610 }
7611
Eli Friedman9fa28852012-08-08 23:57:20 +00007612 if (!Args.hasArg(options::OPT_shared)) {
7613 if (Args.hasArg(options::OPT_pg))
7614 CmdArgs.push_back("-lc_p");
7615 else
7616 CmdArgs.push_back("-lc");
7617 }
7618
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007619 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007620 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007621 case llvm::Triple::arm:
7622 MyArch = "arm";
7623 break;
7624 case llvm::Triple::x86:
7625 MyArch = "i386";
7626 break;
7627 case llvm::Triple::x86_64:
7628 MyArch = "amd64";
7629 break;
7630 default:
7631 llvm_unreachable("Unsupported architecture");
7632 }
7633 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007634 }
7635
Douglas Katzman78b37b02015-11-17 20:28:07 +00007636 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007637 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007638 CmdArgs.push_back(
7639 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007640 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007641 CmdArgs.push_back(
7642 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007643 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007644
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007645 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007646 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007647}
7648
Douglas Katzman95354292015-06-23 20:42:09 +00007649void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7650 const InputInfo &Output,
7651 const InputInfoList &Inputs,
7652 const ArgList &Args,
7653 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007654 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007655 ArgStringList CmdArgs;
7656
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007657 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7658 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007659 switch (getToolChain().getArch()) {
7660 default:
7661 break;
7662 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007663 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007664 break;
7665 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007666 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007667 break;
7668 case llvm::Triple::mips:
7669 case llvm::Triple::mipsel:
7670 case llvm::Triple::mips64:
7671 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007672 StringRef CPUName;
7673 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007674 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007675
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007676 CmdArgs.push_back("-march");
7677 CmdArgs.push_back(CPUName.data());
7678
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007679 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007680 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007681
7682 if (getToolChain().getArch() == llvm::Triple::mips ||
7683 getToolChain().getArch() == llvm::Triple::mips64)
7684 CmdArgs.push_back("-EB");
7685 else
7686 CmdArgs.push_back("-EL");
7687
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007688 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007689 break;
7690 }
7691 case llvm::Triple::arm:
7692 case llvm::Triple::armeb:
7693 case llvm::Triple::thumb:
7694 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007695 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007696
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007697 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007698 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007699 else
Renato Golinf4421f72014-02-19 10:44:07 +00007700 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007701
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007702 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007703 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007704 case llvm::Triple::GNUEABI:
7705 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007706 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007707 break;
7708
7709 default:
7710 CmdArgs.push_back("-matpcs");
7711 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007712 break;
7713 }
7714 case llvm::Triple::sparc:
7715 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007716 case llvm::Triple::sparcv9: {
7717 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7718 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007719 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007720 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007721 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007722 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007723
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007724 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007725
7726 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007727 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007728
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007729 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007730 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007731
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007732 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007733 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007734}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007735
Douglas Katzman95354292015-06-23 20:42:09 +00007736void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7737 const InputInfo &Output,
7738 const InputInfoList &Inputs,
7739 const ArgList &Args,
7740 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007741 const toolchains::FreeBSD &ToolChain =
7742 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007743 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007744 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007745 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007746 !Args.hasArg(options::OPT_shared) &&
7747 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007748 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007749
7750 // Silence warning for "clang -g foo.o -o foo"
7751 Args.ClaimAllArgs(options::OPT_g_Group);
7752 // and "clang -emit-llvm foo.o -o foo"
7753 Args.ClaimAllArgs(options::OPT_emit_llvm);
7754 // and for "clang -w foo.o -o foo". Other warning options are already
7755 // handled somewhere else.
7756 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007757
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007758 if (!D.SysRoot.empty())
7759 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7760
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007761 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007762 CmdArgs.push_back("-pie");
7763
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007764 if (Args.hasArg(options::OPT_static)) {
7765 CmdArgs.push_back("-Bstatic");
7766 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007767 if (Args.hasArg(options::OPT_rdynamic))
7768 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007769 CmdArgs.push_back("--eh-frame-hdr");
7770 if (Args.hasArg(options::OPT_shared)) {
7771 CmdArgs.push_back("-Bshareable");
7772 } else {
7773 CmdArgs.push_back("-dynamic-linker");
7774 CmdArgs.push_back("/libexec/ld-elf.so.1");
7775 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007776 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007777 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7778 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7779 CmdArgs.push_back("--hash-style=both");
7780 }
7781 }
7782 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007783 }
7784
7785 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7786 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007787 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007788 CmdArgs.push_back("-m");
7789 CmdArgs.push_back("elf_i386_fbsd");
7790 }
7791
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007792 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007793 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007794 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007795 }
7796
Daniel Dunbarb440f562010-08-02 02:38:21 +00007797 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007798 CmdArgs.push_back("-o");
7799 CmdArgs.push_back(Output.getFilename());
7800 } else {
7801 assert(Output.isNothing() && "Invalid output.");
7802 }
7803
Douglas Katzman78b37b02015-11-17 20:28:07 +00007804 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007805 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007806 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007807 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007808 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007809 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007810 crt1 = "Scrt1.o";
7811 else
7812 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007813 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007814 if (crt1)
7815 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7816
7817 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7818
Craig Topper92fc2df2014-05-17 16:56:41 +00007819 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007820 if (Args.hasArg(options::OPT_static))
7821 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007822 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007823 crtbegin = "crtbeginS.o";
7824 else
7825 crtbegin = "crtbegin.o";
7826
7827 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007828 }
7829
7830 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007831 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007832 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7833 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007834 Args.AddAllArgs(CmdArgs, options::OPT_s);
7835 Args.AddAllArgs(CmdArgs, options::OPT_t);
7836 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7837 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007838
Teresa Johnson945bc502015-10-15 20:35:53 +00007839 if (D.isUsingLTO())
7840 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007841
Alexey Samsonov52550342014-09-15 19:58:40 +00007842 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007843 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007844
Douglas Katzman78b37b02015-11-17 20:28:07 +00007845 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007846 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007847 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007848 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007849 if (Args.hasArg(options::OPT_pg))
7850 CmdArgs.push_back("-lm_p");
7851 else
7852 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007853 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007854 if (NeedsSanitizerDeps)
7855 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007856 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7857 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007858 if (Args.hasArg(options::OPT_pg))
7859 CmdArgs.push_back("-lgcc_p");
7860 else
7861 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007862 if (Args.hasArg(options::OPT_static)) {
7863 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007864 } else if (Args.hasArg(options::OPT_pg)) {
7865 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007866 } else {
7867 CmdArgs.push_back("--as-needed");
7868 CmdArgs.push_back("-lgcc_s");
7869 CmdArgs.push_back("--no-as-needed");
7870 }
7871
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007872 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007873 if (Args.hasArg(options::OPT_pg))
7874 CmdArgs.push_back("-lpthread_p");
7875 else
7876 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007877 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007878
Roman Divacky66f22762011-02-10 16:59:40 +00007879 if (Args.hasArg(options::OPT_pg)) {
7880 if (Args.hasArg(options::OPT_shared))
7881 CmdArgs.push_back("-lc");
7882 else
7883 CmdArgs.push_back("-lc_p");
7884 CmdArgs.push_back("-lgcc_p");
7885 } else {
7886 CmdArgs.push_back("-lc");
7887 CmdArgs.push_back("-lgcc");
7888 }
7889
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007890 if (Args.hasArg(options::OPT_static)) {
7891 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007892 } else if (Args.hasArg(options::OPT_pg)) {
7893 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007894 } else {
7895 CmdArgs.push_back("--as-needed");
7896 CmdArgs.push_back("-lgcc_s");
7897 CmdArgs.push_back("--no-as-needed");
7898 }
7899 }
7900
Douglas Katzman78b37b02015-11-17 20:28:07 +00007901 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007902 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007903 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007904 else
7905 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007906 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007907 }
7908
Xinliang David Li69306c02015-10-22 06:15:31 +00007909 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007910
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007911 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007912 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007913}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007914
Douglas Katzman95354292015-06-23 20:42:09 +00007915void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007916 const InputInfo &Output,
7917 const InputInfoList &Inputs,
7918 const ArgList &Args,
7919 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007920 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007921 ArgStringList CmdArgs;
7922
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007923 // GNU as needs different flags for creating the correct output format
7924 // on architectures with different ABIs or optional feature sets.
7925 switch (getToolChain().getArch()) {
7926 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007927 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007928 break;
7929 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007930 case llvm::Triple::armeb:
7931 case llvm::Triple::thumb:
7932 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007933 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007934 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7935 std::string Arch =
7936 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007937 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007938 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007939 }
7940
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007941 case llvm::Triple::mips:
7942 case llvm::Triple::mipsel:
7943 case llvm::Triple::mips64:
7944 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007945 StringRef CPUName;
7946 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007947 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007948
7949 CmdArgs.push_back("-march");
7950 CmdArgs.push_back(CPUName.data());
7951
7952 CmdArgs.push_back("-mabi");
7953 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7954
7955 if (getToolChain().getArch() == llvm::Triple::mips ||
7956 getToolChain().getArch() == llvm::Triple::mips64)
7957 CmdArgs.push_back("-EB");
7958 else
7959 CmdArgs.push_back("-EL");
7960
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007961 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007962 break;
7963 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007964
7965 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007966 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007967 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007968 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7969 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007970 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007971 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007972 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007973
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007974 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007975 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007976 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7977 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007978 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007979 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007980 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007981
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007982 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007983 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007984 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007985
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007986 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007987
7988 CmdArgs.push_back("-o");
7989 CmdArgs.push_back(Output.getFilename());
7990
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007991 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007992 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007993
David Chisnallddbd68f2011-09-27 22:03:18 +00007994 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007995 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007996}
7997
Douglas Katzman95354292015-06-23 20:42:09 +00007998void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7999 const InputInfo &Output,
8000 const InputInfoList &Inputs,
8001 const ArgList &Args,
8002 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008003 const Driver &D = getToolChain().getDriver();
8004 ArgStringList CmdArgs;
8005
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008006 if (!D.SysRoot.empty())
8007 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8008
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008009 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008010 if (Args.hasArg(options::OPT_static)) {
8011 CmdArgs.push_back("-Bstatic");
8012 } else {
8013 if (Args.hasArg(options::OPT_rdynamic))
8014 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008015 if (Args.hasArg(options::OPT_shared)) {
8016 CmdArgs.push_back("-Bshareable");
8017 } else {
8018 CmdArgs.push_back("-dynamic-linker");
8019 CmdArgs.push_back("/libexec/ld.elf_so");
8020 }
8021 }
8022
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008023 // Many NetBSD architectures support more than one ABI.
8024 // Determine the correct emulation for ld.
8025 switch (getToolChain().getArch()) {
8026 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008027 CmdArgs.push_back("-m");
8028 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008029 break;
8030 case llvm::Triple::arm:
8031 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008032 CmdArgs.push_back("-m");
8033 switch (getToolChain().getTriple().getEnvironment()) {
8034 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008035 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008036 CmdArgs.push_back("armelf_nbsd_eabi");
8037 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008038 case llvm::Triple::EABIHF:
8039 case llvm::Triple::GNUEABIHF:
8040 CmdArgs.push_back("armelf_nbsd_eabihf");
8041 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008042 default:
8043 CmdArgs.push_back("armelf_nbsd");
8044 break;
8045 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008046 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008047 case llvm::Triple::armeb:
8048 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008049 arm::appendEBLinkFlags(
8050 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008051 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008052 CmdArgs.push_back("-m");
8053 switch (getToolChain().getTriple().getEnvironment()) {
8054 case llvm::Triple::EABI:
8055 case llvm::Triple::GNUEABI:
8056 CmdArgs.push_back("armelfb_nbsd_eabi");
8057 break;
8058 case llvm::Triple::EABIHF:
8059 case llvm::Triple::GNUEABIHF:
8060 CmdArgs.push_back("armelfb_nbsd_eabihf");
8061 break;
8062 default:
8063 CmdArgs.push_back("armelfb_nbsd");
8064 break;
8065 }
8066 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008067 case llvm::Triple::mips64:
8068 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008069 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008070 CmdArgs.push_back("-m");
8071 if (getToolChain().getArch() == llvm::Triple::mips64)
8072 CmdArgs.push_back("elf32btsmip");
8073 else
8074 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008075 } else if (mips::hasMipsAbiArg(Args, "64")) {
8076 CmdArgs.push_back("-m");
8077 if (getToolChain().getArch() == llvm::Triple::mips64)
8078 CmdArgs.push_back("elf64btsmip");
8079 else
8080 CmdArgs.push_back("elf64ltsmip");
8081 }
8082 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008083 case llvm::Triple::ppc:
8084 CmdArgs.push_back("-m");
8085 CmdArgs.push_back("elf32ppc_nbsd");
8086 break;
8087
8088 case llvm::Triple::ppc64:
8089 case llvm::Triple::ppc64le:
8090 CmdArgs.push_back("-m");
8091 CmdArgs.push_back("elf64ppc");
8092 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008093
8094 case llvm::Triple::sparc:
8095 CmdArgs.push_back("-m");
8096 CmdArgs.push_back("elf32_sparc");
8097 break;
8098
8099 case llvm::Triple::sparcv9:
8100 CmdArgs.push_back("-m");
8101 CmdArgs.push_back("elf64_sparc");
8102 break;
8103
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008104 default:
8105 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008106 }
8107
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008108 if (Output.isFilename()) {
8109 CmdArgs.push_back("-o");
8110 CmdArgs.push_back(Output.getFilename());
8111 } else {
8112 assert(Output.isNothing() && "Invalid output.");
8113 }
8114
Douglas Katzman78b37b02015-11-17 20:28:07 +00008115 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008116 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008117 CmdArgs.push_back(
8118 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8119 CmdArgs.push_back(
8120 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8121 CmdArgs.push_back(
8122 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008123 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008124 CmdArgs.push_back(
8125 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8126 CmdArgs.push_back(
8127 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008128 }
8129 }
8130
8131 Args.AddAllArgs(CmdArgs, options::OPT_L);
8132 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8133 Args.AddAllArgs(CmdArgs, options::OPT_e);
8134 Args.AddAllArgs(CmdArgs, options::OPT_s);
8135 Args.AddAllArgs(CmdArgs, options::OPT_t);
8136 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8137 Args.AddAllArgs(CmdArgs, options::OPT_r);
8138
8139 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8140
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008141 unsigned Major, Minor, Micro;
8142 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8143 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008144 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008145 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008146 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008147 case llvm::Triple::arm:
8148 case llvm::Triple::armeb:
8149 case llvm::Triple::thumb:
8150 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008151 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008152 case llvm::Triple::ppc64:
8153 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008154 case llvm::Triple::x86:
8155 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008156 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008157 break;
8158 default:
8159 break;
8160 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008161 }
8162
Douglas Katzman78b37b02015-11-17 20:28:07 +00008163 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008164 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008165 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008166 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8167 CmdArgs.push_back("-lm");
8168 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008169 if (Args.hasArg(options::OPT_pthread))
8170 CmdArgs.push_back("-lpthread");
8171 CmdArgs.push_back("-lc");
8172
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008173 if (useLibgcc) {
8174 if (Args.hasArg(options::OPT_static)) {
8175 // libgcc_eh depends on libc, so resolve as much as possible,
8176 // pull in any new requirements from libc and then get the rest
8177 // of libgcc.
8178 CmdArgs.push_back("-lgcc_eh");
8179 CmdArgs.push_back("-lc");
8180 CmdArgs.push_back("-lgcc");
8181 } else {
8182 CmdArgs.push_back("-lgcc");
8183 CmdArgs.push_back("--as-needed");
8184 CmdArgs.push_back("-lgcc_s");
8185 CmdArgs.push_back("--no-as-needed");
8186 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008187 }
8188 }
8189
Douglas Katzman78b37b02015-11-17 20:28:07 +00008190 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008191 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008192 CmdArgs.push_back(
8193 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008194 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008195 CmdArgs.push_back(
8196 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8197 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008198 }
8199
Xinliang David Li69306c02015-10-22 06:15:31 +00008200 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008201
Logan Chieneb9162f2014-06-26 14:23:45 +00008202 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008203 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008204}
8205
Douglas Katzman95354292015-06-23 20:42:09 +00008206void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8207 const InputInfo &Output,
8208 const InputInfoList &Inputs,
8209 const ArgList &Args,
8210 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008211 claimNoWarnArgs(Args);
8212
James Y Knight2db38f32015-08-15 03:45:25 +00008213 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8214 llvm::Triple Triple = llvm::Triple(TripleStr);
8215
Rafael Espindola92b00932010-08-10 00:25:48 +00008216 ArgStringList CmdArgs;
8217
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008218 llvm::Reloc::Model RelocationModel;
8219 unsigned PICLevel;
8220 bool IsPIE;
8221 std::tie(RelocationModel, PICLevel, IsPIE) =
8222 ParsePICArgs(getToolChain(), Triple, Args);
8223
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008224 switch (getToolChain().getArch()) {
8225 default:
8226 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008227 // Add --32/--64 to make sure we get the format we want.
8228 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008229 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008230 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008231 break;
8232 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008233 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8234 CmdArgs.push_back("--x32");
8235 else
8236 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008237 break;
8238 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008239 CmdArgs.push_back("-a32");
8240 CmdArgs.push_back("-mppc");
8241 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008242 break;
8243 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008244 CmdArgs.push_back("-a64");
8245 CmdArgs.push_back("-mppc64");
8246 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008247 break;
8248 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008249 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008250 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008251 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008252 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008253 break;
8254 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008255 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008256 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008257 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8258 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8259 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008260 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008261 }
8262 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008263 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008264 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8265 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8266 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008267 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008268 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008269 case llvm::Triple::arm:
8270 case llvm::Triple::armeb:
8271 case llvm::Triple::thumb:
8272 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008273 const llvm::Triple &Triple2 = getToolChain().getTriple();
8274 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008275 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008276 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008277 break;
8278 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008279 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008280 break;
8281 default:
8282 break;
8283 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008284
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008285 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008286 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8287 case arm::FloatABI::Soft:
8288 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8289 break;
8290 case arm::FloatABI::SoftFP:
8291 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8292 break;
8293 case arm::FloatABI::Hard:
8294 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8295 break;
8296 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008297
8298 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008299
8300 // FIXME: remove krait check when GNU tools support krait cpu
8301 // for now replace it with -march=armv7-a to avoid a lower
8302 // march from being picked in the absence of a cpu flag.
8303 Arg *A;
8304 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008305 StringRef(A->getValue()).lower() == "krait")
8306 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008307 else
8308 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008309 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008310 break;
8311 }
8312 case llvm::Triple::mips:
8313 case llvm::Triple::mipsel:
8314 case llvm::Triple::mips64:
8315 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008316 StringRef CPUName;
8317 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008318 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008319 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008320
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008321 CmdArgs.push_back("-march");
8322 CmdArgs.push_back(CPUName.data());
8323
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008324 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008325 CmdArgs.push_back(ABIName.data());
8326
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008327 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8328 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008329 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008330 CmdArgs.push_back("-mno-shared");
8331
Daniel Sanders379d44b2014-07-16 11:52:23 +00008332 // LLVM doesn't support -mplt yet and acts as if it is always given.
8333 // However, -mplt has no effect with the N64 ABI.
8334 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008335
8336 if (getToolChain().getArch() == llvm::Triple::mips ||
8337 getToolChain().getArch() == llvm::Triple::mips64)
8338 CmdArgs.push_back("-EB");
8339 else
8340 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008341
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008342 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8343 if (StringRef(A->getValue()) == "2008")
8344 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8345 }
8346
Daniel Sanders379d44b2014-07-16 11:52:23 +00008347 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8348 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8349 options::OPT_mfp64)) {
8350 A->claim();
8351 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008352 } else if (mips::shouldUseFPXX(
8353 Args, getToolChain().getTriple(), CPUName, ABIName,
8354 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008355 CmdArgs.push_back("-mfpxx");
8356
8357 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8358 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008359 if (Arg *A =
8360 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008361 if (A->getOption().matches(options::OPT_mips16)) {
8362 A->claim();
8363 A->render(Args, CmdArgs);
8364 } else {
8365 A->claim();
8366 CmdArgs.push_back("-no-mips16");
8367 }
8368 }
8369
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008370 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8371 options::OPT_mno_micromips);
8372 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8373 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8374
Simon Atanasyanbd986632013-11-26 11:58:04 +00008375 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8376 // Do not use AddLastArg because not all versions of MIPS assembler
8377 // support -mmsa / -mno-msa options.
8378 if (A->getOption().matches(options::OPT_mmsa))
8379 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8380 }
8381
Daniel Sanders379d44b2014-07-16 11:52:23 +00008382 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8383 options::OPT_msoft_float);
8384
Toma Tabacub36d6102015-06-11 12:13:18 +00008385 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8386 options::OPT_msingle_float);
8387
Daniel Sanders379d44b2014-07-16 11:52:23 +00008388 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8389 options::OPT_mno_odd_spreg);
8390
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008391 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008392 break;
8393 }
8394 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008395 // Always pass an -march option, since our default of z10 is later
8396 // than the GNU assembler's default.
8397 StringRef CPUName = getSystemZTargetCPU(Args);
8398 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008399 break;
8400 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008401 }
8402
Renato Golina74bbc72015-07-22 15:32:36 +00008403 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008404 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008405
8406 CmdArgs.push_back("-o");
8407 CmdArgs.push_back(Output.getFilename());
8408
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008409 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008410 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008411
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008412 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008413 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008414
8415 // Handle the debug info splitting at object creation time if we're
8416 // creating an object.
8417 // TODO: Currently only works on linux with newer objcopy.
8418 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008419 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008420 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008421 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008422}
8423
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008424static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008425 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008426 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008427 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008428 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8429 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008430 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008431 CmdArgs.push_back("-lgcc");
8432
Logan Chien3d3373c2012-11-19 12:04:11 +00008433 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008434 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008435 CmdArgs.push_back("-lgcc");
8436 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008437 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008438 CmdArgs.push_back("--as-needed");
8439 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008440 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008441 CmdArgs.push_back("--no-as-needed");
8442 }
8443
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008444 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008445 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008446 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008447 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008448
8449 // According to Android ABI, we have to link with libdl if we are
8450 // linking with non-static libgcc.
8451 //
8452 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8453 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8454 if (isAndroid && !StaticLibgcc)
8455 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008456}
8457
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008458static std::string getLinuxDynamicLinker(const ArgList &Args,
8459 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008460 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8461
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008462 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008463 if (ToolChain.getTriple().isArch64Bit())
8464 return "/system/bin/linker64";
8465 else
8466 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008467 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8468 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008469 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008470 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008471 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008472 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008473 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008474 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008475 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008476 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008477 return "/lib/ld-linux-armhf.so.3";
8478 else
8479 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008480 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8481 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008482 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008483 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008484 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008485 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008486 return "/lib/ld-linux.so.3";
8487 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8488 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008489 std::string LibDir =
8490 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008491 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008492 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008493 if (mips::isUCLibc(Args))
8494 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008495 else if (!ToolChain.getTriple().hasEnvironment()) {
8496 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8497 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8498 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8499 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008500 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008501
8502 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008503 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008504 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008505 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008506 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8507 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008508 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008509 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008510 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8511 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008512 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008513 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008514 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008515 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008516 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008517 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008518 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8519 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008520 else
8521 return "/lib64/ld-linux-x86-64.so.2";
8522}
8523
Renato Golinc4b49242014-02-13 10:01:16 +00008524static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008525 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008526 // Make use of compiler-rt if --rtlib option is used
8527 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8528
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008529 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008530 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008531 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008532 default:
8533 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008534 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008535 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008536 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008537 break;
8538 }
Renato Golinc4b49242014-02-13 10:01:16 +00008539 break;
8540 case ToolChain::RLT_Libgcc:
8541 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8542 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008543 }
8544}
8545
Rafael Espindola1e085772014-08-15 17:14:35 +00008546static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8547 switch (T.getArch()) {
8548 case llvm::Triple::x86:
8549 return "elf_i386";
8550 case llvm::Triple::aarch64:
8551 return "aarch64linux";
8552 case llvm::Triple::aarch64_be:
8553 return "aarch64_be_linux";
8554 case llvm::Triple::arm:
8555 case llvm::Triple::thumb:
8556 return "armelf_linux_eabi";
8557 case llvm::Triple::armeb:
8558 case llvm::Triple::thumbeb:
8559 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8560 case llvm::Triple::ppc:
8561 return "elf32ppclinux";
8562 case llvm::Triple::ppc64:
8563 return "elf64ppc";
8564 case llvm::Triple::ppc64le:
8565 return "elf64lppc";
8566 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008567 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008568 return "elf32_sparc";
8569 case llvm::Triple::sparcv9:
8570 return "elf64_sparc";
8571 case llvm::Triple::mips:
8572 return "elf32btsmip";
8573 case llvm::Triple::mipsel:
8574 return "elf32ltsmip";
8575 case llvm::Triple::mips64:
8576 if (mips::hasMipsAbiArg(Args, "n32"))
8577 return "elf32btsmipn32";
8578 return "elf64btsmip";
8579 case llvm::Triple::mips64el:
8580 if (mips::hasMipsAbiArg(Args, "n32"))
8581 return "elf32ltsmipn32";
8582 return "elf64ltsmip";
8583 case llvm::Triple::systemz:
8584 return "elf64_s390";
8585 case llvm::Triple::x86_64:
8586 if (T.getEnvironment() == llvm::Triple::GNUX32)
8587 return "elf32_x86_64";
8588 return "elf_x86_64";
8589 default:
8590 llvm_unreachable("Unexpected arch");
8591 }
8592}
8593
Douglas Katzman95354292015-06-23 20:42:09 +00008594void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8595 const InputInfo &Output,
8596 const InputInfoList &Inputs,
8597 const ArgList &Args,
8598 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008599 const toolchains::Linux &ToolChain =
8600 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008601 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008602
8603 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8604 llvm::Triple Triple = llvm::Triple(TripleStr);
8605
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008606 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008607 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008608 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008609 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8610 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008611 const bool HasCRTBeginEndFiles =
8612 ToolChain.getTriple().hasEnvironment() ||
8613 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008614
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008615 ArgStringList CmdArgs;
8616
Rafael Espindolad1002f62010-11-15 18:28:16 +00008617 // Silence warning for "clang -g foo.o -o foo"
8618 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008619 // and "clang -emit-llvm foo.o -o foo"
8620 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008621 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008622 // handled somewhere else.
8623 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008624
Peter Collingbourne39719a72015-11-20 20:49:39 +00008625 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8626 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008627 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008628 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008629 CmdArgs.push_back("-target");
8630 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8631 }
8632
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008633 if (!D.SysRoot.empty())
8634 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008635
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008636 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008637 CmdArgs.push_back("-pie");
8638
Rafael Espindola1c76c592010-11-07 22:57:16 +00008639 if (Args.hasArg(options::OPT_rdynamic))
8640 CmdArgs.push_back("-export-dynamic");
8641
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008642 if (Args.hasArg(options::OPT_s))
8643 CmdArgs.push_back("-s");
8644
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008645 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008646 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008647
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008648 for (const auto &Opt : ToolChain.ExtraOpts)
8649 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008650
8651 if (!Args.hasArg(options::OPT_static)) {
8652 CmdArgs.push_back("--eh-frame-hdr");
8653 }
8654
8655 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008656 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008657
8658 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008659 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8660 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008661 CmdArgs.push_back("-Bstatic");
8662 else
8663 CmdArgs.push_back("-static");
8664 } else if (Args.hasArg(options::OPT_shared)) {
8665 CmdArgs.push_back("-shared");
8666 }
8667
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008668 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8669 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008670 (!Args.hasArg(options::OPT_static) &&
8671 !Args.hasArg(options::OPT_shared))) {
8672 CmdArgs.push_back("-dynamic-linker");
8673 CmdArgs.push_back(Args.MakeArgString(
8674 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8675 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008676
8677 CmdArgs.push_back("-o");
8678 CmdArgs.push_back(Output.getFilename());
8679
Douglas Katzman78b37b02015-11-17 20:28:07 +00008680 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008681 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008682 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008683 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008684 if (Args.hasArg(options::OPT_pg))
8685 crt1 = "gcrt1.o";
8686 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008687 crt1 = "Scrt1.o";
8688 else
8689 crt1 = "crt1.o";
8690 }
8691 if (crt1)
8692 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008693
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008694 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8695 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008696
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008697 const char *crtbegin;
8698 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008699 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008700 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008701 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008702 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008703 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008704 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008705 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008706
8707 if (HasCRTBeginEndFiles)
8708 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008709
8710 // Add crtfastmath.o if available and fast math is enabled.
8711 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008712 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008713
8714 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008715 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008716
Douglas Katzman6059ef92015-11-17 17:41:23 +00008717 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008718
Teresa Johnson945bc502015-10-15 20:35:53 +00008719 if (D.isUsingLTO())
8720 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008721
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008722 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8723 CmdArgs.push_back("--no-demangle");
8724
Alexey Samsonov52550342014-09-15 19:58:40 +00008725 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008726 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008727 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008728 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008729
Douglas Katzman78b37b02015-11-17 20:28:07 +00008730 if (D.CCCIsCXX() &&
8731 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008732 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008733 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008734 if (OnlyLibstdcxxStatic)
8735 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008736 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008737 if (OnlyLibstdcxxStatic)
8738 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008739 CmdArgs.push_back("-lm");
8740 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008741 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8742 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008743
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008744 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008745 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8746 if (Args.hasArg(options::OPT_static))
8747 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008748
Alexey Samsonov52550342014-09-15 19:58:40 +00008749 if (NeedsSanitizerDeps)
8750 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8751
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008752 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8753 Args.hasArg(options::OPT_pthreads);
8754
8755 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8756 options::OPT_fno_openmp, false)) {
8757 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8758 // FIXME: Does this really make sense for all GNU toolchains?
8759 WantPthread = true;
8760
8761 // Also link the particular OpenMP runtimes.
8762 switch (getOpenMPRuntime(ToolChain, Args)) {
8763 case OMPRT_OMP:
8764 CmdArgs.push_back("-lomp");
8765 break;
8766 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008767 CmdArgs.push_back("-lgomp");
8768
8769 // FIXME: Exclude this for platforms with libgomp that don't require
8770 // librt. Most modern Linux platforms require it, but some may not.
8771 CmdArgs.push_back("-lrt");
8772 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008773 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008774 CmdArgs.push_back("-liomp5");
8775 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008776 case OMPRT_Unknown:
8777 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008778 break;
8779 }
Chandler Carruth01538002013-01-17 13:19:29 +00008780 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008781
Renato Golinc4b49242014-02-13 10:01:16 +00008782 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008783
Richard Smith31d1de22015-05-20 22:48:44 +00008784 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008785 CmdArgs.push_back("-lpthread");
8786
8787 CmdArgs.push_back("-lc");
8788
8789 if (Args.hasArg(options::OPT_static))
8790 CmdArgs.push_back("--end-group");
8791 else
Renato Golinc4b49242014-02-13 10:01:16 +00008792 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008793 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008794
Rafael Espindola81937ec2010-12-01 01:52:43 +00008795 if (!Args.hasArg(options::OPT_nostartfiles)) {
8796 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008797 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008798 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008799 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008800 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008801 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008802 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008803
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008804 if (HasCRTBeginEndFiles)
8805 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008806 if (!isAndroid)
8807 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008808 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00008809 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008810
Peter Collingbourne39719a72015-11-20 20:49:39 +00008811 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008812}
8813
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008814// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8815// for the various SFI requirements like register masking. The assembly tool
8816// inserts the file containing the macros as an input into all the assembly
8817// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008818void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8819 const InputInfo &Output,
8820 const InputInfoList &Inputs,
8821 const ArgList &Args,
8822 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008823 const toolchains::NaClToolChain &ToolChain =
8824 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008825 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8826 "nacl-arm-macros.s");
8827 InputInfoList NewInputs;
8828 NewInputs.push_back(NaClMacros);
8829 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008830 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8831 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008832}
8833
Douglas Katzman750cfc52015-06-29 18:42:16 +00008834// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008835// we use static by default, do not yet support sanitizers or LTO, and a few
8836// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008837// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008838void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8839 const InputInfo &Output,
8840 const InputInfoList &Inputs,
8841 const ArgList &Args,
8842 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008843
Douglas Katzman54366072015-07-27 16:53:08 +00008844 const toolchains::NaClToolChain &ToolChain =
8845 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008846 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008847 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008848 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008849 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008850
8851 ArgStringList CmdArgs;
8852
8853 // Silence warning for "clang -g foo.o -o foo"
8854 Args.ClaimAllArgs(options::OPT_g_Group);
8855 // and "clang -emit-llvm foo.o -o foo"
8856 Args.ClaimAllArgs(options::OPT_emit_llvm);
8857 // and for "clang -w foo.o -o foo". Other warning options are already
8858 // handled somewhere else.
8859 Args.ClaimAllArgs(options::OPT_w);
8860
8861 if (!D.SysRoot.empty())
8862 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8863
8864 if (Args.hasArg(options::OPT_rdynamic))
8865 CmdArgs.push_back("-export-dynamic");
8866
8867 if (Args.hasArg(options::OPT_s))
8868 CmdArgs.push_back("-s");
8869
Douglas Katzman54366072015-07-27 16:53:08 +00008870 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8871 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008872 CmdArgs.push_back("--build-id");
8873
8874 if (!IsStatic)
8875 CmdArgs.push_back("--eh-frame-hdr");
8876
8877 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008878 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008879 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008880 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008881 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008882 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008883 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008884 else if (Arch == llvm::Triple::mipsel)
8885 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008886 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008887 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8888 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008889
8890 if (IsStatic)
8891 CmdArgs.push_back("-static");
8892 else if (Args.hasArg(options::OPT_shared))
8893 CmdArgs.push_back("-shared");
8894
8895 CmdArgs.push_back("-o");
8896 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00008897 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008898 if (!Args.hasArg(options::OPT_shared))
8899 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8900 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8901
8902 const char *crtbegin;
8903 if (IsStatic)
8904 crtbegin = "crtbeginT.o";
8905 else if (Args.hasArg(options::OPT_shared))
8906 crtbegin = "crtbeginS.o";
8907 else
8908 crtbegin = "crtbegin.o";
8909 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8910 }
8911
8912 Args.AddAllArgs(CmdArgs, options::OPT_L);
8913 Args.AddAllArgs(CmdArgs, options::OPT_u);
8914
Douglas Katzman6059ef92015-11-17 17:41:23 +00008915 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008916
8917 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8918 CmdArgs.push_back("--no-demangle");
8919
8920 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8921
Douglas Katzman78b37b02015-11-17 20:28:07 +00008922 if (D.CCCIsCXX() &&
8923 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008924 bool OnlyLibstdcxxStatic =
8925 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008926 if (OnlyLibstdcxxStatic)
8927 CmdArgs.push_back("-Bstatic");
8928 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8929 if (OnlyLibstdcxxStatic)
8930 CmdArgs.push_back("-Bdynamic");
8931 CmdArgs.push_back("-lm");
8932 }
8933
8934 if (!Args.hasArg(options::OPT_nostdlib)) {
8935 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8936 // Always use groups, since it has no effect on dynamic libraries.
8937 CmdArgs.push_back("--start-group");
8938 CmdArgs.push_back("-lc");
8939 // NaCl's libc++ currently requires libpthread, so just always include it
8940 // in the group for C++.
8941 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008942 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008943 // Gold, used by Mips, handles nested groups differently than ld, and
8944 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8945 // which is not a desired behaviour here.
8946 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8947 if (getToolChain().getArch() == llvm::Triple::mipsel)
8948 CmdArgs.push_back("-lnacl");
8949
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008950 CmdArgs.push_back("-lpthread");
8951 }
8952
8953 CmdArgs.push_back("-lgcc");
8954 CmdArgs.push_back("--as-needed");
8955 if (IsStatic)
8956 CmdArgs.push_back("-lgcc_eh");
8957 else
8958 CmdArgs.push_back("-lgcc_s");
8959 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008960
8961 // Mips needs to create and use pnacl_legacy library that contains
8962 // definitions from bitcode/pnaclmm.c and definitions for
8963 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8964 if (getToolChain().getArch() == llvm::Triple::mipsel)
8965 CmdArgs.push_back("-lpnacl_legacy");
8966
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008967 CmdArgs.push_back("--end-group");
8968 }
8969
8970 if (!Args.hasArg(options::OPT_nostartfiles)) {
8971 const char *crtend;
8972 if (Args.hasArg(options::OPT_shared))
8973 crtend = "crtendS.o";
8974 else
8975 crtend = "crtend.o";
8976
8977 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8978 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8979 }
8980 }
8981
Peter Collingbourne39719a72015-11-20 20:49:39 +00008982 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8983 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008984}
8985
Douglas Katzman95354292015-06-23 20:42:09 +00008986void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8987 const InputInfo &Output,
8988 const InputInfoList &Inputs,
8989 const ArgList &Args,
8990 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008991 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008992 ArgStringList CmdArgs;
8993
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008994 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008995
8996 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008997 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008998
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008999 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009000 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009001
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009002 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009003 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009004}
9005
Douglas Katzman95354292015-06-23 20:42:09 +00009006void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9007 const InputInfo &Output,
9008 const InputInfoList &Inputs,
9009 const ArgList &Args,
9010 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009011 const Driver &D = getToolChain().getDriver();
9012 ArgStringList CmdArgs;
9013
Daniel Dunbarb440f562010-08-02 02:38:21 +00009014 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009015 CmdArgs.push_back("-o");
9016 CmdArgs.push_back(Output.getFilename());
9017 } else {
9018 assert(Output.isNothing() && "Invalid output.");
9019 }
9020
Douglas Katzman78b37b02015-11-17 20:28:07 +00009021 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009022 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9023 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9024 CmdArgs.push_back(
9025 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9026 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009027 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009028
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009029 Args.AddAllArgs(CmdArgs,
9030 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009031
Daniel Dunbar54423b22010-09-17 00:24:54 +00009032 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009033
Xinliang David Li69306c02015-10-22 06:15:31 +00009034 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009035
Douglas Katzman78b37b02015-11-17 20:28:07 +00009036 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009037 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009038 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009039 CmdArgs.push_back("-lm");
9040 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009041 }
9042
Douglas Katzman78b37b02015-11-17 20:28:07 +00009043 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009044 if (Args.hasArg(options::OPT_pthread))
9045 CmdArgs.push_back("-lpthread");
9046 CmdArgs.push_back("-lc");
9047 CmdArgs.push_back("-lCompilerRT-Generic");
9048 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9049 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009050 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009051 }
9052
Logan Chieneb9162f2014-06-26 14:23:45 +00009053 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009054 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009055}
9056
Daniel Dunbarcc912342009-05-02 18:28:39 +00009057/// DragonFly Tools
9058
9059// For now, DragonFly Assemble does just about the same as for
9060// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009061void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9062 const InputInfo &Output,
9063 const InputInfoList &Inputs,
9064 const ArgList &Args,
9065 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009066 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009067 ArgStringList CmdArgs;
9068
9069 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9070 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009071 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009072 CmdArgs.push_back("--32");
9073
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009074 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009075
9076 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009077 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009078
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009079 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009080 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009081
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009082 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009083 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009084}
9085
Douglas Katzman95354292015-06-23 20:42:09 +00009086void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9087 const InputInfo &Output,
9088 const InputInfoList &Inputs,
9089 const ArgList &Args,
9090 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009091 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009092 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00009093 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00009094
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009095 if (!D.SysRoot.empty())
9096 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9097
John McCall65b8da02013-04-11 22:55:55 +00009098 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009099 if (Args.hasArg(options::OPT_static)) {
9100 CmdArgs.push_back("-Bstatic");
9101 } else {
John McCall65b8da02013-04-11 22:55:55 +00009102 if (Args.hasArg(options::OPT_rdynamic))
9103 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009104 if (Args.hasArg(options::OPT_shared))
9105 CmdArgs.push_back("-Bshareable");
9106 else {
9107 CmdArgs.push_back("-dynamic-linker");
9108 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9109 }
John McCall65b8da02013-04-11 22:55:55 +00009110 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009111 }
9112
9113 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9114 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009115 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009116 CmdArgs.push_back("-m");
9117 CmdArgs.push_back("elf_i386");
9118 }
9119
Daniel Dunbarb440f562010-08-02 02:38:21 +00009120 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009121 CmdArgs.push_back("-o");
9122 CmdArgs.push_back(Output.getFilename());
9123 } else {
9124 assert(Output.isNothing() && "Invalid output.");
9125 }
9126
Douglas Katzman78b37b02015-11-17 20:28:07 +00009127 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009128 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009129 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009130 CmdArgs.push_back(
9131 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009132 else {
9133 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009134 CmdArgs.push_back(
9135 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009136 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009137 CmdArgs.push_back(
9138 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009139 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009140 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009141 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009142 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009143 CmdArgs.push_back(
9144 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009145 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009146 CmdArgs.push_back(
9147 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009148 }
9149
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009150 Args.AddAllArgs(CmdArgs,
9151 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009152
Daniel Dunbar54423b22010-09-17 00:24:54 +00009153 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009154
Douglas Katzman78b37b02015-11-17 20:28:07 +00009155 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009156 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9157 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009158 if (UseGCC47)
9159 CmdArgs.push_back("-L/usr/lib/gcc47");
9160 else
9161 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009162
9163 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009164 if (UseGCC47) {
9165 CmdArgs.push_back("-rpath");
9166 CmdArgs.push_back("/usr/lib/gcc47");
9167 } else {
9168 CmdArgs.push_back("-rpath");
9169 CmdArgs.push_back("/usr/lib/gcc44");
9170 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009171 }
9172
Hans Wennborg70850d82013-07-18 20:29:38 +00009173 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009174 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009175 CmdArgs.push_back("-lm");
9176 }
9177
Daniel Dunbarcc912342009-05-02 18:28:39 +00009178 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009179 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009180
9181 if (!Args.hasArg(options::OPT_nolibc)) {
9182 CmdArgs.push_back("-lc");
9183 }
9184
John McCall65b8da02013-04-11 22:55:55 +00009185 if (UseGCC47) {
9186 if (Args.hasArg(options::OPT_static) ||
9187 Args.hasArg(options::OPT_static_libgcc)) {
9188 CmdArgs.push_back("-lgcc");
9189 CmdArgs.push_back("-lgcc_eh");
9190 } else {
9191 if (Args.hasArg(options::OPT_shared_libgcc)) {
9192 CmdArgs.push_back("-lgcc_pic");
9193 if (!Args.hasArg(options::OPT_shared))
9194 CmdArgs.push_back("-lgcc");
9195 } else {
9196 CmdArgs.push_back("-lgcc");
9197 CmdArgs.push_back("--as-needed");
9198 CmdArgs.push_back("-lgcc_pic");
9199 CmdArgs.push_back("--no-as-needed");
9200 }
9201 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009202 } else {
John McCall65b8da02013-04-11 22:55:55 +00009203 if (Args.hasArg(options::OPT_shared)) {
9204 CmdArgs.push_back("-lgcc_pic");
9205 } else {
9206 CmdArgs.push_back("-lgcc");
9207 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009208 }
9209 }
9210
Douglas Katzman78b37b02015-11-17 20:28:07 +00009211 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009212 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009213 CmdArgs.push_back(
9214 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009215 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009216 CmdArgs.push_back(
9217 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9218 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009219 }
9220
Xinliang David Li69306c02015-10-22 06:15:31 +00009221 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009222
Logan Chieneb9162f2014-06-26 14:23:45 +00009223 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009224 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009225}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009226
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009227// Try to find Exe from a Visual Studio distribution. This first tries to find
9228// an installed copy of Visual Studio and, failing that, looks in the PATH,
9229// making sure that whatever executable that's found is not a same-named exe
9230// from clang itself to prevent clang from falling back to itself.
9231static std::string FindVisualStudioExecutable(const ToolChain &TC,
9232 const char *Exe,
9233 const char *ClangProgramPath) {
9234 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9235 std::string visualStudioBinDir;
9236 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9237 visualStudioBinDir)) {
9238 SmallString<128> FilePath(visualStudioBinDir);
9239 llvm::sys::path::append(FilePath, Exe);
9240 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9241 return FilePath.str();
9242 }
9243
9244 return Exe;
9245}
9246
Douglas Katzman95354292015-06-23 20:42:09 +00009247void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9248 const InputInfo &Output,
9249 const InputInfoList &Inputs,
9250 const ArgList &Args,
9251 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009252 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009253 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009254
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009255 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9256 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009257 CmdArgs.push_back(
9258 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009259
Douglas Katzman78b37b02015-11-17 20:28:07 +00009260 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9261 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009262 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009263
Zachary Turner10d75b22014-10-22 20:40:43 +00009264 if (!llvm::sys::Process::GetEnv("LIB")) {
9265 // If the VC environment hasn't been configured (perhaps because the user
9266 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009267 // the environment variable is set however, assume the user knows what
9268 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009269 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009270 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009271 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9272 SmallString<128> LibDir(VisualStudioDir);
9273 llvm::sys::path::append(LibDir, "VC", "lib");
9274 switch (MSVC.getArch()) {
9275 case llvm::Triple::x86:
9276 // x86 just puts the libraries directly in lib
9277 break;
9278 case llvm::Triple::x86_64:
9279 llvm::sys::path::append(LibDir, "amd64");
9280 break;
9281 case llvm::Triple::arm:
9282 llvm::sys::path::append(LibDir, "arm");
9283 break;
9284 default:
9285 break;
9286 }
9287 CmdArgs.push_back(
9288 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009289
9290 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9291 std::string UniversalCRTLibPath;
9292 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9293 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9294 UniversalCRTLibPath.c_str()));
9295 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009296 }
9297
9298 std::string WindowsSdkLibPath;
9299 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9300 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9301 WindowsSdkLibPath.c_str()));
9302 }
9303
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009304 CmdArgs.push_back("-nologo");
9305
Reid Kleckner124955a2015-08-05 18:51:13 +00009306 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009307 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009308
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009309 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009310 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009311 if (DLL) {
9312 CmdArgs.push_back(Args.MakeArgString("-dll"));
9313
9314 SmallString<128> ImplibName(Output.getFilename());
9315 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009316 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009317 }
9318
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009319 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009320 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009321 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009322 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009323 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9324 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009325 // Make sure the dynamic runtime thunk is not optimized out at link time
9326 // to ensure proper SEH handling.
9327 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009328 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009329 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009330 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009331 for (const auto &Lib : {"asan", "asan_cxx"})
9332 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009333 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009334 }
9335
Hans Wennborg2e274592013-08-13 23:38:57 +00009336 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009337
Alexey Bataevc7e84352015-08-19 04:49:01 +00009338 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9339 options::OPT_fno_openmp, false)) {
9340 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9341 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9342 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9343 TC.getDriver().Dir + "/../lib"));
9344 switch (getOpenMPRuntime(getToolChain(), Args)) {
9345 case OMPRT_OMP:
9346 CmdArgs.push_back("-defaultlib:libomp.lib");
9347 break;
9348 case OMPRT_IOMP5:
9349 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9350 break;
9351 case OMPRT_GOMP:
9352 break;
9353 case OMPRT_Unknown:
9354 // Already diagnosed.
9355 break;
9356 }
9357 }
9358
Reid Kleckner337188f2014-09-16 19:22:00 +00009359 // Add filenames, libraries, and other linker inputs.
9360 for (const auto &Input : Inputs) {
9361 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009362 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009363 continue;
9364 }
9365
9366 const Arg &A = Input.getInputArg();
9367
9368 // Render -l options differently for the MSVC linker.
9369 if (A.getOption().matches(options::OPT_l)) {
9370 StringRef Lib = A.getValue();
9371 const char *LinkLibArg;
9372 if (Lib.endswith(".lib"))
9373 LinkLibArg = Args.MakeArgString(Lib);
9374 else
9375 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9376 CmdArgs.push_back(LinkLibArg);
9377 continue;
9378 }
9379
9380 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9381 // or -L. Render it, even if MSVC doesn't understand it.
9382 A.renderAsInput(Args, CmdArgs);
9383 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009384
Zachary Turner719f58c2014-12-01 23:06:47 +00009385 // We need to special case some linker paths. In the case of lld, we need to
9386 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9387 // linker, we need to use a special search algorithm.
9388 llvm::SmallString<128> linkPath;
9389 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9390 if (Linker.equals_lower("lld"))
9391 Linker = "lld-link";
9392
9393 if (Linker.equals_lower("link")) {
9394 // If we're using the MSVC linker, it's not sufficient to just use link
9395 // from the program PATH, because other environments like GnuWin32 install
9396 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009397 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009398 C.getDriver().getClangProgramPath());
9399 } else {
9400 linkPath = Linker;
9401 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009402 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009403 }
9404
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009405 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009406 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009407}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009408
Douglas Katzman95354292015-06-23 20:42:09 +00009409void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9410 const InputInfo &Output,
9411 const InputInfoList &Inputs,
9412 const ArgList &Args,
9413 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009414 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9415}
9416
Douglas Katzman95354292015-06-23 20:42:09 +00009417std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009418 Compilation &C, const JobAction &JA, const InputInfo &Output,
9419 const InputInfoList &Inputs, const ArgList &Args,
9420 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009421 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009422 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009423 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009424 CmdArgs.push_back("/W0"); // No warnings.
9425
9426 // The goal is to be able to invoke this tool correctly based on
9427 // any flag accepted by clang-cl.
9428
9429 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009430 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009431
9432 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009433 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9434 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9435 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009436 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9437 if (A->getOption().getID() == options::OPT_O0) {
9438 CmdArgs.push_back("/Od");
9439 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009440 CmdArgs.push_back("/Og");
9441
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009442 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009443 if (OptLevel == "s" || OptLevel == "z")
9444 CmdArgs.push_back("/Os");
9445 else
9446 CmdArgs.push_back("/Ot");
9447
9448 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009449 }
9450 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009451 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9452 options::OPT_fno_omit_frame_pointer))
9453 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9454 ? "/Oy"
9455 : "/Oy-");
9456 if (!Args.hasArg(options::OPT_fwritable_strings))
9457 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009458
Nico Weber3f8dafb2015-03-12 19:37:10 +00009459 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009460 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9461
David Majnemerf6072342014-07-01 22:24:56 +00009462 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9463 /*default=*/false))
9464 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009465 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9466 options::OPT_fno_function_sections))
9467 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9468 ? "/Gy"
9469 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009470 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9471 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009472 CmdArgs.push_back(
9473 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009474 if (Args.hasArg(options::OPT_fsyntax_only))
9475 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009476 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9477 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009478 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009479
Nico Weber3f8dafb2015-03-12 19:37:10 +00009480 std::vector<std::string> Includes =
9481 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009482 for (const auto &Include : Includes)
9483 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009484
Hans Wennborg87cfa712013-09-19 20:32:16 +00009485 // Flags that can simply be passed through.
9486 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9487 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009488 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009489 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009490
9491 // The order of these flags is relevant, so pick the last one.
9492 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9493 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9494 A->render(Args, CmdArgs);
9495
Hans Wennborg87cfa712013-09-19 20:32:16 +00009496 // Input filename.
9497 assert(Inputs.size() == 1);
9498 const InputInfo &II = Inputs[0];
9499 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9500 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9501 if (II.isFilename())
9502 CmdArgs.push_back(II.getFilename());
9503 else
9504 II.getInputArg().renderAsInput(Args, CmdArgs);
9505
9506 // Output filename.
9507 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009508 const char *Fo =
9509 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009510 CmdArgs.push_back(Fo);
9511
Hans Wennborg188382e2013-09-20 18:16:35 +00009512 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009513 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9514 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009515 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009516 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009517}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009518
Yaron Keren1c0070c2015-07-02 04:45:27 +00009519/// MinGW Tools
9520void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9521 const InputInfo &Output,
9522 const InputInfoList &Inputs,
9523 const ArgList &Args,
9524 const char *LinkingOutput) const {
9525 claimNoWarnArgs(Args);
9526 ArgStringList CmdArgs;
9527
9528 if (getToolChain().getArch() == llvm::Triple::x86) {
9529 CmdArgs.push_back("--32");
9530 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9531 CmdArgs.push_back("--64");
9532 }
9533
9534 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9535
9536 CmdArgs.push_back("-o");
9537 CmdArgs.push_back(Output.getFilename());
9538
9539 for (const auto &II : Inputs)
9540 CmdArgs.push_back(II.getFilename());
9541
9542 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009543 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009544
9545 if (Args.hasArg(options::OPT_gsplit_dwarf))
9546 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9547 SplitDebugName(Args, Inputs[0]));
9548}
9549
9550void MinGW::Linker::AddLibGCC(const ArgList &Args,
9551 ArgStringList &CmdArgs) const {
9552 if (Args.hasArg(options::OPT_mthreads))
9553 CmdArgs.push_back("-lmingwthrd");
9554 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009555
Yaron Kerenaa281332015-08-09 00:24:07 +00009556 // Make use of compiler-rt if --rtlib option is used
9557 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9558 if (RLT == ToolChain::RLT_Libgcc) {
9559 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9560 Args.hasArg(options::OPT_static);
9561 bool Shared = Args.hasArg(options::OPT_shared);
9562 bool CXX = getToolChain().getDriver().CCCIsCXX();
9563
9564 if (Static || (!CXX && !Shared)) {
9565 CmdArgs.push_back("-lgcc");
9566 CmdArgs.push_back("-lgcc_eh");
9567 } else {
9568 CmdArgs.push_back("-lgcc_s");
9569 CmdArgs.push_back("-lgcc");
9570 }
9571 } else {
9572 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9573 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009574
Yaron Keren1c0070c2015-07-02 04:45:27 +00009575 CmdArgs.push_back("-lmoldname");
9576 CmdArgs.push_back("-lmingwex");
9577 CmdArgs.push_back("-lmsvcrt");
9578}
9579
9580void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9581 const InputInfo &Output,
9582 const InputInfoList &Inputs,
9583 const ArgList &Args,
9584 const char *LinkingOutput) const {
9585 const ToolChain &TC = getToolChain();
9586 const Driver &D = TC.getDriver();
9587 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9588
9589 ArgStringList CmdArgs;
9590
9591 // Silence warning for "clang -g foo.o -o foo"
9592 Args.ClaimAllArgs(options::OPT_g_Group);
9593 // and "clang -emit-llvm foo.o -o foo"
9594 Args.ClaimAllArgs(options::OPT_emit_llvm);
9595 // and for "clang -w foo.o -o foo". Other warning options are already
9596 // handled somewhere else.
9597 Args.ClaimAllArgs(options::OPT_w);
9598
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009599 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9600 if (LinkerName.equals_lower("lld")) {
9601 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009602 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009603 } else if (!LinkerName.equals_lower("ld")) {
9604 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009605 }
9606
Yaron Keren1c0070c2015-07-02 04:45:27 +00009607 if (!D.SysRoot.empty())
9608 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9609
9610 if (Args.hasArg(options::OPT_s))
9611 CmdArgs.push_back("-s");
9612
9613 CmdArgs.push_back("-m");
9614 if (TC.getArch() == llvm::Triple::x86)
9615 CmdArgs.push_back("i386pe");
9616 if (TC.getArch() == llvm::Triple::x86_64)
9617 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009618 if (TC.getArch() == llvm::Triple::arm)
9619 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009620
9621 if (Args.hasArg(options::OPT_mwindows)) {
9622 CmdArgs.push_back("--subsystem");
9623 CmdArgs.push_back("windows");
9624 } else if (Args.hasArg(options::OPT_mconsole)) {
9625 CmdArgs.push_back("--subsystem");
9626 CmdArgs.push_back("console");
9627 }
9628
9629 if (Args.hasArg(options::OPT_static))
9630 CmdArgs.push_back("-Bstatic");
9631 else {
9632 if (Args.hasArg(options::OPT_mdll))
9633 CmdArgs.push_back("--dll");
9634 else if (Args.hasArg(options::OPT_shared))
9635 CmdArgs.push_back("--shared");
9636 CmdArgs.push_back("-Bdynamic");
9637 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9638 CmdArgs.push_back("-e");
9639 if (TC.getArch() == llvm::Triple::x86)
9640 CmdArgs.push_back("_DllMainCRTStartup@12");
9641 else
9642 CmdArgs.push_back("DllMainCRTStartup");
9643 CmdArgs.push_back("--enable-auto-image-base");
9644 }
9645 }
9646
9647 CmdArgs.push_back("-o");
9648 CmdArgs.push_back(Output.getFilename());
9649
9650 Args.AddAllArgs(CmdArgs, options::OPT_e);
9651 // FIXME: add -N, -n flags
9652 Args.AddLastArg(CmdArgs, options::OPT_r);
9653 Args.AddLastArg(CmdArgs, options::OPT_s);
9654 Args.AddLastArg(CmdArgs, options::OPT_t);
9655 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9656 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9657
Douglas Katzman78b37b02015-11-17 20:28:07 +00009658 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009659 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9660 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9661 } else {
9662 if (Args.hasArg(options::OPT_municode))
9663 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9664 else
9665 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9666 }
9667 if (Args.hasArg(options::OPT_pg))
9668 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9669 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9670 }
9671
9672 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009673 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009674 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9675
9676 // TODO: Add ASan stuff here
9677
9678 // TODO: Add profile stuff here
9679
Douglas Katzman78b37b02015-11-17 20:28:07 +00009680 if (D.CCCIsCXX() &&
9681 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009682 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9683 !Args.hasArg(options::OPT_static);
9684 if (OnlyLibstdcxxStatic)
9685 CmdArgs.push_back("-Bstatic");
9686 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9687 if (OnlyLibstdcxxStatic)
9688 CmdArgs.push_back("-Bdynamic");
9689 }
9690
9691 if (!Args.hasArg(options::OPT_nostdlib)) {
9692 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9693 if (Args.hasArg(options::OPT_static))
9694 CmdArgs.push_back("--start-group");
9695
9696 if (Args.hasArg(options::OPT_fstack_protector) ||
9697 Args.hasArg(options::OPT_fstack_protector_strong) ||
9698 Args.hasArg(options::OPT_fstack_protector_all)) {
9699 CmdArgs.push_back("-lssp_nonshared");
9700 CmdArgs.push_back("-lssp");
9701 }
9702 if (Args.hasArg(options::OPT_fopenmp))
9703 CmdArgs.push_back("-lgomp");
9704
9705 AddLibGCC(Args, CmdArgs);
9706
9707 if (Args.hasArg(options::OPT_pg))
9708 CmdArgs.push_back("-lgmon");
9709
Yaron Kerenadce68e2015-07-06 18:52:19 +00009710 if (Args.hasArg(options::OPT_pthread))
9711 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009712
9713 // add system libraries
9714 if (Args.hasArg(options::OPT_mwindows)) {
9715 CmdArgs.push_back("-lgdi32");
9716 CmdArgs.push_back("-lcomdlg32");
9717 }
9718 CmdArgs.push_back("-ladvapi32");
9719 CmdArgs.push_back("-lshell32");
9720 CmdArgs.push_back("-luser32");
9721 CmdArgs.push_back("-lkernel32");
9722
9723 if (Args.hasArg(options::OPT_static))
9724 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009725 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009726 AddLibGCC(Args, CmdArgs);
9727 }
9728
9729 if (!Args.hasArg(options::OPT_nostartfiles)) {
9730 // Add crtfastmath.o if available and fast math is enabled.
9731 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9732
9733 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9734 }
9735 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009736 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009737 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009738}
9739
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009740/// XCore Tools
9741// We pass assemble and link construction to the xcc tool.
9742
Douglas Katzman95354292015-06-23 20:42:09 +00009743void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9744 const InputInfo &Output,
9745 const InputInfoList &Inputs,
9746 const ArgList &Args,
9747 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009748 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009749 ArgStringList CmdArgs;
9750
9751 CmdArgs.push_back("-o");
9752 CmdArgs.push_back(Output.getFilename());
9753
9754 CmdArgs.push_back("-c");
9755
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009756 if (Args.hasArg(options::OPT_v))
9757 CmdArgs.push_back("-v");
9758
Robert Lytton894d25c2014-05-02 09:33:25 +00009759 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9760 if (!A->getOption().matches(options::OPT_g0))
9761 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009762
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009763 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9764 false))
9765 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009766
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009767 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009768
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009769 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009770 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009771
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009772 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009773 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009774}
9775
Douglas Katzman95354292015-06-23 20:42:09 +00009776void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9777 const InputInfo &Output,
9778 const InputInfoList &Inputs,
9779 const ArgList &Args,
9780 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009781 ArgStringList CmdArgs;
9782
9783 if (Output.isFilename()) {
9784 CmdArgs.push_back("-o");
9785 CmdArgs.push_back(Output.getFilename());
9786 } else {
9787 assert(Output.isNothing() && "Invalid output.");
9788 }
9789
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009790 if (Args.hasArg(options::OPT_v))
9791 CmdArgs.push_back("-v");
9792
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009793 // Pass -fexceptions through to the linker if it was present.
9794 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9795 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009796 CmdArgs.push_back("-fexceptions");
9797
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009798 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9799
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009800 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009801 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009802}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009803
Douglas Katzman95354292015-06-23 20:42:09 +00009804void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9805 const InputInfo &Output,
9806 const InputInfoList &Inputs,
9807 const ArgList &Args,
9808 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009809 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009810 const auto &TC =
9811 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9812 ArgStringList CmdArgs;
9813 const char *Exec;
9814
9815 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009816 default:
9817 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009818 case llvm::Triple::arm:
9819 case llvm::Triple::thumb:
9820 break;
9821 case llvm::Triple::x86:
9822 CmdArgs.push_back("--32");
9823 break;
9824 case llvm::Triple::x86_64:
9825 CmdArgs.push_back("--64");
9826 break;
9827 }
9828
9829 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9830
9831 CmdArgs.push_back("-o");
9832 CmdArgs.push_back(Output.getFilename());
9833
9834 for (const auto &Input : Inputs)
9835 CmdArgs.push_back(Input.getFilename());
9836
9837 const std::string Assembler = TC.GetProgramPath("as");
9838 Exec = Args.MakeArgString(Assembler);
9839
Justin Bognerd3371d82015-07-17 03:35:54 +00009840 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009841}
9842
Douglas Katzman95354292015-06-23 20:42:09 +00009843void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9844 const InputInfo &Output,
9845 const InputInfoList &Inputs,
9846 const ArgList &Args,
9847 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009848 const auto &TC =
9849 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9850 const llvm::Triple &T = TC.getTriple();
9851 const Driver &D = TC.getDriver();
9852 SmallString<128> EntryPoint;
9853 ArgStringList CmdArgs;
9854 const char *Exec;
9855
9856 // Silence warning for "clang -g foo.o -o foo"
9857 Args.ClaimAllArgs(options::OPT_g_Group);
9858 // and "clang -emit-llvm foo.o -o foo"
9859 Args.ClaimAllArgs(options::OPT_emit_llvm);
9860 // and for "clang -w foo.o -o foo"
9861 Args.ClaimAllArgs(options::OPT_w);
9862 // Other warning options are already handled somewhere else.
9863
9864 if (!D.SysRoot.empty())
9865 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9866
9867 if (Args.hasArg(options::OPT_pie))
9868 CmdArgs.push_back("-pie");
9869 if (Args.hasArg(options::OPT_rdynamic))
9870 CmdArgs.push_back("-export-dynamic");
9871 if (Args.hasArg(options::OPT_s))
9872 CmdArgs.push_back("--strip-all");
9873
9874 CmdArgs.push_back("-m");
9875 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009876 default:
9877 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009878 case llvm::Triple::arm:
9879 case llvm::Triple::thumb:
9880 // FIXME: this is incorrect for WinCE
9881 CmdArgs.push_back("thumb2pe");
9882 break;
9883 case llvm::Triple::x86:
9884 CmdArgs.push_back("i386pe");
9885 EntryPoint.append("_");
9886 break;
9887 case llvm::Triple::x86_64:
9888 CmdArgs.push_back("i386pep");
9889 break;
9890 }
9891
9892 if (Args.hasArg(options::OPT_shared)) {
9893 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009894 default:
9895 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009896 case llvm::Triple::arm:
9897 case llvm::Triple::thumb:
9898 case llvm::Triple::x86_64:
9899 EntryPoint.append("_DllMainCRTStartup");
9900 break;
9901 case llvm::Triple::x86:
9902 EntryPoint.append("_DllMainCRTStartup@12");
9903 break;
9904 }
9905
9906 CmdArgs.push_back("-shared");
9907 CmdArgs.push_back("-Bdynamic");
9908
9909 CmdArgs.push_back("--enable-auto-image-base");
9910
9911 CmdArgs.push_back("--entry");
9912 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9913 } else {
9914 EntryPoint.append("mainCRTStartup");
9915
9916 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9917 : "-Bdynamic");
9918
Douglas Katzman78b37b02015-11-17 20:28:07 +00009919 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009920 CmdArgs.push_back("--entry");
9921 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9922 }
9923
9924 // FIXME: handle subsystem
9925 }
9926
9927 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009928 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009929
9930 CmdArgs.push_back("-o");
9931 CmdArgs.push_back(Output.getFilename());
9932
9933 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9934 SmallString<261> ImpLib(Output.getFilename());
9935 llvm::sys::path::replace_extension(ImpLib, ".lib");
9936
9937 CmdArgs.push_back("--out-implib");
9938 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9939 }
9940
Douglas Katzman78b37b02015-11-17 20:28:07 +00009941 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009942 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9943 const char *CRTBegin;
9944
9945 CRTBegin =
9946 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9947 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9948 }
9949
9950 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009951 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009952 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9953
9954 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9955 !Args.hasArg(options::OPT_nodefaultlibs)) {
9956 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9957 !Args.hasArg(options::OPT_static);
9958 if (StaticCXX)
9959 CmdArgs.push_back("-Bstatic");
9960 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9961 if (StaticCXX)
9962 CmdArgs.push_back("-Bdynamic");
9963 }
9964
9965 if (!Args.hasArg(options::OPT_nostdlib)) {
9966 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9967 // TODO handle /MT[d] /MD[d]
9968 CmdArgs.push_back("-lmsvcrt");
9969 AddRunTimeLibs(TC, D, CmdArgs, Args);
9970 }
9971 }
9972
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009973 if (TC.getSanitizerArgs().needsAsanRt()) {
9974 // TODO handle /MT[d] /MD[d]
9975 if (Args.hasArg(options::OPT_shared)) {
9976 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9977 } else {
9978 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9979 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9980 // Make sure the dynamic runtime thunk is not optimized out at link time
9981 // to ensure proper SEH handling.
9982 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9983 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9984 ? "___asan_seh_interceptor"
9985 : "__asan_seh_interceptor"));
9986 }
9987 }
9988
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009989 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009990
Justin Bognerd3371d82015-07-17 03:35:54 +00009991 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009992}
Douglas Katzman84a75642015-06-19 14:55:19 +00009993
Douglas Katzman95354292015-06-23 20:42:09 +00009994void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9995 const InputInfo &Output,
9996 const InputInfoList &Inputs,
9997 const ArgList &Args,
9998 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009999 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010000 assert(Inputs.size() == 1);
10001 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010002 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10003 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010004
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010005 if (JA.getKind() == Action::PreprocessJobClass) {
10006 Args.ClaimAllArgs();
10007 CmdArgs.push_back("-E");
10008 } else {
10009 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10010 CmdArgs.push_back("-S");
10011 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10012 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010013 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010014 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010015
Douglas Katzmanf6071112015-08-03 14:34:22 +000010016 // Append all -I, -iquote, -isystem paths, defines/undefines,
10017 // 'f' flags, optimize flags, and warning options.
10018 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010019 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010020 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010021 options::OPT_f_Group, options::OPT_f_clang_Group,
10022 options::OPT_g_Group, options::OPT_M_Group,
10023 options::OPT_O_Group, options::OPT_W_Group});
10024
10025 // If we're producing a dependency file, and assembly is the final action,
10026 // then the name of the target in the dependency file should be the '.o'
10027 // file, not the '.s' file produced by this step. For example, instead of
10028 // /tmp/mumble.s: mumble.c .../someheader.h
10029 // the filename on the lefthand side should be "mumble.o"
10030 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10031 C.getActions().size() == 1 &&
10032 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10033 Arg *A = Args.getLastArg(options::OPT_o);
10034 if (A) {
10035 CmdArgs.push_back("-MT");
10036 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10037 }
10038 }
10039
Douglas Katzman84a75642015-06-19 14:55:19 +000010040 CmdArgs.push_back(II.getFilename());
10041 CmdArgs.push_back("-o");
10042 CmdArgs.push_back(Output.getFilename());
10043
10044 std::string Exec =
10045 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010046 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10047 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010048}
10049
Douglas Katzman95354292015-06-23 20:42:09 +000010050void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10051 const InputInfo &Output,
10052 const InputInfoList &Inputs,
10053 const ArgList &Args,
10054 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010055 ArgStringList CmdArgs;
10056
10057 assert(Inputs.size() == 1);
10058 const InputInfo &II = Inputs[0];
10059 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10060 assert(Output.getType() == types::TY_Object);
10061
10062 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010063 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010064 CmdArgs.push_back("-noSPrefixing");
10065 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010066 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10067 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10068 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010069 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010070 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010071 }
10072 CmdArgs.push_back("-elf"); // Output format.
10073 CmdArgs.push_back(II.getFilename());
10074 CmdArgs.push_back(
10075 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10076
10077 std::string Exec =
10078 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010079 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10080 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010081}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010082
10083void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10084 const InputInfo &Output,
10085 const InputInfoList &Inputs,
10086 const ArgList &Args,
10087 const char *LinkingOutput) const {
10088 const auto &TC =
10089 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10090 const llvm::Triple &T = TC.getTriple();
10091 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010092 bool UseStartfiles =
10093 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010094 bool UseDefaultLibs =
10095 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010096
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010097 if (T.getArch() == llvm::Triple::sparc)
10098 CmdArgs.push_back("-EB");
10099 else // SHAVE assumes little-endian, and sparcel is expressly so.
10100 CmdArgs.push_back("-EL");
10101
10102 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10103 // but we never pass through a --sysroot option and various other bits.
10104 // For example, there are no sanitizers (yet) nor gold linker.
10105
10106 // Eat some arguments that may be present but have no effect.
10107 Args.ClaimAllArgs(options::OPT_g_Group);
10108 Args.ClaimAllArgs(options::OPT_w);
10109 Args.ClaimAllArgs(options::OPT_static_libgcc);
10110
10111 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10112 CmdArgs.push_back("-s");
10113
10114 CmdArgs.push_back("-o");
10115 CmdArgs.push_back(Output.getFilename());
10116
10117 if (UseStartfiles) {
10118 // If you want startfiles, it means you want the builtin crti and crtbegin,
10119 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010120 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10121 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010122 }
10123
10124 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10125 options::OPT_e, options::OPT_s, options::OPT_t,
10126 options::OPT_Z_Flag, options::OPT_r});
10127
Douglas Katzman674a3122015-11-18 16:24:46 +000010128 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010129
10130 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10131
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010132 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010133 if (C.getDriver().CCCIsCXX())
10134 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010135 if (T.getOS() == llvm::Triple::RTEMS) {
10136 CmdArgs.push_back("--start-group");
10137 CmdArgs.push_back("-lc");
10138 // You must provide your own "-L" option to enable finding these.
10139 CmdArgs.push_back("-lrtemscpu");
10140 CmdArgs.push_back("-lrtemsbsp");
10141 CmdArgs.push_back("--end-group");
10142 } else {
10143 CmdArgs.push_back("-lc");
10144 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010145 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010146 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010147 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010148 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10149 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010150 }
10151
10152 std::string Exec =
10153 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10154 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10155 CmdArgs, Inputs));
10156}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010157
10158void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10159 const InputInfo &Output,
10160 const InputInfoList &Inputs,
10161 const ArgList &Args,
10162 const char *LinkingOutput) const {
10163 claimNoWarnArgs(Args);
10164 ArgStringList CmdArgs;
10165
10166 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10167
10168 CmdArgs.push_back("-o");
10169 CmdArgs.push_back(Output.getFilename());
10170
10171 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10172 const InputInfo &Input = Inputs[0];
10173 assert(Input.isFilename() && "Invalid input.");
10174 CmdArgs.push_back(Input.getFilename());
10175
10176 const char *Exec =
10177 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10178 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10179}
10180
10181static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
10182 ArgStringList &CmdArgs) {
10183 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
10184 false) ||
10185 Args.hasArg(options::OPT_fprofile_generate) ||
10186 Args.hasArg(options::OPT_fprofile_instr_generate) ||
10187 Args.hasArg(options::OPT_fcreate_profile) ||
10188 Args.hasArg(options::OPT_coverage)))
10189 return;
10190
10191 assert(TC.getTriple().isPS4CPU() &&
10192 "Profiling libraries are only implemented for the PS4 CPU");
10193 CmdArgs.push_back("-lclang_rt.profile-x86_64");
10194}
10195
10196static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10197 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10198 if (SanArgs.needsUbsanRt()) {
10199 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10200 }
10201 if (SanArgs.needsAsanRt()) {
10202 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10203 }
10204}
10205
10206static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10207 const JobAction &JA, const InputInfo &Output,
10208 const InputInfoList &Inputs,
10209 const ArgList &Args,
10210 const char *LinkingOutput) {
10211 const toolchains::FreeBSD &ToolChain =
10212 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10213 const Driver &D = ToolChain.getDriver();
10214 ArgStringList CmdArgs;
10215
10216 // Silence warning for "clang -g foo.o -o foo"
10217 Args.ClaimAllArgs(options::OPT_g_Group);
10218 // and "clang -emit-llvm foo.o -o foo"
10219 Args.ClaimAllArgs(options::OPT_emit_llvm);
10220 // and for "clang -w foo.o -o foo". Other warning options are already
10221 // handled somewhere else.
10222 Args.ClaimAllArgs(options::OPT_w);
10223
10224 if (!D.SysRoot.empty())
10225 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10226
10227 if (Args.hasArg(options::OPT_pie))
10228 CmdArgs.push_back("-pie");
10229
10230 if (Args.hasArg(options::OPT_rdynamic))
10231 CmdArgs.push_back("-export-dynamic");
10232 if (Args.hasArg(options::OPT_shared))
10233 CmdArgs.push_back("--oformat=so");
10234
10235 if (Output.isFilename()) {
10236 CmdArgs.push_back("-o");
10237 CmdArgs.push_back(Output.getFilename());
10238 } else {
10239 assert(Output.isNothing() && "Invalid output.");
10240 }
10241
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010242 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10243
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010244 Args.AddAllArgs(CmdArgs, options::OPT_L);
10245 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10246 Args.AddAllArgs(CmdArgs, options::OPT_e);
10247 Args.AddAllArgs(CmdArgs, options::OPT_s);
10248 Args.AddAllArgs(CmdArgs, options::OPT_t);
10249 Args.AddAllArgs(CmdArgs, options::OPT_r);
10250
10251 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10252 CmdArgs.push_back("--no-demangle");
10253
10254 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10255
10256 if (Args.hasArg(options::OPT_pthread)) {
10257 CmdArgs.push_back("-lpthread");
10258 }
10259
10260 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010261
10262 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10263
10264 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10265}
10266
10267static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10268 const JobAction &JA, const InputInfo &Output,
10269 const InputInfoList &Inputs,
10270 const ArgList &Args,
10271 const char *LinkingOutput) {
10272 const toolchains::FreeBSD &ToolChain =
10273 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10274 const Driver &D = ToolChain.getDriver();
10275 ArgStringList CmdArgs;
10276
10277 // Silence warning for "clang -g foo.o -o foo"
10278 Args.ClaimAllArgs(options::OPT_g_Group);
10279 // and "clang -emit-llvm foo.o -o foo"
10280 Args.ClaimAllArgs(options::OPT_emit_llvm);
10281 // and for "clang -w foo.o -o foo". Other warning options are already
10282 // handled somewhere else.
10283 Args.ClaimAllArgs(options::OPT_w);
10284
10285 if (!D.SysRoot.empty())
10286 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10287
10288 if (Args.hasArg(options::OPT_pie))
10289 CmdArgs.push_back("-pie");
10290
10291 if (Args.hasArg(options::OPT_static)) {
10292 CmdArgs.push_back("-Bstatic");
10293 } else {
10294 if (Args.hasArg(options::OPT_rdynamic))
10295 CmdArgs.push_back("-export-dynamic");
10296 CmdArgs.push_back("--eh-frame-hdr");
10297 if (Args.hasArg(options::OPT_shared)) {
10298 CmdArgs.push_back("-Bshareable");
10299 } else {
10300 CmdArgs.push_back("-dynamic-linker");
10301 CmdArgs.push_back("/libexec/ld-elf.so.1");
10302 }
10303 CmdArgs.push_back("--enable-new-dtags");
10304 }
10305
10306 if (Output.isFilename()) {
10307 CmdArgs.push_back("-o");
10308 CmdArgs.push_back(Output.getFilename());
10309 } else {
10310 assert(Output.isNothing() && "Invalid output.");
10311 }
10312
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010313 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10314
Douglas Katzman78b37b02015-11-17 20:28:07 +000010315 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010316 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010317 if (!Args.hasArg(options::OPT_shared)) {
10318 if (Args.hasArg(options::OPT_pg))
10319 crt1 = "gcrt1.o";
10320 else if (Args.hasArg(options::OPT_pie))
10321 crt1 = "Scrt1.o";
10322 else
10323 crt1 = "crt1.o";
10324 }
10325 if (crt1)
10326 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10327
10328 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10329
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010330 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010331 if (Args.hasArg(options::OPT_static))
10332 crtbegin = "crtbeginT.o";
10333 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10334 crtbegin = "crtbeginS.o";
10335 else
10336 crtbegin = "crtbegin.o";
10337
10338 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10339 }
10340
10341 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010342 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010343 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10344 Args.AddAllArgs(CmdArgs, options::OPT_e);
10345 Args.AddAllArgs(CmdArgs, options::OPT_s);
10346 Args.AddAllArgs(CmdArgs, options::OPT_t);
10347 Args.AddAllArgs(CmdArgs, options::OPT_r);
10348
10349 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10350 CmdArgs.push_back("--no-demangle");
10351
10352 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10353
Douglas Katzman78b37b02015-11-17 20:28:07 +000010354 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010355 // For PS4, we always want to pass libm, libstdc++ and libkernel
10356 // libraries for both C and C++ compilations.
10357 CmdArgs.push_back("-lkernel");
10358 if (D.CCCIsCXX()) {
10359 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10360 if (Args.hasArg(options::OPT_pg))
10361 CmdArgs.push_back("-lm_p");
10362 else
10363 CmdArgs.push_back("-lm");
10364 }
10365 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10366 // the default system libraries. Just mimic this for now.
10367 if (Args.hasArg(options::OPT_pg))
10368 CmdArgs.push_back("-lgcc_p");
10369 else
10370 CmdArgs.push_back("-lcompiler_rt");
10371 if (Args.hasArg(options::OPT_static)) {
10372 CmdArgs.push_back("-lstdc++");
10373 } else if (Args.hasArg(options::OPT_pg)) {
10374 CmdArgs.push_back("-lgcc_eh_p");
10375 } else {
10376 CmdArgs.push_back("--as-needed");
10377 CmdArgs.push_back("-lstdc++");
10378 CmdArgs.push_back("--no-as-needed");
10379 }
10380
10381 if (Args.hasArg(options::OPT_pthread)) {
10382 if (Args.hasArg(options::OPT_pg))
10383 CmdArgs.push_back("-lpthread_p");
10384 else
10385 CmdArgs.push_back("-lpthread");
10386 }
10387
10388 if (Args.hasArg(options::OPT_pg)) {
10389 if (Args.hasArg(options::OPT_shared))
10390 CmdArgs.push_back("-lc");
10391 else {
10392 if (Args.hasArg(options::OPT_static)) {
10393 CmdArgs.push_back("--start-group");
10394 CmdArgs.push_back("-lc_p");
10395 CmdArgs.push_back("-lpthread_p");
10396 CmdArgs.push_back("--end-group");
10397 } else {
10398 CmdArgs.push_back("-lc_p");
10399 }
10400 }
10401 CmdArgs.push_back("-lgcc_p");
10402 } else {
10403 if (Args.hasArg(options::OPT_static)) {
10404 CmdArgs.push_back("--start-group");
10405 CmdArgs.push_back("-lc");
10406 CmdArgs.push_back("-lpthread");
10407 CmdArgs.push_back("--end-group");
10408 } else {
10409 CmdArgs.push_back("-lc");
10410 }
10411 CmdArgs.push_back("-lcompiler_rt");
10412 }
10413
10414 if (Args.hasArg(options::OPT_static)) {
10415 CmdArgs.push_back("-lstdc++");
10416 } else if (Args.hasArg(options::OPT_pg)) {
10417 CmdArgs.push_back("-lgcc_eh_p");
10418 } else {
10419 CmdArgs.push_back("--as-needed");
10420 CmdArgs.push_back("-lstdc++");
10421 CmdArgs.push_back("--no-as-needed");
10422 }
10423 }
10424
Douglas Katzman78b37b02015-11-17 20:28:07 +000010425 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010426 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10427 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10428 else
10429 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10430 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10431 }
10432
10433 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010434
10435 const char *Exec =
10436#ifdef LLVM_ON_WIN32
10437 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10438#else
10439 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10440#endif
10441
10442 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10443}
10444
10445void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10446 const InputInfo &Output,
10447 const InputInfoList &Inputs,
10448 const ArgList &Args,
10449 const char *LinkingOutput) const {
10450 const toolchains::FreeBSD &ToolChain =
10451 static_cast<const toolchains::FreeBSD &>(getToolChain());
10452 const Driver &D = ToolChain.getDriver();
10453 bool PS4Linker;
10454 StringRef LinkerOptName;
10455 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10456 LinkerOptName = A->getValue();
10457 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10458 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10459 }
10460
10461 if (LinkerOptName == "gold")
10462 PS4Linker = false;
10463 else if (LinkerOptName == "ps4")
10464 PS4Linker = true;
10465 else
10466 PS4Linker = !Args.hasArg(options::OPT_shared);
10467
10468 if (PS4Linker)
10469 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10470 else
10471 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10472}