blob: 9ae9348792bae9c493572586f955fb8e15091221 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000055static const char *getSparcAsmModeForCPU(StringRef Name,
56 const llvm::Triple &Triple) {
57 if (Triple.getArch() == llvm::Triple::sparcv9) {
58 return llvm::StringSwitch<const char *>(Name)
59 .Case("niagara", "-Av9b")
60 .Case("niagara2", "-Av9b")
61 .Case("niagara3", "-Av9d")
62 .Case("niagara4", "-Av9d")
63 .Default("-Av9");
64 } else {
65 return llvm::StringSwitch<const char *>(Name)
66 .Case("v8", "-Av8")
67 .Case("supersparc", "-Av8")
68 .Case("sparclite", "-Asparclite")
69 .Case("f934", "-Asparclite")
70 .Case("hypersparc", "-Av8")
71 .Case("sparclite86x", "-Asparclite")
72 .Case("sparclet", "-Asparclet")
73 .Case("tsc701", "-Asparclet")
74 .Case("v9", "-Av8plus")
75 .Case("ultrasparc", "-Av8plus")
76 .Case("ultrasparc3", "-Av8plus")
77 .Case("niagara", "-Av8plusb")
78 .Case("niagara2", "-Av8plusb")
79 .Case("niagara3", "-Av8plusd")
80 .Case("niagara4", "-Av8plusd")
81 .Default("-Av8");
82 }
83}
84
Daniel Dunbar64198ef2009-09-10 01:21:05 +000085/// CheckPreprocessingOptions - Perform some validation of preprocessing
86/// arguments that is shared with gcc.
87static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000088 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
89 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
90 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000091 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000092 << A->getBaseArg().getAsString(Args)
93 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
94 }
95 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000096}
97
Daniel Dunbar4eadb602009-09-10 01:21:12 +000098/// CheckCodeGenerationOptions - Perform some validation of code generation
99/// arguments that is shared with gcc.
100static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
101 // In gcc, only ARM checks this, but it seems reasonable to check universally.
102 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000103 if (const Arg *A =
104 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
105 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
106 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000107}
108
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000109// Add backslashes to escape spaces and other backslashes.
110// This is used for the space-separated argument list specified with
111// the -dwarf-debug-flags option.
112static void EscapeSpacesAndBackslashes(const char *Arg,
113 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000114 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000115 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000116 default:
117 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000118 case ' ':
119 case '\\':
120 Res.push_back('\\');
121 break;
122 }
123 Res.push_back(*Arg);
124 }
125}
126
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000127// Quote target names for inclusion in GNU Make dependency files.
128// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000129static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000130 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
131 switch (Target[i]) {
132 case ' ':
133 case '\t':
134 // Escape the preceding backslashes
135 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
136 Res.push_back('\\');
137
138 // Escape the space/tab
139 Res.push_back('\\');
140 break;
141 case '$':
142 Res.push_back('$');
143 break;
144 case '#':
145 Res.push_back('\\');
146 break;
147 default:
148 break;
149 }
150
151 Res.push_back(Target[i]);
152 }
153}
154
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000155static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
156 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000157 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000158 bool CombinedArg = false;
159
Bill Wendling281ca292012-03-12 21:22:35 +0000160 if (!DirList)
161 return; // Nothing to do.
162
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 StringRef Name(ArgName);
164 if (Name.equals("-I") || Name.equals("-L"))
165 CombinedArg = true;
166
Bill Wendling281ca292012-03-12 21:22:35 +0000167 StringRef Dirs(DirList);
168 if (Dirs.empty()) // Empty string should not add '.'.
169 return;
170
171 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000172 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000173 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000174 if (CombinedArg) {
175 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
176 } else {
177 CmdArgs.push_back(ArgName);
178 CmdArgs.push_back(".");
179 }
Bill Wendling281ca292012-03-12 21:22:35 +0000180 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000182 CmdArgs.push_back(
183 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 } else {
185 CmdArgs.push_back(ArgName);
186 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
187 }
Bill Wendling281ca292012-03-12 21:22:35 +0000188 }
Nico Weber89355782012-03-19 15:00:03 +0000189 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191
192 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000193 if (CombinedArg) {
194 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
195 } else {
196 CmdArgs.push_back(ArgName);
197 CmdArgs.push_back(".");
198 }
Bill Wendling281ca292012-03-12 21:22:35 +0000199 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000200 if (CombinedArg) {
201 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
207}
208
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000209static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
210 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 const Driver &D = TC.getDriver();
212
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000213 // Add extra linker input arguments which are not treated as inputs
214 // (constructed via -Xarch_).
215 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
216
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000217 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000218 if (!TC.HasNativeLLVMSupport()) {
219 // Don't try to pass LLVM inputs unless we have native support.
220 if (II.getType() == types::TY_LLVM_IR ||
221 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000222 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
223 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000224 }
225
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000226 // Add filenames immediately.
227 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000228 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000229 continue;
230 }
231
232 // Otherwise, this is a linker input argument.
233 const Arg &A = II.getInputArg();
234
235 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000236 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000237 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000238 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000239 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000240 else if (A.getOption().matches(options::OPT_z)) {
241 // Pass -z prefix for gcc linker compatibility.
242 A.claim();
243 A.render(Args, CmdArgs);
244 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000245 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000246 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000247 }
Bill Wendling281ca292012-03-12 21:22:35 +0000248
249 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000250 // and only supported on native toolchains.
251 if (!TC.isCrossCompiling())
252 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000253}
254
John McCall31168b02011-06-15 23:02:42 +0000255/// \brief Determine whether Objective-C automated reference counting is
256/// enabled.
257static bool isObjCAutoRefCount(const ArgList &Args) {
258 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
259}
260
Ted Kremeneke65b0862012-03-06 20:05:56 +0000261/// \brief Determine whether we are linking the ObjC runtime.
262static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000263 if (isObjCAutoRefCount(Args)) {
264 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000265 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000266 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000267 return Args.hasArg(options::OPT_fobjc_link_runtime);
268}
269
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000270static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000271 // Don't forward inputs from the original command line. They are added from
272 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000273 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000274 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000275}
276
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000277void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
278 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000279 ArgStringList &CmdArgs,
280 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000281 const InputInfoList &Inputs,
282 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000283 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000284
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000285 CheckPreprocessingOptions(D, Args);
286
287 Args.AddLastArg(CmdArgs, options::OPT_C);
288 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000289
290 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000291 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000292 (A = Args.getLastArg(options::OPT_MD)) ||
293 (A = Args.getLastArg(options::OPT_MMD))) {
294 // Determine the output location.
295 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000296 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000297 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000298 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000299 } else if (Output.getType() == types::TY_Dependencies) {
300 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000301 } else if (A->getOption().matches(options::OPT_M) ||
302 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 DepFile = "-";
304 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000305 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000306 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000307 }
308 CmdArgs.push_back("-dependency-file");
309 CmdArgs.push_back(DepFile);
310
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000311 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000312 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
313 const char *DepTarget;
314
315 // If user provided -o, that is the dependency target, except
316 // when we are only generating a dependency file.
317 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
318 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000319 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 } else {
321 // Otherwise derive from the base input.
322 //
323 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000324 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000325 llvm::sys::path::replace_extension(P, "o");
326 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327 }
328
329 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000330 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000331 QuoteTarget(DepTarget, Quoted);
332 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000333 }
334
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000335 if (A->getOption().matches(options::OPT_M) ||
336 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000337 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000338 if ((isa<PrecompileJobAction>(JA) &&
339 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
340 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000341 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000342 }
343
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000344 if (Args.hasArg(options::OPT_MG)) {
345 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000346 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000347 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000348 CmdArgs.push_back("-MG");
349 }
350
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000352 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000353
354 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000355 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000356 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000357
Daniel Dunbara442fd52010-06-11 22:00:13 +0000358 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000359 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000360 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000361 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000362 CmdArgs.push_back(Args.MakeArgString(Quoted));
363
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000364 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000365 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000366 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367 }
368 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000369
Douglas Gregor111af7d2009-04-18 00:34:01 +0000370 // Add -i* options, and automatically translate to
371 // -include-pch/-include-pth for transparent PCH support. It's
372 // wonky, but we include looking for .gch so we can support seamless
373 // replacement into a build system already set up to be generating
374 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000375 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000376 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000377 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000378 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
379 RenderedImplicitInclude = true;
380
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000381 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000382 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000383
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000384 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000385 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000386 SmallString<128> P(A->getValue());
387 // We want the files to have a name like foo.h.pch. Add a dummy extension
388 // so that replace_extension does the right thing.
389 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000390 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000391 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000392 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000393 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000394 }
395
Douglas Gregor111af7d2009-04-18 00:34:01 +0000396 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000397 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000398 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000399 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000400 }
401
Douglas Gregor111af7d2009-04-18 00:34:01 +0000402 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000403 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000404 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000405 FoundPCH = UsePCH;
406 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000407 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000408 }
409
410 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000411 if (IsFirstImplicitInclude) {
412 A->claim();
413 if (UsePCH)
414 CmdArgs.push_back("-include-pch");
415 else
416 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000417 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000418 continue;
419 } else {
420 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000421 D.Diag(diag::warn_drv_pch_not_first_include) << P
422 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000423 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000424 }
425 }
426
427 // Not translated, render as usual.
428 A->claim();
429 A->render(Args, CmdArgs);
430 }
431
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000432 Args.AddAllArgs(CmdArgs,
433 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
434 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000435
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000436 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000437
438 // FIXME: There is a very unfortunate problem here, some troubled
439 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
440 // really support that we would have to parse and then translate
441 // those options. :(
442 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
443 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000444
445 // -I- is a deprecated GCC feature, reject it.
446 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000447 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000448
449 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
450 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000451 StringRef sysroot = C.getSysRoot();
452 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000453 if (!Args.hasArg(options::OPT_isysroot)) {
454 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000455 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000456 }
457 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000458
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000459 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000460 // FIXME: We should probably sink the logic for handling these from the
461 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000462 // CPATH - included following the user specified includes (but prior to
463 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000467 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000469 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000470 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000471 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000472 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000473
Artem Belevichfa11ab52015-11-17 22:28:46 +0000474 // Optional AuxToolChain indicates that we need to include headers
475 // for more than one target. If that's the case, add include paths
476 // from AuxToolChain right after include paths of the same kind for
477 // the current target.
478
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000479 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000480 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000481 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000482 if (AuxToolChain)
483 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
484 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000485
486 // Add system include arguments.
487 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000488 if (AuxToolChain)
489 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
490
491 // Add CUDA include arguments, if needed.
492 if (types::isCuda(Inputs[0].getType()))
493 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000494}
495
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000496// FIXME: Move to target hook.
497static bool isSignedCharDefault(const llvm::Triple &Triple) {
498 switch (Triple.getArch()) {
499 default:
500 return true;
501
Tim Northover9bb857a2013-01-31 12:13:10 +0000502 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000503 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000504 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000505 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000506 case llvm::Triple::thumb:
507 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000508 if (Triple.isOSDarwin() || Triple.isOSWindows())
509 return true;
510 return false;
511
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000512 case llvm::Triple::ppc:
513 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000514 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000515 return true;
516 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000517
David Majnemerdcecd932015-05-23 19:23:55 +0000518 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000519 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000520 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000521 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000522 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000523 }
524}
525
Robert Lytton0e076492013-08-13 09:43:10 +0000526static bool isNoCommonDefault(const llvm::Triple &Triple) {
527 switch (Triple.getArch()) {
528 default:
529 return false;
530
531 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000532 case llvm::Triple::wasm32:
533 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000534 return true;
535 }
536}
537
Renato Goline17c5802015-07-27 23:44:42 +0000538// ARM tools start.
539
540// Get SubArch (vN).
541static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
542 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000543 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000544}
545
546// True if M-profile.
547static bool isARMMProfile(const llvm::Triple &Triple) {
548 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000549 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000550 return Profile == llvm::ARM::PK_M;
551}
552
553// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000554static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
555 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000556 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
557 CPU = A->getValue();
558 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
559 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000560 if (!FromAs)
561 return;
562
563 for (const Arg *A :
564 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
565 StringRef Value = A->getValue();
566 if (Value.startswith("-mcpu="))
567 CPU = Value.substr(6);
568 if (Value.startswith("-march="))
569 Arch = Value.substr(7);
570 }
Renato Goline17c5802015-07-27 23:44:42 +0000571}
572
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000573// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000574// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000575static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000576 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000577 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000578 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
579 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000580 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
581}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000582
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000583// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000584static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000585 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000586 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000587 unsigned FPUID = llvm::ARM::parseFPU(FPU);
588 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000589 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
590}
591
Bradley Smithbbf5a002015-11-18 16:33:48 +0000592// Decode ARM features from string like +[no]featureA+[no]featureB+...
593static bool DecodeARMFeatures(const Driver &D, StringRef text,
594 std::vector<const char *> &Features) {
595 SmallVector<StringRef, 8> Split;
596 text.split(Split, StringRef("+"), -1, false);
597
598 for (StringRef Feature : Split) {
599 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
600 if (FeatureName)
601 Features.push_back(FeatureName);
602 else
603 return false;
604 }
605 return true;
606}
607
Renato Golin7c542b42015-07-27 23:44:45 +0000608// Check if -march is valid by checking if it can be canonicalised and parsed.
609// getARMArch is used here instead of just checking the -march value in order
610// to handle -march=native correctly.
611static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000612 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000613 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000614 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000615 std::pair<StringRef, StringRef> Split = ArchName.split("+");
616
Renato Goline17c5802015-07-27 23:44:42 +0000617 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000618 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
619 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000620 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000621}
622
Renato Golin7c542b42015-07-27 23:44:45 +0000623// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
624static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
625 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000626 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000627 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000628 std::pair<StringRef, StringRef> Split = CPUName.split("+");
629
Renato Goline17c5802015-07-27 23:44:42 +0000630 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000631 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
632 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000633 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000634}
635
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000636static bool useAAPCSForMachO(const llvm::Triple &T) {
637 // The backend is hardwired to assume AAPCS for M-class processors, ensure
638 // the frontend matches that.
639 return T.getEnvironment() == llvm::Triple::EABI ||
640 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
641}
642
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000643// Select the float ABI as determined by -msoft-float, -mhard-float, and
644// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000645arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
646 const Driver &D = TC.getDriver();
647 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000648 auto SubArch = getARMSubArchVersionNumber(Triple);
649 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000650 if (Arg *A =
651 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
652 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000653 if (A->getOption().matches(options::OPT_msoft_float)) {
654 ABI = FloatABI::Soft;
655 } else if (A->getOption().matches(options::OPT_mhard_float)) {
656 ABI = FloatABI::Hard;
657 } else {
658 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
659 .Case("soft", FloatABI::Soft)
660 .Case("softfp", FloatABI::SoftFP)
661 .Case("hard", FloatABI::Hard)
662 .Default(FloatABI::Invalid);
663 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000664 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000665 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000666 }
667 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000668
669 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
670 // "apcs-gnu".
671 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000672 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000673 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
674 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000675 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000676 }
677
678 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000679 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000680 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000681 case llvm::Triple::Darwin:
682 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000683 case llvm::Triple::IOS:
684 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000685 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000686 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000687 break;
688 }
Tim Northover756447a2015-10-30 16:30:36 +0000689 case llvm::Triple::WatchOS:
690 ABI = FloatABI::Hard;
691 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000692
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000693 // FIXME: this is invalid for WindowsCE
694 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000695 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000696 break;
697
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000698 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000699 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000700 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000701 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000702 break;
703 default:
704 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000705 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000706 break;
707 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000708 break;
709
Daniel Dunbar78485922009-09-10 23:00:09 +0000710 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000711 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000712 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000713 case llvm::Triple::EABIHF:
714 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000715 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000716 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000717 case llvm::Triple::EABI:
718 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000719 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000720 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000721 case llvm::Triple::Android:
722 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000723 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000724 default:
725 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000726 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000727 if (Triple.getOS() != llvm::Triple::UnknownOS ||
728 !Triple.isOSBinFormatMachO())
729 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000730 break;
731 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000732 }
733 }
734
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000735 assert(ABI != FloatABI::Invalid && "must select an ABI");
736 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000737}
738
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000739static void getARMTargetFeatures(const ToolChain &TC,
740 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000741 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000742 std::vector<const char *> &Features,
743 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000744 const Driver &D = TC.getDriver();
745
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000746 bool KernelOrKext =
747 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000748 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000749 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
750 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
751
Nico Weber6e0ebae2015-04-29 21:16:40 +0000752 if (!ForAS) {
753 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
754 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
755 // stripped out by the ARM target. We should probably pass this a new
756 // -target-option, which is handled by the -cc1/-cc1as invocation.
757 //
758 // FIXME2: For consistency, it would be ideal if we set up the target
759 // machine state the same when using the frontend or the assembler. We don't
760 // currently do that for the assembler, we pass the options directly to the
761 // backend and never even instantiate the frontend TargetInfo. If we did,
762 // and used its handleTargetFeatures hook, then we could ensure the
763 // assembler and the frontend behave the same.
764
765 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000766 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000767 Features.push_back("+soft-float");
768
769 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000770 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000771 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000772 } else {
773 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
774 // to the assembler correctly.
775 for (const Arg *A :
776 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
777 StringRef Value = A->getValue();
778 if (Value.startswith("-mfpu=")) {
779 WaFPU = A;
780 } else if (Value.startswith("-mcpu=")) {
781 WaCPU = A;
782 } else if (Value.startswith("-mhwdiv=")) {
783 WaHDiv = A;
784 } else if (Value.startswith("-march=")) {
785 WaArch = A;
786 }
787 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000788 }
789
Renato Golin7c542b42015-07-27 23:44:45 +0000790 // Check -march. ClangAs gives preference to -Wa,-march=.
791 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000792 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000793 if (WaArch) {
794 if (ArchArg)
795 D.Diag(clang::diag::warn_drv_unused_argument)
796 << ArchArg->getAsString(Args);
797 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000798 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000799 // FIXME: Set Arch.
800 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
801 } else if (ArchArg) {
802 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000803 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000804 }
805
Renato Golin7c542b42015-07-27 23:44:45 +0000806 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
807 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000808 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000809 if (WaCPU) {
810 if (CPUArg)
811 D.Diag(clang::diag::warn_drv_unused_argument)
812 << CPUArg->getAsString(Args);
813 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000814 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000815 } else if (CPUArg) {
816 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000817 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000818 }
John Brawna95c1a82015-05-08 12:52:18 +0000819
Renato Golin23459c62015-07-30 16:40:17 +0000820 // Add CPU features for generic CPUs
821 if (CPUName == "native") {
822 llvm::StringMap<bool> HostFeatures;
823 if (llvm::sys::getHostCPUFeatures(HostFeatures))
824 for (auto &F : HostFeatures)
825 Features.push_back(
826 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
827 }
828
829 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
830 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
831 if (WaFPU) {
832 if (FPUArg)
833 D.Diag(clang::diag::warn_drv_unused_argument)
834 << FPUArg->getAsString(Args);
835 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
836 Features);
837 } else if (FPUArg) {
838 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
839 }
840
841 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
842 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
843 if (WaHDiv) {
844 if (HDivArg)
845 D.Diag(clang::diag::warn_drv_unused_argument)
846 << HDivArg->getAsString(Args);
847 getARMHWDivFeatures(D, WaHDiv, Args,
848 StringRef(WaHDiv->getValue()).substr(8), Features);
849 } else if (HDivArg)
850 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
851
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000852 // Setting -msoft-float effectively disables NEON because of the GCC
853 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000854 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000855 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000856 // Also need to explicitly disable features which imply NEON.
857 Features.push_back("-crypto");
858 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000859
Eric Christopher269c2a22015-04-04 03:34:43 +0000860 // En/disable crc code generation.
861 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000862 if (A->getOption().matches(options::OPT_mcrc))
863 Features.push_back("+crc");
864 else
865 Features.push_back("-crc");
866 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000867
868 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
869 Features.insert(Features.begin(), "+v8.1a");
870 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000871
Akira Hatanakac2694822015-07-07 08:28:42 +0000872 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
873 // neither options are specified, see if we are compiling for kernel/kext and
874 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000875 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
876 options::OPT_mno_long_calls)) {
877 if (A->getOption().matches(options::OPT_mlong_calls))
878 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000879 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
880 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000881 Features.push_back("+long-calls");
882 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000883
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000884 // Kernel code has more strict alignment requirements.
885 if (KernelOrKext)
886 Features.push_back("+strict-align");
887 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
888 options::OPT_munaligned_access)) {
889 if (A->getOption().matches(options::OPT_munaligned_access)) {
890 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
891 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
892 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
893 } else
894 Features.push_back("+strict-align");
895 } else {
896 // Assume pre-ARMv6 doesn't support unaligned accesses.
897 //
898 // ARMv6 may or may not support unaligned accesses depending on the
899 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
900 // Darwin and NetBSD targets support unaligned accesses, and others don't.
901 //
902 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
903 // which raises an alignment fault on unaligned accesses. Linux
904 // defaults this bit to 0 and handles it as a system-wide (not
905 // per-process) setting. It is therefore safe to assume that ARMv7+
906 // Linux targets support unaligned accesses. The same goes for NaCl.
907 //
908 // The above behavior is consistent with GCC.
909 int VersionNum = getARMSubArchVersionNumber(Triple);
910 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000911 if (VersionNum < 6 ||
912 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000913 Features.push_back("+strict-align");
914 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
915 if (VersionNum < 7)
916 Features.push_back("+strict-align");
917 } else
918 Features.push_back("+strict-align");
919 }
920
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000921 // llvm does not support reserving registers in general. There is support
922 // for reserving r9 on ARM though (defined as a platform-specific register
923 // in ARM EABI).
924 if (Args.hasArg(options::OPT_ffixed_r9))
925 Features.push_back("+reserve-r9");
926
Akira Hatanaka580efb22015-07-16 00:43:00 +0000927 // The kext linker doesn't know how to deal with movw/movt.
928 if (KernelOrKext)
929 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000930}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000931
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000932void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
933 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000934 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000935 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000936 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000937 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000938 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000939 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000940 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000941 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000942 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000943 } else if (Triple.isWatchOS()) {
944 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000945 } else {
946 ABIName = "apcs-gnu";
947 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000948 } else if (Triple.isOSWindows()) {
949 // FIXME: this is invalid for WindowsCE
950 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000951 } else {
952 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000953 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000954 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000955 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000956 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000957 ABIName = "aapcs-linux";
958 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000959 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000960 case llvm::Triple::EABI:
961 ABIName = "aapcs";
962 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000963 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000964 if (Triple.getOS() == llvm::Triple::NetBSD)
965 ABIName = "apcs-gnu";
966 else
967 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000968 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000969 }
970 }
971 CmdArgs.push_back("-target-abi");
972 CmdArgs.push_back(ABIName);
973
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000974 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000975 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000976 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000977 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000978 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000979 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000980 CmdArgs.push_back("-mfloat-abi");
981 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000982 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000983 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000984 CmdArgs.push_back("-mfloat-abi");
985 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000986 } else {
987 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000988 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000989 CmdArgs.push_back("-mfloat-abi");
990 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000991 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000992
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000993 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000994 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
995 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000996 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000997 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000998 CmdArgs.push_back("-arm-global-merge=false");
999 else
1000 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001001 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001002
Bob Wilson9c8af452013-04-11 18:53:25 +00001003 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001004 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001005 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001006}
Renato Goline17c5802015-07-27 23:44:42 +00001007// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001008
Tim Northover573cbee2014-05-24 12:52:07 +00001009/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1010/// targeting.
1011static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001012 Arg *A;
1013 std::string CPU;
1014 // If we have -mtune or -mcpu, use that.
1015 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001016 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001017 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001018 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001019 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001020 }
1021
Kevin Qin110db6f2014-07-18 07:03:22 +00001022 // Handle CPU name is 'native'.
1023 if (CPU == "native")
1024 return llvm::sys::getHostCPUName();
1025 else if (CPU.size())
1026 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001027
James Molloy9b1586b2014-04-17 12:51:17 +00001028 // Make sure we pick "cyclone" if -arch is used.
1029 // FIXME: Should this be picked by checking the target triple instead?
1030 if (Args.getLastArg(options::OPT_arch))
1031 return "cyclone";
1032
1033 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001034}
1035
Tim Northover573cbee2014-05-24 12:52:07 +00001036void Clang::AddAArch64TargetArgs(const ArgList &Args,
1037 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001038 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1039 llvm::Triple Triple(TripleStr);
1040
1041 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1042 Args.hasArg(options::OPT_mkernel) ||
1043 Args.hasArg(options::OPT_fapple_kext))
1044 CmdArgs.push_back("-disable-red-zone");
1045
1046 if (!Args.hasFlag(options::OPT_mimplicit_float,
1047 options::OPT_mno_implicit_float, true))
1048 CmdArgs.push_back("-no-implicit-float");
1049
Craig Topper92fc2df2014-05-17 16:56:41 +00001050 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001051 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1052 ABIName = A->getValue();
1053 else if (Triple.isOSDarwin())
1054 ABIName = "darwinpcs";
1055 else
1056 ABIName = "aapcs";
1057
1058 CmdArgs.push_back("-target-abi");
1059 CmdArgs.push_back(ABIName);
1060
Bradley Smith9ff64332014-10-13 10:16:06 +00001061 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1062 options::OPT_mno_fix_cortex_a53_835769)) {
1063 CmdArgs.push_back("-backend-option");
1064 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1065 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1066 else
1067 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001068 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001069 // Enabled A53 errata (835769) workaround by default on android
1070 CmdArgs.push_back("-backend-option");
1071 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001072 }
1073
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001074 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001075 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1076 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001077 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001078 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001079 CmdArgs.push_back("-aarch64-global-merge=false");
1080 else
1081 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001082 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001083}
1084
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001085// Get CPU and ABI names. They are not independent
1086// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001087void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1088 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001089 const char *DefMips32CPU = "mips32r2";
1090 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001091
Daniel Sanders2bf13662014-07-10 14:40:57 +00001092 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1093 // default for mips64(el)?-img-linux-gnu.
1094 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1095 Triple.getEnvironment() == llvm::Triple::GNU) {
1096 DefMips32CPU = "mips32r6";
1097 DefMips64CPU = "mips64r6";
1098 }
Renato Golin7c542b42015-07-27 23:44:45 +00001099
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001100 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001101 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001102 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001103
Brad Smithba26f582015-01-06 02:53:17 +00001104 // MIPS3 is the default for mips64*-unknown-openbsd.
1105 if (Triple.getOS() == llvm::Triple::OpenBSD)
1106 DefMips64CPU = "mips3";
1107
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001108 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001109 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001110
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001111 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001112 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001113 // Convert a GNU style Mips ABI name to the name
1114 // accepted by LLVM Mips backend.
1115 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001116 .Case("32", "o32")
1117 .Case("64", "n64")
1118 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001119 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001120
1121 // Setup default CPU and ABI names.
1122 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001123 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001124 default:
1125 llvm_unreachable("Unexpected triple arch name");
1126 case llvm::Triple::mips:
1127 case llvm::Triple::mipsel:
1128 CPUName = DefMips32CPU;
1129 break;
1130 case llvm::Triple::mips64:
1131 case llvm::Triple::mips64el:
1132 CPUName = DefMips64CPU;
1133 break;
1134 }
1135 }
1136
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001137 if (ABIName.empty()) {
1138 // Deduce ABI name from the target triple.
1139 if (Triple.getArch() == llvm::Triple::mips ||
1140 Triple.getArch() == llvm::Triple::mipsel)
1141 ABIName = "o32";
1142 else
1143 ABIName = "n64";
1144 }
1145
1146 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001147 // Deduce CPU name from ABI name.
1148 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001149 .Cases("o32", "eabi", DefMips32CPU)
1150 .Cases("n32", "n64", DefMips64CPU)
1151 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001152 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001153
1154 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001155}
1156
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001157std::string mips::getMipsABILibSuffix(const ArgList &Args,
1158 const llvm::Triple &Triple) {
1159 StringRef CPUName, ABIName;
1160 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1161 return llvm::StringSwitch<std::string>(ABIName)
1162 .Case("o32", "")
1163 .Case("n32", "32")
1164 .Case("n64", "64");
1165}
1166
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001167// Convert ABI name to the GNU tools acceptable variant.
1168static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1169 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001170 .Case("o32", "32")
1171 .Case("n64", "64")
1172 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001173}
1174
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001175// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1176// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001177static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1178 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001179 if (Arg *A =
1180 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1181 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001182 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001183 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001184 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001185 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001186 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001187 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1188 .Case("soft", mips::FloatABI::Soft)
1189 .Case("hard", mips::FloatABI::Hard)
1190 .Default(mips::FloatABI::Invalid);
1191 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001192 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001193 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001194 }
1195 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001196 }
1197
1198 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 // Assume "hard", because it's a default value used by gcc.
1201 // When we start to recognize specific target MIPS processors,
1202 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001203 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001204 }
1205
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001206 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1207 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001208}
1209
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001210static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001211 std::vector<const char *> &Features,
1212 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001213 StringRef FeatureName) {
1214 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001215 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001216 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001217 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001218 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001219 }
1220}
1221
Daniel Sanders379d44b2014-07-16 11:52:23 +00001222static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1223 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001224 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001225 StringRef CPUName;
1226 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001227 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001228 ABIName = getGnuCompatibleMipsABIName(ABIName);
1229
Daniel Sandersfeb61302014-08-08 15:47:17 +00001230 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1231 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001232
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001233 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1234 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001235 // FIXME: Note, this is a hack. We need to pass the selected float
1236 // mode to the MipsTargetInfoBase to define appropriate macros there.
1237 // Now it is the only method.
1238 Features.push_back("+soft-float");
1239 }
1240
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001241 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001242 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001243 if (Val == "2008") {
1244 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1245 Features.push_back("+nan2008");
1246 else {
1247 Features.push_back("-nan2008");
1248 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1249 }
1250 } else if (Val == "legacy") {
1251 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1252 Features.push_back("-nan2008");
1253 else {
1254 Features.push_back("+nan2008");
1255 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1256 }
1257 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001258 D.Diag(diag::err_drv_unsupported_option_argument)
1259 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001260 }
1261
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001262 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1263 options::OPT_mdouble_float, "single-float");
1264 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1265 "mips16");
1266 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1267 options::OPT_mno_micromips, "micromips");
1268 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1269 "dsp");
1270 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1271 "dspr2");
1272 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1273 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001274
1275 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1276 // pass -mfpxx
1277 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1278 options::OPT_mfp64)) {
1279 if (A->getOption().matches(options::OPT_mfp32))
1280 Features.push_back(Args.MakeArgString("-fp64"));
1281 else if (A->getOption().matches(options::OPT_mfpxx)) {
1282 Features.push_back(Args.MakeArgString("+fpxx"));
1283 Features.push_back(Args.MakeArgString("+nooddspreg"));
1284 } else
1285 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001286 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001287 Features.push_back(Args.MakeArgString("+fpxx"));
1288 Features.push_back(Args.MakeArgString("+nooddspreg"));
1289 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001290
Daniel Sanders28e5d392014-07-10 10:39:51 +00001291 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1292 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001293}
1294
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001295void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001296 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001297 const Driver &D = getToolChain().getDriver();
1298 StringRef CPUName;
1299 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001300 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001301 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001302
1303 CmdArgs.push_back("-target-abi");
1304 CmdArgs.push_back(ABIName.data());
1305
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001306 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1307 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001308 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001309 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001310 CmdArgs.push_back("-mfloat-abi");
1311 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001312 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001313 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001314 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001315 CmdArgs.push_back("-mfloat-abi");
1316 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001317 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001318
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001319 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1320 if (A->getOption().matches(options::OPT_mxgot)) {
1321 CmdArgs.push_back("-mllvm");
1322 CmdArgs.push_back("-mxgot");
1323 }
1324 }
1325
Simon Atanasyanc580b322013-05-11 06:33:44 +00001326 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1327 options::OPT_mno_ldc1_sdc1)) {
1328 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1329 CmdArgs.push_back("-mllvm");
1330 CmdArgs.push_back("-mno-ldc1-sdc1");
1331 }
1332 }
1333
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001334 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1335 options::OPT_mno_check_zero_division)) {
1336 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1337 CmdArgs.push_back("-mllvm");
1338 CmdArgs.push_back("-mno-check-zero-division");
1339 }
1340 }
1341
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001342 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001343 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001344 CmdArgs.push_back("-mllvm");
1345 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1346 A->claim();
1347 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001348}
1349
Hal Finkel8eb59282012-06-11 22:35:19 +00001350/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1351static std::string getPPCTargetCPU(const ArgList &Args) {
1352 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001353 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001354
1355 if (CPUName == "native") {
1356 std::string CPU = llvm::sys::getHostCPUName();
1357 if (!CPU.empty() && CPU != "generic")
1358 return CPU;
1359 else
1360 return "";
1361 }
1362
1363 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001364 .Case("common", "generic")
1365 .Case("440", "440")
1366 .Case("440fp", "440")
1367 .Case("450", "450")
1368 .Case("601", "601")
1369 .Case("602", "602")
1370 .Case("603", "603")
1371 .Case("603e", "603e")
1372 .Case("603ev", "603ev")
1373 .Case("604", "604")
1374 .Case("604e", "604e")
1375 .Case("620", "620")
1376 .Case("630", "pwr3")
1377 .Case("G3", "g3")
1378 .Case("7400", "7400")
1379 .Case("G4", "g4")
1380 .Case("7450", "7450")
1381 .Case("G4+", "g4+")
1382 .Case("750", "750")
1383 .Case("970", "970")
1384 .Case("G5", "g5")
1385 .Case("a2", "a2")
1386 .Case("a2q", "a2q")
1387 .Case("e500mc", "e500mc")
1388 .Case("e5500", "e5500")
1389 .Case("power3", "pwr3")
1390 .Case("power4", "pwr4")
1391 .Case("power5", "pwr5")
1392 .Case("power5x", "pwr5x")
1393 .Case("power6", "pwr6")
1394 .Case("power6x", "pwr6x")
1395 .Case("power7", "pwr7")
1396 .Case("power8", "pwr8")
1397 .Case("pwr3", "pwr3")
1398 .Case("pwr4", "pwr4")
1399 .Case("pwr5", "pwr5")
1400 .Case("pwr5x", "pwr5x")
1401 .Case("pwr6", "pwr6")
1402 .Case("pwr6x", "pwr6x")
1403 .Case("pwr7", "pwr7")
1404 .Case("pwr8", "pwr8")
1405 .Case("powerpc", "ppc")
1406 .Case("powerpc64", "ppc64")
1407 .Case("powerpc64le", "ppc64le")
1408 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001409 }
1410
1411 return "";
1412}
1413
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001414static void getPPCTargetFeatures(const ArgList &Args,
1415 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001416 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1417 StringRef Name = A->getOption().getName();
1418 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001419
1420 // Skip over "-m".
1421 assert(Name.startswith("m") && "Invalid feature name.");
1422 Name = Name.substr(1);
1423
1424 bool IsNegative = Name.startswith("no-");
1425 if (IsNegative)
1426 Name = Name.substr(3);
1427
1428 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1429 // pass the correct option to the backend while calling the frontend
1430 // option the same.
1431 // TODO: Change the LLVM backend option maybe?
1432 if (Name == "mfcrf")
1433 Name = "mfocrf";
1434
1435 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1436 }
1437
1438 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001439 AddTargetFeature(Args, Features, options::OPT_faltivec,
1440 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001441}
1442
Ulrich Weigand8afad612014-07-28 13:17:52 +00001443void Clang::AddPPCTargetArgs(const ArgList &Args,
1444 ArgStringList &CmdArgs) const {
1445 // Select the ABI to use.
1446 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001447 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001448 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001449 case llvm::Triple::ppc64: {
1450 // When targeting a processor that supports QPX, or if QPX is
1451 // specifically enabled, default to using the ABI that supports QPX (so
1452 // long as it is not specifically disabled).
1453 bool HasQPX = false;
1454 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1455 HasQPX = A->getValue() == StringRef("a2q");
1456 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1457 if (HasQPX) {
1458 ABIName = "elfv1-qpx";
1459 break;
1460 }
1461
Ulrich Weigand8afad612014-07-28 13:17:52 +00001462 ABIName = "elfv1";
1463 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001464 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001465 case llvm::Triple::ppc64le:
1466 ABIName = "elfv2";
1467 break;
1468 default:
1469 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001470 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001471
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001472 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1473 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1474 // the option if given as we don't have backend support for any targets
1475 // that don't use the altivec abi.
1476 if (StringRef(A->getValue()) != "altivec")
1477 ABIName = A->getValue();
1478
Ulrich Weigand8afad612014-07-28 13:17:52 +00001479 if (ABIName) {
1480 CmdArgs.push_back("-target-abi");
1481 CmdArgs.push_back(ABIName);
1482 }
1483}
1484
1485bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1486 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1487 return A && (A->getValue() == StringRef(Value));
1488}
1489
Tom Stellard6674c702013-04-01 20:56:53 +00001490/// Get the (LLVM) name of the R600 gpu we are targeting.
1491static std::string getR600TargetGPU(const ArgList &Args) {
1492 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001493 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001494 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001495 .Cases("rv630", "rv635", "r600")
1496 .Cases("rv610", "rv620", "rs780", "rs880")
1497 .Case("rv740", "rv770")
1498 .Case("palm", "cedar")
1499 .Cases("sumo", "sumo2", "sumo")
1500 .Case("hemlock", "cypress")
1501 .Case("aruba", "cayman")
1502 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001503 }
1504 return "";
1505}
1506
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001507void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001508 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001509 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001510 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001511
James Y Knightb2406522015-06-15 20:51:24 +00001512 bool SoftFloatABI = false;
1513 if (Arg *A =
1514 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001515 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001516 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001517 }
1518
James Y Knightb2406522015-06-15 20:51:24 +00001519 // Only the hard-float ABI on Sparc is standardized, and it is the
1520 // default. GCC also supports a nonstandard soft-float ABI mode, and
1521 // perhaps LLVM should implement that, too. However, since llvm
1522 // currently does not support Sparc soft-float, at all, display an
1523 // error if it's requested.
1524 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001525 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1526 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001527 }
1528}
1529
Richard Sandiford4652d892013-07-19 16:51:51 +00001530static const char *getSystemZTargetCPU(const ArgList &Args) {
1531 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1532 return A->getValue();
1533 return "z10";
1534}
1535
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001536static void getSystemZTargetFeatures(const ArgList &Args,
1537 std::vector<const char *> &Features) {
1538 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001539 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001540 if (A->getOption().matches(options::OPT_mhtm))
1541 Features.push_back("+transactional-execution");
1542 else
1543 Features.push_back("-transactional-execution");
1544 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001545 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001546 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001547 if (A->getOption().matches(options::OPT_mvx))
1548 Features.push_back("+vector");
1549 else
1550 Features.push_back("-vector");
1551 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001552}
1553
Chandler Carruth953fb082013-01-13 11:46:33 +00001554static const char *getX86TargetCPU(const ArgList &Args,
1555 const llvm::Triple &Triple) {
1556 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001557 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001558 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001559 return "core-avx2";
1560
Chandler Carruth953fb082013-01-13 11:46:33 +00001561 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001562 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001563
1564 // FIXME: Reject attempts to use -march=native unless the target matches
1565 // the host.
1566 //
1567 // FIXME: We should also incorporate the detected target features for use
1568 // with -native.
1569 std::string CPU = llvm::sys::getHostCPUName();
1570 if (!CPU.empty() && CPU != "generic")
1571 return Args.MakeArgString(CPU);
1572 }
1573
Reid Kleckner3123eff2015-06-30 16:32:04 +00001574 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1575 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1576 StringRef Arch = A->getValue();
1577 const char *CPU;
1578 if (Triple.getArch() == llvm::Triple::x86) {
1579 CPU = llvm::StringSwitch<const char *>(Arch)
1580 .Case("IA32", "i386")
1581 .Case("SSE", "pentium3")
1582 .Case("SSE2", "pentium4")
1583 .Case("AVX", "sandybridge")
1584 .Case("AVX2", "haswell")
1585 .Default(nullptr);
1586 } else {
1587 CPU = llvm::StringSwitch<const char *>(Arch)
1588 .Case("AVX", "sandybridge")
1589 .Case("AVX2", "haswell")
1590 .Default(nullptr);
1591 }
1592 if (CPU)
1593 return CPU;
1594 }
1595
Chandler Carruth953fb082013-01-13 11:46:33 +00001596 // Select the default CPU if none was given (or detection failed).
1597
1598 if (Triple.getArch() != llvm::Triple::x86_64 &&
1599 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001600 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001601
1602 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1603
1604 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001605 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001606 if (Triple.getArchName() == "x86_64h")
1607 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001608 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001610
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001611 // Set up default CPU name for PS4 compilers.
1612 if (Triple.isPS4CPU())
1613 return "btver2";
1614
Alexey Bataev286d1b92014-01-31 04:07:13 +00001615 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001616 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001617 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001618
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001619 // Everything else goes to x86-64 in 64-bit mode.
1620 if (Is64Bit)
1621 return "x86-64";
1622
1623 switch (Triple.getOS()) {
1624 case llvm::Triple::FreeBSD:
1625 case llvm::Triple::NetBSD:
1626 case llvm::Triple::OpenBSD:
1627 return "i486";
1628 case llvm::Triple::Haiku:
1629 return "i586";
1630 case llvm::Triple::Bitrig:
1631 return "i686";
1632 default:
1633 // Fallback to p4.
1634 return "pentium4";
1635 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001636}
1637
Dan Gohmanc2853072015-09-03 22:51:53 +00001638/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1639static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1640 // If we have -mcpu=, use that.
1641 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1642 StringRef CPU = A->getValue();
1643
1644#ifdef __wasm__
1645 // Handle "native" by examining the host. "native" isn't meaningful when
1646 // cross compiling, so only support this when the host is also WebAssembly.
1647 if (CPU == "native")
1648 return llvm::sys::getHostCPUName();
1649#endif
1650
1651 return CPU;
1652 }
1653
1654 return "generic";
1655}
1656
Renato Golin7c542b42015-07-27 23:44:45 +00001657static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1658 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001659 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001660 default:
1661 return "";
1662
Amara Emerson703da2e2013-10-31 09:32:33 +00001663 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001664 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001665 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001666
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001667 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001668 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001669 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001670 case llvm::Triple::thumbeb: {
1671 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001672 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001673 return arm::getARMTargetCPU(MCPU, MArch, T);
1674 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001675 case llvm::Triple::mips:
1676 case llvm::Triple::mipsel:
1677 case llvm::Triple::mips64:
1678 case llvm::Triple::mips64el: {
1679 StringRef CPUName;
1680 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001681 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001682 return CPUName;
1683 }
1684
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001685 case llvm::Triple::nvptx:
1686 case llvm::Triple::nvptx64:
1687 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1688 return A->getValue();
1689 return "";
1690
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001691 case llvm::Triple::ppc:
1692 case llvm::Triple::ppc64:
1693 case llvm::Triple::ppc64le: {
1694 std::string TargetCPUName = getPPCTargetCPU(Args);
1695 // LLVM may default to generating code for the native CPU,
1696 // but, like gcc, we default to a more generic option for
1697 // each architecture. (except on Darwin)
1698 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1699 if (T.getArch() == llvm::Triple::ppc64)
1700 TargetCPUName = "ppc64";
1701 else if (T.getArch() == llvm::Triple::ppc64le)
1702 TargetCPUName = "ppc64le";
1703 else
1704 TargetCPUName = "ppc";
1705 }
1706 return TargetCPUName;
1707 }
1708
1709 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001710 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001711 case llvm::Triple::sparcv9:
1712 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001713 return A->getValue();
1714 return "";
1715
1716 case llvm::Triple::x86:
1717 case llvm::Triple::x86_64:
1718 return getX86TargetCPU(Args, T);
1719
1720 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001721 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001722
1723 case llvm::Triple::systemz:
1724 return getSystemZTargetCPU(Args);
1725
1726 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001727 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001728 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001729
1730 case llvm::Triple::wasm32:
1731 case llvm::Triple::wasm64:
1732 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001733 }
1734}
1735
Alp Tokerce365ca2013-12-02 12:43:03 +00001736static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001737 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001738 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1739 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1740 // forward.
1741 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001742 std::string Plugin =
1743 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001744 CmdArgs.push_back(Args.MakeArgString(Plugin));
1745
1746 // Try to pass driver level flags relevant to LTO code generation down to
1747 // the plugin.
1748
1749 // Handle flags for selecting CPU variants.
1750 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1751 if (!CPU.empty())
1752 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001753
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001754 if (IsThinLTO)
1755 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001756}
1757
Sanjay Patel2987c292015-06-11 14:53:41 +00001758/// This is a helper function for validating the optional refinement step
1759/// parameter in reciprocal argument strings. Return false if there is an error
1760/// parsing the refinement step. Otherwise, return true and set the Position
1761/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001762static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001763 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001764 const char RefinementStepToken = ':';
1765 Position = In.find(RefinementStepToken);
1766 if (Position != StringRef::npos) {
1767 StringRef Option = A.getOption().getName();
1768 StringRef RefStep = In.substr(Position + 1);
1769 // Allow exactly one numeric character for the additional refinement
1770 // step parameter. This is reasonable for all currently-supported
1771 // operations and architectures because we would expect that a larger value
1772 // of refinement steps would cause the estimate "optimization" to
1773 // under-perform the native operation. Also, if the estimate does not
1774 // converge quickly, it probably will not ever converge, so further
1775 // refinement steps will not produce a better answer.
1776 if (RefStep.size() != 1) {
1777 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1778 return false;
1779 }
1780 char RefStepChar = RefStep[0];
1781 if (RefStepChar < '0' || RefStepChar > '9') {
1782 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1783 return false;
1784 }
1785 }
1786 return true;
1787}
1788
1789/// The -mrecip flag requires processing of many optional parameters.
1790static void ParseMRecip(const Driver &D, const ArgList &Args,
1791 ArgStringList &OutStrings) {
1792 StringRef DisabledPrefixIn = "!";
1793 StringRef DisabledPrefixOut = "!";
1794 StringRef EnabledPrefixOut = "";
1795 StringRef Out = "-mrecip=";
1796
1797 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1798 if (!A)
1799 return;
1800
1801 unsigned NumOptions = A->getNumValues();
1802 if (NumOptions == 0) {
1803 // No option is the same as "all".
1804 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1805 return;
1806 }
1807
1808 // Pass through "all", "none", or "default" with an optional refinement step.
1809 if (NumOptions == 1) {
1810 StringRef Val = A->getValue(0);
1811 size_t RefStepLoc;
1812 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1813 return;
1814 StringRef ValBase = Val.slice(0, RefStepLoc);
1815 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1816 OutStrings.push_back(Args.MakeArgString(Out + Val));
1817 return;
1818 }
1819 }
1820
1821 // Each reciprocal type may be enabled or disabled individually.
1822 // Check each input value for validity, concatenate them all back together,
1823 // and pass through.
1824
1825 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001826 OptionStrings.insert(std::make_pair("divd", false));
1827 OptionStrings.insert(std::make_pair("divf", false));
1828 OptionStrings.insert(std::make_pair("vec-divd", false));
1829 OptionStrings.insert(std::make_pair("vec-divf", false));
1830 OptionStrings.insert(std::make_pair("sqrtd", false));
1831 OptionStrings.insert(std::make_pair("sqrtf", false));
1832 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1833 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001834
1835 for (unsigned i = 0; i != NumOptions; ++i) {
1836 StringRef Val = A->getValue(i);
1837
1838 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1839 // Ignore the disablement token for string matching.
1840 if (IsDisabled)
1841 Val = Val.substr(1);
1842
1843 size_t RefStep;
1844 if (!getRefinementStep(Val, D, *A, RefStep))
1845 return;
1846
1847 StringRef ValBase = Val.slice(0, RefStep);
1848 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1849 if (OptionIter == OptionStrings.end()) {
1850 // Try again specifying float suffix.
1851 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1852 if (OptionIter == OptionStrings.end()) {
1853 // The input name did not match any known option string.
1854 D.Diag(diag::err_drv_unknown_argument) << Val;
1855 return;
1856 }
1857 // The option was specified without a float or double suffix.
1858 // Make sure that the double entry was not already specified.
1859 // The float entry will be checked below.
1860 if (OptionStrings[ValBase.str() + 'd']) {
1861 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1862 return;
1863 }
1864 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001865
Sanjay Patel2987c292015-06-11 14:53:41 +00001866 if (OptionIter->second == true) {
1867 // Duplicate option specified.
1868 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1869 return;
1870 }
1871
1872 // Mark the matched option as found. Do not allow duplicate specifiers.
1873 OptionIter->second = true;
1874
1875 // If the precision was not specified, also mark the double entry as found.
1876 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1877 OptionStrings[ValBase.str() + 'd'] = true;
1878
1879 // Build the output string.
1880 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1881 Out = Args.MakeArgString(Out + Prefix + Val);
1882 if (i != NumOptions - 1)
1883 Out = Args.MakeArgString(Out + ",");
1884 }
1885
1886 OutStrings.push_back(Args.MakeArgString(Out));
1887}
1888
Eric Christopherc54920a2015-03-23 19:26:05 +00001889static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001890 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001891 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001892 // If -march=native, autodetect the feature list.
1893 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1894 if (StringRef(A->getValue()) == "native") {
1895 llvm::StringMap<bool> HostFeatures;
1896 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1897 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 Features.push_back(
1899 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001900 }
1901 }
1902
Jim Grosbach82eee262013-11-16 00:53:35 +00001903 if (Triple.getArchName() == "x86_64h") {
1904 // x86_64h implies quite a few of the more modern subtarget features
1905 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1906 Features.push_back("-rdrnd");
1907 Features.push_back("-aes");
1908 Features.push_back("-pclmul");
1909 Features.push_back("-rtm");
1910 Features.push_back("-hle");
1911 Features.push_back("-fsgsbase");
1912 }
1913
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001914 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001915 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001916 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001917 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001918 Features.push_back("+sse4.2");
1919 Features.push_back("+popcnt");
1920 } else
1921 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001922 }
1923
Eric Christopherc54920a2015-03-23 19:26:05 +00001924 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001925 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1926 StringRef Arch = A->getValue();
1927 bool ArchUsed = false;
1928 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001929 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001930 if (Arch == "AVX" || Arch == "AVX2") {
1931 ArchUsed = true;
1932 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1933 }
1934 }
1935 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001936 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001937 if (Arch == "IA32") {
1938 ArchUsed = true;
1939 } else if (Arch == "SSE" || Arch == "SSE2") {
1940 ArchUsed = true;
1941 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1942 }
1943 }
1944 if (!ArchUsed)
1945 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1946 }
1947
Jim Grosbach82eee262013-11-16 00:53:35 +00001948 // Now add any that the user explicitly requested on the command line,
1949 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001950 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1951 StringRef Name = A->getOption().getName();
1952 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001953
1954 // Skip over "-m".
1955 assert(Name.startswith("m") && "Invalid feature name.");
1956 Name = Name.substr(1);
1957
1958 bool IsNegative = Name.startswith("no-");
1959 if (IsNegative)
1960 Name = Name.substr(3);
1961
1962 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1963 }
1964}
1965
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001966void Clang::AddX86TargetArgs(const ArgList &Args,
1967 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001968 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001969 Args.hasArg(options::OPT_mkernel) ||
1970 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001971 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001972
Bob Wilson2616e2e2013-02-10 16:01:41 +00001973 // Default to avoid implicit floating-point for kernel/kext code, but allow
1974 // that to be overridden with -mno-soft-float.
1975 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1976 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001977 if (Arg *A = Args.getLastArg(
1978 options::OPT_msoft_float, options::OPT_mno_soft_float,
1979 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001980 const Option &O = A->getOption();
1981 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1982 O.matches(options::OPT_msoft_float));
1983 }
1984 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001985 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001986
1987 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1988 StringRef Value = A->getValue();
1989 if (Value == "intel" || Value == "att") {
1990 CmdArgs.push_back("-mllvm");
1991 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1992 } else {
1993 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1994 << A->getOption().getName() << Value;
1995 }
1996 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001997}
1998
Tony Linthicum76329bf2011-12-12 21:14:55 +00001999void Clang::AddHexagonTargetArgs(const ArgList &Args,
2000 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002001 CmdArgs.push_back("-mqdsp6-compat");
2002 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002003
Douglas Katzman54366072015-07-27 16:53:08 +00002004 if (const char *v =
2005 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002006 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002007 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002008 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002009 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002010 }
2011
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002012 if (!Args.hasArg(options::OPT_fno_short_enums))
2013 CmdArgs.push_back("-fshort-enums");
2014 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002015 CmdArgs.push_back("-mllvm");
2016 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002017 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002018 CmdArgs.push_back("-mllvm");
2019 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002020}
2021
Kevin Qin110db6f2014-07-18 07:03:22 +00002022// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002023static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002024 std::vector<const char *> &Features) {
2025 SmallVector<StringRef, 8> Split;
2026 text.split(Split, StringRef("+"), -1, false);
2027
Benjamin Kramer72e64312015-09-24 14:48:49 +00002028 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002029 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002030 .Case("fp", "+fp-armv8")
2031 .Case("simd", "+neon")
2032 .Case("crc", "+crc")
2033 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002034 .Case("fp16", "+fullfp16")
Kevin Qin110db6f2014-07-18 07:03:22 +00002035 .Case("nofp", "-fp-armv8")
2036 .Case("nosimd", "-neon")
2037 .Case("nocrc", "-crc")
2038 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002039 .Case("nofp16", "-fullfp16")
Kevin Qin110db6f2014-07-18 07:03:22 +00002040 .Default(nullptr);
2041 if (result)
2042 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002043 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002044 D.Diag(diag::err_drv_no_neon_modifier);
2045 else
2046 return false;
2047 }
2048 return true;
2049}
2050
2051// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2052// decode CPU and feature.
2053static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2054 std::vector<const char *> &Features) {
2055 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2056 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002057 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
2058 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002059 Features.push_back("+neon");
2060 Features.push_back("+crc");
2061 Features.push_back("+crypto");
2062 } else if (CPU == "generic") {
2063 Features.push_back("+neon");
2064 } else {
2065 return false;
2066 }
2067
2068 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2069 return false;
2070
2071 return true;
2072}
2073
2074static bool
2075getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2076 const ArgList &Args,
2077 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002078 std::string MarchLowerCase = March.lower();
2079 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002080
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002081 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002082 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002083 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002084 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002085 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2086 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002087 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002088 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002089 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002090
2091 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2092 return false;
2093
2094 return true;
2095}
2096
2097static bool
2098getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2099 const ArgList &Args,
2100 std::vector<const char *> &Features) {
2101 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002102 std::string McpuLowerCase = Mcpu.lower();
2103 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002104 return false;
2105
2106 return true;
2107}
2108
2109static bool
2110getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2111 const ArgList &Args,
2112 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002113 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002114 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002115 if (MtuneLowerCase == "native")
2116 MtuneLowerCase = llvm::sys::getHostCPUName();
2117 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002118 Features.push_back("+zcm");
2119 Features.push_back("+zcz");
2120 }
2121 return true;
2122}
2123
2124static bool
2125getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2126 const ArgList &Args,
2127 std::vector<const char *> &Features) {
2128 StringRef CPU;
2129 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002130 std::string McpuLowerCase = Mcpu.lower();
2131 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002132 return false;
2133
2134 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2135}
2136
Justin Bognerf9052562015-11-13 23:07:31 +00002137static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002138 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002139 Arg *A;
2140 bool success = true;
2141 // Enable NEON by default.
2142 Features.push_back("+neon");
2143 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2144 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2145 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2146 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002147 else if (Args.hasArg(options::OPT_arch))
2148 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2149 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002150
2151 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2152 success =
2153 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2154 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2155 success =
2156 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002157 else if (Args.hasArg(options::OPT_arch))
2158 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2159 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002160
2161 if (!success)
2162 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002163
2164 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2165 Features.push_back("-fp-armv8");
2166 Features.push_back("-crypto");
2167 Features.push_back("-neon");
2168 }
Bradley Smith418c5932014-05-02 15:17:51 +00002169
2170 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002171 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002172 if (A->getOption().matches(options::OPT_mcrc))
2173 Features.push_back("+crc");
2174 else
2175 Features.push_back("-crc");
2176 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002177
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002178 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2179 options::OPT_munaligned_access))
2180 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2181 Features.push_back("+strict-align");
2182
Justin Bognerf9052562015-11-13 23:07:31 +00002183 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002184 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002185}
2186
Dan Gohmanc2853072015-09-03 22:51:53 +00002187static void getWebAssemblyTargetFeatures(const ArgList &Args,
2188 std::vector<const char *> &Features) {
2189 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2190 StringRef Name = A->getOption().getName();
2191 A->claim();
2192
2193 // Skip over "-m".
2194 assert(Name.startswith("m") && "Invalid feature name.");
2195 Name = Name.substr(1);
2196
2197 bool IsNegative = Name.startswith("no-");
2198 if (IsNegative)
2199 Name = Name.substr(3);
2200
2201 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2202 }
2203}
2204
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002205static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002206 const ArgList &Args, ArgStringList &CmdArgs,
2207 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002208 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002209 std::vector<const char *> Features;
2210 switch (Triple.getArch()) {
2211 default:
2212 break;
2213 case llvm::Triple::mips:
2214 case llvm::Triple::mipsel:
2215 case llvm::Triple::mips64:
2216 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002217 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002218 break;
2219
2220 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002221 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002222 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002223 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002224 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002225 break;
2226
2227 case llvm::Triple::ppc:
2228 case llvm::Triple::ppc64:
2229 case llvm::Triple::ppc64le:
2230 getPPCTargetFeatures(Args, Features);
2231 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002232 case llvm::Triple::systemz:
2233 getSystemZTargetFeatures(Args, Features);
2234 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002235 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002236 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002237 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002238 break;
2239 case llvm::Triple::x86:
2240 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002241 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002242 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002243 case llvm::Triple::wasm32:
2244 case llvm::Triple::wasm64:
2245 getWebAssemblyTargetFeatures(Args, Features);
2246 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002247 }
Rafael Espindola43964802013-08-21 17:34:32 +00002248
2249 // Find the last of each feature.
2250 llvm::StringMap<unsigned> LastOpt;
2251 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2252 const char *Name = Features[I];
2253 assert(Name[0] == '-' || Name[0] == '+');
2254 LastOpt[Name + 1] = I;
2255 }
2256
2257 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2258 // If this feature was overridden, ignore it.
2259 const char *Name = Features[I];
2260 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2261 assert(LastI != LastOpt.end());
2262 unsigned Last = LastI->second;
2263 if (Last != I)
2264 continue;
2265
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002266 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002267 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002268 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002269}
2270
David Majnemerae394812014-12-09 00:12:30 +00002271static bool
2272shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2273 const llvm::Triple &Triple) {
2274 // We use the zero-cost exception tables for Objective-C if the non-fragile
2275 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2276 // later.
2277 if (runtime.isNonFragile())
2278 return true;
2279
2280 if (!Triple.isMacOSX())
2281 return false;
2282
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002283 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002284 (Triple.getArch() == llvm::Triple::x86_64 ||
2285 Triple.getArch() == llvm::Triple::arm));
2286}
2287
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002288/// Adds exception related arguments to the driver command arguments. There's a
2289/// master flag, -fexceptions and also language specific flags to enable/disable
2290/// C++ and Objective-C exceptions. This makes it possible to for example
2291/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002292static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002293 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002294 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002295 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002296 const Driver &D = TC.getDriver();
2297 const llvm::Triple &Triple = TC.getTriple();
2298
Chad Rosier4fab82c2012-03-26 22:04:46 +00002299 if (KernelOrKext) {
2300 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2301 // arguments now to avoid warnings about unused arguments.
2302 Args.ClaimAllArgs(options::OPT_fexceptions);
2303 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2304 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2305 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2306 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2307 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002308 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002309 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002310
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002311 // See if the user explicitly enabled exceptions.
2312 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2313 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002314
David Majnemerae394812014-12-09 00:12:30 +00002315 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2316 // is not necessarily sensible, but follows GCC.
2317 if (types::isObjC(InputType) &&
2318 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002319 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002320 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002321
David Majnemerae394812014-12-09 00:12:30 +00002322 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002323 }
2324
2325 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002326 // Disable C++ EH by default on XCore, PS4, and MSVC.
2327 // FIXME: Remove MSVC from this list once things work.
2328 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2329 !Triple.isPS4CPU() &&
2330 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002331 Arg *ExceptionArg = Args.getLastArg(
2332 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2333 options::OPT_fexceptions, options::OPT_fno_exceptions);
2334 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002335 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002336 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2337 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002338
2339 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002340 if (Triple.isPS4CPU()) {
2341 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2342 assert(ExceptionArg &&
2343 "On the PS4 exceptions should only be enabled if passing "
2344 "an argument");
2345 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2346 const Arg *RTTIArg = TC.getRTTIArg();
2347 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2348 D.Diag(diag::err_drv_argument_not_allowed_with)
2349 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2350 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2351 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2352 } else
2353 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2354
Anders Carlssone96ab552011-02-28 02:27:16 +00002355 CmdArgs.push_back("-fcxx-exceptions");
2356
David Majnemer8de68642014-12-05 08:11:58 +00002357 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002358 }
2359 }
2360
David Majnemer8de68642014-12-05 08:11:58 +00002361 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002362 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002363}
2364
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002365static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002366 bool Default = true;
2367 if (TC.getTriple().isOSDarwin()) {
2368 // The native darwin assembler doesn't support the linker_option directives,
2369 // so we disable them if we think the .s file will be passed to it.
2370 Default = TC.useIntegratedAs();
2371 }
2372 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2373 Default);
2374}
2375
Ted Kremenek62093662013-03-12 17:02:12 +00002376static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2377 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002378 bool UseDwarfDirectory =
2379 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2380 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002381 return !UseDwarfDirectory;
2382}
2383
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002384/// \brief Check whether the given input tree contains any compilation actions.
2385static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002386 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002387 return true;
2388
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002389 for (const auto &Act : *A)
2390 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002391 return true;
2392
2393 return false;
2394}
2395
2396/// \brief Check if -relax-all should be passed to the internal assembler.
2397/// This is done by default when compiling non-assembler source with -O0.
2398static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2399 bool RelaxDefault = true;
2400
2401 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2402 RelaxDefault = A->getOption().matches(options::OPT_O0);
2403
2404 if (RelaxDefault) {
2405 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002406 for (const auto &Act : C.getActions()) {
2407 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002408 RelaxDefault = true;
2409 break;
2410 }
2411 }
2412 }
2413
2414 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002415 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002416}
2417
Douglas Katzman3459ce22015-10-08 04:24:12 +00002418// Extract the integer N from a string spelled "-dwarf-N", returning 0
2419// on mismatch. The StringRef input (rather than an Arg) allows
2420// for use by the "-Xassembler" option parser.
2421static unsigned DwarfVersionNum(StringRef ArgValue) {
2422 return llvm::StringSwitch<unsigned>(ArgValue)
2423 .Case("-gdwarf-2", 2)
2424 .Case("-gdwarf-3", 3)
2425 .Case("-gdwarf-4", 4)
2426 .Default(0);
2427}
2428
2429static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2430 CodeGenOptions::DebugInfoKind DebugInfoKind,
2431 unsigned DwarfVersion) {
2432 switch (DebugInfoKind) {
2433 case CodeGenOptions::DebugLineTablesOnly:
2434 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2435 break;
2436 case CodeGenOptions::LimitedDebugInfo:
2437 CmdArgs.push_back("-debug-info-kind=limited");
2438 break;
2439 case CodeGenOptions::FullDebugInfo:
2440 CmdArgs.push_back("-debug-info-kind=standalone");
2441 break;
2442 default:
2443 break;
2444 }
2445 if (DwarfVersion > 0)
2446 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002447 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002448}
2449
David Blaikie9260ed62013-07-25 21:19:01 +00002450static void CollectArgsForIntegratedAssembler(Compilation &C,
2451 const ArgList &Args,
2452 ArgStringList &CmdArgs,
2453 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002454 if (UseRelaxAll(C, Args))
2455 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002456
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002457 // When passing -I arguments to the assembler we sometimes need to
2458 // unconditionally take the next argument. For example, when parsing
2459 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2460 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2461 // arg after parsing the '-I' arg.
2462 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002463
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002464 // When using an integrated assembler, translate -Wa, and -Xassembler
2465 // options.
2466 bool CompressDebugSections = false;
2467 for (const Arg *A :
2468 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2469 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002470
Benjamin Kramer72e64312015-09-24 14:48:49 +00002471 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002472 if (TakeNextArg) {
2473 CmdArgs.push_back(Value.data());
2474 TakeNextArg = false;
2475 continue;
2476 }
David Blaikie9260ed62013-07-25 21:19:01 +00002477
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002478 switch (C.getDefaultToolChain().getArch()) {
2479 default:
2480 break;
2481 case llvm::Triple::mips:
2482 case llvm::Triple::mipsel:
2483 case llvm::Triple::mips64:
2484 case llvm::Triple::mips64el:
2485 if (Value == "--trap") {
2486 CmdArgs.push_back("-target-feature");
2487 CmdArgs.push_back("+use-tcc-in-div");
2488 continue;
2489 }
2490 if (Value == "--break") {
2491 CmdArgs.push_back("-target-feature");
2492 CmdArgs.push_back("-use-tcc-in-div");
2493 continue;
2494 }
2495 if (Value.startswith("-msoft-float")) {
2496 CmdArgs.push_back("-target-feature");
2497 CmdArgs.push_back("+soft-float");
2498 continue;
2499 }
2500 if (Value.startswith("-mhard-float")) {
2501 CmdArgs.push_back("-target-feature");
2502 CmdArgs.push_back("-soft-float");
2503 continue;
2504 }
2505 break;
2506 }
2507
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002508 if (Value == "-force_cpusubtype_ALL") {
2509 // Do nothing, this is the default and we don't support anything else.
2510 } else if (Value == "-L") {
2511 CmdArgs.push_back("-msave-temp-labels");
2512 } else if (Value == "--fatal-warnings") {
2513 CmdArgs.push_back("-massembler-fatal-warnings");
2514 } else if (Value == "--noexecstack") {
2515 CmdArgs.push_back("-mnoexecstack");
2516 } else if (Value == "-compress-debug-sections" ||
2517 Value == "--compress-debug-sections") {
2518 CompressDebugSections = true;
2519 } else if (Value == "-nocompress-debug-sections" ||
2520 Value == "--nocompress-debug-sections") {
2521 CompressDebugSections = false;
2522 } else if (Value.startswith("-I")) {
2523 CmdArgs.push_back(Value.data());
2524 // We need to consume the next argument if the current arg is a plain
2525 // -I. The next arg will be the include directory.
2526 if (Value == "-I")
2527 TakeNextArg = true;
2528 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002529 // "-gdwarf-N" options are not cc1as options.
2530 unsigned DwarfVersion = DwarfVersionNum(Value);
2531 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2532 CmdArgs.push_back(Value.data());
2533 } else {
2534 RenderDebugEnablingArgs(
2535 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2536 }
Renato Golin7c542b42015-07-27 23:44:45 +00002537 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2538 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2539 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002540 } else {
2541 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002542 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002543 }
2544 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002545 }
2546 if (CompressDebugSections) {
2547 if (llvm::zlib::isAvailable())
2548 CmdArgs.push_back("-compress-debug-sections");
2549 else
2550 D.Diag(diag::warn_debug_compression_unavailable);
2551 }
David Blaikie9260ed62013-07-25 21:19:01 +00002552}
2553
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002554// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002555// FIXME: Make sure we can also emit shared objects if they're requested
2556// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002557static void addClangRT(const ToolChain &TC, const ArgList &Args,
2558 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002559 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002560}
2561
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002562namespace {
2563enum OpenMPRuntimeKind {
2564 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2565 /// without knowing what runtime to target.
2566 OMPRT_Unknown,
2567
2568 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2569 /// the default for Clang.
2570 OMPRT_OMP,
2571
2572 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2573 /// this runtime but can swallow the pragmas, and find and link against the
2574 /// runtime library itself.
2575 OMPRT_GOMP,
2576
Chandler Carruthc6625c62015-05-28 21:10:31 +00002577 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002578 /// OpenMP runtime. We support this mode for users with existing dependencies
2579 /// on this runtime library name.
2580 OMPRT_IOMP5
2581};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002582}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002583
2584/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002585static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2586 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002587 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2588
2589 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2590 if (A)
2591 RuntimeName = A->getValue();
2592
2593 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002594 .Case("libomp", OMPRT_OMP)
2595 .Case("libgomp", OMPRT_GOMP)
2596 .Case("libiomp5", OMPRT_IOMP5)
2597 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002598
2599 if (RT == OMPRT_Unknown) {
2600 if (A)
2601 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002602 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002603 else
2604 // FIXME: We could use a nicer diagnostic here.
2605 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2606 }
2607
2608 return RT;
2609}
2610
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002611static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2612 const ArgList &Args) {
2613 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2614 options::OPT_fno_openmp, false))
2615 return;
2616
2617 switch (getOpenMPRuntime(TC, Args)) {
2618 case OMPRT_OMP:
2619 CmdArgs.push_back("-lomp");
2620 break;
2621 case OMPRT_GOMP:
2622 CmdArgs.push_back("-lgomp");
2623 break;
2624 case OMPRT_IOMP5:
2625 CmdArgs.push_back("-liomp5");
2626 break;
2627 case OMPRT_Unknown:
2628 // Already diagnosed.
2629 break;
2630 }
2631}
2632
Alexey Samsonov52550342014-09-15 19:58:40 +00002633static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2634 ArgStringList &CmdArgs, StringRef Sanitizer,
2635 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002636 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002637 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002638 if (!IsShared) CmdArgs.push_back("-whole-archive");
2639 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2640 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002641}
2642
Alexey Samsonov52550342014-09-15 19:58:40 +00002643// Tries to use a file with the list of dynamic symbols that need to be exported
2644// from the runtime library. Returns true if the file was found.
2645static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2646 ArgStringList &CmdArgs,
2647 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002648 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002649 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2650 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002651 return true;
2652 }
2653 return false;
2654}
2655
2656static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2657 ArgStringList &CmdArgs) {
2658 // Force linking against the system libraries sanitizers depends on
2659 // (see PR15823 why this is necessary).
2660 CmdArgs.push_back("--no-as-needed");
2661 CmdArgs.push_back("-lpthread");
2662 CmdArgs.push_back("-lrt");
2663 CmdArgs.push_back("-lm");
2664 // There's no libdl on FreeBSD.
2665 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2666 CmdArgs.push_back("-ldl");
2667}
2668
2669static void
2670collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2671 SmallVectorImpl<StringRef> &SharedRuntimes,
2672 SmallVectorImpl<StringRef> &StaticRuntimes,
2673 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2674 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2675 // Collect shared runtimes.
2676 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2677 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002678 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002679
Alexey Samsonov52550342014-09-15 19:58:40 +00002680 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002681 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002682 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002683 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002684 }
2685 if (SanArgs.needsAsanRt()) {
2686 if (SanArgs.needsSharedAsanRt()) {
2687 HelperStaticRuntimes.push_back("asan-preinit");
2688 } else {
2689 StaticRuntimes.push_back("asan");
2690 if (SanArgs.linkCXXRuntimes())
2691 StaticRuntimes.push_back("asan_cxx");
2692 }
2693 }
2694 if (SanArgs.needsDfsanRt())
2695 StaticRuntimes.push_back("dfsan");
2696 if (SanArgs.needsLsanRt())
2697 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002698 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002699 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002700 if (SanArgs.linkCXXRuntimes())
2701 StaticRuntimes.push_back("msan_cxx");
2702 }
2703 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002704 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002705 if (SanArgs.linkCXXRuntimes())
2706 StaticRuntimes.push_back("tsan_cxx");
2707 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002708 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002709 StaticRuntimes.push_back("ubsan_standalone");
2710 if (SanArgs.linkCXXRuntimes())
2711 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002712 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002713 if (SanArgs.needsSafeStackRt())
2714 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002715}
2716
Alexey Samsonov52550342014-09-15 19:58:40 +00002717// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2718// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2719static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002720 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002721 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2722 HelperStaticRuntimes;
2723 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2724 HelperStaticRuntimes);
2725 for (auto RT : SharedRuntimes)
2726 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2727 for (auto RT : HelperStaticRuntimes)
2728 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2729 bool AddExportDynamic = false;
2730 for (auto RT : StaticRuntimes) {
2731 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2732 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2733 }
2734 // If there is a static runtime with no dynamic list, force all the symbols
2735 // to be dynamic to be sure we export sanitizer interface functions.
2736 if (AddExportDynamic)
2737 CmdArgs.push_back("-export-dynamic");
2738 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002739}
2740
Reid Kleckner86ea7702015-02-04 23:45:07 +00002741static bool areOptimizationsEnabled(const ArgList &Args) {
2742 // Find the last -O arg and see if it is non-zero.
2743 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2744 return !A->getOption().matches(options::OPT_O0);
2745 // Defaults to -O0.
2746 return false;
2747}
2748
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002749static bool shouldUseFramePointerForTarget(const ArgList &Args,
2750 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002751 switch (Triple.getArch()) {
2752 case llvm::Triple::xcore:
2753 case llvm::Triple::wasm32:
2754 case llvm::Triple::wasm64:
2755 // XCore never wants frame pointers, regardless of OS.
2756 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002757 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002758 default:
2759 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002760 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002761
2762 if (Triple.isOSLinux()) {
2763 switch (Triple.getArch()) {
2764 // Don't use a frame pointer on linux if optimizing for certain targets.
2765 case llvm::Triple::mips64:
2766 case llvm::Triple::mips64el:
2767 case llvm::Triple::mips:
2768 case llvm::Triple::mipsel:
2769 case llvm::Triple::systemz:
2770 case llvm::Triple::x86:
2771 case llvm::Triple::x86_64:
2772 return !areOptimizationsEnabled(Args);
2773 default:
2774 return true;
2775 }
2776 }
2777
2778 if (Triple.isOSWindows()) {
2779 switch (Triple.getArch()) {
2780 case llvm::Triple::x86:
2781 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002782 case llvm::Triple::arm:
2783 case llvm::Triple::thumb:
2784 // Windows on ARM builds with FPO disabled to aid fast stack walking
2785 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002786 default:
2787 // All other supported Windows ISAs use xdata unwind information, so frame
2788 // pointers are not generally useful.
2789 return false;
2790 }
2791 }
2792
2793 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002794}
2795
Rafael Espindola224dd632011-12-14 21:02:23 +00002796static bool shouldUseFramePointer(const ArgList &Args,
2797 const llvm::Triple &Triple) {
2798 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2799 options::OPT_fomit_frame_pointer))
2800 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002801 if (Args.hasArg(options::OPT_pg))
2802 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002803
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002804 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002805}
2806
Eric Christopherb7d97e92013-04-03 01:58:53 +00002807static bool shouldUseLeafFramePointer(const ArgList &Args,
2808 const llvm::Triple &Triple) {
2809 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2810 options::OPT_momit_leaf_frame_pointer))
2811 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002812 if (Args.hasArg(options::OPT_pg))
2813 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002814
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002815 if (Triple.isPS4CPU())
2816 return false;
2817
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002818 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002819}
2820
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002821/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002822static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002823 SmallString<128> cwd;
2824 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002825 CmdArgs.push_back("-fdebug-compilation-dir");
2826 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002827 }
2828}
2829
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002830static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002831 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2832 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2833 SmallString<128> T(FinalOutput->getValue());
2834 llvm::sys::path::replace_extension(T, "dwo");
2835 return Args.MakeArgString(T);
2836 } else {
2837 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002838 SmallString<128> T(
2839 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002840 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002841 llvm::sys::path::replace_extension(F, "dwo");
2842 T += F;
2843 return Args.MakeArgString(F);
2844 }
2845}
2846
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002847static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2848 const JobAction &JA, const ArgList &Args,
2849 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002850 ArgStringList ExtractArgs;
2851 ExtractArgs.push_back("--extract-dwo");
2852
2853 ArgStringList StripArgs;
2854 StripArgs.push_back("--strip-dwo");
2855
2856 // Grabbing the output of the earlier compile step.
2857 StripArgs.push_back(Output.getFilename());
2858 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002859 ExtractArgs.push_back(OutFile);
2860
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002861 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002862 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002863
2864 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002865 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002866
2867 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002868 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002869}
2870
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002871/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002872/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2873static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002874 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002875 if (A->getOption().matches(options::OPT_O4) ||
2876 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002877 return true;
2878
2879 if (A->getOption().matches(options::OPT_O0))
2880 return false;
2881
2882 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2883
Rafael Espindola91780de2013-08-26 14:05:41 +00002884 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002885 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002886 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002887 return true;
2888
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002889 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002890 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002891 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002892
2893 unsigned OptLevel = 0;
2894 if (S.getAsInteger(10, OptLevel))
2895 return false;
2896
2897 return OptLevel > 1;
2898 }
2899
2900 return false;
2901}
2902
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002903/// Add -x lang to \p CmdArgs for \p Input.
2904static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2905 ArgStringList &CmdArgs) {
2906 // When using -verify-pch, we don't want to provide the type
2907 // 'precompiled-header' if it was inferred from the file extension
2908 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2909 return;
2910
2911 CmdArgs.push_back("-x");
2912 if (Args.hasArg(options::OPT_rewrite_objc))
2913 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2914 else
2915 CmdArgs.push_back(types::getTypeName(Input.getType()));
2916}
2917
David Majnemerc371ff02015-03-22 08:39:22 +00002918static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002919 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002920 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002921
2922 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002923 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002924
2925 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002926 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002927 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002928 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002929}
2930
Rafael Espindola577637a2015-01-03 00:06:04 +00002931// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002932// options that build systems might add but are unused when assembling or only
2933// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002934static void claimNoWarnArgs(const ArgList &Args) {
2935 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002936 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00002937 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00002938 Args.ClaimAllArgs(options::OPT_flto);
2939 Args.ClaimAllArgs(options::OPT_fno_lto);
2940}
2941
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002942static void appendUserToPath(SmallVectorImpl<char> &Result) {
2943#ifdef LLVM_ON_UNIX
2944 const char *Username = getenv("LOGNAME");
2945#else
2946 const char *Username = getenv("USERNAME");
2947#endif
2948 if (Username) {
2949 // Validate that LoginName can be used in a path, and get its length.
2950 size_t Len = 0;
2951 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002952 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002953 Username = nullptr;
2954 break;
2955 }
2956 }
2957
2958 if (Username && Len > 0) {
2959 Result.append(Username, Username + Len);
2960 return;
2961 }
2962 }
2963
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002964// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002965#ifdef LLVM_ON_UNIX
2966 std::string UID = llvm::utostr(getuid());
2967#else
2968 // FIXME: Windows seems to have an 'SID' that might work.
2969 std::string UID = "9999";
2970#endif
2971 Result.append(UID.begin(), UID.end());
2972}
2973
David Majnemere11d3732015-06-08 00:22:46 +00002974VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2975 const llvm::Triple &Triple,
2976 const llvm::opt::ArgList &Args,
2977 bool IsWindowsMSVC) {
2978 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2979 IsWindowsMSVC) ||
2980 Args.hasArg(options::OPT_fmsc_version) ||
2981 Args.hasArg(options::OPT_fms_compatibility_version)) {
2982 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2983 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002984 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002985
2986 if (MSCVersion && MSCompatibilityVersion) {
2987 if (D)
2988 D->Diag(diag::err_drv_argument_not_allowed_with)
2989 << MSCVersion->getAsString(Args)
2990 << MSCompatibilityVersion->getAsString(Args);
2991 return VersionTuple();
2992 }
2993
2994 if (MSCompatibilityVersion) {
2995 VersionTuple MSVT;
2996 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2997 D->Diag(diag::err_drv_invalid_value)
2998 << MSCompatibilityVersion->getAsString(Args)
2999 << MSCompatibilityVersion->getValue();
3000 return MSVT;
3001 }
3002
3003 if (MSCVersion) {
3004 unsigned Version = 0;
3005 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3006 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3007 << MSCVersion->getValue();
3008 return getMSCompatibilityVersion(Version);
3009 }
3010
3011 unsigned Major, Minor, Micro;
3012 Triple.getEnvironmentVersion(Major, Minor, Micro);
3013 if (Major || Minor || Micro)
3014 return VersionTuple(Major, Minor, Micro);
3015
3016 return VersionTuple(18);
3017 }
3018 return VersionTuple();
3019}
3020
Diego Novilloa0545962015-07-10 18:00:07 +00003021static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3022 const InputInfo &Output, const ArgList &Args,
3023 ArgStringList &CmdArgs) {
3024 auto *ProfileGenerateArg = Args.getLastArg(
3025 options::OPT_fprofile_instr_generate,
3026 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003027 options::OPT_fprofile_generate_EQ,
3028 options::OPT_fno_profile_instr_generate);
3029 if (ProfileGenerateArg &&
3030 ProfileGenerateArg->getOption().matches(
3031 options::OPT_fno_profile_instr_generate))
3032 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003033
3034 auto *ProfileUseArg = Args.getLastArg(
3035 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003036 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3037 options::OPT_fno_profile_instr_use);
3038 if (ProfileUseArg &&
3039 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3040 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003041
3042 if (ProfileGenerateArg && ProfileUseArg)
3043 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003044 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003045
Diego Novillo758f3f52015-08-05 21:49:51 +00003046 if (ProfileGenerateArg) {
3047 if (ProfileGenerateArg->getOption().matches(
3048 options::OPT_fprofile_instr_generate_EQ))
3049 ProfileGenerateArg->render(Args, CmdArgs);
3050 else if (ProfileGenerateArg->getOption().matches(
3051 options::OPT_fprofile_generate_EQ)) {
3052 SmallString<128> Path(ProfileGenerateArg->getValue());
3053 llvm::sys::path::append(Path, "default.profraw");
3054 CmdArgs.push_back(
3055 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3056 } else
3057 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3058 }
Diego Novilloa0545962015-07-10 18:00:07 +00003059
Diego Novillo758f3f52015-08-05 21:49:51 +00003060 if (ProfileUseArg) {
3061 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3062 ProfileUseArg->render(Args, CmdArgs);
3063 else if ((ProfileUseArg->getOption().matches(
3064 options::OPT_fprofile_use_EQ) ||
3065 ProfileUseArg->getOption().matches(
3066 options::OPT_fprofile_instr_use))) {
3067 SmallString<128> Path(
3068 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3069 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3070 llvm::sys::path::append(Path, "default.profdata");
3071 CmdArgs.push_back(
3072 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3073 }
Diego Novilloa0545962015-07-10 18:00:07 +00003074 }
3075
3076 if (Args.hasArg(options::OPT_ftest_coverage) ||
3077 Args.hasArg(options::OPT_coverage))
3078 CmdArgs.push_back("-femit-coverage-notes");
3079 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3080 false) ||
3081 Args.hasArg(options::OPT_coverage))
3082 CmdArgs.push_back("-femit-coverage-data");
3083
Diego Novilloc4b94da2015-08-05 23:27:40 +00003084 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3085 options::OPT_fno_coverage_mapping, false) &&
3086 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003087 D.Diag(diag::err_drv_argument_only_allowed_with)
3088 << "-fcoverage-mapping"
3089 << "-fprofile-instr-generate";
3090
Diego Novilloc4b94da2015-08-05 23:27:40 +00003091 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3092 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003093 CmdArgs.push_back("-fcoverage-mapping");
3094
3095 if (C.getArgs().hasArg(options::OPT_c) ||
3096 C.getArgs().hasArg(options::OPT_S)) {
3097 if (Output.isFilename()) {
3098 CmdArgs.push_back("-coverage-file");
3099 SmallString<128> CoverageFilename;
3100 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3101 CoverageFilename = FinalOutput->getValue();
3102 } else {
3103 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3104 }
3105 if (llvm::sys::path::is_relative(CoverageFilename)) {
3106 SmallString<128> Pwd;
3107 if (!llvm::sys::fs::current_path(Pwd)) {
3108 llvm::sys::path::append(Pwd, CoverageFilename);
3109 CoverageFilename.swap(Pwd);
3110 }
3111 }
3112 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3113 }
3114 }
3115}
3116
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003117/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3118/// smooshes them together with platform defaults, to decide whether
3119/// this compile should be using PIC mode or not. Returns a tuple of
3120/// (RelocationModel, PICLevel, IsPIE).
3121static std::tuple<llvm::Reloc::Model, unsigned, bool>
3122ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3123 const ArgList &Args) {
3124 // FIXME: why does this code...and so much everywhere else, use both
3125 // ToolChain.getTriple() and Triple?
3126 bool PIE = ToolChain.isPIEDefault();
3127 bool PIC = PIE || ToolChain.isPICDefault();
3128 bool IsPICLevelTwo = PIC;
3129
3130 bool KernelOrKext =
3131 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3132
3133 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003134 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003135 switch (ToolChain.getArch()) {
3136 case llvm::Triple::arm:
3137 case llvm::Triple::armeb:
3138 case llvm::Triple::thumb:
3139 case llvm::Triple::thumbeb:
3140 case llvm::Triple::aarch64:
3141 case llvm::Triple::mips:
3142 case llvm::Triple::mipsel:
3143 case llvm::Triple::mips64:
3144 case llvm::Triple::mips64el:
3145 PIC = true; // "-fpic"
3146 break;
3147
3148 case llvm::Triple::x86:
3149 case llvm::Triple::x86_64:
3150 PIC = true; // "-fPIC"
3151 IsPICLevelTwo = true;
3152 break;
3153
3154 default:
3155 break;
3156 }
3157 }
3158
3159 // OpenBSD-specific defaults for PIE
3160 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3161 switch (ToolChain.getArch()) {
3162 case llvm::Triple::mips64:
3163 case llvm::Triple::mips64el:
3164 case llvm::Triple::sparcel:
3165 case llvm::Triple::x86:
3166 case llvm::Triple::x86_64:
3167 IsPICLevelTwo = false; // "-fpie"
3168 break;
3169
3170 case llvm::Triple::ppc:
3171 case llvm::Triple::sparc:
3172 case llvm::Triple::sparcv9:
3173 IsPICLevelTwo = true; // "-fPIE"
3174 break;
3175
3176 default:
3177 break;
3178 }
3179 }
3180
3181 // The last argument relating to either PIC or PIE wins, and no
3182 // other argument is used. If the last argument is any flavor of the
3183 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3184 // option implicitly enables PIC at the same level.
3185 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3186 options::OPT_fpic, options::OPT_fno_pic,
3187 options::OPT_fPIE, options::OPT_fno_PIE,
3188 options::OPT_fpie, options::OPT_fno_pie);
3189 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3190 // is forced, then neither PIC nor PIE flags will have no effect.
3191 if (!ToolChain.isPICDefaultForced()) {
3192 if (LastPICArg) {
3193 Option O = LastPICArg->getOption();
3194 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3195 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3196 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3197 PIC =
3198 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3199 IsPICLevelTwo =
3200 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3201 } else {
3202 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003203 if (Triple.isPS4CPU()) {
3204 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3205 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3206 if (Model != "kernel") {
3207 PIC = true;
3208 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3209 << LastPICArg->getSpelling();
3210 }
3211 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003212 }
3213 }
3214 }
3215
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003216 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3217 // PIC level would've been set to level 1, force it back to level 2 PIC
3218 // instead.
3219 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003220 IsPICLevelTwo |= ToolChain.isPICDefault();
3221
James Y Knightc4015d32015-08-21 04:14:55 +00003222 // This kernel flags are a trump-card: they will disable PIC/PIE
3223 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003224 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3225 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003226 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003227
3228 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3229 // This is a very special mode. It trumps the other modes, almost no one
3230 // uses it, and it isn't even valid on any OS but Darwin.
3231 if (!ToolChain.getTriple().isOSDarwin())
3232 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3233 << A->getSpelling() << ToolChain.getTriple().str();
3234
3235 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3236
3237 // Only a forced PIC mode can cause the actual compile to have PIC defines
3238 // etc., no flags are sufficient. This behavior was selected to closely
3239 // match that of llvm-gcc and Apple GCC before that.
3240 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3241
3242 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3243 }
3244
3245 if (PIC)
3246 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3247
3248 return std::make_tuple(llvm::Reloc::Static, 0, false);
3249}
3250
3251static const char *RelocationModelName(llvm::Reloc::Model Model) {
3252 switch (Model) {
3253 case llvm::Reloc::Default:
3254 return nullptr;
3255 case llvm::Reloc::Static:
3256 return "static";
3257 case llvm::Reloc::PIC_:
3258 return "pic";
3259 case llvm::Reloc::DynamicNoPIC:
3260 return "dynamic-no-pic";
3261 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003262 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003263}
3264
3265static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3266 ArgStringList &CmdArgs) {
3267 llvm::Reloc::Model RelocationModel;
3268 unsigned PICLevel;
3269 bool IsPIE;
3270 std::tie(RelocationModel, PICLevel, IsPIE) =
3271 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3272
3273 if (RelocationModel != llvm::Reloc::Static)
3274 CmdArgs.push_back("-KPIC");
3275}
3276
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003277void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003278 const InputInfo &Output, const InputInfoList &Inputs,
3279 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003280 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3281 const llvm::Triple Triple(TripleStr);
3282
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003283 bool KernelOrKext =
3284 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003285 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003286 ArgStringList CmdArgs;
3287
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003288 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003289 bool IsWindowsCygnus =
3290 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003291 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003292 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003293
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003294 // Check number of inputs for sanity. We need at least one input.
3295 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003296 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003297 // CUDA compilation may have multiple inputs (source file + results of
3298 // device-side compilations). All other jobs are expected to have exactly one
3299 // input.
3300 bool IsCuda = types::isCuda(Input.getType());
3301 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003302
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003303 // Invoke ourselves in -cc1 mode.
3304 //
3305 // FIXME: Implement custom jobs for internal actions.
3306 CmdArgs.push_back("-cc1");
3307
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003308 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003309 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003310 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003311
Artem Belevichfa11ab52015-11-17 22:28:46 +00003312 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003313 if (IsCuda) {
3314 // FIXME: We need a (better) way to pass information about
3315 // particular compilation pass we're constructing here. For now we
3316 // can check which toolchain we're using and pick the other one to
3317 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003318 if (&getToolChain() == C.getCudaDeviceToolChain())
3319 AuxToolChain = C.getCudaHostToolChain();
3320 else if (&getToolChain() == C.getCudaHostToolChain())
3321 AuxToolChain = C.getCudaDeviceToolChain();
3322 else
3323 llvm_unreachable("Can't figure out CUDA compilation mode.");
3324 assert(AuxToolChain != nullptr && "No aux toolchain.");
3325 CmdArgs.push_back("-aux-triple");
3326 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003327 CmdArgs.push_back("-fcuda-target-overloads");
3328 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003329 }
3330
James Y Knight2db38f32015-08-15 03:45:25 +00003331 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3332 Triple.getArch() == llvm::Triple::thumb)) {
3333 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003334 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003335 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003336 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003337 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003338 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003339 }
3340
Tim Northover336f1892014-03-29 13:16:12 +00003341 // Push all default warning arguments that are specific to
3342 // the given target. These come before user provided warning options
3343 // are provided.
3344 getToolChain().addClangWarningOptions(CmdArgs);
3345
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003346 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003347 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003348
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003349 if (isa<AnalyzeJobAction>(JA)) {
3350 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3351 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003352 } else if (isa<MigrateJobAction>(JA)) {
3353 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003354 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003355 if (Output.getType() == types::TY_Dependencies)
3356 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003357 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003358 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003359 if (Args.hasArg(options::OPT_rewrite_objc) &&
3360 !Args.hasArg(options::OPT_g_Group))
3361 CmdArgs.push_back("-P");
3362 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003363 } else if (isa<AssembleJobAction>(JA)) {
3364 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003365
David Blaikie9260ed62013-07-25 21:19:01 +00003366 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003367
3368 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003369 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003370 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003371 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003372 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003373
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003374 if (JA.getType() == types::TY_Nothing)
3375 CmdArgs.push_back("-fsyntax-only");
3376 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003377 CmdArgs.push_back("-emit-pch");
3378 else
3379 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003380 } else if (isa<VerifyPCHJobAction>(JA)) {
3381 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003382 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003383 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3384 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003385 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003386 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003387 } else if (JA.getType() == types::TY_LLVM_IR ||
3388 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003389 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003390 } else if (JA.getType() == types::TY_LLVM_BC ||
3391 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003392 CmdArgs.push_back("-emit-llvm-bc");
3393 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003394 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003395 } else if (JA.getType() == types::TY_AST) {
3396 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003397 } else if (JA.getType() == types::TY_ModuleFile) {
3398 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003399 } else if (JA.getType() == types::TY_RewrittenObjC) {
3400 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003401 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003402 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3403 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003404 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003405 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003406 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003407 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003408
3409 // Preserve use-list order by default when emitting bitcode, so that
3410 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3411 // same result as running passes here. For LTO, we don't need to preserve
3412 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003413 if (JA.getType() == types::TY_LLVM_BC)
3414 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003415
3416 if (D.isUsingLTO())
3417 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003418 }
3419
Justin Bognera88f0122014-06-20 22:59:50 +00003420 // We normally speed up the clang process a bit by skipping destructors at
3421 // exit, but when we're generating diagnostics we can rely on some of the
3422 // cleanup.
3423 if (!C.isForDiagnostics())
3424 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003425
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003426// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003427#ifdef NDEBUG
3428 CmdArgs.push_back("-disable-llvm-verifier");
3429#endif
3430
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003431 // Set the main file name, so that debug info works even with
3432 // -save-temps.
3433 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003434 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003435
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003436 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003437 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003438 if (Args.hasArg(options::OPT_static))
3439 CmdArgs.push_back("-static-define");
3440
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003441 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003442 // Enable region store model by default.
3443 CmdArgs.push_back("-analyzer-store=region");
3444
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003445 // Treat blocks as analysis entry points.
3446 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3447
Ted Kremenek49c79792011-03-24 00:28:47 +00003448 CmdArgs.push_back("-analyzer-eagerly-assume");
3449
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003450 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003451 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003452 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003453
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003454 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003455 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003456
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003457 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003458 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003459
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003460 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003461
Artem Belevichba558952015-05-06 18:20:23 +00003462 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003463 CmdArgs.push_back("-analyzer-checker=cplusplus");
3464
Nico Webere8e53112014-05-11 01:04:02 +00003465 // Enable the following experimental checkers for testing.
3466 CmdArgs.push_back(
3467 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003468 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3469 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003470 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003471 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3472 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003473
3474 // Default nullability checks.
3475 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3476 CmdArgs.push_back(
3477 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003478 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003479
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003480 // Set the output format. The default is plist, for (lame) historical
3481 // reasons.
3482 CmdArgs.push_back("-analyzer-output");
3483 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003484 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003485 else
3486 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003487
Ted Kremenekfe449a22010-03-22 22:32:05 +00003488 // Disable the presentation of standard compiler warnings when
3489 // using --analyze. We only want to show static analyzer diagnostics
3490 // or frontend errors.
3491 CmdArgs.push_back("-w");
3492
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003493 // Add -Xanalyzer arguments when running as analyzer.
3494 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003495 }
3496
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003497 CheckCodeGenerationOptions(D, Args);
3498
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003499 llvm::Reloc::Model RelocationModel;
3500 unsigned PICLevel;
3501 bool IsPIE;
3502 std::tie(RelocationModel, PICLevel, IsPIE) =
3503 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003504
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003505 const char *RMName = RelocationModelName(RelocationModel);
3506 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003507 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003508 CmdArgs.push_back(RMName);
3509 }
3510 if (PICLevel > 0) {
3511 CmdArgs.push_back("-pic-level");
3512 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3513 if (IsPIE) {
3514 CmdArgs.push_back("-pie-level");
3515 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003516 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003517 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003518
Renato Golin4854d802015-11-09 12:40:41 +00003519 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3520 CmdArgs.push_back("-meabi");
3521 CmdArgs.push_back(A->getValue());
3522 }
3523
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003524 CmdArgs.push_back("-mthread-model");
3525 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3526 CmdArgs.push_back(A->getValue());
3527 else
3528 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3529
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003530 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3531
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003532 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3533 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003534 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003535
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003536 // LLVM Code Generator Options.
3537
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003538 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3539 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003540 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3541 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003542 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003543 CmdArgs.push_back(A->getValue());
3544 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003545 }
3546 }
3547
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003548 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3549 StringRef v = A->getValue();
3550 CmdArgs.push_back("-mllvm");
3551 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3552 A->claim();
3553 }
3554
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003555 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3556 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003557 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003558 }
3559
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003560 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3561 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003562 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003563 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003564 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003565 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3566 CmdArgs.push_back("-fpcc-struct-return");
3567 } else {
3568 assert(A->getOption().matches(options::OPT_freg_struct_return));
3569 CmdArgs.push_back("-freg-struct-return");
3570 }
3571 }
3572
Roman Divacky65b88cd2011-03-01 17:40:53 +00003573 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3574 CmdArgs.push_back("-mrtd");
3575
Rafael Espindola224dd632011-12-14 21:02:23 +00003576 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003577 CmdArgs.push_back("-mdisable-fp-elim");
3578 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3579 options::OPT_fno_zero_initialized_in_bss))
3580 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003581
3582 bool OFastEnabled = isOptimizationLevelFast(Args);
3583 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3584 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003585 OptSpecifier StrictAliasingAliasOption =
3586 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003587 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3588 // doesn't do any TBAA.
3589 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003590 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003591 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003592 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003593 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3594 options::OPT_fno_struct_path_tbaa))
3595 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003596 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3597 false))
3598 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003599 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3600 options::OPT_fno_strict_vtable_pointers,
3601 false))
3602 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003603 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3604 options::OPT_fno_optimize_sibling_calls))
3605 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003606
Eric Christopher006208c2013-04-04 06:29:47 +00003607 // Handle segmented stacks.
3608 if (Args.hasArg(options::OPT_fsplit_stack))
3609 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003610
3611 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3612 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003613 OptSpecifier FastMathAliasOption =
3614 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3615
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003616 // Handle various floating point optimization flags, mapping them to the
3617 // appropriate LLVM code generation flags. The pattern for all of these is to
3618 // default off the codegen optimizations, and if any flag enables them and no
3619 // flag disables them after the flag enabling them, enable the codegen
3620 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003621 if (Arg *A = Args.getLastArg(
3622 options::OPT_ffast_math, FastMathAliasOption,
3623 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3624 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3625 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003626 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3627 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003628 A->getOption().getID() != options::OPT_fhonor_infinities)
3629 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003630 if (Arg *A = Args.getLastArg(
3631 options::OPT_ffast_math, FastMathAliasOption,
3632 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3633 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3634 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003635 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3636 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003637 A->getOption().getID() != options::OPT_fhonor_nans)
3638 CmdArgs.push_back("-menable-no-nans");
3639
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003640 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3641 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003642 if (Arg *A =
3643 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3644 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3645 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003646 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3647 // However, turning *off* -ffast_math merely restores the toolchain default
3648 // (which may be false).
3649 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3650 A->getOption().getID() == options::OPT_ffast_math ||
3651 A->getOption().getID() == options::OPT_Ofast)
3652 MathErrno = false;
3653 else if (A->getOption().getID() == options::OPT_fmath_errno)
3654 MathErrno = true;
3655 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003656 if (MathErrno)
3657 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003658
3659 // There are several flags which require disabling very specific
3660 // optimizations. Any of these being disabled forces us to turn off the
3661 // entire set of LLVM optimizations, so collect them through all the flag
3662 // madness.
3663 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003664 if (Arg *A = Args.getLastArg(
3665 options::OPT_ffast_math, FastMathAliasOption,
3666 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3667 options::OPT_fno_unsafe_math_optimizations,
3668 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003669 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3670 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003671 A->getOption().getID() != options::OPT_fno_associative_math)
3672 AssociativeMath = true;
3673 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003674 if (Arg *A = Args.getLastArg(
3675 options::OPT_ffast_math, FastMathAliasOption,
3676 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3677 options::OPT_fno_unsafe_math_optimizations,
3678 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003679 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3680 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003681 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3682 ReciprocalMath = true;
3683 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003684 if (Arg *A = Args.getLastArg(
3685 options::OPT_ffast_math, FastMathAliasOption,
3686 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3687 options::OPT_fno_unsafe_math_optimizations,
3688 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003689 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3690 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003691 A->getOption().getID() != options::OPT_fsigned_zeros)
3692 SignedZeros = false;
3693 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003694 if (Arg *A = Args.getLastArg(
3695 options::OPT_ffast_math, FastMathAliasOption,
3696 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3697 options::OPT_fno_unsafe_math_optimizations,
3698 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003699 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3700 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003701 A->getOption().getID() != options::OPT_ftrapping_math)
3702 TrappingMath = false;
3703 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3704 !TrappingMath)
3705 CmdArgs.push_back("-menable-unsafe-fp-math");
3706
Sanjay Patel76c9e092015-01-23 16:40:50 +00003707 if (!SignedZeros)
3708 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003709
Sanjay Patel359b1052015-04-09 15:03:23 +00003710 if (ReciprocalMath)
3711 CmdArgs.push_back("-freciprocal-math");
3712
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003713 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003714 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003715 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003716 options::OPT_ffp_contract)) {
3717 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003718 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003719 if (Val == "fast" || Val == "on" || Val == "off") {
3720 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3721 } else {
3722 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003723 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003724 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003725 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3726 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003727 // If fast-math is set then set the fp-contract mode to fast.
3728 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3729 }
3730 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003731
Sanjay Patel2987c292015-06-11 14:53:41 +00003732 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003733
Bob Wilson6a039162012-07-19 03:52:53 +00003734 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3735 // and if we find them, tell the frontend to provide the appropriate
3736 // preprocessor macros. This is distinct from enabling any optimizations as
3737 // these options induce language changes which must survive serialization
3738 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003739 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3740 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003741 if (!A->getOption().matches(options::OPT_fno_fast_math))
3742 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003743 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3744 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003745 if (A->getOption().matches(options::OPT_ffinite_math_only))
3746 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003747
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003748 // Decide whether to use verbose asm. Verbose assembly is the default on
3749 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003750 bool IsIntegratedAssemblerDefault =
3751 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003752 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003753 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003754 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003755 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003756
Rafael Espindolab8a12932015-05-22 20:44:03 +00003757 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3758 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003759 CmdArgs.push_back("-no-integrated-as");
3760
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003761 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3762 CmdArgs.push_back("-mdebug-pass");
3763 CmdArgs.push_back("Structure");
3764 }
3765 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3766 CmdArgs.push_back("-mdebug-pass");
3767 CmdArgs.push_back("Arguments");
3768 }
3769
John McCall8517abc2010-02-19 02:45:38 +00003770 // Enable -mconstructor-aliases except on darwin, where we have to
3771 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003772 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003773 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003774
John McCall7ef5cb32011-03-18 02:56:14 +00003775 // Darwin's kernel doesn't support guard variables; just die if we
3776 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003777 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003778 CmdArgs.push_back("-fforbid-guard-variables");
3779
Akira Hatanaka02028482015-11-12 17:21:22 +00003780 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3781 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003782 CmdArgs.push_back("-mms-bitfields");
3783 }
John McCall8517abc2010-02-19 02:45:38 +00003784
Daniel Dunbar306945d2009-09-16 06:17:29 +00003785 // This is a coarse approximation of what llvm-gcc actually does, both
3786 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3787 // complicated ways.
3788 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003789 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3790 options::OPT_fno_asynchronous_unwind_tables,
3791 (getToolChain().IsUnwindTablesDefault() ||
3792 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3793 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003794 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3795 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003796 CmdArgs.push_back("-munwind-tables");
3797
Chandler Carruth05fb5852012-11-21 23:40:23 +00003798 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003799
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003800 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3801 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003802 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003803 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003804
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003805 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003806 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003807
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003808 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003809 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003810 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003811 }
3812
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003813 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003814 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003815 if (!CPU.empty()) {
3816 CmdArgs.push_back("-target-cpu");
3817 CmdArgs.push_back(Args.MakeArgString(CPU));
3818 }
3819
Rafael Espindolaeb265472013-08-21 21:59:03 +00003820 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3821 CmdArgs.push_back("-mfpmath");
3822 CmdArgs.push_back(A->getValue());
3823 }
3824
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003825 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003826 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003827
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003828 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003829 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003830 default:
3831 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003832
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003833 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003834 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003835 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003836 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003837 // Use the effective triple, which takes into account the deployment target.
3838 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003839 break;
3840
Tim Northover573cbee2014-05-24 12:52:07 +00003841 case llvm::Triple::aarch64:
3842 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003843 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003844 break;
3845
Eric Christopher0b26a612010-03-02 02:41:08 +00003846 case llvm::Triple::mips:
3847 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003848 case llvm::Triple::mips64:
3849 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003850 AddMIPSTargetArgs(Args, CmdArgs);
3851 break;
3852
Ulrich Weigand8afad612014-07-28 13:17:52 +00003853 case llvm::Triple::ppc:
3854 case llvm::Triple::ppc64:
3855 case llvm::Triple::ppc64le:
3856 AddPPCTargetArgs(Args, CmdArgs);
3857 break;
3858
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003859 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003860 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003861 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003862 AddSparcTargetArgs(Args, CmdArgs);
3863 break;
3864
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003865 case llvm::Triple::x86:
3866 case llvm::Triple::x86_64:
3867 AddX86TargetArgs(Args, CmdArgs);
3868 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003869
3870 case llvm::Triple::hexagon:
3871 AddHexagonTargetArgs(Args, CmdArgs);
3872 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003873 }
3874
Douglas Katzman3459ce22015-10-08 04:24:12 +00003875 // The 'g' groups options involve a somewhat intricate sequence of decisions
3876 // about what to pass from the driver to the frontend, but by the time they
3877 // reach cc1 they've been factored into two well-defined orthogonal choices:
3878 // * what level of debug info to generate
3879 // * what dwarf version to write
3880 // This avoids having to monkey around further in cc1 other than to disable
3881 // codeview if not running in a Windows environment. Perhaps even that
3882 // decision should be made in the driver as well though.
3883 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3884 CodeGenOptions::NoDebugInfo;
3885 // These two are potentially updated by AddClangCLArgs.
3886 unsigned DwarfVersion = 0;
3887 bool EmitCodeView = false;
3888
Hans Wennborg75958c42013-08-08 00:17:41 +00003889 // Add clang-cl arguments.
3890 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003891 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003892
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003893 // Pass the linker version in use.
3894 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3895 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003896 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003897 }
3898
Eric Christopherb7d97e92013-04-03 01:58:53 +00003899 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003900 CmdArgs.push_back("-momit-leaf-frame-pointer");
3901
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003902 // Explicitly error on some things we know we don't support and can't just
3903 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003904 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003905 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3906 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003907 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003908 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003909 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3910 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003911 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003912 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003913 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003914 }
3915
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003916 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003917 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003918 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003919 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003920 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3921 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003922 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003923 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003924 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003925
Chad Rosierbe10f982011-08-02 17:58:04 +00003926 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003927 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003928 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3929 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003930 }
3931
Rafael Espindola08a692a2010-03-07 04:46:18 +00003932 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003933 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003934 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003935 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
3936 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
3937 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003938 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003939 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003940 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00003941 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003942 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003943 // Some 'g' group option other than one expressly disabling debug info
3944 // must have been the final (winning) one. They're all equivalent.
3945 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00003946 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003947 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003948
Douglas Katzman3459ce22015-10-08 04:24:12 +00003949 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
3950 // (because that would mean that "-g0" was the rightmost 'g' group option).
3951 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
3952 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
3953 // exists of removing the gdwarf options from the g_group.
3954 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
3955 options::OPT_gdwarf_4))
3956 DwarfVersion = DwarfVersionNum(A->getSpelling());
3957
Reid Kleckner124955a2015-08-05 18:51:13 +00003958 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00003959 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
3960 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
3961 // DwarfVersion remains at 0 if no explicit choice was made.
3962 CmdArgs.push_back("-gcodeview");
3963 } else if (DwarfVersion == 0 &&
3964 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
3965 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
3966 }
Reid Kleckner124955a2015-08-05 18:51:13 +00003967
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003968 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3969 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003970
3971 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00003972 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003973 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003974 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003975
Eric Christopher138c32b2013-09-13 22:37:55 +00003976 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003977 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003978 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003979 CmdArgs.push_back("-dwarf-ext-refs");
3980 CmdArgs.push_back("-fmodule-format=obj");
3981 }
3982
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003983 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3984 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003985 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003986 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003987 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003988 CmdArgs.push_back("-backend-option");
3989 CmdArgs.push_back("-split-dwarf=Enable");
3990 }
3991
Douglas Katzman3459ce22015-10-08 04:24:12 +00003992 // After we've dealt with all combinations of things that could
3993 // make DebugInfoKind be other than None or DebugLineTablesOnly,
3994 // figure out if we need to "upgrade" it to standalone debug info.
3995 // We parse these two '-f' options whether or not they will be used,
3996 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
3997 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
3998 options::OPT_fno_standalone_debug,
3999 getToolChain().GetDefaultStandaloneDebug());
4000 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4001 DebugInfoKind = CodeGenOptions::FullDebugInfo;
4002 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
4003
Eric Christopher138c32b2013-09-13 22:37:55 +00004004 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4005 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4006 CmdArgs.push_back("-backend-option");
4007 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4008 }
Eric Christophereec89c22013-06-18 00:03:50 +00004009
Eric Christopher0d403d22014-02-14 01:27:03 +00004010 // -gdwarf-aranges turns on the emission of the aranges section in the
4011 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004012 // Always enabled on the PS4.
4013 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004014 CmdArgs.push_back("-backend-option");
4015 CmdArgs.push_back("-generate-arange-section");
4016 }
4017
David Blaikief36d9ba2014-01-27 18:52:43 +00004018 if (Args.hasFlag(options::OPT_fdebug_types_section,
4019 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004020 CmdArgs.push_back("-backend-option");
4021 CmdArgs.push_back("-generate-type-units");
4022 }
Eric Christophereec89c22013-06-18 00:03:50 +00004023
Ed Schouten6e576152015-03-26 17:50:28 +00004024 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4025 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4026
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004027 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004028 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004029 CmdArgs.push_back("-ffunction-sections");
4030 }
4031
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004032 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4033 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004034 CmdArgs.push_back("-fdata-sections");
4035 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004036
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004037 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004038 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004039 CmdArgs.push_back("-fno-unique-section-names");
4040
Chris Lattner3c77a352010-06-22 00:03:40 +00004041 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4042
Diego Novilloa0545962015-07-10 18:00:07 +00004043 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004044
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004045 // Pass options for controlling the default header search paths.
4046 if (Args.hasArg(options::OPT_nostdinc)) {
4047 CmdArgs.push_back("-nostdsysteminc");
4048 CmdArgs.push_back("-nobuiltininc");
4049 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004050 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004051 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004052 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4053 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4054 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004055
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004056 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004057 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004058 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004059
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004060 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4061
Ted Kremenekf7639e12012-03-06 20:06:33 +00004062 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004063 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004064 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004065 options::OPT_ccc_arcmt_modify,
4066 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004067 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004068 switch (A->getOption().getID()) {
4069 default:
4070 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004071 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004072 CmdArgs.push_back("-arcmt-check");
4073 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004074 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004075 CmdArgs.push_back("-arcmt-modify");
4076 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004077 case options::OPT_ccc_arcmt_migrate:
4078 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004079 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004080 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004081
4082 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4083 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004084 break;
John McCalld70fb982011-06-15 23:25:17 +00004085 }
4086 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004087 } else {
4088 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4089 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4090 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004091 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004092
Ted Kremenekf7639e12012-03-06 20:06:33 +00004093 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4094 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004095 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4096 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004097 }
4098 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004099 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004100
4101 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004102 options::OPT_objcmt_migrate_subscripting,
4103 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004104 // None specified, means enable them all.
4105 CmdArgs.push_back("-objcmt-migrate-literals");
4106 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004107 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004108 } else {
4109 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4110 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004111 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004112 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004113 } else {
4114 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4115 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4116 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4117 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4118 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4119 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004120 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004121 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4122 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4123 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4124 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4125 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4126 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4127 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004128 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004129 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004130 }
4131
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004132 // Add preprocessing options like -I, -D, etc. if we are using the
4133 // preprocessor.
4134 //
4135 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004136 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004137 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4138 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004139
Rafael Espindolaa7431922011-07-21 23:40:37 +00004140 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4141 // that "The compiler can only warn and ignore the option if not recognized".
4142 // When building with ccache, it will pass -D options to clang even on
4143 // preprocessed inputs and configure concludes that -fPIC is not supported.
4144 Args.ClaimAllArgs(options::OPT_D);
4145
Alp Toker7874bdc2013-11-15 20:40:58 +00004146 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004147 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4148 if (A->getOption().matches(options::OPT_O4)) {
4149 CmdArgs.push_back("-O3");
4150 D.Diag(diag::warn_O4_is_O3);
4151 } else {
4152 A->render(Args, CmdArgs);
4153 }
4154 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004155
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004156 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004157 for (const Arg *A :
4158 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4159 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004160 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004161 }
4162
Rafael Espindola577637a2015-01-03 00:06:04 +00004163 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004164
Richard Smith3be1cb22014-08-07 00:24:21 +00004165 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004166 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004167 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4168 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004169 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004170 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004171
4172 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004173 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004174 //
4175 // If a std is supplied, only add -trigraphs if it follows the
4176 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004177 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004178 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4179 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004180 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004181 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004182 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004183 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004184 else
4185 Std->render(Args, CmdArgs);
4186
Nico Weber00721502014-12-23 22:32:37 +00004187 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004188 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004189 options::OPT_ftrigraphs,
4190 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004191 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004192 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004193 } else {
4194 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004195 //
4196 // FIXME: Clang doesn't correctly handle -std= when the input language
4197 // doesn't match. For the time being just ignore this for C++ inputs;
4198 // eventually we want to do all the standard defaulting here instead of
4199 // splitting it between the driver and clang -cc1.
4200 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004201 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4202 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004203 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004204 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004205
Nico Weber00721502014-12-23 22:32:37 +00004206 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4207 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004208 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004209
Richard Smith282b4492013-09-04 22:50:31 +00004210 // GCC's behavior for -Wwrite-strings is a bit strange:
4211 // * In C, this "warning flag" changes the types of string literals from
4212 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4213 // for the discarded qualifier.
4214 // * In C++, this is just a normal warning flag.
4215 //
4216 // Implementing this warning correctly in C is hard, so we follow GCC's
4217 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4218 // a non-const char* in C, rather than using this crude hack.
4219 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004220 // FIXME: This should behave just like a warning flag, and thus should also
4221 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4222 Arg *WriteStrings =
4223 Args.getLastArg(options::OPT_Wwrite_strings,
4224 options::OPT_Wno_write_strings, options::OPT_w);
4225 if (WriteStrings &&
4226 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004227 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004228 }
4229
Chandler Carruth61fbf622011-04-23 09:27:53 +00004230 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004231 // during C++ compilation, which it is by default. GCC keeps this define even
4232 // in the presence of '-w', match this behavior bug-for-bug.
4233 if (types::isCXX(InputType) &&
4234 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4235 true)) {
4236 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004237 }
4238
Chandler Carruthe0391482010-05-22 02:21:53 +00004239 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4240 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4241 if (Asm->getOption().matches(options::OPT_fasm))
4242 CmdArgs.push_back("-fgnu-keywords");
4243 else
4244 CmdArgs.push_back("-fno-gnu-keywords");
4245 }
4246
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004247 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4248 CmdArgs.push_back("-fno-dwarf-directory-asm");
4249
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004250 if (ShouldDisableAutolink(Args, getToolChain()))
4251 CmdArgs.push_back("-fno-autolink");
4252
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004253 // Add in -fdebug-compilation-dir if necessary.
4254 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004255
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004256 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4257 StringRef Map = A->getValue();
4258 if (Map.find('=') == StringRef::npos)
4259 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4260 else
4261 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4262 A->claim();
4263 }
4264
Richard Smith9a568822011-11-21 19:36:32 +00004265 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4266 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004267 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004268 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004269 }
4270
Richard Smith79c927b2013-11-06 19:31:51 +00004271 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4272 CmdArgs.push_back("-foperator-arrow-depth");
4273 CmdArgs.push_back(A->getValue());
4274 }
4275
Richard Smith9a568822011-11-21 19:36:32 +00004276 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4277 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004278 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004279 }
4280
Richard Smitha3d3bd22013-05-08 02:12:03 +00004281 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4282 CmdArgs.push_back("-fconstexpr-steps");
4283 CmdArgs.push_back(A->getValue());
4284 }
4285
Richard Smithb3a14522013-02-22 01:59:51 +00004286 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4287 CmdArgs.push_back("-fbracket-depth");
4288 CmdArgs.push_back(A->getValue());
4289 }
4290
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004291 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4292 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004293 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004294 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004295 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4296 } else
4297 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004298 }
4299
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004300 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004301 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004302
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004303 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4304 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004305 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004306 }
David Chisnall5778fce2009-08-31 16:41:57 +00004307
Chris Lattnere23003d2010-01-09 21:54:33 +00004308 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4309 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004310 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004311 }
4312
Chris Lattnerb35583d2010-04-07 20:49:23 +00004313 CmdArgs.push_back("-ferror-limit");
4314 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004315 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004316 else
4317 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004318
Chandler Carrutha77a7272010-05-06 04:55:18 +00004319 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4320 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004321 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004322 }
4323
4324 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4325 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004326 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004327 }
4328
Richard Smithf6f003a2011-12-16 19:06:07 +00004329 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4330 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004331 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004332 }
4333
Nick Lewycky24653262014-12-16 21:39:02 +00004334 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4335 CmdArgs.push_back("-fspell-checking-limit");
4336 CmdArgs.push_back(A->getValue());
4337 }
4338
Daniel Dunbar2c978472009-11-04 06:24:47 +00004339 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004340 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004341 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004342 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004343 } else {
4344 // If -fmessage-length=N was not specified, determine whether this is a
4345 // terminal and, if so, implicitly define -fmessage-length appropriately.
4346 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004347 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004348 }
4349
John McCallb4a99d32013-02-19 01:57:35 +00004350 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4351 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4352 options::OPT_fvisibility_ms_compat)) {
4353 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4354 CmdArgs.push_back("-fvisibility");
4355 CmdArgs.push_back(A->getValue());
4356 } else {
4357 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4358 CmdArgs.push_back("-fvisibility");
4359 CmdArgs.push_back("hidden");
4360 CmdArgs.push_back("-ftype-visibility");
4361 CmdArgs.push_back("default");
4362 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004363 }
4364
Douglas Gregor08329632010-06-15 17:05:35 +00004365 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004366
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004367 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4368
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004369 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004370 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4371 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004372 CmdArgs.push_back("-ffreestanding");
4373
Daniel Dunbare357d562009-12-03 18:42:11 +00004374 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004375 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004376 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004377 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004378 // Emulated TLS is enabled by default on Android, and can be enabled manually
4379 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004380 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004381 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4382 EmulatedTLSDefault))
4383 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004384 // AltiVec-like language extensions aren't relevant for assembling.
4385 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004386 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004387 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4388 }
Richard Trieu91844232012-06-26 18:18:47 +00004389 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4390 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004391
Alexey Bataevdb390212015-05-20 04:24:19 +00004392 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004393 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4394 options::OPT_fno_openmp, false))
4395 switch (getOpenMPRuntime(getToolChain(), Args)) {
4396 case OMPRT_OMP:
4397 case OMPRT_IOMP5:
4398 // Clang can generate useful OpenMP code for these two runtime libraries.
4399 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004400
4401 // If no option regarding the use of TLS in OpenMP codegeneration is
4402 // given, decide a default based on the target. Otherwise rely on the
4403 // options and pass the right information to the frontend.
4404 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004405 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004406 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004407 break;
4408 default:
4409 // By default, if Clang doesn't know how to generate useful OpenMP code
4410 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4411 // down to the actual compilation.
4412 // FIXME: It would be better to have a mode which *only* omits IR
4413 // generation based on the OpenMP support so that we get consistent
4414 // semantic analysis, etc.
4415 break;
4416 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004417
Peter Collingbourne32701642013-11-01 18:16:25 +00004418 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004419 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004420
Eric Christopher459d2712013-02-19 06:16:53 +00004421 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004422 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4423 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4424 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4425 Arch == llvm::Triple::ppc64le))
4426 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4427 << "ppc/ppc64/ppc64le";
4428 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004429
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004430 // -fzvector is incompatible with -faltivec.
4431 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4432 if (Args.hasArg(options::OPT_faltivec))
4433 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4434 << "-faltivec";
4435
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004436 if (getToolChain().SupportsProfiling())
4437 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004438
4439 // -flax-vector-conversions is default.
4440 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4441 options::OPT_fno_lax_vector_conversions))
4442 CmdArgs.push_back("-fno-lax-vector-conversions");
4443
John Brawna7b4ec02015-08-10 11:11:28 +00004444 if (Args.getLastArg(options::OPT_fapple_kext) ||
4445 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004446 CmdArgs.push_back("-fapple-kext");
4447
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004448 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004449 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004450 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004451 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4452 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004453
4454 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4455 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004456 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004457 }
4458
Bob Wilson14adb362012-02-03 06:27:22 +00004459 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004460
Chandler Carruth6e501032011-03-27 00:04:55 +00004461 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4462 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004463 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004464 if (A->getOption().matches(options::OPT_fwrapv))
4465 CmdArgs.push_back("-fwrapv");
4466 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4467 options::OPT_fno_strict_overflow)) {
4468 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4469 CmdArgs.push_back("-fwrapv");
4470 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004471
4472 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4473 options::OPT_fno_reroll_loops))
4474 if (A->getOption().matches(options::OPT_freroll_loops))
4475 CmdArgs.push_back("-freroll-loops");
4476
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004477 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004478 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4479 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004480
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004481 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4482
Daniel Dunbar4930e332009-11-17 08:07:36 +00004483 // -stack-protector=0 is default.
4484 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004485 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4486 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4487 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4488 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4489 Args.ClaimAllArgs(options::OPT_fstack_protector);
4490 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004491 options::OPT_fstack_protector_all,
4492 options::OPT_fstack_protector_strong,
4493 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004494 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004495 StackProtectorLevel = std::max<unsigned>(
4496 LangOptions::SSPOn,
4497 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004498 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004499 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004500 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004501 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004502 } else {
4503 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004504 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004505 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004506 if (StackProtectorLevel) {
4507 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004508 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004509 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004510
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004511 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004512 for (const Arg *A : Args.filtered(options::OPT__param)) {
4513 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004514 if (Str.startswith("ssp-buffer-size=")) {
4515 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004516 CmdArgs.push_back("-stack-protector-buffer-size");
4517 // FIXME: Verify the argument is a valid integer.
4518 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004519 }
Sean Silva14facf32015-06-09 01:57:17 +00004520 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004521 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004522 }
4523
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004524 // Translate -mstackrealign
4525 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004526 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004527 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004528
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004529 if (Args.hasArg(options::OPT_mstack_alignment)) {
4530 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4531 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004532 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004533
Hans Wennborg77dc2362015-01-20 19:45:50 +00004534 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4535 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4536
4537 if (!Size.empty())
4538 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4539 else
4540 CmdArgs.push_back("-mstack-probe-size=0");
4541 }
4542
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004543 switch (getToolChain().getArch()) {
4544 case llvm::Triple::aarch64:
4545 case llvm::Triple::aarch64_be:
4546 case llvm::Triple::arm:
4547 case llvm::Triple::armeb:
4548 case llvm::Triple::thumb:
4549 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004550 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004551 break;
4552
4553 default:
4554 break;
4555 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004556
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004557 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4558 options::OPT_mno_restrict_it)) {
4559 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4560 CmdArgs.push_back("-backend-option");
4561 CmdArgs.push_back("-arm-restrict-it");
4562 } else {
4563 CmdArgs.push_back("-backend-option");
4564 CmdArgs.push_back("-arm-no-restrict-it");
4565 }
James Y Knight2db38f32015-08-15 03:45:25 +00004566 } else if (Triple.isOSWindows() &&
4567 (Triple.getArch() == llvm::Triple::arm ||
4568 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004569 // Windows on ARM expects restricted IT blocks
4570 CmdArgs.push_back("-backend-option");
4571 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004572 }
4573
Daniel Dunbard18049a2009-04-07 21:16:11 +00004574 // Forward -f options with positive and negative forms; we translate
4575 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004576 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4577 StringRef fname = A->getValue();
4578 if (!llvm::sys::fs::exists(fname))
4579 D.Diag(diag::err_drv_no_such_file) << fname;
4580 else
4581 A->render(Args, CmdArgs);
4582 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004583
John Brawna7b4ec02015-08-10 11:11:28 +00004584 // -fbuiltin is default unless -mkernel is used
4585 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4586 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004587 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004588
Nuno Lopes13c88c72009-12-16 16:59:22 +00004589 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4590 options::OPT_fno_assume_sane_operator_new))
4591 CmdArgs.push_back("-fno-assume-sane-operator-new");
4592
Daniel Dunbar4930e332009-11-17 08:07:36 +00004593 // -fblocks=0 is default.
4594 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004595 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004596 (Args.hasArg(options::OPT_fgnu_runtime) &&
4597 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4598 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004599 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004600
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004601 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004602 !getToolChain().hasBlocksRuntime())
4603 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004604 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004605
Richard Smith47972af2015-06-16 00:08:24 +00004606 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004607 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004608 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004609 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004610 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004611 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4612 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004613 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004614 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004615 HaveModules = true;
4616 }
4617 }
4618
Richard Smith47972af2015-06-16 00:08:24 +00004619 // -fmodule-maps enables implicit reading of module map files. By default,
4620 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004621 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4622 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004623 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004624 }
4625
Daniel Jasperac42b752013-10-21 06:34:34 +00004626 // -fmodules-decluse checks that modules used are declared so (off by
4627 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004628 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004629 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004630 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004631 }
4632
Daniel Jasper962b38e2014-04-11 11:47:45 +00004633 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4634 // all #included headers are part of modules.
4635 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004636 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004637 CmdArgs.push_back("-fmodules-strict-decluse");
4638 }
4639
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004640 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4641 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4642 options::OPT_fno_implicit_modules)) {
4643 CmdArgs.push_back("-fno-implicit-modules");
4644 }
4645
Daniel Jasperac42b752013-10-21 06:34:34 +00004646 // -fmodule-name specifies the module that is currently being built (or
4647 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004648 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004649
Richard Smith9887d792014-10-17 01:42:53 +00004650 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004651 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004652 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004653
Richard Smithe842a472014-10-22 02:05:46 +00004654 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004655 if (HaveModules)
4656 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4657 else
4658 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004659
4660 // -fmodule-cache-path specifies where our implicitly-built module files
4661 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004662 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004663 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004664 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004665 if (HaveModules) {
4666 if (C.isForDiagnostics()) {
4667 // When generating crash reports, we want to emit the modules along with
4668 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004669 Path = Output.getFilename();
4670 llvm::sys::path::replace_extension(Path, ".cache");
4671 llvm::sys::path::append(Path, "modules");
4672 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004673 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004674 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004675 llvm::sys::path::append(Path, "org.llvm.clang.");
4676 appendUserToPath(Path);
4677 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004678 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004679 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004680 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4681 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004682 }
4683
4684 // When building modules and generating crashdumps, we need to dump a module
4685 // dependency VFS alongside the output.
4686 if (HaveModules && C.isForDiagnostics()) {
4687 SmallString<128> VFSDir(Output.getFilename());
4688 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004689 // Add the cache directory as a temp so the crash diagnostics pick it up.
4690 C.addTempFile(Args.MakeArgString(VFSDir));
4691
Justin Bognera88f0122014-06-20 22:59:50 +00004692 llvm::sys::path::append(VFSDir, "vfs");
4693 CmdArgs.push_back("-module-dependency-dir");
4694 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004695 }
4696
Richard Smith9887d792014-10-17 01:42:53 +00004697 if (HaveModules)
4698 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004699
Douglas Gregor35b04d62013-02-07 19:01:24 +00004700 // Pass through all -fmodules-ignore-macro arguments.
4701 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004702 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4703 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004704
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004705 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4706
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004707 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4708 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4709 D.Diag(diag::err_drv_argument_not_allowed_with)
4710 << A->getAsString(Args) << "-fbuild-session-timestamp";
4711
4712 llvm::sys::fs::file_status Status;
4713 if (llvm::sys::fs::status(A->getValue(), Status))
4714 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004715 CmdArgs.push_back(Args.MakeArgString(
4716 "-fbuild-session-timestamp=" +
4717 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004718 }
4719
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004720 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004721 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4722 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004723 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4724
4725 Args.AddLastArg(CmdArgs,
4726 options::OPT_fmodules_validate_once_per_build_session);
4727 }
4728
Ben Langmuirdcf73862014-03-12 00:06:17 +00004729 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4730
John McCalldfea9982010-04-09 19:12:06 +00004731 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004732 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004733 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004734 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004735
Anders Carlssond470fef2010-11-21 00:09:52 +00004736 // -felide-constructors is the default.
4737 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004738 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004739 CmdArgs.push_back("-fno-elide-constructors");
4740
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004741 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004742
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004743 if (KernelOrKext || (types::isCXX(InputType) &&
4744 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4745 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004746 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004747
Tony Linthicum76329bf2011-12-12 21:14:55 +00004748 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004749 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4750 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004751 CmdArgs.push_back("-fshort-enums");
4752
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004753 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004754 if (Arg *A = Args.getLastArg(
4755 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4756 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4757 if (A->getOption().matches(options::OPT_funsigned_char) ||
4758 A->getOption().matches(options::OPT_fno_signed_char)) {
4759 CmdArgs.push_back("-fno-signed-char");
4760 }
4761 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004762 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004763 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004764
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004765 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004766 if (!Args.hasFlag(
4767 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4768 !IsWindowsCygnus && !IsWindowsGNU &&
4769 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4770 getToolChain().getArch() != llvm::Triple::hexagon &&
4771 getToolChain().getArch() != llvm::Triple::xcore &&
4772 ((getToolChain().getTriple().getVendor() !=
4773 llvm::Triple::MipsTechnologies) ||
4774 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004775 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004776 CmdArgs.push_back("-fno-use-cxa-atexit");
4777
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004778 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004779 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004780 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004781 CmdArgs.push_back("-fms-extensions");
4782
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004783 // -fno-use-line-directives is default.
4784 if (Args.hasFlag(options::OPT_fuse_line_directives,
4785 options::OPT_fno_use_line_directives, false))
4786 CmdArgs.push_back("-fuse-line-directives");
4787
Francois Pichet1b4f1632011-09-17 04:32:15 +00004788 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004789 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004790 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004791 (IsWindowsMSVC &&
4792 Args.hasFlag(options::OPT_fms_extensions,
4793 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004794 CmdArgs.push_back("-fms-compatibility");
4795
David Majnemerc371ff02015-03-22 08:39:22 +00004796 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004797 VersionTuple MSVT = visualstudio::getMSVCVersion(
4798 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4799 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004800 CmdArgs.push_back(
4801 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004802
David Majnemer8db91762015-05-18 04:49:30 +00004803 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4804 if (ImplyVCPPCXXVer) {
4805 if (IsMSVC2015Compatible)
4806 CmdArgs.push_back("-std=c++14");
4807 else
4808 CmdArgs.push_back("-std=c++11");
4809 }
4810
Eric Christopher5ecce122013-02-18 00:38:31 +00004811 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004812 if (Args.hasFlag(options::OPT_fborland_extensions,
4813 options::OPT_fno_borland_extensions, false))
4814 CmdArgs.push_back("-fborland-extensions");
4815
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004816 // -fno-declspec is default, except for PS4.
4817 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4818 getToolChain().getTriple().isPS4()))
4819 CmdArgs.push_back("-fdeclspec");
4820 else if (Args.hasArg(options::OPT_fno_declspec))
4821 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4822
David Majnemerc371ff02015-03-22 08:39:22 +00004823 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4824 // than 19.
4825 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4826 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004827 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004828 CmdArgs.push_back("-fno-threadsafe-statics");
4829
Francois Pichet02744872011-09-01 16:38:08 +00004830 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4831 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004832 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004833 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004834 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004835
Chandler Carruthe03aa552010-04-17 20:17:31 +00004836 // -fgnu-keywords default varies depending on language; only pass if
4837 // specified.
4838 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004839 options::OPT_fno_gnu_keywords))
4840 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004841
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004842 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004843 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004844 CmdArgs.push_back("-fgnu89-inline");
4845
Chad Rosier9c76d242012-03-15 22:31:42 +00004846 if (Args.hasArg(options::OPT_fno_inline))
4847 CmdArgs.push_back("-fno-inline");
4848
Chad Rosier64d6be92012-03-06 21:17:19 +00004849 if (Args.hasArg(options::OPT_fno_inline_functions))
4850 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004851
John McCall5fb5df92012-06-20 06:18:46 +00004852 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004853
John McCall5fb5df92012-06-20 06:18:46 +00004854 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004855 // legacy is the default. Except for deployment taget of 10.5,
4856 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4857 // gets ignored silently.
4858 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004859 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4860 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004861 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004862 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004863 if (getToolChain().UseObjCMixedDispatch())
4864 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4865 else
4866 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4867 }
4868 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004869
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004870 // When ObjectiveC legacy runtime is in effect on MacOSX,
4871 // turn on the option to do Array/Dictionary subscripting
4872 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004873 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004874 getToolChain().getTriple().isMacOSX() &&
4875 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4876 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004877 objcRuntime.isNeXTFamily())
4878 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004879
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004880 // -fencode-extended-block-signature=1 is default.
4881 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4882 CmdArgs.push_back("-fencode-extended-block-signature");
4883 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004884
John McCall24fc0de2011-07-06 00:26:06 +00004885 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4886 // NOTE: This logic is duplicated in ToolChains.cpp.
4887 bool ARC = isObjCAutoRefCount(Args);
4888 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004889 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004890
John McCall24fc0de2011-07-06 00:26:06 +00004891 CmdArgs.push_back("-fobjc-arc");
4892
Chandler Carruth491db322011-11-04 07:34:47 +00004893 // FIXME: It seems like this entire block, and several around it should be
4894 // wrapped in isObjC, but for now we just use it here as this is where it
4895 // was being used previously.
4896 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4897 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4898 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4899 else
4900 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4901 }
4902
John McCall24fc0de2011-07-06 00:26:06 +00004903 // Allow the user to enable full exceptions code emission.
4904 // We define off for Objective-CC, on for Objective-C++.
4905 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4906 options::OPT_fno_objc_arc_exceptions,
4907 /*default*/ types::isCXX(InputType)))
4908 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00004909
John McCall24fc0de2011-07-06 00:26:06 +00004910 }
4911
4912 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4913 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004914 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004915 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004916
John McCall24fc0de2011-07-06 00:26:06 +00004917 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4918 // takes precedence.
4919 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4920 if (!GCArg)
4921 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4922 if (GCArg) {
4923 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004924 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004925 } else if (getToolChain().SupportsObjCGC()) {
4926 GCArg->render(Args, CmdArgs);
4927 } else {
4928 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004929 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004930 }
4931 }
4932
John McCallfbe5ed72015-11-05 19:19:56 +00004933 // Pass down -fobjc-weak or -fno-objc-weak if present.
4934 if (types::isObjC(InputType)) {
4935 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
4936 options::OPT_fno_objc_weak);
4937 if (!WeakArg) {
4938 // nothing to do
4939 } else if (GCArg) {
4940 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4941 D.Diag(diag::err_objc_weak_with_gc);
4942 } else if (!objcRuntime.allowsWeak()) {
4943 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4944 D.Diag(diag::err_objc_weak_unsupported);
4945 } else {
4946 WeakArg->render(Args, CmdArgs);
4947 }
4948 }
4949
Bob Wilsonb111ec92015-03-02 19:01:14 +00004950 if (Args.hasFlag(options::OPT_fapplication_extension,
4951 options::OPT_fno_application_extension, false))
4952 CmdArgs.push_back("-fapplication-extension");
4953
Reid Klecknerc542d372014-06-27 17:02:02 +00004954 // Handle GCC-style exception args.
4955 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004956 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4957 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004958
Tim Northovere931f9f2015-10-30 16:30:41 +00004959 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00004960 CmdArgs.push_back("-fsjlj-exceptions");
4961
4962 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004963 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4964 options::OPT_fno_assume_sane_operator_new))
4965 CmdArgs.push_back("-fno-assume-sane-operator-new");
4966
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004967 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4968 // most platforms.
4969 if (Args.hasFlag(options::OPT_fsized_deallocation,
4970 options::OPT_fno_sized_deallocation, false))
4971 CmdArgs.push_back("-fsized-deallocation");
4972
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004973 // -fconstant-cfstrings is default, and may be subject to argument translation
4974 // on Darwin.
4975 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4976 options::OPT_fno_constant_cfstrings) ||
4977 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4978 options::OPT_mno_constant_cfstrings))
4979 CmdArgs.push_back("-fno-constant-cfstrings");
4980
John Thompsoned4e2952009-11-05 20:14:16 +00004981 // -fshort-wchar default varies depending on platform; only
4982 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004983 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4984 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004985 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004986
Hans Wennborg28c96312013-07-31 23:39:13 +00004987 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004988 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004989 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004990 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004991
Daniel Dunbar096ed292011-10-05 21:04:55 +00004992 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4993 // -fno-pack-struct doesn't apply to -fpack-struct=.
4994 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004995 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004996 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004997 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004998 } else if (Args.hasFlag(options::OPT_fpack_struct,
4999 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005000 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005001 }
5002
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005003 // Handle -fmax-type-align=N and -fno-type-align
5004 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5005 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5006 if (!SkipMaxTypeAlign) {
5007 std::string MaxTypeAlignStr = "-fmax-type-align=";
5008 MaxTypeAlignStr += A->getValue();
5009 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5010 }
5011 } else if (getToolChain().getTriple().isOSDarwin()) {
5012 if (!SkipMaxTypeAlign) {
5013 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5014 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5015 }
5016 }
5017
John Brawna7b4ec02015-08-10 11:11:28 +00005018 // -fcommon is the default unless compiling kernel code or the target says so
5019 bool NoCommonDefault =
5020 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5021 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5022 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005023 CmdArgs.push_back("-fno-common");
5024
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005025 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005026 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005027 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005028 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005029 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005030 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005031
Daniel Dunbar6358d682010-10-15 22:30:42 +00005032 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005033 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005034 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005035 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005036
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005037 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005038 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5039 StringRef value = inputCharset->getValue();
5040 if (value != "UTF-8")
5041 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5042 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005043 }
5044
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005045 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005046 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5047 StringRef value = execCharset->getValue();
5048 if (value != "UTF-8")
5049 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5050 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005051 }
5052
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005053 // -fcaret-diagnostics is default.
5054 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5055 options::OPT_fno_caret_diagnostics, true))
5056 CmdArgs.push_back("-fno-caret-diagnostics");
5057
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005058 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005059 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005060 options::OPT_fno_diagnostics_fixit_info))
5061 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005062
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005063 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005064 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005065 options::OPT_fno_diagnostics_show_option))
5066 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005067
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005068 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005069 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005070 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005071 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005072 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005073
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005074 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005075 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005076 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005077 }
5078
Chandler Carruthb6766f02011-03-27 01:50:55 +00005079 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005080 options::OPT_fdiagnostics_show_note_include_stack,
5081 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005082 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005083 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005084 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5085 else
5086 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5087 }
5088
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005089 // Color diagnostics are the default, unless the terminal doesn't support
5090 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005091 // Support both clang's -f[no-]color-diagnostics and gcc's
5092 // -f[no-]diagnostics-colors[=never|always|auto].
5093 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005094 for (const auto &Arg : Args) {
5095 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005096 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5097 !O.matches(options::OPT_fdiagnostics_color) &&
5098 !O.matches(options::OPT_fno_color_diagnostics) &&
5099 !O.matches(options::OPT_fno_diagnostics_color) &&
5100 !O.matches(options::OPT_fdiagnostics_color_EQ))
5101 continue;
5102
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005103 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005104 if (O.matches(options::OPT_fcolor_diagnostics) ||
5105 O.matches(options::OPT_fdiagnostics_color)) {
5106 ShowColors = Colors_On;
5107 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5108 O.matches(options::OPT_fno_diagnostics_color)) {
5109 ShowColors = Colors_Off;
5110 } else {
5111 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005112 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005113 if (value == "always")
5114 ShowColors = Colors_On;
5115 else if (value == "never")
5116 ShowColors = Colors_Off;
5117 else if (value == "auto")
5118 ShowColors = Colors_Auto;
5119 else
5120 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005121 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005122 }
5123 }
5124 if (ShowColors == Colors_On ||
5125 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005126 CmdArgs.push_back("-fcolor-diagnostics");
5127
Nico Rieck7857d462013-09-11 00:38:02 +00005128 if (Args.hasArg(options::OPT_fansi_escape_codes))
5129 CmdArgs.push_back("-fansi-escape-codes");
5130
Daniel Dunbardb097022009-06-08 21:13:54 +00005131 if (!Args.hasFlag(options::OPT_fshow_source_location,
5132 options::OPT_fno_show_source_location))
5133 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005134
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005135 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005136 true))
5137 CmdArgs.push_back("-fno-show-column");
5138
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005139 if (!Args.hasFlag(options::OPT_fspell_checking,
5140 options::OPT_fno_spell_checking))
5141 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005142
Chad Rosierc8e56e82012-12-05 21:08:21 +00005143 // -fno-asm-blocks is default.
5144 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5145 false))
5146 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005147
Steven Wucb0d13f2015-01-16 23:05:28 +00005148 // -fgnu-inline-asm is default.
5149 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5150 options::OPT_fno_gnu_inline_asm, true))
5151 CmdArgs.push_back("-fno-gnu-inline-asm");
5152
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005153 // Enable vectorization per default according to the optimization level
5154 // selected. For optimization levels that want vectorization we use the alias
5155 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005156 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005157 OptSpecifier VectorizeAliasOption =
5158 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005159 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005160 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005161 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005162
Chad Rosier136d67d2014-04-28 19:30:57 +00005163 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005164 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005165 OptSpecifier SLPVectAliasOption =
5166 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005167 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005168 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005169 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005170
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005171 // -fno-slp-vectorize-aggressive is default.
5172 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005173 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005174 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005175
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005176 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5177 A->render(Args, CmdArgs);
5178
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005179 // -fdollars-in-identifiers default varies depending on platform and
5180 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005181 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005182 options::OPT_fno_dollars_in_identifiers)) {
5183 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005184 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005185 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005186 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005187 }
5188
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005189 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5190 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005191 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005192 options::OPT_fno_unit_at_a_time)) {
5193 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005194 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005195 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005196
Eli Friedman055c9702011-11-02 01:53:16 +00005197 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5198 options::OPT_fno_apple_pragma_pack, false))
5199 CmdArgs.push_back("-fapple-pragma-pack");
5200
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005201 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005202 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5203 // by default.
5204 if (getToolChain().getArch() == llvm::Triple::le32) {
5205 CmdArgs.push_back("-fno-math-builtin");
5206 }
5207
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005208// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5209//
5210// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005211#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005212 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005213 (getToolChain().getArch() == llvm::Triple::arm ||
5214 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005215 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5216 CmdArgs.push_back("-fno-builtin-strcat");
5217 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5218 CmdArgs.push_back("-fno-builtin-strcpy");
5219 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005220#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005221
Justin Bognera88f0122014-06-20 22:59:50 +00005222 // Enable rewrite includes if the user's asked for it or if we're generating
5223 // diagnostics.
5224 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5225 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005226 if (Args.hasFlag(options::OPT_frewrite_includes,
5227 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005228 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005229 CmdArgs.push_back("-frewrite-includes");
5230
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005231 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005232 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005233 options::OPT_traditional_cpp)) {
5234 if (isa<PreprocessJobAction>(JA))
5235 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005236 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005237 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005238 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005239
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005240 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005241 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005242
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005243 // Handle serialized diagnostics.
5244 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5245 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005246 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005247 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005248
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005249 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5250 CmdArgs.push_back("-fretain-comments-from-system-headers");
5251
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005252 // Forward -fcomment-block-commands to -cc1.
5253 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005254 // Forward -fparse-all-comments to -cc1.
5255 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005256
John Brawnad31ace2015-09-23 13:55:40 +00005257 // Turn -fplugin=name.so into -load name.so
5258 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5259 CmdArgs.push_back("-load");
5260 CmdArgs.push_back(A->getValue());
5261 A->claim();
5262 }
5263
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005264 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5265 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005266 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005267 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5268 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005269
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005270 // We translate this by hand to the -cc1 argument, since nightly test uses
5271 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005272 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005273 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005274 } else
Sean Silva14facf32015-06-09 01:57:17 +00005275 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005276 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005277
Bob Wilson23a55f12014-12-21 07:00:00 +00005278 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005279 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5280 // by the frontend.
5281 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5282 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005283
Daniel Dunbard67a3222009-03-30 06:36:42 +00005284 if (Output.getType() == types::TY_Dependencies) {
5285 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005286 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005287 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005288 CmdArgs.push_back(Output.getFilename());
5289 } else {
5290 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005291 }
5292
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005293 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005294
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005295 if (Input.isFilename())
5296 CmdArgs.push_back(Input.getFilename());
5297 else
5298 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005299
Chris Lattnere9d7d782009-11-03 19:50:27 +00005300 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5301
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005302 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005303
5304 // Optionally embed the -cc1 level arguments into the debug info, for build
5305 // analysis.
5306 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005307 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005308 for (const auto &Arg : Args)
5309 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005310
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005311 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005312 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005313 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005314 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005315 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005316 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005317 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005318 }
5319 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005320 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005321 }
5322
Eric Christopherd3804002013-02-22 20:12:52 +00005323 // Add the split debug info name to the command lines here so we
5324 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005325 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005326 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5327 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005328 const char *SplitDwarfOut;
5329 if (SplitDwarf) {
5330 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005331 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005332 CmdArgs.push_back(SplitDwarfOut);
5333 }
5334
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005335 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5336 // Include them with -fcuda-include-gpubinary.
5337 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005338 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005339 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005340 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005341 }
5342
Eric Christopherd3804002013-02-22 20:12:52 +00005343 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005344 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005345 Output.getType() == types::TY_Object &&
5346 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005347 auto CLCommand =
5348 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005349 C.addCommand(llvm::make_unique<FallbackCommand>(
5350 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005351 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005352 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005353 }
5354
Eric Christopherf1545832013-02-22 23:50:16 +00005355 // Handle the debug info splitting at object creation time if we're
5356 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005357 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005358 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005359 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005360
Roman Divacky178e01602011-02-10 16:52:03 +00005361 if (Arg *A = Args.getLastArg(options::OPT_pg))
5362 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005363 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5364 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005365
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005366 // Claim some arguments which clang supports automatically.
5367
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005368 // -fpch-preprocess is used with gcc to add a special marker in the output to
5369 // include the PCH file. Clang's PTH solution is completely transparent, so we
5370 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005371 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005372
Daniel Dunbar17731772009-03-23 19:03:36 +00005373 // Claim some arguments which clang doesn't support, but we don't
5374 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005375 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5376 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005377
Rafael Espindolab0092d72013-09-04 19:37:35 +00005378 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005379 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005380}
5381
John McCall5fb5df92012-06-20 06:18:46 +00005382/// Add options related to the Objective-C runtime/ABI.
5383///
5384/// Returns true if the runtime is non-fragile.
5385ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5386 ArgStringList &cmdArgs,
5387 RewriteKind rewriteKind) const {
5388 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005389 Arg *runtimeArg =
5390 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5391 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005392
5393 // Just forward -fobjc-runtime= to the frontend. This supercedes
5394 // options about fragility.
5395 if (runtimeArg &&
5396 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5397 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005398 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005399 if (runtime.tryParse(value)) {
5400 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005401 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005402 }
5403
5404 runtimeArg->render(args, cmdArgs);
5405 return runtime;
5406 }
5407
5408 // Otherwise, we'll need the ABI "version". Version numbers are
5409 // slightly confusing for historical reasons:
5410 // 1 - Traditional "fragile" ABI
5411 // 2 - Non-fragile ABI, version 1
5412 // 3 - Non-fragile ABI, version 2
5413 unsigned objcABIVersion = 1;
5414 // If -fobjc-abi-version= is present, use that to set the version.
5415 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005416 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005417 if (value == "1")
5418 objcABIVersion = 1;
5419 else if (value == "2")
5420 objcABIVersion = 2;
5421 else if (value == "3")
5422 objcABIVersion = 3;
5423 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005424 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005425 } else {
5426 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005427 bool nonFragileABIIsDefault =
5428 (rewriteKind == RK_NonFragile ||
5429 (rewriteKind == RK_None &&
5430 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005431 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5432 options::OPT_fno_objc_nonfragile_abi,
5433 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005434// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005435#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5436 unsigned nonFragileABIVersion = 1;
5437#else
5438 unsigned nonFragileABIVersion = 2;
5439#endif
5440
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005441 if (Arg *abiArg =
5442 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005443 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005444 if (value == "1")
5445 nonFragileABIVersion = 1;
5446 else if (value == "2")
5447 nonFragileABIVersion = 2;
5448 else
5449 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005450 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005451 }
5452
5453 objcABIVersion = 1 + nonFragileABIVersion;
5454 } else {
5455 objcABIVersion = 1;
5456 }
5457 }
5458
5459 // We don't actually care about the ABI version other than whether
5460 // it's non-fragile.
5461 bool isNonFragile = objcABIVersion != 1;
5462
5463 // If we have no runtime argument, ask the toolchain for its default runtime.
5464 // However, the rewriter only really supports the Mac runtime, so assume that.
5465 ObjCRuntime runtime;
5466 if (!runtimeArg) {
5467 switch (rewriteKind) {
5468 case RK_None:
5469 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5470 break;
5471 case RK_Fragile:
5472 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5473 break;
5474 case RK_NonFragile:
5475 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5476 break;
5477 }
5478
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005479 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005480 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5481 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005482 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005483 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5484
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005485 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005486 } else {
5487 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5488 }
5489
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005490 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005491 } else {
5492 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005493 // Legacy behaviour is to target the gnustep runtime if we are i
5494 // non-fragile mode or the GCC runtime in fragile mode.
5495 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005496 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005497 else
5498 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005499 }
5500
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005501 cmdArgs.push_back(
5502 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005503 return runtime;
5504}
5505
Reid Klecknerc542d372014-06-27 17:02:02 +00005506static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5507 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5508 I += HaveDash;
5509 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005510}
Reid Klecknerc542d372014-06-27 17:02:02 +00005511
Benjamin Kramere003ca22015-10-28 13:54:16 +00005512namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005513struct EHFlags {
5514 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5515 bool Synch;
5516 bool Asynch;
5517 bool NoExceptC;
5518};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005519} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005520
5521/// /EH controls whether to run destructor cleanups when exceptions are
5522/// thrown. There are three modifiers:
5523/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5524/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5525/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5526/// - c: Assume that extern "C" functions are implicitly noexcept. This
5527/// modifier is an optimization, so we ignore it for now.
5528/// The default is /EHs-c-, meaning cleanups are disabled.
5529static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5530 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005531
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005532 std::vector<std::string> EHArgs =
5533 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005534 for (auto EHVal : EHArgs) {
5535 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5536 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005537 case 'a':
5538 EH.Asynch = maybeConsumeDash(EHVal, I);
5539 continue;
5540 case 'c':
5541 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5542 continue;
5543 case 's':
5544 EH.Synch = maybeConsumeDash(EHVal, I);
5545 continue;
5546 default:
5547 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005548 }
5549 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5550 break;
5551 }
5552 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005553
Reid Klecknerc542d372014-06-27 17:02:02 +00005554 return EH;
5555}
5556
Douglas Katzman3459ce22015-10-08 04:24:12 +00005557void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5558 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5559 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005560 unsigned RTOptionID = options::OPT__SLASH_MT;
5561
Hans Wennborgf1a74252013-09-10 20:18:04 +00005562 if (Args.hasArg(options::OPT__SLASH_LDd))
5563 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5564 // but defining _DEBUG is sticky.
5565 RTOptionID = options::OPT__SLASH_MTd;
5566
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005567 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005568 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005569
David Majnemere2afb472015-07-24 06:49:13 +00005570 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005571 switch (RTOptionID) {
5572 case options::OPT__SLASH_MD:
5573 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005574 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005575 CmdArgs.push_back("-D_MT");
5576 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005577 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005578 break;
5579 case options::OPT__SLASH_MDd:
5580 CmdArgs.push_back("-D_DEBUG");
5581 CmdArgs.push_back("-D_MT");
5582 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005583 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005584 break;
5585 case options::OPT__SLASH_MT:
5586 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005587 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005588 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005589 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005590 break;
5591 case options::OPT__SLASH_MTd:
5592 CmdArgs.push_back("-D_DEBUG");
5593 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005594 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005595 break;
5596 default:
5597 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005598 }
5599
David Majnemere2afb472015-07-24 06:49:13 +00005600 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5601 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5602 } else {
5603 CmdArgs.push_back(FlagForCRT.data());
5604
5605 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5606 // users want. The /Za flag to cl.exe turns this off, but it's not
5607 // implemented in clang.
5608 CmdArgs.push_back("--dependent-lib=oldnames");
5609 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005610
Hans Wennborg8858a032014-07-21 23:42:07 +00005611 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5612 // would produce interleaved output, so ignore /showIncludes in such cases.
5613 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5614 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5615 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005616
David Majnemerf6072342014-07-01 22:24:56 +00005617 // This controls whether or not we emit RTTI data for polymorphic types.
5618 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5619 /*default=*/false))
5620 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005621
Reid Kleckner124955a2015-08-05 18:51:13 +00005622 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005623 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005624 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5625 // If we are emitting CV but not DWARF, don't build information that LLVM
5626 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005627 if (*EmitCodeView && !EmitDwarf)
5628 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5629 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005630 CmdArgs.push_back("-gcodeview");
5631
Reid Klecknerc542d372014-06-27 17:02:02 +00005632 const Driver &D = getToolChain().getDriver();
5633 EHFlags EH = parseClangCLEHFlags(D, Args);
5634 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005635 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005636 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005637 CmdArgs.push_back("-fexceptions");
5638 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005639
Hans Wennborge50cec32014-06-13 20:59:54 +00005640 // /EP should expand to -E -P.
5641 if (Args.hasArg(options::OPT__SLASH_EP)) {
5642 CmdArgs.push_back("-E");
5643 CmdArgs.push_back("-P");
5644 }
5645
David Majnemera5b195a2015-02-14 01:35:12 +00005646 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005647 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5648 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005649 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5650 else
5651 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5652
5653 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5654 VolatileOptionID = A->getOption().getID();
5655
5656 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5657 CmdArgs.push_back("-fms-volatile");
5658
David Majnemer86c318f2014-02-11 21:05:00 +00005659 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5660 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5661 if (MostGeneralArg && BestCaseArg)
5662 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5663 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5664
5665 if (MostGeneralArg) {
5666 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5667 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5668 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5669
5670 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5671 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5672 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5673 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5674 << FirstConflict->getAsString(Args)
5675 << SecondConflict->getAsString(Args);
5676
5677 if (SingleArg)
5678 CmdArgs.push_back("-fms-memptr-rep=single");
5679 else if (MultipleArg)
5680 CmdArgs.push_back("-fms-memptr-rep=multiple");
5681 else
5682 CmdArgs.push_back("-fms-memptr-rep=virtual");
5683 }
5684
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005685 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5686 A->render(Args, CmdArgs);
5687
Hans Wennborg81f74482013-09-10 01:07:07 +00005688 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5689 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005690 if (Args.hasArg(options::OPT__SLASH_fallback))
5691 CmdArgs.push_back("msvc-fallback");
5692 else
5693 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005694 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005695}
5696
Douglas Katzman95354292015-06-23 20:42:09 +00005697visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005698 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005699 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005700 return CLFallback.get();
5701}
5702
Daniel Sanders7f933f42015-01-30 17:35:23 +00005703void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5704 ArgStringList &CmdArgs) const {
5705 StringRef CPUName;
5706 StringRef ABIName;
5707 const llvm::Triple &Triple = getToolChain().getTriple();
5708 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5709
5710 CmdArgs.push_back("-target-abi");
5711 CmdArgs.push_back(ABIName.data());
5712}
5713
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005714void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005715 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005716 const ArgList &Args,
5717 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005718 ArgStringList CmdArgs;
5719
5720 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5721 const InputInfo &Input = Inputs[0];
5722
James Y Knight2db38f32015-08-15 03:45:25 +00005723 std::string TripleStr =
5724 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5725 const llvm::Triple Triple(TripleStr);
5726
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005727 // Don't warn about "clang -w -c foo.s"
5728 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005729 // and "clang -emit-llvm -c foo.s"
5730 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005731
Rafael Espindola577637a2015-01-03 00:06:04 +00005732 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005733
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005734 // Invoke ourselves in -cc1as mode.
5735 //
5736 // FIXME: Implement custom jobs for internal actions.
5737 CmdArgs.push_back("-cc1as");
5738
5739 // Add the "effective" target triple.
5740 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005741 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5742
5743 // Set the output mode, we currently only expect to be used as a real
5744 // assembler.
5745 CmdArgs.push_back("-filetype");
5746 CmdArgs.push_back("obj");
5747
Eric Christopher45f2e712012-12-18 00:31:10 +00005748 // Set the main file name, so that debug info works even with
5749 // -save-temps or preprocessed assembly.
5750 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005751 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005752
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005753 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005754 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005755 if (!CPU.empty()) {
5756 CmdArgs.push_back("-target-cpu");
5757 CmdArgs.push_back(Args.MakeArgString(CPU));
5758 }
5759
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005760 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005761 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005762
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005763 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005764 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005765
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005766 // Pass along any -I options so we get proper .include search paths.
5767 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5768
Eric Christopherfc3ee562012-01-10 00:38:01 +00005769 // Determine the original source input.
5770 const Action *SourceAction = &JA;
5771 while (SourceAction->getKind() != Action::InputClass) {
5772 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5773 SourceAction = SourceAction->getInputs()[0];
5774 }
5775
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005776 // Forward -g and handle debug info related flags, assuming we are dealing
5777 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005778 if (SourceAction->getType() == types::TY_Asm ||
5779 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005780 bool WantDebug = false;
5781 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005782 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005783 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5784 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005785 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005786 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005787 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005788 if (DwarfVersion == 0)
5789 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005790 RenderDebugEnablingArgs(Args, CmdArgs,
5791 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5792 : CodeGenOptions::NoDebugInfo),
5793 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005794
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005795 // Add the -fdebug-compilation-dir flag if needed.
5796 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005797
5798 // Set the AT_producer to the clang version when using the integrated
5799 // assembler on assembly source files.
5800 CmdArgs.push_back("-dwarf-debug-producer");
5801 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005802
5803 // And pass along -I options
5804 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005805 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005806
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005807 // Handle -fPIC et al -- the relocation-model affects the assembler
5808 // for some targets.
5809 llvm::Reloc::Model RelocationModel;
5810 unsigned PICLevel;
5811 bool IsPIE;
5812 std::tie(RelocationModel, PICLevel, IsPIE) =
5813 ParsePICArgs(getToolChain(), Triple, Args);
5814
5815 const char *RMName = RelocationModelName(RelocationModel);
5816 if (RMName) {
5817 CmdArgs.push_back("-mrelocation-model");
5818 CmdArgs.push_back(RMName);
5819 }
5820
Kevin Enderby292dc082011-12-22 19:31:58 +00005821 // Optionally embed the -cc1as level arguments into the debug info, for build
5822 // analysis.
5823 if (getToolChain().UseDwarfDebugFlags()) {
5824 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005825 for (const auto &Arg : Args)
5826 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005827
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005828 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005829 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5830 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005831 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005832 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005833 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005834 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005835 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005836 }
5837 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005838 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005839 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005840
5841 // FIXME: Add -static support, once we have it.
5842
Daniel Sanders7f933f42015-01-30 17:35:23 +00005843 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005844 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005845 default:
5846 break;
5847
5848 case llvm::Triple::mips:
5849 case llvm::Triple::mipsel:
5850 case llvm::Triple::mips64:
5851 case llvm::Triple::mips64el:
5852 AddMIPSTargetArgs(Args, CmdArgs);
5853 break;
5854 }
5855
David Blaikie372d9502014-01-17 03:17:40 +00005856 // Consume all the warning flags. Usually this would be handled more
5857 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5858 // doesn't handle that so rather than warning about unused flags that are
5859 // actually used, we'll lie by omission instead.
5860 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005861 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5862 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005863
David Blaikie9260ed62013-07-25 21:19:01 +00005864 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5865 getToolChain().getDriver());
5866
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005867 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005868
5869 assert(Output.isFilename() && "Unexpected lipo output.");
5870 CmdArgs.push_back("-o");
5871 CmdArgs.push_back(Output.getFilename());
5872
Daniel Dunbarb440f562010-08-02 02:38:21 +00005873 assert(Input.isFilename() && "Invalid input.");
5874 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005875
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005876 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005877 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005878
5879 // Handle the debug info splitting at object creation time if we're
5880 // creating an object.
5881 // TODO: Currently only works on linux with newer objcopy.
5882 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005883 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005884 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005885 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005886}
5887
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005888void GnuTool::anchor() {}
5889
Daniel Dunbara3246a02009-03-18 08:07:30 +00005890void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005891 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005892 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005893 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005894 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005895 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005896
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005897 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005898 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005899 // Don't forward any -g arguments to assembly steps.
5900 if (isa<AssembleJobAction>(JA) &&
5901 A->getOption().matches(options::OPT_g_Group))
5902 continue;
5903
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005904 // Don't forward any -W arguments to assembly and link steps.
5905 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5906 A->getOption().matches(options::OPT_W_Group))
5907 continue;
5908
Daniel Dunbar2da02722009-03-19 07:55:12 +00005909 // It is unfortunate that we have to claim here, as this means
5910 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005911 // platforms using a generic gcc, even if we are just using gcc
5912 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005913 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005914 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005915 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005916 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005917
Daniel Dunbar4e295052010-01-25 22:35:08 +00005918 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005919
5920 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005921 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005922 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005923 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005924 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005925 }
5926
Daniel Dunbar5716d872009-05-02 21:41:52 +00005927 // Try to force gcc to match the tool chain we want, if we recognize
5928 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005929 //
5930 // FIXME: The triple class should directly provide the information we want
5931 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005932 switch (getToolChain().getArch()) {
5933 default:
5934 break;
5935 case llvm::Triple::x86:
5936 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005937 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005938 break;
5939 case llvm::Triple::x86_64:
5940 case llvm::Triple::ppc64:
5941 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005942 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005943 break;
5944 case llvm::Triple::sparcel:
5945 CmdArgs.push_back("-EL");
5946 break;
5947 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005948
Daniel Dunbarb440f562010-08-02 02:38:21 +00005949 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005950 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005951 CmdArgs.push_back(Output.getFilename());
5952 } else {
5953 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005954 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005955 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005956
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005957 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005958
5959 // Only pass -x if gcc will understand it; otherwise hope gcc
5960 // understands the suffix correctly. The main use case this would go
5961 // wrong in is for linker inputs if they happened to have an odd
5962 // suffix; really the only way to get this to happen is a command
5963 // like '-x foobar a.c' which will treat a.c like a linker input.
5964 //
5965 // FIXME: For the linker case specifically, can we safely convert
5966 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005967 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005968 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005969 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5970 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005971 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005972 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005973 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005974 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005975 else if (II.getType() == types::TY_ModuleFile)
5976 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005977 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005978
Daniel Dunbara3246a02009-03-18 08:07:30 +00005979 if (types::canTypeBeUserSpecified(II.getType())) {
5980 CmdArgs.push_back("-x");
5981 CmdArgs.push_back(types::getTypeName(II.getType()));
5982 }
5983
Daniel Dunbarb440f562010-08-02 02:38:21 +00005984 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005985 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005986 else {
5987 const Arg &A = II.getInputArg();
5988
5989 // Reverse translate some rewritten options.
5990 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5991 CmdArgs.push_back("-lstdc++");
5992 continue;
5993 }
5994
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005995 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005996 A.render(Args, CmdArgs);
5997 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005998 }
5999
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006000 const std::string customGCCName = D.getCCCGenericGCCName();
6001 const char *GCCName;
6002 if (!customGCCName.empty())
6003 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006004 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006005 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006006 } else
6007 GCCName = "gcc";
6008
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006009 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006010 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006011}
6012
Douglas Katzman95354292015-06-23 20:42:09 +00006013void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6014 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006015 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006016}
6017
Douglas Katzman95354292015-06-23 20:42:09 +00006018void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6019 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006020 const Driver &D = getToolChain().getDriver();
6021
Eric Christophercc7ff502015-01-29 00:56:17 +00006022 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006023 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006024 case types::TY_LLVM_IR:
6025 case types::TY_LTO_IR:
6026 case types::TY_LLVM_BC:
6027 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006028 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006029 break;
6030 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006031 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006032 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006033 case types::TY_Nothing:
6034 CmdArgs.push_back("-fsyntax-only");
6035 break;
6036 default:
6037 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006038 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006039}
6040
Douglas Katzman95354292015-06-23 20:42:09 +00006041void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6042 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006043 // The types are (hopefully) good enough.
6044}
6045
Tony Linthicum76329bf2011-12-12 21:14:55 +00006046// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006047void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
6048 ArgStringList &CmdArgs) const {}
6049void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6050 const InputInfo &Output,
6051 const InputInfoList &Inputs,
6052 const ArgList &Args,
6053 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006054 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006055
6056 const Driver &D = getToolChain().getDriver();
6057 ArgStringList CmdArgs;
6058
6059 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00006060 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006061 CmdArgs.push_back(Args.MakeArgString(MarchString));
6062
6063 RenderExtraToolArgs(JA, CmdArgs);
6064
6065 if (Output.isFilename()) {
6066 CmdArgs.push_back("-o");
6067 CmdArgs.push_back(Output.getFilename());
6068 } else {
6069 assert(Output.isNothing() && "Unexpected output");
6070 CmdArgs.push_back("-fsyntax-only");
6071 }
6072
Douglas Katzman54366072015-07-27 16:53:08 +00006073 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006074 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006075
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006076 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006077
Tony Linthicum76329bf2011-12-12 21:14:55 +00006078 // Only pass -x if gcc will understand it; otherwise hope gcc
6079 // understands the suffix correctly. The main use case this would go
6080 // wrong in is for linker inputs if they happened to have an odd
6081 // suffix; really the only way to get this to happen is a command
6082 // like '-x foobar a.c' which will treat a.c like a linker input.
6083 //
6084 // FIXME: For the linker case specifically, can we safely convert
6085 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006086 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006087 // Don't try to pass LLVM or AST inputs to a generic gcc.
6088 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
6089 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
6090 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006091 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006092 else if (II.getType() == types::TY_AST)
6093 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006094 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006095 else if (II.getType() == types::TY_ModuleFile)
6096 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006097 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006098
6099 if (II.isFilename())
6100 CmdArgs.push_back(II.getFilename());
6101 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006102 // Don't render as input, we need gcc to do the translations.
6103 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006104 II.getInputArg().render(Args, CmdArgs);
6105 }
6106
6107 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006108 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006109 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006110}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006111
Douglas Katzman95354292015-06-23 20:42:09 +00006112void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6113 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006114 // The types are (hopefully) good enough.
6115}
6116
Douglas Katzman54366072015-07-27 16:53:08 +00006117static void
6118constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
6119 const toolchains::HexagonToolChain &ToolChain,
6120 const InputInfo &Output, const InputInfoList &Inputs,
6121 const ArgList &Args, ArgStringList &CmdArgs,
6122 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006123
Matthew Curtise689b052012-12-06 15:46:07 +00006124 const Driver &D = ToolChain.getDriver();
6125
Matthew Curtise689b052012-12-06 15:46:07 +00006126 //----------------------------------------------------------------------------
6127 //
6128 //----------------------------------------------------------------------------
6129 bool hasStaticArg = Args.hasArg(options::OPT_static);
6130 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006131 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00006132 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
6133 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6134 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006135 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006136 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006137
Matthew Curtise689b052012-12-06 15:46:07 +00006138 //----------------------------------------------------------------------------
6139 // Silence warnings for various options
6140 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00006141
Matthew Curtise689b052012-12-06 15:46:07 +00006142 Args.ClaimAllArgs(options::OPT_g_Group);
6143 Args.ClaimAllArgs(options::OPT_emit_llvm);
6144 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6145 // handled somewhere else.
6146 Args.ClaimAllArgs(options::OPT_static_libgcc);
6147
6148 //----------------------------------------------------------------------------
6149 //
6150 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006151 for (const auto &Opt : ToolChain.ExtraOpts)
6152 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006153
Douglas Katzman54366072015-07-27 16:53:08 +00006154 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00006155 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00006156
Matthew Curtise689b052012-12-06 15:46:07 +00006157 if (buildingLib) {
6158 CmdArgs.push_back("-shared");
6159 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
6160 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00006161 }
6162
Matthew Curtise689b052012-12-06 15:46:07 +00006163 if (hasStaticArg)
6164 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006165
Matthew Curtise8f80a12012-12-06 17:49:03 +00006166 if (buildPIE && !buildingLib)
6167 CmdArgs.push_back("-pie");
6168
Douglas Katzman54366072015-07-27 16:53:08 +00006169 if (const char *v =
6170 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006171 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00006172 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006173 }
6174
Matthew Curtise689b052012-12-06 15:46:07 +00006175 //----------------------------------------------------------------------------
6176 //
6177 //----------------------------------------------------------------------------
6178 CmdArgs.push_back("-o");
6179 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006180
Matthew Curtise689b052012-12-06 15:46:07 +00006181 const std::string MarchSuffix = "/" + MarchString;
6182 const std::string G0Suffix = "/G0";
6183 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00006184 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006185 const std::string StartFilesDir =
6186 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006187
6188 //----------------------------------------------------------------------------
6189 // moslib
6190 //----------------------------------------------------------------------------
6191 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006192 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006193
Sean Silva14facf32015-06-09 01:57:17 +00006194 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6195 A->claim();
6196 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00006197 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006198 }
Matthew Curtise689b052012-12-06 15:46:07 +00006199 if (oslibs.empty()) {
6200 oslibs.push_back("standalone");
6201 hasStandalone = true;
6202 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006203
Matthew Curtise689b052012-12-06 15:46:07 +00006204 //----------------------------------------------------------------------------
6205 // Start Files
6206 //----------------------------------------------------------------------------
6207 if (incStdLib && incStartFiles) {
6208
6209 if (!buildingLib) {
6210 if (hasStandalone) {
6211 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006212 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00006213 }
6214 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
6215 }
6216 std::string initObj = useShared ? "/initS.o" : "/init.o";
6217 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
6218 }
6219
6220 //----------------------------------------------------------------------------
6221 // Library Search Paths
6222 //----------------------------------------------------------------------------
Douglas Katzman6059ef92015-11-17 17:41:23 +00006223 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006224
6225 //----------------------------------------------------------------------------
6226 //
6227 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006228 Args.AddAllArgs(CmdArgs,
6229 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6230 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006231
6232 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6233
6234 //----------------------------------------------------------------------------
6235 // Libraries
6236 //----------------------------------------------------------------------------
6237 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006238 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006239 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6240 CmdArgs.push_back("-lm");
6241 }
6242
6243 CmdArgs.push_back("--start-group");
6244
6245 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006246 for (const std::string &Lib : oslibs)
6247 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006248 CmdArgs.push_back("-lc");
6249 }
6250 CmdArgs.push_back("-lgcc");
6251
6252 CmdArgs.push_back("--end-group");
6253 }
6254
6255 //----------------------------------------------------------------------------
6256 // End files
6257 //----------------------------------------------------------------------------
6258 if (incStdLib && incStartFiles) {
6259 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6260 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6261 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006262}
6263
Douglas Katzman95354292015-06-23 20:42:09 +00006264void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6265 const InputInfo &Output,
6266 const InputInfoList &Inputs,
6267 const ArgList &Args,
6268 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006269
Douglas Katzman54366072015-07-27 16:53:08 +00006270 const toolchains::HexagonToolChain &ToolChain =
6271 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006272
6273 ArgStringList CmdArgs;
6274 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6275 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006276
6277 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006278 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006279 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006280}
6281// Hexagon tools end.
6282
Tom Stellard8fa33092015-07-18 01:49:05 +00006283void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6284 const InputInfo &Output,
6285 const InputInfoList &Inputs,
6286 const ArgList &Args,
6287 const char *LinkingOutput) const {
6288
6289 std::string Linker = getToolChain().GetProgramPath(getShortName());
6290 ArgStringList CmdArgs;
6291 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006292 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006293 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006294 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006295 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6296 CmdArgs.push_back("-o");
6297 CmdArgs.push_back(Output.getFilename());
6298 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6299 CmdArgs, Inputs));
6300}
6301// AMDGPU tools end.
6302
Renato Golin7c542b42015-07-27 23:44:45 +00006303const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006304 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006305 if (!Arch.empty())
6306 MArch = Arch;
6307 else
Bernard Ogden31561762013-12-12 13:27:11 +00006308 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006309 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006310
6311 // Handle -march=native.
6312 if (MArch == "native") {
6313 std::string CPU = llvm::sys::getHostCPUName();
6314 if (CPU != "generic") {
6315 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006316 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006317 // If there is no valid architecture suffix for this CPU we don't know how
6318 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006319 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006320 MArch = "";
6321 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006322 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006323 }
6324 }
6325
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006326 return MArch;
6327}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006328
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006329/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006330StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006331 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006332 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6333 // here means an -march=native that we can't handle, so instead return no CPU.
6334 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006335 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006336
John Brawna95c1a82015-05-08 12:52:18 +00006337 // We need to return an empty string here on invalid MArch values as the
6338 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006339 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006340}
6341
6342/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006343std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006344 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006345 // FIXME: Warn on inconsistent use of -mcpu and -march.
6346 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006347 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006348 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006349 // Handle -mcpu=native.
6350 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006351 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006352 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006353 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006354 }
6355
Renato Goline17c5802015-07-27 23:44:42 +00006356 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006357}
6358
6359/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006360/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006361// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006362StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6363 const llvm::Triple &Triple) {
6364 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006365 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006366 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006367 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006368 if (ArchKind == llvm::ARM::AK_INVALID)
6369 // In case of generic Arch, i.e. "arm",
6370 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006371 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006372 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006373 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6374 // armv7k triple if it's actually been specified via "-arch armv7k".
6375 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006376 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006377 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006378 }
Renato Golin3c007252015-05-28 15:05:53 +00006379 if (ArchKind == llvm::ARM::AK_INVALID)
6380 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006381 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006382}
6383
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006384void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006385 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006386 if (Args.hasArg(options::OPT_r))
6387 return;
6388
John Brawn94fd9632015-05-21 12:19:49 +00006389 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6390 // to generate BE-8 executables.
6391 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6392 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006393}
6394
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006395mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006396 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6397 // was first introduced in Release 3. However, other compilers have
6398 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006399 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6400 .Case("mips1", NanLegacy)
6401 .Case("mips2", NanLegacy)
6402 .Case("mips3", NanLegacy)
6403 .Case("mips4", NanLegacy)
6404 .Case("mips5", NanLegacy)
6405 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006406 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006407 .Case("mips32r3", NanLegacy | Nan2008)
6408 .Case("mips32r5", NanLegacy | Nan2008)
6409 .Case("mips32r6", Nan2008)
6410 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006411 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006412 .Case("mips64r3", NanLegacy | Nan2008)
6413 .Case("mips64r5", NanLegacy | Nan2008)
6414 .Case("mips64r6", Nan2008)
6415 .Default(NanLegacy);
6416}
6417
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006418bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6419 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6420 return A && (A->getValue() == StringRef(Value));
6421}
6422
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006423bool mips::isUCLibc(const ArgList &Args) {
6424 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006425 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006426}
6427
Daniel Sanders2bf13662014-07-10 14:40:57 +00006428bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006429 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6430 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006431 .Case("2008", true)
6432 .Case("legacy", false)
6433 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006434
6435 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006436 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006437 .Cases("mips32r6", "mips64r6", true)
6438 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006439
6440 return false;
6441}
6442
Daniel Sanders379d44b2014-07-16 11:52:23 +00006443bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006444 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006445 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006446 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006447 return false;
6448
6449 if (ABIName != "32")
6450 return false;
6451
Toma Tabacu94ea6862015-06-16 13:54:13 +00006452 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6453 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006454 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006455 return false;
6456
Daniel Sanders379d44b2014-07-16 11:52:23 +00006457 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006458 .Cases("mips2", "mips3", "mips4", "mips5", true)
6459 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6460 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6461 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006462}
6463
Toma Tabacu94ea6862015-06-16 13:54:13 +00006464bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6465 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006466 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006467 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6468
6469 // FPXX shouldn't be used if -msingle-float is present.
6470 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6471 options::OPT_mdouble_float))
6472 if (A->getOption().matches(options::OPT_msingle_float))
6473 UseFPXX = false;
6474
6475 return UseFPXX;
6476}
6477
Tim Northover157d9112014-01-16 08:48:16 +00006478llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006479 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6480 // archs which Darwin doesn't use.
6481
6482 // The matching this routine does is fairly pointless, since it is neither the
6483 // complete architecture list, nor a reasonable subset. The problem is that
6484 // historically the driver driver accepts this and also ties its -march=
6485 // handling to the architecture name, so we need to be careful before removing
6486 // support for it.
6487
6488 // This code must be kept in sync with Clang's Darwin specific argument
6489 // translation.
6490
6491 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006492 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6493 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6494 .Case("ppc64", llvm::Triple::ppc64)
6495 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6496 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6497 llvm::Triple::x86)
6498 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6499 // This is derived from the driver driver.
6500 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6501 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6502 .Cases("armv7s", "xscale", llvm::Triple::arm)
6503 .Case("arm64", llvm::Triple::aarch64)
6504 .Case("r600", llvm::Triple::r600)
6505 .Case("amdgcn", llvm::Triple::amdgcn)
6506 .Case("nvptx", llvm::Triple::nvptx)
6507 .Case("nvptx64", llvm::Triple::nvptx64)
6508 .Case("amdil", llvm::Triple::amdil)
6509 .Case("spir", llvm::Triple::spir)
6510 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006511}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006512
Tim Northover157d9112014-01-16 08:48:16 +00006513void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006514 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006515 T.setArch(Arch);
6516
6517 if (Str == "x86_64h")
6518 T.setArchName(Str);
6519 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6520 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006521 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006522 }
6523}
6524
Bob Wilsondecc03e2012-11-23 06:14:39 +00006525const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006526 const InputInfo &Input) {
6527 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006528}
6529
Bob Wilsondecc03e2012-11-23 06:14:39 +00006530const char *Clang::getBaseInputStem(const ArgList &Args,
6531 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006532 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006533
Chris Lattner906bb902011-01-16 08:14:11 +00006534 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006535 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006536
6537 return Str;
6538}
6539
Bob Wilsondecc03e2012-11-23 06:14:39 +00006540const char *Clang::getDependencyFileName(const ArgList &Args,
6541 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006542 // FIXME: Think about this more.
6543 std::string Res;
6544
6545 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006546 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006547 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006548 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006549 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006550 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006551 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006552}
6553
Douglas Katzman95354292015-06-23 20:42:09 +00006554void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6555 const InputInfo &Output,
6556 const InputInfoList &Inputs,
6557 const ArgList &Args,
6558 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006559 const ToolChain &ToolChain = getToolChain();
6560 const Driver &D = ToolChain.getDriver();
6561 ArgStringList CmdArgs;
6562
6563 // Silence warning for "clang -g foo.o -o foo"
6564 Args.ClaimAllArgs(options::OPT_g_Group);
6565 // and "clang -emit-llvm foo.o -o foo"
6566 Args.ClaimAllArgs(options::OPT_emit_llvm);
6567 // and for "clang -w foo.o -o foo". Other warning options are already
6568 // handled somewhere else.
6569 Args.ClaimAllArgs(options::OPT_w);
6570
6571 if (!D.SysRoot.empty())
6572 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6573
6574 // CloudABI only supports static linkage.
6575 CmdArgs.push_back("-Bstatic");
6576 CmdArgs.push_back("--eh-frame-hdr");
6577 CmdArgs.push_back("--gc-sections");
6578
6579 if (Output.isFilename()) {
6580 CmdArgs.push_back("-o");
6581 CmdArgs.push_back(Output.getFilename());
6582 } else {
6583 assert(Output.isNothing() && "Invalid output.");
6584 }
6585
Douglas Katzman78b37b02015-11-17 20:28:07 +00006586 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006587 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6588 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6589 }
6590
6591 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006592 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006593 Args.AddAllArgs(CmdArgs,
6594 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6595 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006596
Teresa Johnson945bc502015-10-15 20:35:53 +00006597 if (D.isUsingLTO())
6598 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006599
6600 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6601
Douglas Katzman78b37b02015-11-17 20:28:07 +00006602 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006603 if (D.CCCIsCXX())
6604 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6605 CmdArgs.push_back("-lc");
6606 CmdArgs.push_back("-lcompiler_rt");
6607 }
6608
Douglas Katzman78b37b02015-11-17 20:28:07 +00006609 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006610 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6611
6612 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006613 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006614}
6615
Douglas Katzman95354292015-06-23 20:42:09 +00006616void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6617 const InputInfo &Output,
6618 const InputInfoList &Inputs,
6619 const ArgList &Args,
6620 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006621 ArgStringList CmdArgs;
6622
6623 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6624 const InputInfo &Input = Inputs[0];
6625
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006626 // Determine the original source input.
6627 const Action *SourceAction = &JA;
6628 while (SourceAction->getKind() != Action::InputClass) {
6629 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6630 SourceAction = SourceAction->getInputs()[0];
6631 }
6632
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006633 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006634 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006635 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6636 // FIXME: at run-time detect assembler capabilities or rely on version
6637 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006638 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006639 const llvm::Triple &T(getToolChain().getTriple());
6640 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006641 CmdArgs.push_back("-Q");
6642 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006643
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006644 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006645 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006646 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006647 if (Args.hasArg(options::OPT_gstabs))
6648 CmdArgs.push_back("--gstabs");
6649 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006650 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006651 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006652
Daniel Dunbarbe220842009-03-20 16:06:39 +00006653 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006654 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006655
Daniel Dunbar6d484762010-07-22 01:47:22 +00006656 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006657 if (getToolChain().getArch() == llvm::Triple::x86 ||
6658 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006659 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6660 CmdArgs.push_back("-force_cpusubtype_ALL");
6661
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006662 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006663 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006664 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006665 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006666 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006667 CmdArgs.push_back("-static");
6668
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006669 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006670
6671 assert(Output.isFilename() && "Unexpected lipo output.");
6672 CmdArgs.push_back("-o");
6673 CmdArgs.push_back(Output.getFilename());
6674
Daniel Dunbarb440f562010-08-02 02:38:21 +00006675 assert(Input.isFilename() && "Invalid input.");
6676 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006677
6678 // asm_final spec is empty.
6679
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006680 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006681 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006682}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006683
Tim Northover157d9112014-01-16 08:48:16 +00006684void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006685
Tim Northover157d9112014-01-16 08:48:16 +00006686void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6687 ArgStringList &CmdArgs) const {
6688 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006689
Daniel Dunbarc1964212009-03-26 16:23:12 +00006690 // Derived from darwin_arch spec.
6691 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006692 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006693
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006694 // FIXME: Is this needed anymore?
6695 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006696 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006697}
6698
Douglas Katzman95354292015-06-23 20:42:09 +00006699bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006700 // We only need to generate a temp path for LTO if we aren't compiling object
6701 // files. When compiling source files, we run 'dsymutil' after linking. We
6702 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006703 for (const auto &Input : Inputs)
6704 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006705 return true;
6706
6707 return false;
6708}
6709
Douglas Katzman95354292015-06-23 20:42:09 +00006710void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6711 ArgStringList &CmdArgs,
6712 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006713 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006714 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006715
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006716 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006717 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6718 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006719 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6720 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006721 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006722 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006723 }
6724
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006725 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006726 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006727 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6728 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006729
Bob Wilson3d27dad2013-08-02 22:25:34 +00006730 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6731 CmdArgs.push_back("-export_dynamic");
6732
Bob Wilsonb111ec92015-03-02 19:01:14 +00006733 // If we are using App Extension restrictions, pass a flag to the linker
6734 // telling it that the compiled code has been audited.
6735 if (Args.hasFlag(options::OPT_fapplication_extension,
6736 options::OPT_fno_application_extension, false))
6737 CmdArgs.push_back("-application_extension");
6738
Teresa Johnson945bc502015-10-15 20:35:53 +00006739 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006740 // If we are using LTO, then automatically create a temporary file path for
6741 // the linker to use, so that it's lifetime will extend past a possible
6742 // dsymutil step.
6743 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6744 const char *TmpPath = C.getArgs().MakeArgString(
6745 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6746 C.addTempFile(TmpPath);
6747 CmdArgs.push_back("-object_path_lto");
6748 CmdArgs.push_back(TmpPath);
6749 }
6750
6751 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6752 // it in clang installed libraries. If not found, the option is not used
6753 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6754 if (Version[0] >= 133) {
6755 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6756 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6757 SmallString<128> LibLTOPath(P);
6758 llvm::sys::path::append(LibLTOPath, "lib");
6759 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6760 if (llvm::sys::fs::exists(LibLTOPath)) {
6761 CmdArgs.push_back("-lto_library");
6762 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6763 } else {
6764 D.Diag(diag::warn_drv_lto_libpath);
6765 }
6766 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006767 }
6768
Daniel Dunbarc1964212009-03-26 16:23:12 +00006769 // Derived from the "link" spec.
6770 Args.AddAllArgs(CmdArgs, options::OPT_static);
6771 if (!Args.hasArg(options::OPT_static))
6772 CmdArgs.push_back("-dynamic");
6773 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6774 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6775 // here. How do we wish to handle such things?
6776 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006777
Daniel Dunbarc1964212009-03-26 16:23:12 +00006778 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006779 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006780 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006781 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006782
6783 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6784 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6785 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6786
6787 Arg *A;
6788 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6789 (A = Args.getLastArg(options::OPT_current__version)) ||
6790 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006791 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6792 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006793
6794 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6795 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6796 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6797 } else {
6798 CmdArgs.push_back("-dylib");
6799
6800 Arg *A;
6801 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6802 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6803 (A = Args.getLastArg(options::OPT_client__name)) ||
6804 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6805 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6806 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006807 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6808 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006809
Daniel Dunbarc1964212009-03-26 16:23:12 +00006810 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6811 "-dylib_compatibility_version");
6812 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6813 "-dylib_current_version");
6814
Tim Northover157d9112014-01-16 08:48:16 +00006815 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006816
6817 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6818 "-dylib_install_name");
6819 }
6820
6821 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6822 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6823 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006824 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006825 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006826 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6827 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6828 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6829 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6830 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6831 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006832 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006833 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6834 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6835 Args.AddAllArgs(CmdArgs, options::OPT_init);
6836
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006837 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006838 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006839
Daniel Dunbarc1964212009-03-26 16:23:12 +00006840 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6841 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6842 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6843 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6844 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006845
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006846 if (const Arg *A =
6847 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6848 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006849 if (A->getOption().matches(options::OPT_fpie) ||
6850 A->getOption().matches(options::OPT_fPIE))
6851 CmdArgs.push_back("-pie");
6852 else
6853 CmdArgs.push_back("-no_pie");
6854 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006855
6856 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6857 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6858 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6859 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6860 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6861 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6862 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6863 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6864 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6865 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6866 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6867 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6868 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6869 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6870 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6871 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006872
Daniel Dunbar84384642011-05-02 21:03:47 +00006873 // Give --sysroot= preference, over the Apple specific behavior to also use
6874 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006875 StringRef sysroot = C.getSysRoot();
6876 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006877 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006878 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006879 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6880 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006881 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006882 }
6883
Daniel Dunbarc1964212009-03-26 16:23:12 +00006884 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6885 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6886 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6887 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6888 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006889 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006890 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6891 Args.AddAllArgs(CmdArgs, options::OPT_y);
6892 Args.AddLastArg(CmdArgs, options::OPT_w);
6893 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6894 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6895 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6896 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6897 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6898 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6899 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6900 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6901 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6902 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6903 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6904 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6905}
6906
Douglas Katzman95354292015-06-23 20:42:09 +00006907void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6908 const InputInfo &Output,
6909 const InputInfoList &Inputs,
6910 const ArgList &Args,
6911 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006912 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006913
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006914 // If the number of arguments surpasses the system limits, we will encode the
6915 // input files in a separate file, shortening the command line. To this end,
6916 // build a list of input file names that can be passed via a file with the
6917 // -filelist linker option.
6918 llvm::opt::ArgStringList InputFileList;
6919
Daniel Dunbarc1964212009-03-26 16:23:12 +00006920 // The logic here is derived from gcc's behavior; most of which
6921 // comes from specs (starting with link_command). Consult gcc for
6922 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006923 ArgStringList CmdArgs;
6924
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006925 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6926 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6927 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006928 for (const auto &Arg : Args)
6929 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006930 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006931 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006932 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006933 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006934 return;
6935 }
6936
Daniel Dunbarc1964212009-03-26 16:23:12 +00006937 // I'm not sure why this particular decomposition exists in gcc, but
6938 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006939 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006940
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006941 // It seems that the 'e' option is completely ignored for dynamic executables
6942 // (the default), and with static executables, the last one wins, as expected.
6943 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6944 options::OPT_Z_Flag, options::OPT_u_Group,
6945 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006946
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006947 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6948 // members of static archive libraries which implement Objective-C classes or
6949 // categories.
6950 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6951 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006952
Daniel Dunbarc1964212009-03-26 16:23:12 +00006953 CmdArgs.push_back("-o");
6954 CmdArgs.push_back(Output.getFilename());
6955
Douglas Katzman78b37b02015-11-17 20:28:07 +00006956 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00006957 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006958
Peter Collingbournec4122c12015-06-15 21:08:13 +00006959 // SafeStack requires its own runtime libraries
6960 // These libraries should be linked first, to make sure the
6961 // __safestack_init constructor executes before everything else
6962 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6963 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6964 "libclang_rt.safestack_osx.a",
6965 /*AlwaysLink=*/true);
6966 }
6967
Daniel Dunbarc1964212009-03-26 16:23:12 +00006968 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006969
Douglas Gregor9295df02012-05-15 21:00:27 +00006970 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006971 // Build the input file for -filelist (list of linker input files) in case we
6972 // need it later
6973 for (const auto &II : Inputs) {
6974 if (!II.isFilename()) {
6975 // This is a linker input argument.
6976 // We cannot mix input arguments and file names in a -filelist input, thus
6977 // we prematurely stop our list (remaining files shall be passed as
6978 // arguments).
6979 if (InputFileList.size() > 0)
6980 break;
6981
6982 continue;
6983 }
6984
6985 InputFileList.push_back(II.getFilename());
6986 }
6987
Douglas Katzman78b37b02015-11-17 20:28:07 +00006988 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006989 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6990
Douglas Katzman78b37b02015-11-17 20:28:07 +00006991 if (isObjCRuntimeLinked(Args) &&
6992 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006993 // We use arclite library for both ARC and subscripting support.
6994 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6995
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006996 CmdArgs.push_back("-framework");
6997 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006998 // Link libobj.
6999 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007000 }
John McCall31168b02011-06-15 23:02:42 +00007001
Daniel Dunbarc1964212009-03-26 16:23:12 +00007002 if (LinkingOutput) {
7003 CmdArgs.push_back("-arch_multiple");
7004 CmdArgs.push_back("-final_output");
7005 CmdArgs.push_back(LinkingOutput);
7006 }
7007
Daniel Dunbarc1964212009-03-26 16:23:12 +00007008 if (Args.hasArg(options::OPT_fnested_functions))
7009 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007010
Justin Bognerc7701242015-05-12 05:44:36 +00007011 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7012
Douglas Katzman78b37b02015-11-17 20:28:07 +00007013 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007014 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007015 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007016
Daniel Dunbarc1964212009-03-26 16:23:12 +00007017 // link_ssp spec is empty.
7018
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007019 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007020 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007021 }
7022
Douglas Katzman78b37b02015-11-17 20:28:07 +00007023 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007024 // endfile_spec is empty.
7025 }
7026
7027 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7028 Args.AddAllArgs(CmdArgs, options::OPT_F);
7029
Steven Wu3ffb61b2015-02-06 18:08:29 +00007030 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007031 for (const Arg *A : Args.filtered(options::OPT_iframework))
7032 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007033
Douglas Katzman78b37b02015-11-17 20:28:07 +00007034 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007035 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7036 if (A->getValue() == StringRef("Accelerate")) {
7037 CmdArgs.push_back("-framework");
7038 CmdArgs.push_back("Accelerate");
7039 }
7040 }
7041 }
7042
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007043 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007044 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007045 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007046 Cmd->setInputFileList(std::move(InputFileList));
7047 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007048}
7049
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007050void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007051 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007052 const InputInfoList &Inputs,
7053 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007054 const char *LinkingOutput) const {
7055 ArgStringList CmdArgs;
7056
7057 CmdArgs.push_back("-create");
7058 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007059
7060 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007061 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007062
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007063 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007064 assert(II.isFilename() && "Unexpected lipo input.");
7065 CmdArgs.push_back(II.getFilename());
7066 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007067
7068 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007069 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007070}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007071
Daniel Dunbar88299622010-06-04 18:28:36 +00007072void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007073 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007074 const InputInfoList &Inputs,
7075 const ArgList &Args,
7076 const char *LinkingOutput) const {
7077 ArgStringList CmdArgs;
7078
Daniel Dunbareb86b042011-05-09 17:23:16 +00007079 CmdArgs.push_back("-o");
7080 CmdArgs.push_back(Output.getFilename());
7081
Daniel Dunbar88299622010-06-04 18:28:36 +00007082 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7083 const InputInfo &Input = Inputs[0];
7084 assert(Input.isFilename() && "Unexpected dsymutil input.");
7085 CmdArgs.push_back(Input.getFilename());
7086
Daniel Dunbar88299622010-06-04 18:28:36 +00007087 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007088 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007089 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007090}
7091
Eric Christopher551ef452011-08-23 17:56:55 +00007092void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007093 const InputInfo &Output,
7094 const InputInfoList &Inputs,
7095 const ArgList &Args,
7096 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007097 ArgStringList CmdArgs;
7098 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007099 CmdArgs.push_back("--debug-info");
7100 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007101 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007102
7103 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7104 const InputInfo &Input = Inputs[0];
7105 assert(Input.isFilename() && "Unexpected verify input");
7106
7107 // Grabbing the output of the earlier dsymutil run.
7108 CmdArgs.push_back(Input.getFilename());
7109
7110 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007111 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007112 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007113}
7114
Douglas Katzman95354292015-06-23 20:42:09 +00007115void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007116 const InputInfo &Output,
7117 const InputInfoList &Inputs,
7118 const ArgList &Args,
7119 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007120 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007121 ArgStringList CmdArgs;
7122
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007123 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007124
7125 CmdArgs.push_back("-o");
7126 CmdArgs.push_back(Output.getFilename());
7127
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007128 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007129 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007130
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007131 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007132 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007133}
7134
Douglas Katzman95354292015-06-23 20:42:09 +00007135void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7136 const InputInfo &Output,
7137 const InputInfoList &Inputs,
7138 const ArgList &Args,
7139 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007140 ArgStringList CmdArgs;
7141
David Chisnall272a0712012-02-29 15:06:12 +00007142 // Demangle C++ names in errors
7143 CmdArgs.push_back("-C");
7144
Douglas Katzman78b37b02015-11-17 20:28:07 +00007145 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007146 CmdArgs.push_back("-e");
7147 CmdArgs.push_back("_start");
7148 }
7149
7150 if (Args.hasArg(options::OPT_static)) {
7151 CmdArgs.push_back("-Bstatic");
7152 CmdArgs.push_back("-dn");
7153 } else {
7154 CmdArgs.push_back("-Bdynamic");
7155 if (Args.hasArg(options::OPT_shared)) {
7156 CmdArgs.push_back("-shared");
7157 } else {
7158 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007159 CmdArgs.push_back(
7160 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007161 }
7162 }
7163
7164 if (Output.isFilename()) {
7165 CmdArgs.push_back("-o");
7166 CmdArgs.push_back(Output.getFilename());
7167 } else {
7168 assert(Output.isNothing() && "Invalid output.");
7169 }
7170
Douglas Katzman78b37b02015-11-17 20:28:07 +00007171 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007172 if (!Args.hasArg(options::OPT_shared))
7173 CmdArgs.push_back(
7174 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7175
7176 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7177 CmdArgs.push_back(
7178 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7179 CmdArgs.push_back(
7180 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007181 }
7182
Douglas Katzman6059ef92015-11-17 17:41:23 +00007183 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007184
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007185 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7186 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007187
7188 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7189
Douglas Katzman78b37b02015-11-17 20:28:07 +00007190 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007191 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007192 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007193 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007194 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007195 if (!Args.hasArg(options::OPT_shared)) {
7196 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007197 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007198 }
David Chisnallf571cde2012-02-15 13:39:01 +00007199 }
7200
Douglas Katzman78b37b02015-11-17 20:28:07 +00007201 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007202 CmdArgs.push_back(
7203 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007204 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007205 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007206
Xinliang David Li69306c02015-10-22 06:15:31 +00007207 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007208
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007209 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007210 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007211}
7212
Douglas Katzman95354292015-06-23 20:42:09 +00007213void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7214 const InputInfo &Output,
7215 const InputInfoList &Inputs,
7216 const ArgList &Args,
7217 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007218 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007219 ArgStringList CmdArgs;
7220
Rafael Espindolacc126272014-02-28 01:55:21 +00007221 switch (getToolChain().getArch()) {
7222 case llvm::Triple::x86:
7223 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7224 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007225 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007226 break;
7227
7228 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007229 CmdArgs.push_back("-mppc");
7230 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007231 break;
7232
7233 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007234 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007235 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007236 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7237 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7238 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007239 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007240 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007241
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007242 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007243 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007244 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7245 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7246 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007247 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007248 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007249
7250 case llvm::Triple::mips64:
7251 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007252 StringRef CPUName;
7253 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007254 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007255
7256 CmdArgs.push_back("-mabi");
7257 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7258
7259 if (getToolChain().getArch() == llvm::Triple::mips64)
7260 CmdArgs.push_back("-EB");
7261 else
7262 CmdArgs.push_back("-EL");
7263
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007264 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007265 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007266 }
7267
Rafael Espindolacc126272014-02-28 01:55:21 +00007268 default:
7269 break;
7270 }
7271
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007272 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007273
7274 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007275 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007276
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007277 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007278 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007279
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007280 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007281 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007282}
7283
Douglas Katzman95354292015-06-23 20:42:09 +00007284void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7285 const InputInfo &Output,
7286 const InputInfoList &Inputs,
7287 const ArgList &Args,
7288 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007289 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007290 ArgStringList CmdArgs;
7291
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007292 // Silence warning for "clang -g foo.o -o foo"
7293 Args.ClaimAllArgs(options::OPT_g_Group);
7294 // and "clang -emit-llvm foo.o -o foo"
7295 Args.ClaimAllArgs(options::OPT_emit_llvm);
7296 // and for "clang -w foo.o -o foo". Other warning options are already
7297 // handled somewhere else.
7298 Args.ClaimAllArgs(options::OPT_w);
7299
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007300 if (getToolChain().getArch() == llvm::Triple::mips64)
7301 CmdArgs.push_back("-EB");
7302 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7303 CmdArgs.push_back("-EL");
7304
Douglas Katzman78b37b02015-11-17 20:28:07 +00007305 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007306 CmdArgs.push_back("-e");
7307 CmdArgs.push_back("__start");
7308 }
7309
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007310 if (Args.hasArg(options::OPT_static)) {
7311 CmdArgs.push_back("-Bstatic");
7312 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007313 if (Args.hasArg(options::OPT_rdynamic))
7314 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007315 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007316 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007317 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007318 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007319 } else {
7320 CmdArgs.push_back("-dynamic-linker");
7321 CmdArgs.push_back("/usr/libexec/ld.so");
7322 }
7323 }
7324
Rafael Espindola044f7832013-06-05 04:28:55 +00007325 if (Args.hasArg(options::OPT_nopie))
7326 CmdArgs.push_back("-nopie");
7327
Daniel Dunbarb440f562010-08-02 02:38:21 +00007328 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007329 CmdArgs.push_back("-o");
7330 CmdArgs.push_back(Output.getFilename());
7331 } else {
7332 assert(Output.isNothing() && "Invalid output.");
7333 }
7334
Douglas Katzman78b37b02015-11-17 20:28:07 +00007335 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007336 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007337 if (Args.hasArg(options::OPT_pg))
7338 CmdArgs.push_back(
7339 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007340 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007341 CmdArgs.push_back(
7342 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7343 CmdArgs.push_back(
7344 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007345 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007346 CmdArgs.push_back(
7347 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007348 }
7349 }
7350
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007351 std::string Triple = getToolChain().getTripleString();
7352 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007353 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007354 CmdArgs.push_back(
7355 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007356
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007357 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7358 options::OPT_e, options::OPT_s, options::OPT_t,
7359 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007360
Daniel Dunbar54423b22010-09-17 00:24:54 +00007361 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007362
Douglas Katzman78b37b02015-11-17 20:28:07 +00007363 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007364 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007365 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007366 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007367 CmdArgs.push_back("-lm_p");
7368 else
7369 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007370 }
7371
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007372 // FIXME: For some reason GCC passes -lgcc before adding
7373 // the default system libraries. Just mimic this for now.
7374 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007375
Eric Christopher17674ec2012-09-13 06:32:34 +00007376 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007377 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7378 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007379 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007380 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007381 }
7382
Chandler Carruth45661652011-12-17 22:32:42 +00007383 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007384 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007385 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007386 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007387 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007388 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007389
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007390 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007391 }
7392
Douglas Katzman78b37b02015-11-17 20:28:07 +00007393 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007394 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007395 CmdArgs.push_back(
7396 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007397 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007398 CmdArgs.push_back(
7399 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007400 }
7401
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007402 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007403 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007404}
Ed Schoutene33194b2009-04-02 19:13:12 +00007405
Douglas Katzman95354292015-06-23 20:42:09 +00007406void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7407 const InputInfo &Output,
7408 const InputInfoList &Inputs,
7409 const ArgList &Args,
7410 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007411 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007412 ArgStringList CmdArgs;
7413
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007414 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007415
7416 CmdArgs.push_back("-o");
7417 CmdArgs.push_back(Output.getFilename());
7418
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007419 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007420 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007421
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007422 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007423 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007424}
7425
Douglas Katzman95354292015-06-23 20:42:09 +00007426void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7427 const InputInfo &Output,
7428 const InputInfoList &Inputs,
7429 const ArgList &Args,
7430 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007431 const Driver &D = getToolChain().getDriver();
7432 ArgStringList CmdArgs;
7433
Douglas Katzman78b37b02015-11-17 20:28:07 +00007434 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007435 CmdArgs.push_back("-e");
7436 CmdArgs.push_back("__start");
7437 }
7438
7439 if (Args.hasArg(options::OPT_static)) {
7440 CmdArgs.push_back("-Bstatic");
7441 } else {
7442 if (Args.hasArg(options::OPT_rdynamic))
7443 CmdArgs.push_back("-export-dynamic");
7444 CmdArgs.push_back("--eh-frame-hdr");
7445 CmdArgs.push_back("-Bdynamic");
7446 if (Args.hasArg(options::OPT_shared)) {
7447 CmdArgs.push_back("-shared");
7448 } else {
7449 CmdArgs.push_back("-dynamic-linker");
7450 CmdArgs.push_back("/usr/libexec/ld.so");
7451 }
7452 }
7453
7454 if (Output.isFilename()) {
7455 CmdArgs.push_back("-o");
7456 CmdArgs.push_back(Output.getFilename());
7457 } else {
7458 assert(Output.isNothing() && "Invalid output.");
7459 }
7460
Douglas Katzman78b37b02015-11-17 20:28:07 +00007461 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007462 if (!Args.hasArg(options::OPT_shared)) {
7463 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007464 CmdArgs.push_back(
7465 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007466 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007467 CmdArgs.push_back(
7468 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7469 CmdArgs.push_back(
7470 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007471 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007472 CmdArgs.push_back(
7473 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007474 }
7475 }
7476
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007477 Args.AddAllArgs(CmdArgs,
7478 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007479
7480 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7481
Douglas Katzman78b37b02015-11-17 20:28:07 +00007482 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007483 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007484 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7485 if (Args.hasArg(options::OPT_pg))
7486 CmdArgs.push_back("-lm_p");
7487 else
7488 CmdArgs.push_back("-lm");
7489 }
7490
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007491 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007492 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007493 CmdArgs.push_back("-lpthread_p");
7494 else
7495 CmdArgs.push_back("-lpthread");
7496 }
7497
Eli Friedman9fa28852012-08-08 23:57:20 +00007498 if (!Args.hasArg(options::OPT_shared)) {
7499 if (Args.hasArg(options::OPT_pg))
7500 CmdArgs.push_back("-lc_p");
7501 else
7502 CmdArgs.push_back("-lc");
7503 }
7504
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007505 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007506 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007507 case llvm::Triple::arm:
7508 MyArch = "arm";
7509 break;
7510 case llvm::Triple::x86:
7511 MyArch = "i386";
7512 break;
7513 case llvm::Triple::x86_64:
7514 MyArch = "amd64";
7515 break;
7516 default:
7517 llvm_unreachable("Unsupported architecture");
7518 }
7519 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007520 }
7521
Douglas Katzman78b37b02015-11-17 20:28:07 +00007522 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007523 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007524 CmdArgs.push_back(
7525 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007526 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007527 CmdArgs.push_back(
7528 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007529 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007530
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007531 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007532 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007533}
7534
Douglas Katzman95354292015-06-23 20:42:09 +00007535void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7536 const InputInfo &Output,
7537 const InputInfoList &Inputs,
7538 const ArgList &Args,
7539 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007540 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007541 ArgStringList CmdArgs;
7542
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007543 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7544 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007545 switch (getToolChain().getArch()) {
7546 default:
7547 break;
7548 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007549 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007550 break;
7551 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007552 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007553 break;
7554 case llvm::Triple::mips:
7555 case llvm::Triple::mipsel:
7556 case llvm::Triple::mips64:
7557 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007558 StringRef CPUName;
7559 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007560 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007561
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007562 CmdArgs.push_back("-march");
7563 CmdArgs.push_back(CPUName.data());
7564
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007565 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007566 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007567
7568 if (getToolChain().getArch() == llvm::Triple::mips ||
7569 getToolChain().getArch() == llvm::Triple::mips64)
7570 CmdArgs.push_back("-EB");
7571 else
7572 CmdArgs.push_back("-EL");
7573
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007574 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007575 break;
7576 }
7577 case llvm::Triple::arm:
7578 case llvm::Triple::armeb:
7579 case llvm::Triple::thumb:
7580 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007581 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007582
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007583 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007584 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007585 else
Renato Golinf4421f72014-02-19 10:44:07 +00007586 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007587
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007588 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007589 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007590 case llvm::Triple::GNUEABI:
7591 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007592 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007593 break;
7594
7595 default:
7596 CmdArgs.push_back("-matpcs");
7597 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007598 break;
7599 }
7600 case llvm::Triple::sparc:
7601 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007602 case llvm::Triple::sparcv9: {
7603 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7604 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007605 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007606 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007607 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007608 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007609
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007610 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007611
7612 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007613 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007614
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007615 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007616 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007617
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007618 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007619 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007620}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007621
Douglas Katzman95354292015-06-23 20:42:09 +00007622void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7623 const InputInfo &Output,
7624 const InputInfoList &Inputs,
7625 const ArgList &Args,
7626 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007627 const toolchains::FreeBSD &ToolChain =
7628 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007629 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007630 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007631 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007632 !Args.hasArg(options::OPT_shared) &&
7633 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007634 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007635
7636 // Silence warning for "clang -g foo.o -o foo"
7637 Args.ClaimAllArgs(options::OPT_g_Group);
7638 // and "clang -emit-llvm foo.o -o foo"
7639 Args.ClaimAllArgs(options::OPT_emit_llvm);
7640 // and for "clang -w foo.o -o foo". Other warning options are already
7641 // handled somewhere else.
7642 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007643
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007644 if (!D.SysRoot.empty())
7645 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7646
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007647 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007648 CmdArgs.push_back("-pie");
7649
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007650 if (Args.hasArg(options::OPT_static)) {
7651 CmdArgs.push_back("-Bstatic");
7652 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007653 if (Args.hasArg(options::OPT_rdynamic))
7654 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007655 CmdArgs.push_back("--eh-frame-hdr");
7656 if (Args.hasArg(options::OPT_shared)) {
7657 CmdArgs.push_back("-Bshareable");
7658 } else {
7659 CmdArgs.push_back("-dynamic-linker");
7660 CmdArgs.push_back("/libexec/ld-elf.so.1");
7661 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007662 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007663 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7664 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7665 CmdArgs.push_back("--hash-style=both");
7666 }
7667 }
7668 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007669 }
7670
7671 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7672 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007673 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007674 CmdArgs.push_back("-m");
7675 CmdArgs.push_back("elf_i386_fbsd");
7676 }
7677
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007678 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007679 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007680 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007681 }
7682
Daniel Dunbarb440f562010-08-02 02:38:21 +00007683 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007684 CmdArgs.push_back("-o");
7685 CmdArgs.push_back(Output.getFilename());
7686 } else {
7687 assert(Output.isNothing() && "Invalid output.");
7688 }
7689
Douglas Katzman78b37b02015-11-17 20:28:07 +00007690 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007691 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007692 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007693 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007694 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007695 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007696 crt1 = "Scrt1.o";
7697 else
7698 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007699 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007700 if (crt1)
7701 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7702
7703 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7704
Craig Topper92fc2df2014-05-17 16:56:41 +00007705 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007706 if (Args.hasArg(options::OPT_static))
7707 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007708 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007709 crtbegin = "crtbeginS.o";
7710 else
7711 crtbegin = "crtbegin.o";
7712
7713 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007714 }
7715
7716 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007717 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007718 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7719 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007720 Args.AddAllArgs(CmdArgs, options::OPT_s);
7721 Args.AddAllArgs(CmdArgs, options::OPT_t);
7722 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7723 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007724
Teresa Johnson945bc502015-10-15 20:35:53 +00007725 if (D.isUsingLTO())
7726 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007727
Alexey Samsonov52550342014-09-15 19:58:40 +00007728 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007729 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007730
Douglas Katzman78b37b02015-11-17 20:28:07 +00007731 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007732 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007733 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007734 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007735 if (Args.hasArg(options::OPT_pg))
7736 CmdArgs.push_back("-lm_p");
7737 else
7738 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007739 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007740 if (NeedsSanitizerDeps)
7741 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007742 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7743 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007744 if (Args.hasArg(options::OPT_pg))
7745 CmdArgs.push_back("-lgcc_p");
7746 else
7747 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007748 if (Args.hasArg(options::OPT_static)) {
7749 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007750 } else if (Args.hasArg(options::OPT_pg)) {
7751 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007752 } else {
7753 CmdArgs.push_back("--as-needed");
7754 CmdArgs.push_back("-lgcc_s");
7755 CmdArgs.push_back("--no-as-needed");
7756 }
7757
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007758 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007759 if (Args.hasArg(options::OPT_pg))
7760 CmdArgs.push_back("-lpthread_p");
7761 else
7762 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007763 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007764
Roman Divacky66f22762011-02-10 16:59:40 +00007765 if (Args.hasArg(options::OPT_pg)) {
7766 if (Args.hasArg(options::OPT_shared))
7767 CmdArgs.push_back("-lc");
7768 else
7769 CmdArgs.push_back("-lc_p");
7770 CmdArgs.push_back("-lgcc_p");
7771 } else {
7772 CmdArgs.push_back("-lc");
7773 CmdArgs.push_back("-lgcc");
7774 }
7775
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007776 if (Args.hasArg(options::OPT_static)) {
7777 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007778 } else if (Args.hasArg(options::OPT_pg)) {
7779 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007780 } else {
7781 CmdArgs.push_back("--as-needed");
7782 CmdArgs.push_back("-lgcc_s");
7783 CmdArgs.push_back("--no-as-needed");
7784 }
7785 }
7786
Douglas Katzman78b37b02015-11-17 20:28:07 +00007787 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007788 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007789 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007790 else
7791 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007792 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007793 }
7794
Xinliang David Li69306c02015-10-22 06:15:31 +00007795 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007796
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007797 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007798 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007799}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007800
Douglas Katzman95354292015-06-23 20:42:09 +00007801void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007802 const InputInfo &Output,
7803 const InputInfoList &Inputs,
7804 const ArgList &Args,
7805 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007806 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007807 ArgStringList CmdArgs;
7808
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007809 // GNU as needs different flags for creating the correct output format
7810 // on architectures with different ABIs or optional feature sets.
7811 switch (getToolChain().getArch()) {
7812 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007813 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007814 break;
7815 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007816 case llvm::Triple::armeb:
7817 case llvm::Triple::thumb:
7818 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007819 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007820 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7821 std::string Arch =
7822 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007823 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007824 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007825 }
7826
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007827 case llvm::Triple::mips:
7828 case llvm::Triple::mipsel:
7829 case llvm::Triple::mips64:
7830 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007831 StringRef CPUName;
7832 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007833 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007834
7835 CmdArgs.push_back("-march");
7836 CmdArgs.push_back(CPUName.data());
7837
7838 CmdArgs.push_back("-mabi");
7839 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7840
7841 if (getToolChain().getArch() == llvm::Triple::mips ||
7842 getToolChain().getArch() == llvm::Triple::mips64)
7843 CmdArgs.push_back("-EB");
7844 else
7845 CmdArgs.push_back("-EL");
7846
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007847 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007848 break;
7849 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007850
7851 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007852 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007853 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007854 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7855 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007856 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007857 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007858 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007859
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007860 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007861 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007862 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7863 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007864 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007865 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007866 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007867
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007868 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007869 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007870 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007871
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007872 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007873
7874 CmdArgs.push_back("-o");
7875 CmdArgs.push_back(Output.getFilename());
7876
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007877 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007878 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007879
David Chisnallddbd68f2011-09-27 22:03:18 +00007880 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007881 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007882}
7883
Douglas Katzman95354292015-06-23 20:42:09 +00007884void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7885 const InputInfo &Output,
7886 const InputInfoList &Inputs,
7887 const ArgList &Args,
7888 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007889 const Driver &D = getToolChain().getDriver();
7890 ArgStringList CmdArgs;
7891
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007892 if (!D.SysRoot.empty())
7893 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7894
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007895 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007896 if (Args.hasArg(options::OPT_static)) {
7897 CmdArgs.push_back("-Bstatic");
7898 } else {
7899 if (Args.hasArg(options::OPT_rdynamic))
7900 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007901 if (Args.hasArg(options::OPT_shared)) {
7902 CmdArgs.push_back("-Bshareable");
7903 } else {
7904 CmdArgs.push_back("-dynamic-linker");
7905 CmdArgs.push_back("/libexec/ld.elf_so");
7906 }
7907 }
7908
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007909 // Many NetBSD architectures support more than one ABI.
7910 // Determine the correct emulation for ld.
7911 switch (getToolChain().getArch()) {
7912 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007913 CmdArgs.push_back("-m");
7914 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007915 break;
7916 case llvm::Triple::arm:
7917 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007918 CmdArgs.push_back("-m");
7919 switch (getToolChain().getTriple().getEnvironment()) {
7920 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007921 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007922 CmdArgs.push_back("armelf_nbsd_eabi");
7923 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007924 case llvm::Triple::EABIHF:
7925 case llvm::Triple::GNUEABIHF:
7926 CmdArgs.push_back("armelf_nbsd_eabihf");
7927 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007928 default:
7929 CmdArgs.push_back("armelf_nbsd");
7930 break;
7931 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007932 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007933 case llvm::Triple::armeb:
7934 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007935 arm::appendEBLinkFlags(
7936 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007937 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007938 CmdArgs.push_back("-m");
7939 switch (getToolChain().getTriple().getEnvironment()) {
7940 case llvm::Triple::EABI:
7941 case llvm::Triple::GNUEABI:
7942 CmdArgs.push_back("armelfb_nbsd_eabi");
7943 break;
7944 case llvm::Triple::EABIHF:
7945 case llvm::Triple::GNUEABIHF:
7946 CmdArgs.push_back("armelfb_nbsd_eabihf");
7947 break;
7948 default:
7949 CmdArgs.push_back("armelfb_nbsd");
7950 break;
7951 }
7952 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007953 case llvm::Triple::mips64:
7954 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007955 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007956 CmdArgs.push_back("-m");
7957 if (getToolChain().getArch() == llvm::Triple::mips64)
7958 CmdArgs.push_back("elf32btsmip");
7959 else
7960 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007961 } else if (mips::hasMipsAbiArg(Args, "64")) {
7962 CmdArgs.push_back("-m");
7963 if (getToolChain().getArch() == llvm::Triple::mips64)
7964 CmdArgs.push_back("elf64btsmip");
7965 else
7966 CmdArgs.push_back("elf64ltsmip");
7967 }
7968 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007969 case llvm::Triple::ppc:
7970 CmdArgs.push_back("-m");
7971 CmdArgs.push_back("elf32ppc_nbsd");
7972 break;
7973
7974 case llvm::Triple::ppc64:
7975 case llvm::Triple::ppc64le:
7976 CmdArgs.push_back("-m");
7977 CmdArgs.push_back("elf64ppc");
7978 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007979
7980 case llvm::Triple::sparc:
7981 CmdArgs.push_back("-m");
7982 CmdArgs.push_back("elf32_sparc");
7983 break;
7984
7985 case llvm::Triple::sparcv9:
7986 CmdArgs.push_back("-m");
7987 CmdArgs.push_back("elf64_sparc");
7988 break;
7989
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007990 default:
7991 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007992 }
7993
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007994 if (Output.isFilename()) {
7995 CmdArgs.push_back("-o");
7996 CmdArgs.push_back(Output.getFilename());
7997 } else {
7998 assert(Output.isNothing() && "Invalid output.");
7999 }
8000
Douglas Katzman78b37b02015-11-17 20:28:07 +00008001 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008002 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008003 CmdArgs.push_back(
8004 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8005 CmdArgs.push_back(
8006 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8007 CmdArgs.push_back(
8008 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008009 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008010 CmdArgs.push_back(
8011 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8012 CmdArgs.push_back(
8013 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008014 }
8015 }
8016
8017 Args.AddAllArgs(CmdArgs, options::OPT_L);
8018 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8019 Args.AddAllArgs(CmdArgs, options::OPT_e);
8020 Args.AddAllArgs(CmdArgs, options::OPT_s);
8021 Args.AddAllArgs(CmdArgs, options::OPT_t);
8022 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8023 Args.AddAllArgs(CmdArgs, options::OPT_r);
8024
8025 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8026
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008027 unsigned Major, Minor, Micro;
8028 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8029 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008030 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008031 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008032 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008033 case llvm::Triple::arm:
8034 case llvm::Triple::armeb:
8035 case llvm::Triple::thumb:
8036 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008037 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008038 case llvm::Triple::ppc64:
8039 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008040 case llvm::Triple::x86:
8041 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008042 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008043 break;
8044 default:
8045 break;
8046 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008047 }
8048
Douglas Katzman78b37b02015-11-17 20:28:07 +00008049 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008050 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008051 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008052 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8053 CmdArgs.push_back("-lm");
8054 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008055 if (Args.hasArg(options::OPT_pthread))
8056 CmdArgs.push_back("-lpthread");
8057 CmdArgs.push_back("-lc");
8058
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008059 if (useLibgcc) {
8060 if (Args.hasArg(options::OPT_static)) {
8061 // libgcc_eh depends on libc, so resolve as much as possible,
8062 // pull in any new requirements from libc and then get the rest
8063 // of libgcc.
8064 CmdArgs.push_back("-lgcc_eh");
8065 CmdArgs.push_back("-lc");
8066 CmdArgs.push_back("-lgcc");
8067 } else {
8068 CmdArgs.push_back("-lgcc");
8069 CmdArgs.push_back("--as-needed");
8070 CmdArgs.push_back("-lgcc_s");
8071 CmdArgs.push_back("--no-as-needed");
8072 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008073 }
8074 }
8075
Douglas Katzman78b37b02015-11-17 20:28:07 +00008076 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008077 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008078 CmdArgs.push_back(
8079 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008080 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008081 CmdArgs.push_back(
8082 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8083 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008084 }
8085
Xinliang David Li69306c02015-10-22 06:15:31 +00008086 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008087
Logan Chieneb9162f2014-06-26 14:23:45 +00008088 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008089 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008090}
8091
Douglas Katzman95354292015-06-23 20:42:09 +00008092void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8093 const InputInfo &Output,
8094 const InputInfoList &Inputs,
8095 const ArgList &Args,
8096 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008097 claimNoWarnArgs(Args);
8098
James Y Knight2db38f32015-08-15 03:45:25 +00008099 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8100 llvm::Triple Triple = llvm::Triple(TripleStr);
8101
Rafael Espindola92b00932010-08-10 00:25:48 +00008102 ArgStringList CmdArgs;
8103
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008104 llvm::Reloc::Model RelocationModel;
8105 unsigned PICLevel;
8106 bool IsPIE;
8107 std::tie(RelocationModel, PICLevel, IsPIE) =
8108 ParsePICArgs(getToolChain(), Triple, Args);
8109
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008110 switch (getToolChain().getArch()) {
8111 default:
8112 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008113 // Add --32/--64 to make sure we get the format we want.
8114 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008115 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008116 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008117 break;
8118 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008119 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8120 CmdArgs.push_back("--x32");
8121 else
8122 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008123 break;
8124 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008125 CmdArgs.push_back("-a32");
8126 CmdArgs.push_back("-mppc");
8127 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008128 break;
8129 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008130 CmdArgs.push_back("-a64");
8131 CmdArgs.push_back("-mppc64");
8132 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008133 break;
8134 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008135 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008136 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008137 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008138 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008139 break;
8140 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008141 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008142 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008143 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8144 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8145 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008146 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008147 }
8148 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008149 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008150 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8151 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8152 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008153 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008154 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008155 case llvm::Triple::arm:
8156 case llvm::Triple::armeb:
8157 case llvm::Triple::thumb:
8158 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008159 const llvm::Triple &Triple2 = getToolChain().getTriple();
8160 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008161 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008162 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008163 break;
8164 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008165 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008166 break;
8167 default:
8168 break;
8169 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008170
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008171 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008172 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8173 case arm::FloatABI::Soft:
8174 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8175 break;
8176 case arm::FloatABI::SoftFP:
8177 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8178 break;
8179 case arm::FloatABI::Hard:
8180 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8181 break;
8182 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008183
8184 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008185
8186 // FIXME: remove krait check when GNU tools support krait cpu
8187 // for now replace it with -march=armv7-a to avoid a lower
8188 // march from being picked in the absence of a cpu flag.
8189 Arg *A;
8190 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008191 StringRef(A->getValue()).lower() == "krait")
8192 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008193 else
8194 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008195 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008196 break;
8197 }
8198 case llvm::Triple::mips:
8199 case llvm::Triple::mipsel:
8200 case llvm::Triple::mips64:
8201 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008202 StringRef CPUName;
8203 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008204 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008205 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008206
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008207 CmdArgs.push_back("-march");
8208 CmdArgs.push_back(CPUName.data());
8209
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008210 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008211 CmdArgs.push_back(ABIName.data());
8212
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008213 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8214 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008215 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008216 CmdArgs.push_back("-mno-shared");
8217
Daniel Sanders379d44b2014-07-16 11:52:23 +00008218 // LLVM doesn't support -mplt yet and acts as if it is always given.
8219 // However, -mplt has no effect with the N64 ABI.
8220 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008221
8222 if (getToolChain().getArch() == llvm::Triple::mips ||
8223 getToolChain().getArch() == llvm::Triple::mips64)
8224 CmdArgs.push_back("-EB");
8225 else
8226 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008227
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008228 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8229 if (StringRef(A->getValue()) == "2008")
8230 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8231 }
8232
Daniel Sanders379d44b2014-07-16 11:52:23 +00008233 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8234 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8235 options::OPT_mfp64)) {
8236 A->claim();
8237 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008238 } else if (mips::shouldUseFPXX(
8239 Args, getToolChain().getTriple(), CPUName, ABIName,
8240 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008241 CmdArgs.push_back("-mfpxx");
8242
8243 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8244 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008245 if (Arg *A =
8246 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008247 if (A->getOption().matches(options::OPT_mips16)) {
8248 A->claim();
8249 A->render(Args, CmdArgs);
8250 } else {
8251 A->claim();
8252 CmdArgs.push_back("-no-mips16");
8253 }
8254 }
8255
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008256 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8257 options::OPT_mno_micromips);
8258 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8259 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8260
Simon Atanasyanbd986632013-11-26 11:58:04 +00008261 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8262 // Do not use AddLastArg because not all versions of MIPS assembler
8263 // support -mmsa / -mno-msa options.
8264 if (A->getOption().matches(options::OPT_mmsa))
8265 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8266 }
8267
Daniel Sanders379d44b2014-07-16 11:52:23 +00008268 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8269 options::OPT_msoft_float);
8270
Toma Tabacub36d6102015-06-11 12:13:18 +00008271 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8272 options::OPT_msingle_float);
8273
Daniel Sanders379d44b2014-07-16 11:52:23 +00008274 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8275 options::OPT_mno_odd_spreg);
8276
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008277 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008278 break;
8279 }
8280 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008281 // Always pass an -march option, since our default of z10 is later
8282 // than the GNU assembler's default.
8283 StringRef CPUName = getSystemZTargetCPU(Args);
8284 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008285 break;
8286 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008287 }
8288
Renato Golina74bbc72015-07-22 15:32:36 +00008289 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008290 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008291
8292 CmdArgs.push_back("-o");
8293 CmdArgs.push_back(Output.getFilename());
8294
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008295 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008296 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008297
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008298 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008299 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008300
8301 // Handle the debug info splitting at object creation time if we're
8302 // creating an object.
8303 // TODO: Currently only works on linux with newer objcopy.
8304 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008305 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008306 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008307 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008308}
8309
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008310static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008311 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008312 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008313 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008314 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8315 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008316 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008317 CmdArgs.push_back("-lgcc");
8318
Logan Chien3d3373c2012-11-19 12:04:11 +00008319 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008320 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008321 CmdArgs.push_back("-lgcc");
8322 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008323 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008324 CmdArgs.push_back("--as-needed");
8325 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008326 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008327 CmdArgs.push_back("--no-as-needed");
8328 }
8329
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008330 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008331 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008332 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008333 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008334
8335 // According to Android ABI, we have to link with libdl if we are
8336 // linking with non-static libgcc.
8337 //
8338 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8339 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8340 if (isAndroid && !StaticLibgcc)
8341 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008342}
8343
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008344static std::string getLinuxDynamicLinker(const ArgList &Args,
8345 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008346 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8347
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008348 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008349 if (ToolChain.getTriple().isArch64Bit())
8350 return "/system/bin/linker64";
8351 else
8352 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008353 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8354 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008355 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008356 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008357 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008358 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008359 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008360 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008361 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008362 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008363 return "/lib/ld-linux-armhf.so.3";
8364 else
8365 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008366 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8367 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008368 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008369 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008370 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008371 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008372 return "/lib/ld-linux.so.3";
8373 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8374 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008375 std::string LibDir =
8376 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008377 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008378 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008379 if (mips::isUCLibc(Args))
8380 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008381 else if (!ToolChain.getTriple().hasEnvironment()) {
8382 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8383 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8384 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8385 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008386 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008387
8388 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008389 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008390 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008391 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008392 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8393 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008394 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008395 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008396 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8397 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008398 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008399 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008400 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008401 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008402 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008403 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008404 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8405 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008406 else
8407 return "/lib64/ld-linux-x86-64.so.2";
8408}
8409
Renato Golinc4b49242014-02-13 10:01:16 +00008410static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008411 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008412 // Make use of compiler-rt if --rtlib option is used
8413 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8414
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008415 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008416 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008417 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008418 default:
8419 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008420 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008421 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008422 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008423 break;
8424 }
Renato Golinc4b49242014-02-13 10:01:16 +00008425 break;
8426 case ToolChain::RLT_Libgcc:
8427 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8428 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008429 }
8430}
8431
Rafael Espindola1e085772014-08-15 17:14:35 +00008432static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8433 switch (T.getArch()) {
8434 case llvm::Triple::x86:
8435 return "elf_i386";
8436 case llvm::Triple::aarch64:
8437 return "aarch64linux";
8438 case llvm::Triple::aarch64_be:
8439 return "aarch64_be_linux";
8440 case llvm::Triple::arm:
8441 case llvm::Triple::thumb:
8442 return "armelf_linux_eabi";
8443 case llvm::Triple::armeb:
8444 case llvm::Triple::thumbeb:
8445 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8446 case llvm::Triple::ppc:
8447 return "elf32ppclinux";
8448 case llvm::Triple::ppc64:
8449 return "elf64ppc";
8450 case llvm::Triple::ppc64le:
8451 return "elf64lppc";
8452 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008453 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008454 return "elf32_sparc";
8455 case llvm::Triple::sparcv9:
8456 return "elf64_sparc";
8457 case llvm::Triple::mips:
8458 return "elf32btsmip";
8459 case llvm::Triple::mipsel:
8460 return "elf32ltsmip";
8461 case llvm::Triple::mips64:
8462 if (mips::hasMipsAbiArg(Args, "n32"))
8463 return "elf32btsmipn32";
8464 return "elf64btsmip";
8465 case llvm::Triple::mips64el:
8466 if (mips::hasMipsAbiArg(Args, "n32"))
8467 return "elf32ltsmipn32";
8468 return "elf64ltsmip";
8469 case llvm::Triple::systemz:
8470 return "elf64_s390";
8471 case llvm::Triple::x86_64:
8472 if (T.getEnvironment() == llvm::Triple::GNUX32)
8473 return "elf32_x86_64";
8474 return "elf_x86_64";
8475 default:
8476 llvm_unreachable("Unexpected arch");
8477 }
8478}
8479
Douglas Katzman95354292015-06-23 20:42:09 +00008480void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8481 const InputInfo &Output,
8482 const InputInfoList &Inputs,
8483 const ArgList &Args,
8484 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008485 const toolchains::Linux &ToolChain =
8486 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008487 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008488
8489 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8490 llvm::Triple Triple = llvm::Triple(TripleStr);
8491
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008492 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008493 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008494 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008495 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8496 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008497 const bool HasCRTBeginEndFiles =
8498 ToolChain.getTriple().hasEnvironment() ||
8499 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008500
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008501 ArgStringList CmdArgs;
8502
Rafael Espindolad1002f62010-11-15 18:28:16 +00008503 // Silence warning for "clang -g foo.o -o foo"
8504 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008505 // and "clang -emit-llvm foo.o -o foo"
8506 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008507 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008508 // handled somewhere else.
8509 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008510
Peter Collingbourne39719a72015-11-20 20:49:39 +00008511 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8512 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008513 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008514 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008515 CmdArgs.push_back("-target");
8516 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8517 }
8518
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008519 if (!D.SysRoot.empty())
8520 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008521
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008522 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008523 CmdArgs.push_back("-pie");
8524
Rafael Espindola1c76c592010-11-07 22:57:16 +00008525 if (Args.hasArg(options::OPT_rdynamic))
8526 CmdArgs.push_back("-export-dynamic");
8527
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008528 if (Args.hasArg(options::OPT_s))
8529 CmdArgs.push_back("-s");
8530
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008531 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008532 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008533
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008534 for (const auto &Opt : ToolChain.ExtraOpts)
8535 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008536
8537 if (!Args.hasArg(options::OPT_static)) {
8538 CmdArgs.push_back("--eh-frame-hdr");
8539 }
8540
8541 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008542 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008543
8544 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008545 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8546 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008547 CmdArgs.push_back("-Bstatic");
8548 else
8549 CmdArgs.push_back("-static");
8550 } else if (Args.hasArg(options::OPT_shared)) {
8551 CmdArgs.push_back("-shared");
8552 }
8553
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008554 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8555 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008556 (!Args.hasArg(options::OPT_static) &&
8557 !Args.hasArg(options::OPT_shared))) {
8558 CmdArgs.push_back("-dynamic-linker");
8559 CmdArgs.push_back(Args.MakeArgString(
8560 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8561 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008562
8563 CmdArgs.push_back("-o");
8564 CmdArgs.push_back(Output.getFilename());
8565
Douglas Katzman78b37b02015-11-17 20:28:07 +00008566 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008567 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008568 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008569 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008570 if (Args.hasArg(options::OPT_pg))
8571 crt1 = "gcrt1.o";
8572 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008573 crt1 = "Scrt1.o";
8574 else
8575 crt1 = "crt1.o";
8576 }
8577 if (crt1)
8578 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008579
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008580 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8581 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008582
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008583 const char *crtbegin;
8584 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008585 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008586 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008587 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008588 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008589 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008590 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008591 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008592
8593 if (HasCRTBeginEndFiles)
8594 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008595
8596 // Add crtfastmath.o if available and fast math is enabled.
8597 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008598 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008599
8600 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008601 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008602
Douglas Katzman6059ef92015-11-17 17:41:23 +00008603 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008604
Teresa Johnson945bc502015-10-15 20:35:53 +00008605 if (D.isUsingLTO())
8606 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008607
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008608 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8609 CmdArgs.push_back("--no-demangle");
8610
Alexey Samsonov52550342014-09-15 19:58:40 +00008611 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008612 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008613 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008614 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008615
Douglas Katzman78b37b02015-11-17 20:28:07 +00008616 if (D.CCCIsCXX() &&
8617 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008618 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008619 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008620 if (OnlyLibstdcxxStatic)
8621 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008622 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008623 if (OnlyLibstdcxxStatic)
8624 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008625 CmdArgs.push_back("-lm");
8626 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008627 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8628 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008629
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008630 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008631 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8632 if (Args.hasArg(options::OPT_static))
8633 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008634
Alexey Samsonov52550342014-09-15 19:58:40 +00008635 if (NeedsSanitizerDeps)
8636 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8637
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008638 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8639 Args.hasArg(options::OPT_pthreads);
8640
8641 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8642 options::OPT_fno_openmp, false)) {
8643 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8644 // FIXME: Does this really make sense for all GNU toolchains?
8645 WantPthread = true;
8646
8647 // Also link the particular OpenMP runtimes.
8648 switch (getOpenMPRuntime(ToolChain, Args)) {
8649 case OMPRT_OMP:
8650 CmdArgs.push_back("-lomp");
8651 break;
8652 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008653 CmdArgs.push_back("-lgomp");
8654
8655 // FIXME: Exclude this for platforms with libgomp that don't require
8656 // librt. Most modern Linux platforms require it, but some may not.
8657 CmdArgs.push_back("-lrt");
8658 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008659 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008660 CmdArgs.push_back("-liomp5");
8661 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008662 case OMPRT_Unknown:
8663 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008664 break;
8665 }
Chandler Carruth01538002013-01-17 13:19:29 +00008666 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008667
Renato Golinc4b49242014-02-13 10:01:16 +00008668 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008669
Richard Smith31d1de22015-05-20 22:48:44 +00008670 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008671 CmdArgs.push_back("-lpthread");
8672
8673 CmdArgs.push_back("-lc");
8674
8675 if (Args.hasArg(options::OPT_static))
8676 CmdArgs.push_back("--end-group");
8677 else
Renato Golinc4b49242014-02-13 10:01:16 +00008678 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008679 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008680
Rafael Espindola81937ec2010-12-01 01:52:43 +00008681 if (!Args.hasArg(options::OPT_nostartfiles)) {
8682 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008683 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008684 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008685 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008686 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008687 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008688 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008689
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008690 if (HasCRTBeginEndFiles)
8691 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008692 if (!isAndroid)
8693 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008694 }
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008695 } else if (Args.hasArg(options::OPT_rtlib_EQ))
8696 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008697
Peter Collingbourne39719a72015-11-20 20:49:39 +00008698 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008699}
8700
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008701// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8702// for the various SFI requirements like register masking. The assembly tool
8703// inserts the file containing the macros as an input into all the assembly
8704// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008705void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8706 const InputInfo &Output,
8707 const InputInfoList &Inputs,
8708 const ArgList &Args,
8709 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008710 const toolchains::NaClToolChain &ToolChain =
8711 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008712 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8713 "nacl-arm-macros.s");
8714 InputInfoList NewInputs;
8715 NewInputs.push_back(NaClMacros);
8716 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008717 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8718 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008719}
8720
Douglas Katzman750cfc52015-06-29 18:42:16 +00008721// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008722// we use static by default, do not yet support sanitizers or LTO, and a few
8723// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008724// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008725void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8726 const InputInfo &Output,
8727 const InputInfoList &Inputs,
8728 const ArgList &Args,
8729 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008730
Douglas Katzman54366072015-07-27 16:53:08 +00008731 const toolchains::NaClToolChain &ToolChain =
8732 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008733 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008734 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008735 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008736 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008737
8738 ArgStringList CmdArgs;
8739
8740 // Silence warning for "clang -g foo.o -o foo"
8741 Args.ClaimAllArgs(options::OPT_g_Group);
8742 // and "clang -emit-llvm foo.o -o foo"
8743 Args.ClaimAllArgs(options::OPT_emit_llvm);
8744 // and for "clang -w foo.o -o foo". Other warning options are already
8745 // handled somewhere else.
8746 Args.ClaimAllArgs(options::OPT_w);
8747
8748 if (!D.SysRoot.empty())
8749 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8750
8751 if (Args.hasArg(options::OPT_rdynamic))
8752 CmdArgs.push_back("-export-dynamic");
8753
8754 if (Args.hasArg(options::OPT_s))
8755 CmdArgs.push_back("-s");
8756
Douglas Katzman54366072015-07-27 16:53:08 +00008757 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8758 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008759 CmdArgs.push_back("--build-id");
8760
8761 if (!IsStatic)
8762 CmdArgs.push_back("--eh-frame-hdr");
8763
8764 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008765 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008766 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008767 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008768 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008769 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008770 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008771 else if (Arch == llvm::Triple::mipsel)
8772 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008773 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008774 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8775 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008776
8777 if (IsStatic)
8778 CmdArgs.push_back("-static");
8779 else if (Args.hasArg(options::OPT_shared))
8780 CmdArgs.push_back("-shared");
8781
8782 CmdArgs.push_back("-o");
8783 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00008784 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008785 if (!Args.hasArg(options::OPT_shared))
8786 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8787 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8788
8789 const char *crtbegin;
8790 if (IsStatic)
8791 crtbegin = "crtbeginT.o";
8792 else if (Args.hasArg(options::OPT_shared))
8793 crtbegin = "crtbeginS.o";
8794 else
8795 crtbegin = "crtbegin.o";
8796 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8797 }
8798
8799 Args.AddAllArgs(CmdArgs, options::OPT_L);
8800 Args.AddAllArgs(CmdArgs, options::OPT_u);
8801
Douglas Katzman6059ef92015-11-17 17:41:23 +00008802 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008803
8804 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8805 CmdArgs.push_back("--no-demangle");
8806
8807 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8808
Douglas Katzman78b37b02015-11-17 20:28:07 +00008809 if (D.CCCIsCXX() &&
8810 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008811 bool OnlyLibstdcxxStatic =
8812 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008813 if (OnlyLibstdcxxStatic)
8814 CmdArgs.push_back("-Bstatic");
8815 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8816 if (OnlyLibstdcxxStatic)
8817 CmdArgs.push_back("-Bdynamic");
8818 CmdArgs.push_back("-lm");
8819 }
8820
8821 if (!Args.hasArg(options::OPT_nostdlib)) {
8822 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8823 // Always use groups, since it has no effect on dynamic libraries.
8824 CmdArgs.push_back("--start-group");
8825 CmdArgs.push_back("-lc");
8826 // NaCl's libc++ currently requires libpthread, so just always include it
8827 // in the group for C++.
8828 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008829 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008830 // Gold, used by Mips, handles nested groups differently than ld, and
8831 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8832 // which is not a desired behaviour here.
8833 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8834 if (getToolChain().getArch() == llvm::Triple::mipsel)
8835 CmdArgs.push_back("-lnacl");
8836
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008837 CmdArgs.push_back("-lpthread");
8838 }
8839
8840 CmdArgs.push_back("-lgcc");
8841 CmdArgs.push_back("--as-needed");
8842 if (IsStatic)
8843 CmdArgs.push_back("-lgcc_eh");
8844 else
8845 CmdArgs.push_back("-lgcc_s");
8846 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008847
8848 // Mips needs to create and use pnacl_legacy library that contains
8849 // definitions from bitcode/pnaclmm.c and definitions for
8850 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8851 if (getToolChain().getArch() == llvm::Triple::mipsel)
8852 CmdArgs.push_back("-lpnacl_legacy");
8853
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008854 CmdArgs.push_back("--end-group");
8855 }
8856
8857 if (!Args.hasArg(options::OPT_nostartfiles)) {
8858 const char *crtend;
8859 if (Args.hasArg(options::OPT_shared))
8860 crtend = "crtendS.o";
8861 else
8862 crtend = "crtend.o";
8863
8864 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8865 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8866 }
8867 }
8868
Peter Collingbourne39719a72015-11-20 20:49:39 +00008869 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8870 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008871}
8872
Douglas Katzman95354292015-06-23 20:42:09 +00008873void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8874 const InputInfo &Output,
8875 const InputInfoList &Inputs,
8876 const ArgList &Args,
8877 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008878 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008879 ArgStringList CmdArgs;
8880
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008881 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008882
8883 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008884 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008885
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008886 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008887 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008888
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008889 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008890 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008891}
8892
Douglas Katzman95354292015-06-23 20:42:09 +00008893void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8894 const InputInfo &Output,
8895 const InputInfoList &Inputs,
8896 const ArgList &Args,
8897 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008898 const Driver &D = getToolChain().getDriver();
8899 ArgStringList CmdArgs;
8900
Daniel Dunbarb440f562010-08-02 02:38:21 +00008901 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008902 CmdArgs.push_back("-o");
8903 CmdArgs.push_back(Output.getFilename());
8904 } else {
8905 assert(Output.isNothing() && "Invalid output.");
8906 }
8907
Douglas Katzman78b37b02015-11-17 20:28:07 +00008908 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008909 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8910 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8911 CmdArgs.push_back(
8912 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8913 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008914 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008915
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008916 Args.AddAllArgs(CmdArgs,
8917 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008918
Daniel Dunbar54423b22010-09-17 00:24:54 +00008919 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008920
Xinliang David Li69306c02015-10-22 06:15:31 +00008921 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008922
Douglas Katzman78b37b02015-11-17 20:28:07 +00008923 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008924 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008925 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008926 CmdArgs.push_back("-lm");
8927 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008928 }
8929
Douglas Katzman78b37b02015-11-17 20:28:07 +00008930 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008931 if (Args.hasArg(options::OPT_pthread))
8932 CmdArgs.push_back("-lpthread");
8933 CmdArgs.push_back("-lc");
8934 CmdArgs.push_back("-lCompilerRT-Generic");
8935 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8936 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008937 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008938 }
8939
Logan Chieneb9162f2014-06-26 14:23:45 +00008940 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008941 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008942}
8943
Daniel Dunbarcc912342009-05-02 18:28:39 +00008944/// DragonFly Tools
8945
8946// For now, DragonFly Assemble does just about the same as for
8947// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008948void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8949 const InputInfo &Output,
8950 const InputInfoList &Inputs,
8951 const ArgList &Args,
8952 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008953 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008954 ArgStringList CmdArgs;
8955
8956 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8957 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008958 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008959 CmdArgs.push_back("--32");
8960
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008961 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008962
8963 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008964 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008965
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008966 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008967 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008968
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008969 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008970 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008971}
8972
Douglas Katzman95354292015-06-23 20:42:09 +00008973void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8974 const InputInfo &Output,
8975 const InputInfoList &Inputs,
8976 const ArgList &Args,
8977 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008978 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008979 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008980 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008981
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008982 if (!D.SysRoot.empty())
8983 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8984
John McCall65b8da02013-04-11 22:55:55 +00008985 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008986 if (Args.hasArg(options::OPT_static)) {
8987 CmdArgs.push_back("-Bstatic");
8988 } else {
John McCall65b8da02013-04-11 22:55:55 +00008989 if (Args.hasArg(options::OPT_rdynamic))
8990 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008991 if (Args.hasArg(options::OPT_shared))
8992 CmdArgs.push_back("-Bshareable");
8993 else {
8994 CmdArgs.push_back("-dynamic-linker");
8995 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8996 }
John McCall65b8da02013-04-11 22:55:55 +00008997 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008998 }
8999
9000 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9001 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009002 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009003 CmdArgs.push_back("-m");
9004 CmdArgs.push_back("elf_i386");
9005 }
9006
Daniel Dunbarb440f562010-08-02 02:38:21 +00009007 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009008 CmdArgs.push_back("-o");
9009 CmdArgs.push_back(Output.getFilename());
9010 } else {
9011 assert(Output.isNothing() && "Invalid output.");
9012 }
9013
Douglas Katzman78b37b02015-11-17 20:28:07 +00009014 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009015 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009016 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009017 CmdArgs.push_back(
9018 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009019 else {
9020 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009021 CmdArgs.push_back(
9022 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009023 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009024 CmdArgs.push_back(
9025 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009026 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009027 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009028 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009029 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009030 CmdArgs.push_back(
9031 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009032 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009033 CmdArgs.push_back(
9034 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009035 }
9036
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009037 Args.AddAllArgs(CmdArgs,
9038 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009039
Daniel Dunbar54423b22010-09-17 00:24:54 +00009040 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009041
Douglas Katzman78b37b02015-11-17 20:28:07 +00009042 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009043 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9044 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009045 if (UseGCC47)
9046 CmdArgs.push_back("-L/usr/lib/gcc47");
9047 else
9048 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009049
9050 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009051 if (UseGCC47) {
9052 CmdArgs.push_back("-rpath");
9053 CmdArgs.push_back("/usr/lib/gcc47");
9054 } else {
9055 CmdArgs.push_back("-rpath");
9056 CmdArgs.push_back("/usr/lib/gcc44");
9057 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009058 }
9059
Hans Wennborg70850d82013-07-18 20:29:38 +00009060 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009061 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009062 CmdArgs.push_back("-lm");
9063 }
9064
Daniel Dunbarcc912342009-05-02 18:28:39 +00009065 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009066 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009067
9068 if (!Args.hasArg(options::OPT_nolibc)) {
9069 CmdArgs.push_back("-lc");
9070 }
9071
John McCall65b8da02013-04-11 22:55:55 +00009072 if (UseGCC47) {
9073 if (Args.hasArg(options::OPT_static) ||
9074 Args.hasArg(options::OPT_static_libgcc)) {
9075 CmdArgs.push_back("-lgcc");
9076 CmdArgs.push_back("-lgcc_eh");
9077 } else {
9078 if (Args.hasArg(options::OPT_shared_libgcc)) {
9079 CmdArgs.push_back("-lgcc_pic");
9080 if (!Args.hasArg(options::OPT_shared))
9081 CmdArgs.push_back("-lgcc");
9082 } else {
9083 CmdArgs.push_back("-lgcc");
9084 CmdArgs.push_back("--as-needed");
9085 CmdArgs.push_back("-lgcc_pic");
9086 CmdArgs.push_back("--no-as-needed");
9087 }
9088 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009089 } else {
John McCall65b8da02013-04-11 22:55:55 +00009090 if (Args.hasArg(options::OPT_shared)) {
9091 CmdArgs.push_back("-lgcc_pic");
9092 } else {
9093 CmdArgs.push_back("-lgcc");
9094 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009095 }
9096 }
9097
Douglas Katzman78b37b02015-11-17 20:28:07 +00009098 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009099 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009100 CmdArgs.push_back(
9101 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009102 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009103 CmdArgs.push_back(
9104 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9105 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009106 }
9107
Xinliang David Li69306c02015-10-22 06:15:31 +00009108 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009109
Logan Chieneb9162f2014-06-26 14:23:45 +00009110 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009111 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009112}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009113
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009114// Try to find Exe from a Visual Studio distribution. This first tries to find
9115// an installed copy of Visual Studio and, failing that, looks in the PATH,
9116// making sure that whatever executable that's found is not a same-named exe
9117// from clang itself to prevent clang from falling back to itself.
9118static std::string FindVisualStudioExecutable(const ToolChain &TC,
9119 const char *Exe,
9120 const char *ClangProgramPath) {
9121 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9122 std::string visualStudioBinDir;
9123 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9124 visualStudioBinDir)) {
9125 SmallString<128> FilePath(visualStudioBinDir);
9126 llvm::sys::path::append(FilePath, Exe);
9127 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9128 return FilePath.str();
9129 }
9130
9131 return Exe;
9132}
9133
Douglas Katzman95354292015-06-23 20:42:09 +00009134void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9135 const InputInfo &Output,
9136 const InputInfoList &Inputs,
9137 const ArgList &Args,
9138 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009139 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009140 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009141
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009142 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9143 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009144 CmdArgs.push_back(
9145 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009146
Douglas Katzman78b37b02015-11-17 20:28:07 +00009147 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9148 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009149 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009150
Zachary Turner10d75b22014-10-22 20:40:43 +00009151 if (!llvm::sys::Process::GetEnv("LIB")) {
9152 // If the VC environment hasn't been configured (perhaps because the user
9153 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009154 // the environment variable is set however, assume the user knows what
9155 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009156 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009157 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009158 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9159 SmallString<128> LibDir(VisualStudioDir);
9160 llvm::sys::path::append(LibDir, "VC", "lib");
9161 switch (MSVC.getArch()) {
9162 case llvm::Triple::x86:
9163 // x86 just puts the libraries directly in lib
9164 break;
9165 case llvm::Triple::x86_64:
9166 llvm::sys::path::append(LibDir, "amd64");
9167 break;
9168 case llvm::Triple::arm:
9169 llvm::sys::path::append(LibDir, "arm");
9170 break;
9171 default:
9172 break;
9173 }
9174 CmdArgs.push_back(
9175 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009176
9177 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9178 std::string UniversalCRTLibPath;
9179 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9180 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9181 UniversalCRTLibPath.c_str()));
9182 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009183 }
9184
9185 std::string WindowsSdkLibPath;
9186 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9187 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9188 WindowsSdkLibPath.c_str()));
9189 }
9190
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009191 CmdArgs.push_back("-nologo");
9192
Reid Kleckner124955a2015-08-05 18:51:13 +00009193 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009194 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009195
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009196 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009197 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009198 if (DLL) {
9199 CmdArgs.push_back(Args.MakeArgString("-dll"));
9200
9201 SmallString<128> ImplibName(Output.getFilename());
9202 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009203 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009204 }
9205
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009206 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009207 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009208 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009209 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009210 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9211 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009212 // Make sure the dynamic runtime thunk is not optimized out at link time
9213 // to ensure proper SEH handling.
9214 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009215 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009216 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009217 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009218 for (const auto &Lib : {"asan", "asan_cxx"})
9219 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009220 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009221 }
9222
Hans Wennborg2e274592013-08-13 23:38:57 +00009223 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009224
Alexey Bataevc7e84352015-08-19 04:49:01 +00009225 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9226 options::OPT_fno_openmp, false)) {
9227 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9228 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9229 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9230 TC.getDriver().Dir + "/../lib"));
9231 switch (getOpenMPRuntime(getToolChain(), Args)) {
9232 case OMPRT_OMP:
9233 CmdArgs.push_back("-defaultlib:libomp.lib");
9234 break;
9235 case OMPRT_IOMP5:
9236 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9237 break;
9238 case OMPRT_GOMP:
9239 break;
9240 case OMPRT_Unknown:
9241 // Already diagnosed.
9242 break;
9243 }
9244 }
9245
Reid Kleckner337188f2014-09-16 19:22:00 +00009246 // Add filenames, libraries, and other linker inputs.
9247 for (const auto &Input : Inputs) {
9248 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009249 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009250 continue;
9251 }
9252
9253 const Arg &A = Input.getInputArg();
9254
9255 // Render -l options differently for the MSVC linker.
9256 if (A.getOption().matches(options::OPT_l)) {
9257 StringRef Lib = A.getValue();
9258 const char *LinkLibArg;
9259 if (Lib.endswith(".lib"))
9260 LinkLibArg = Args.MakeArgString(Lib);
9261 else
9262 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9263 CmdArgs.push_back(LinkLibArg);
9264 continue;
9265 }
9266
9267 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9268 // or -L. Render it, even if MSVC doesn't understand it.
9269 A.renderAsInput(Args, CmdArgs);
9270 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009271
Zachary Turner719f58c2014-12-01 23:06:47 +00009272 // We need to special case some linker paths. In the case of lld, we need to
9273 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9274 // linker, we need to use a special search algorithm.
9275 llvm::SmallString<128> linkPath;
9276 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9277 if (Linker.equals_lower("lld"))
9278 Linker = "lld-link";
9279
9280 if (Linker.equals_lower("link")) {
9281 // If we're using the MSVC linker, it's not sufficient to just use link
9282 // from the program PATH, because other environments like GnuWin32 install
9283 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009284 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009285 C.getDriver().getClangProgramPath());
9286 } else {
9287 linkPath = Linker;
9288 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009289 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009290 }
9291
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009292 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009293 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009294}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009295
Douglas Katzman95354292015-06-23 20:42:09 +00009296void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9297 const InputInfo &Output,
9298 const InputInfoList &Inputs,
9299 const ArgList &Args,
9300 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009301 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9302}
9303
Douglas Katzman95354292015-06-23 20:42:09 +00009304std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009305 Compilation &C, const JobAction &JA, const InputInfo &Output,
9306 const InputInfoList &Inputs, const ArgList &Args,
9307 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009308 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009309 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009310 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009311 CmdArgs.push_back("/W0"); // No warnings.
9312
9313 // The goal is to be able to invoke this tool correctly based on
9314 // any flag accepted by clang-cl.
9315
9316 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009317 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009318
9319 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009320 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9321 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9322 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009323 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9324 if (A->getOption().getID() == options::OPT_O0) {
9325 CmdArgs.push_back("/Od");
9326 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009327 CmdArgs.push_back("/Og");
9328
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009329 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009330 if (OptLevel == "s" || OptLevel == "z")
9331 CmdArgs.push_back("/Os");
9332 else
9333 CmdArgs.push_back("/Ot");
9334
9335 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009336 }
9337 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009338 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9339 options::OPT_fno_omit_frame_pointer))
9340 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9341 ? "/Oy"
9342 : "/Oy-");
9343 if (!Args.hasArg(options::OPT_fwritable_strings))
9344 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009345
Nico Weber3f8dafb2015-03-12 19:37:10 +00009346 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009347 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9348
David Majnemerf6072342014-07-01 22:24:56 +00009349 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9350 /*default=*/false))
9351 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009352 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9353 options::OPT_fno_function_sections))
9354 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9355 ? "/Gy"
9356 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009357 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9358 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009359 CmdArgs.push_back(
9360 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009361 if (Args.hasArg(options::OPT_fsyntax_only))
9362 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009363 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9364 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009365 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009366
Nico Weber3f8dafb2015-03-12 19:37:10 +00009367 std::vector<std::string> Includes =
9368 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009369 for (const auto &Include : Includes)
9370 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009371
Hans Wennborg87cfa712013-09-19 20:32:16 +00009372 // Flags that can simply be passed through.
9373 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9374 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009375 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009376 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009377
9378 // The order of these flags is relevant, so pick the last one.
9379 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9380 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9381 A->render(Args, CmdArgs);
9382
Hans Wennborg87cfa712013-09-19 20:32:16 +00009383 // Input filename.
9384 assert(Inputs.size() == 1);
9385 const InputInfo &II = Inputs[0];
9386 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9387 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9388 if (II.isFilename())
9389 CmdArgs.push_back(II.getFilename());
9390 else
9391 II.getInputArg().renderAsInput(Args, CmdArgs);
9392
9393 // Output filename.
9394 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009395 const char *Fo =
9396 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009397 CmdArgs.push_back(Fo);
9398
Hans Wennborg188382e2013-09-20 18:16:35 +00009399 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009400 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9401 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009402 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009403 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009404}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009405
Yaron Keren1c0070c2015-07-02 04:45:27 +00009406/// MinGW Tools
9407void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9408 const InputInfo &Output,
9409 const InputInfoList &Inputs,
9410 const ArgList &Args,
9411 const char *LinkingOutput) const {
9412 claimNoWarnArgs(Args);
9413 ArgStringList CmdArgs;
9414
9415 if (getToolChain().getArch() == llvm::Triple::x86) {
9416 CmdArgs.push_back("--32");
9417 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9418 CmdArgs.push_back("--64");
9419 }
9420
9421 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9422
9423 CmdArgs.push_back("-o");
9424 CmdArgs.push_back(Output.getFilename());
9425
9426 for (const auto &II : Inputs)
9427 CmdArgs.push_back(II.getFilename());
9428
9429 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009430 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009431
9432 if (Args.hasArg(options::OPT_gsplit_dwarf))
9433 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9434 SplitDebugName(Args, Inputs[0]));
9435}
9436
9437void MinGW::Linker::AddLibGCC(const ArgList &Args,
9438 ArgStringList &CmdArgs) const {
9439 if (Args.hasArg(options::OPT_mthreads))
9440 CmdArgs.push_back("-lmingwthrd");
9441 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009442
Yaron Kerenaa281332015-08-09 00:24:07 +00009443 // Make use of compiler-rt if --rtlib option is used
9444 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9445 if (RLT == ToolChain::RLT_Libgcc) {
9446 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9447 Args.hasArg(options::OPT_static);
9448 bool Shared = Args.hasArg(options::OPT_shared);
9449 bool CXX = getToolChain().getDriver().CCCIsCXX();
9450
9451 if (Static || (!CXX && !Shared)) {
9452 CmdArgs.push_back("-lgcc");
9453 CmdArgs.push_back("-lgcc_eh");
9454 } else {
9455 CmdArgs.push_back("-lgcc_s");
9456 CmdArgs.push_back("-lgcc");
9457 }
9458 } else {
9459 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9460 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009461
Yaron Keren1c0070c2015-07-02 04:45:27 +00009462 CmdArgs.push_back("-lmoldname");
9463 CmdArgs.push_back("-lmingwex");
9464 CmdArgs.push_back("-lmsvcrt");
9465}
9466
9467void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9468 const InputInfo &Output,
9469 const InputInfoList &Inputs,
9470 const ArgList &Args,
9471 const char *LinkingOutput) const {
9472 const ToolChain &TC = getToolChain();
9473 const Driver &D = TC.getDriver();
9474 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9475
9476 ArgStringList CmdArgs;
9477
9478 // Silence warning for "clang -g foo.o -o foo"
9479 Args.ClaimAllArgs(options::OPT_g_Group);
9480 // and "clang -emit-llvm foo.o -o foo"
9481 Args.ClaimAllArgs(options::OPT_emit_llvm);
9482 // and for "clang -w foo.o -o foo". Other warning options are already
9483 // handled somewhere else.
9484 Args.ClaimAllArgs(options::OPT_w);
9485
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009486 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9487 if (LinkerName.equals_lower("lld")) {
9488 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009489 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009490 } else if (!LinkerName.equals_lower("ld")) {
9491 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009492 }
9493
Yaron Keren1c0070c2015-07-02 04:45:27 +00009494 if (!D.SysRoot.empty())
9495 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9496
9497 if (Args.hasArg(options::OPT_s))
9498 CmdArgs.push_back("-s");
9499
9500 CmdArgs.push_back("-m");
9501 if (TC.getArch() == llvm::Triple::x86)
9502 CmdArgs.push_back("i386pe");
9503 if (TC.getArch() == llvm::Triple::x86_64)
9504 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009505 if (TC.getArch() == llvm::Triple::arm)
9506 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009507
9508 if (Args.hasArg(options::OPT_mwindows)) {
9509 CmdArgs.push_back("--subsystem");
9510 CmdArgs.push_back("windows");
9511 } else if (Args.hasArg(options::OPT_mconsole)) {
9512 CmdArgs.push_back("--subsystem");
9513 CmdArgs.push_back("console");
9514 }
9515
9516 if (Args.hasArg(options::OPT_static))
9517 CmdArgs.push_back("-Bstatic");
9518 else {
9519 if (Args.hasArg(options::OPT_mdll))
9520 CmdArgs.push_back("--dll");
9521 else if (Args.hasArg(options::OPT_shared))
9522 CmdArgs.push_back("--shared");
9523 CmdArgs.push_back("-Bdynamic");
9524 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9525 CmdArgs.push_back("-e");
9526 if (TC.getArch() == llvm::Triple::x86)
9527 CmdArgs.push_back("_DllMainCRTStartup@12");
9528 else
9529 CmdArgs.push_back("DllMainCRTStartup");
9530 CmdArgs.push_back("--enable-auto-image-base");
9531 }
9532 }
9533
9534 CmdArgs.push_back("-o");
9535 CmdArgs.push_back(Output.getFilename());
9536
9537 Args.AddAllArgs(CmdArgs, options::OPT_e);
9538 // FIXME: add -N, -n flags
9539 Args.AddLastArg(CmdArgs, options::OPT_r);
9540 Args.AddLastArg(CmdArgs, options::OPT_s);
9541 Args.AddLastArg(CmdArgs, options::OPT_t);
9542 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9543 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9544
Douglas Katzman78b37b02015-11-17 20:28:07 +00009545 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009546 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9547 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9548 } else {
9549 if (Args.hasArg(options::OPT_municode))
9550 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9551 else
9552 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9553 }
9554 if (Args.hasArg(options::OPT_pg))
9555 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9556 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9557 }
9558
9559 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009560 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009561 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9562
9563 // TODO: Add ASan stuff here
9564
9565 // TODO: Add profile stuff here
9566
Douglas Katzman78b37b02015-11-17 20:28:07 +00009567 if (D.CCCIsCXX() &&
9568 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009569 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9570 !Args.hasArg(options::OPT_static);
9571 if (OnlyLibstdcxxStatic)
9572 CmdArgs.push_back("-Bstatic");
9573 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9574 if (OnlyLibstdcxxStatic)
9575 CmdArgs.push_back("-Bdynamic");
9576 }
9577
9578 if (!Args.hasArg(options::OPT_nostdlib)) {
9579 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9580 if (Args.hasArg(options::OPT_static))
9581 CmdArgs.push_back("--start-group");
9582
9583 if (Args.hasArg(options::OPT_fstack_protector) ||
9584 Args.hasArg(options::OPT_fstack_protector_strong) ||
9585 Args.hasArg(options::OPT_fstack_protector_all)) {
9586 CmdArgs.push_back("-lssp_nonshared");
9587 CmdArgs.push_back("-lssp");
9588 }
9589 if (Args.hasArg(options::OPT_fopenmp))
9590 CmdArgs.push_back("-lgomp");
9591
9592 AddLibGCC(Args, CmdArgs);
9593
9594 if (Args.hasArg(options::OPT_pg))
9595 CmdArgs.push_back("-lgmon");
9596
Yaron Kerenadce68e2015-07-06 18:52:19 +00009597 if (Args.hasArg(options::OPT_pthread))
9598 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009599
9600 // add system libraries
9601 if (Args.hasArg(options::OPT_mwindows)) {
9602 CmdArgs.push_back("-lgdi32");
9603 CmdArgs.push_back("-lcomdlg32");
9604 }
9605 CmdArgs.push_back("-ladvapi32");
9606 CmdArgs.push_back("-lshell32");
9607 CmdArgs.push_back("-luser32");
9608 CmdArgs.push_back("-lkernel32");
9609
9610 if (Args.hasArg(options::OPT_static))
9611 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009612 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009613 AddLibGCC(Args, CmdArgs);
9614 }
9615
9616 if (!Args.hasArg(options::OPT_nostartfiles)) {
9617 // Add crtfastmath.o if available and fast math is enabled.
9618 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9619
9620 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9621 }
9622 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009623 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009624 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009625}
9626
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009627/// XCore Tools
9628// We pass assemble and link construction to the xcc tool.
9629
Douglas Katzman95354292015-06-23 20:42:09 +00009630void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9631 const InputInfo &Output,
9632 const InputInfoList &Inputs,
9633 const ArgList &Args,
9634 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009635 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009636 ArgStringList CmdArgs;
9637
9638 CmdArgs.push_back("-o");
9639 CmdArgs.push_back(Output.getFilename());
9640
9641 CmdArgs.push_back("-c");
9642
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009643 if (Args.hasArg(options::OPT_v))
9644 CmdArgs.push_back("-v");
9645
Robert Lytton894d25c2014-05-02 09:33:25 +00009646 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9647 if (!A->getOption().matches(options::OPT_g0))
9648 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009649
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009650 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9651 false))
9652 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009653
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009654 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009655
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009656 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009657 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009658
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009659 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009660 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009661}
9662
Douglas Katzman95354292015-06-23 20:42:09 +00009663void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9664 const InputInfo &Output,
9665 const InputInfoList &Inputs,
9666 const ArgList &Args,
9667 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009668 ArgStringList CmdArgs;
9669
9670 if (Output.isFilename()) {
9671 CmdArgs.push_back("-o");
9672 CmdArgs.push_back(Output.getFilename());
9673 } else {
9674 assert(Output.isNothing() && "Invalid output.");
9675 }
9676
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009677 if (Args.hasArg(options::OPT_v))
9678 CmdArgs.push_back("-v");
9679
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009680 // Pass -fexceptions through to the linker if it was present.
9681 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9682 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009683 CmdArgs.push_back("-fexceptions");
9684
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009685 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9686
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009687 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009688 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009689}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009690
Douglas Katzman95354292015-06-23 20:42:09 +00009691void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9692 const InputInfo &Output,
9693 const InputInfoList &Inputs,
9694 const ArgList &Args,
9695 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009696 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009697 const auto &TC =
9698 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9699 ArgStringList CmdArgs;
9700 const char *Exec;
9701
9702 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009703 default:
9704 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009705 case llvm::Triple::arm:
9706 case llvm::Triple::thumb:
9707 break;
9708 case llvm::Triple::x86:
9709 CmdArgs.push_back("--32");
9710 break;
9711 case llvm::Triple::x86_64:
9712 CmdArgs.push_back("--64");
9713 break;
9714 }
9715
9716 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9717
9718 CmdArgs.push_back("-o");
9719 CmdArgs.push_back(Output.getFilename());
9720
9721 for (const auto &Input : Inputs)
9722 CmdArgs.push_back(Input.getFilename());
9723
9724 const std::string Assembler = TC.GetProgramPath("as");
9725 Exec = Args.MakeArgString(Assembler);
9726
Justin Bognerd3371d82015-07-17 03:35:54 +00009727 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009728}
9729
Douglas Katzman95354292015-06-23 20:42:09 +00009730void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9731 const InputInfo &Output,
9732 const InputInfoList &Inputs,
9733 const ArgList &Args,
9734 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009735 const auto &TC =
9736 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9737 const llvm::Triple &T = TC.getTriple();
9738 const Driver &D = TC.getDriver();
9739 SmallString<128> EntryPoint;
9740 ArgStringList CmdArgs;
9741 const char *Exec;
9742
9743 // Silence warning for "clang -g foo.o -o foo"
9744 Args.ClaimAllArgs(options::OPT_g_Group);
9745 // and "clang -emit-llvm foo.o -o foo"
9746 Args.ClaimAllArgs(options::OPT_emit_llvm);
9747 // and for "clang -w foo.o -o foo"
9748 Args.ClaimAllArgs(options::OPT_w);
9749 // Other warning options are already handled somewhere else.
9750
9751 if (!D.SysRoot.empty())
9752 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9753
9754 if (Args.hasArg(options::OPT_pie))
9755 CmdArgs.push_back("-pie");
9756 if (Args.hasArg(options::OPT_rdynamic))
9757 CmdArgs.push_back("-export-dynamic");
9758 if (Args.hasArg(options::OPT_s))
9759 CmdArgs.push_back("--strip-all");
9760
9761 CmdArgs.push_back("-m");
9762 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009763 default:
9764 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009765 case llvm::Triple::arm:
9766 case llvm::Triple::thumb:
9767 // FIXME: this is incorrect for WinCE
9768 CmdArgs.push_back("thumb2pe");
9769 break;
9770 case llvm::Triple::x86:
9771 CmdArgs.push_back("i386pe");
9772 EntryPoint.append("_");
9773 break;
9774 case llvm::Triple::x86_64:
9775 CmdArgs.push_back("i386pep");
9776 break;
9777 }
9778
9779 if (Args.hasArg(options::OPT_shared)) {
9780 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009781 default:
9782 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009783 case llvm::Triple::arm:
9784 case llvm::Triple::thumb:
9785 case llvm::Triple::x86_64:
9786 EntryPoint.append("_DllMainCRTStartup");
9787 break;
9788 case llvm::Triple::x86:
9789 EntryPoint.append("_DllMainCRTStartup@12");
9790 break;
9791 }
9792
9793 CmdArgs.push_back("-shared");
9794 CmdArgs.push_back("-Bdynamic");
9795
9796 CmdArgs.push_back("--enable-auto-image-base");
9797
9798 CmdArgs.push_back("--entry");
9799 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9800 } else {
9801 EntryPoint.append("mainCRTStartup");
9802
9803 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9804 : "-Bdynamic");
9805
Douglas Katzman78b37b02015-11-17 20:28:07 +00009806 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009807 CmdArgs.push_back("--entry");
9808 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9809 }
9810
9811 // FIXME: handle subsystem
9812 }
9813
9814 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009815 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009816
9817 CmdArgs.push_back("-o");
9818 CmdArgs.push_back(Output.getFilename());
9819
9820 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9821 SmallString<261> ImpLib(Output.getFilename());
9822 llvm::sys::path::replace_extension(ImpLib, ".lib");
9823
9824 CmdArgs.push_back("--out-implib");
9825 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9826 }
9827
Douglas Katzman78b37b02015-11-17 20:28:07 +00009828 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009829 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9830 const char *CRTBegin;
9831
9832 CRTBegin =
9833 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9834 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9835 }
9836
9837 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009838 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009839 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9840
9841 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9842 !Args.hasArg(options::OPT_nodefaultlibs)) {
9843 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9844 !Args.hasArg(options::OPT_static);
9845 if (StaticCXX)
9846 CmdArgs.push_back("-Bstatic");
9847 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9848 if (StaticCXX)
9849 CmdArgs.push_back("-Bdynamic");
9850 }
9851
9852 if (!Args.hasArg(options::OPT_nostdlib)) {
9853 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9854 // TODO handle /MT[d] /MD[d]
9855 CmdArgs.push_back("-lmsvcrt");
9856 AddRunTimeLibs(TC, D, CmdArgs, Args);
9857 }
9858 }
9859
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009860 if (TC.getSanitizerArgs().needsAsanRt()) {
9861 // TODO handle /MT[d] /MD[d]
9862 if (Args.hasArg(options::OPT_shared)) {
9863 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9864 } else {
9865 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9866 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9867 // Make sure the dynamic runtime thunk is not optimized out at link time
9868 // to ensure proper SEH handling.
9869 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9870 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9871 ? "___asan_seh_interceptor"
9872 : "__asan_seh_interceptor"));
9873 }
9874 }
9875
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009876 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009877
Justin Bognerd3371d82015-07-17 03:35:54 +00009878 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009879}
Douglas Katzman84a75642015-06-19 14:55:19 +00009880
Douglas Katzman95354292015-06-23 20:42:09 +00009881void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9882 const InputInfo &Output,
9883 const InputInfoList &Inputs,
9884 const ArgList &Args,
9885 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009886 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +00009887 assert(Inputs.size() == 1);
9888 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009889 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
9890 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +00009891
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009892 if (JA.getKind() == Action::PreprocessJobClass) {
9893 Args.ClaimAllArgs();
9894 CmdArgs.push_back("-E");
9895 } else {
9896 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9897 CmdArgs.push_back("-S");
9898 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9899 }
Douglas Katzman84a75642015-06-19 14:55:19 +00009900 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009901 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +00009902
Douglas Katzmanf6071112015-08-03 14:34:22 +00009903 // Append all -I, -iquote, -isystem paths, defines/undefines,
9904 // 'f' flags, optimize flags, and warning options.
9905 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009906 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +00009907 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +00009908 options::OPT_f_Group, options::OPT_f_clang_Group,
9909 options::OPT_g_Group, options::OPT_M_Group,
9910 options::OPT_O_Group, options::OPT_W_Group});
9911
9912 // If we're producing a dependency file, and assembly is the final action,
9913 // then the name of the target in the dependency file should be the '.o'
9914 // file, not the '.s' file produced by this step. For example, instead of
9915 // /tmp/mumble.s: mumble.c .../someheader.h
9916 // the filename on the lefthand side should be "mumble.o"
9917 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9918 C.getActions().size() == 1 &&
9919 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9920 Arg *A = Args.getLastArg(options::OPT_o);
9921 if (A) {
9922 CmdArgs.push_back("-MT");
9923 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9924 }
9925 }
9926
Douglas Katzman84a75642015-06-19 14:55:19 +00009927 CmdArgs.push_back(II.getFilename());
9928 CmdArgs.push_back("-o");
9929 CmdArgs.push_back(Output.getFilename());
9930
9931 std::string Exec =
9932 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009933 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9934 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009935}
9936
Douglas Katzman95354292015-06-23 20:42:09 +00009937void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9938 const InputInfo &Output,
9939 const InputInfoList &Inputs,
9940 const ArgList &Args,
9941 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009942 ArgStringList CmdArgs;
9943
9944 assert(Inputs.size() == 1);
9945 const InputInfo &II = Inputs[0];
9946 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9947 assert(Output.getType() == types::TY_Object);
9948
9949 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009950 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009951 CmdArgs.push_back("-noSPrefixing");
9952 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009953 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9954 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9955 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009956 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009957 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009958 }
9959 CmdArgs.push_back("-elf"); // Output format.
9960 CmdArgs.push_back(II.getFilename());
9961 CmdArgs.push_back(
9962 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9963
9964 std::string Exec =
9965 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009966 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9967 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009968}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009969
9970void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9971 const InputInfo &Output,
9972 const InputInfoList &Inputs,
9973 const ArgList &Args,
9974 const char *LinkingOutput) const {
9975 const auto &TC =
9976 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9977 const llvm::Triple &T = TC.getTriple();
9978 ArgStringList CmdArgs;
Douglas Katzman9d403742015-11-17 22:33:34 +00009979 bool UseStartfiles = !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +00009980 bool UseDefaultLibs =
9981 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009982
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009983 if (T.getArch() == llvm::Triple::sparc)
9984 CmdArgs.push_back("-EB");
9985 else // SHAVE assumes little-endian, and sparcel is expressly so.
9986 CmdArgs.push_back("-EL");
9987
9988 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9989 // but we never pass through a --sysroot option and various other bits.
9990 // For example, there are no sanitizers (yet) nor gold linker.
9991
9992 // Eat some arguments that may be present but have no effect.
9993 Args.ClaimAllArgs(options::OPT_g_Group);
9994 Args.ClaimAllArgs(options::OPT_w);
9995 Args.ClaimAllArgs(options::OPT_static_libgcc);
9996
9997 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9998 CmdArgs.push_back("-s");
9999
10000 CmdArgs.push_back("-o");
10001 CmdArgs.push_back(Output.getFilename());
10002
10003 if (UseStartfiles) {
10004 // If you want startfiles, it means you want the builtin crti and crtbegin,
10005 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010006 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10007 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010008 }
10009
10010 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10011 options::OPT_e, options::OPT_s, options::OPT_t,
10012 options::OPT_Z_Flag, options::OPT_r});
10013
Douglas Katzman674a3122015-11-18 16:24:46 +000010014 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010015
10016 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10017
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010018 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010019 if (C.getDriver().CCCIsCXX())
10020 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010021 if (T.getOS() == llvm::Triple::RTEMS) {
10022 CmdArgs.push_back("--start-group");
10023 CmdArgs.push_back("-lc");
10024 // You must provide your own "-L" option to enable finding these.
10025 CmdArgs.push_back("-lrtemscpu");
10026 CmdArgs.push_back("-lrtemsbsp");
10027 CmdArgs.push_back("--end-group");
10028 } else {
10029 CmdArgs.push_back("-lc");
10030 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010031 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010032 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010033 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010034 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10035 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010036 }
10037
10038 std::string Exec =
10039 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10040 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10041 CmdArgs, Inputs));
10042}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010043
10044void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10045 const InputInfo &Output,
10046 const InputInfoList &Inputs,
10047 const ArgList &Args,
10048 const char *LinkingOutput) const {
10049 claimNoWarnArgs(Args);
10050 ArgStringList CmdArgs;
10051
10052 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10053
10054 CmdArgs.push_back("-o");
10055 CmdArgs.push_back(Output.getFilename());
10056
10057 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10058 const InputInfo &Input = Inputs[0];
10059 assert(Input.isFilename() && "Invalid input.");
10060 CmdArgs.push_back(Input.getFilename());
10061
10062 const char *Exec =
10063 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10064 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10065}
10066
10067static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
10068 ArgStringList &CmdArgs) {
10069 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
10070 false) ||
10071 Args.hasArg(options::OPT_fprofile_generate) ||
10072 Args.hasArg(options::OPT_fprofile_instr_generate) ||
10073 Args.hasArg(options::OPT_fcreate_profile) ||
10074 Args.hasArg(options::OPT_coverage)))
10075 return;
10076
10077 assert(TC.getTriple().isPS4CPU() &&
10078 "Profiling libraries are only implemented for the PS4 CPU");
10079 CmdArgs.push_back("-lclang_rt.profile-x86_64");
10080}
10081
10082static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10083 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10084 if (SanArgs.needsUbsanRt()) {
10085 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10086 }
10087 if (SanArgs.needsAsanRt()) {
10088 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10089 }
10090}
10091
10092static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10093 const JobAction &JA, const InputInfo &Output,
10094 const InputInfoList &Inputs,
10095 const ArgList &Args,
10096 const char *LinkingOutput) {
10097 const toolchains::FreeBSD &ToolChain =
10098 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10099 const Driver &D = ToolChain.getDriver();
10100 ArgStringList CmdArgs;
10101
10102 // Silence warning for "clang -g foo.o -o foo"
10103 Args.ClaimAllArgs(options::OPT_g_Group);
10104 // and "clang -emit-llvm foo.o -o foo"
10105 Args.ClaimAllArgs(options::OPT_emit_llvm);
10106 // and for "clang -w foo.o -o foo". Other warning options are already
10107 // handled somewhere else.
10108 Args.ClaimAllArgs(options::OPT_w);
10109
10110 if (!D.SysRoot.empty())
10111 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10112
10113 if (Args.hasArg(options::OPT_pie))
10114 CmdArgs.push_back("-pie");
10115
10116 if (Args.hasArg(options::OPT_rdynamic))
10117 CmdArgs.push_back("-export-dynamic");
10118 if (Args.hasArg(options::OPT_shared))
10119 CmdArgs.push_back("--oformat=so");
10120
10121 if (Output.isFilename()) {
10122 CmdArgs.push_back("-o");
10123 CmdArgs.push_back(Output.getFilename());
10124 } else {
10125 assert(Output.isNothing() && "Invalid output.");
10126 }
10127
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010128 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10129
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010130 Args.AddAllArgs(CmdArgs, options::OPT_L);
10131 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10132 Args.AddAllArgs(CmdArgs, options::OPT_e);
10133 Args.AddAllArgs(CmdArgs, options::OPT_s);
10134 Args.AddAllArgs(CmdArgs, options::OPT_t);
10135 Args.AddAllArgs(CmdArgs, options::OPT_r);
10136
10137 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10138 CmdArgs.push_back("--no-demangle");
10139
10140 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10141
10142 if (Args.hasArg(options::OPT_pthread)) {
10143 CmdArgs.push_back("-lpthread");
10144 }
10145
10146 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010147
10148 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10149
10150 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10151}
10152
10153static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10154 const JobAction &JA, const InputInfo &Output,
10155 const InputInfoList &Inputs,
10156 const ArgList &Args,
10157 const char *LinkingOutput) {
10158 const toolchains::FreeBSD &ToolChain =
10159 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10160 const Driver &D = ToolChain.getDriver();
10161 ArgStringList CmdArgs;
10162
10163 // Silence warning for "clang -g foo.o -o foo"
10164 Args.ClaimAllArgs(options::OPT_g_Group);
10165 // and "clang -emit-llvm foo.o -o foo"
10166 Args.ClaimAllArgs(options::OPT_emit_llvm);
10167 // and for "clang -w foo.o -o foo". Other warning options are already
10168 // handled somewhere else.
10169 Args.ClaimAllArgs(options::OPT_w);
10170
10171 if (!D.SysRoot.empty())
10172 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10173
10174 if (Args.hasArg(options::OPT_pie))
10175 CmdArgs.push_back("-pie");
10176
10177 if (Args.hasArg(options::OPT_static)) {
10178 CmdArgs.push_back("-Bstatic");
10179 } else {
10180 if (Args.hasArg(options::OPT_rdynamic))
10181 CmdArgs.push_back("-export-dynamic");
10182 CmdArgs.push_back("--eh-frame-hdr");
10183 if (Args.hasArg(options::OPT_shared)) {
10184 CmdArgs.push_back("-Bshareable");
10185 } else {
10186 CmdArgs.push_back("-dynamic-linker");
10187 CmdArgs.push_back("/libexec/ld-elf.so.1");
10188 }
10189 CmdArgs.push_back("--enable-new-dtags");
10190 }
10191
10192 if (Output.isFilename()) {
10193 CmdArgs.push_back("-o");
10194 CmdArgs.push_back(Output.getFilename());
10195 } else {
10196 assert(Output.isNothing() && "Invalid output.");
10197 }
10198
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010199 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10200
Douglas Katzman78b37b02015-11-17 20:28:07 +000010201 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010202 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010203 if (!Args.hasArg(options::OPT_shared)) {
10204 if (Args.hasArg(options::OPT_pg))
10205 crt1 = "gcrt1.o";
10206 else if (Args.hasArg(options::OPT_pie))
10207 crt1 = "Scrt1.o";
10208 else
10209 crt1 = "crt1.o";
10210 }
10211 if (crt1)
10212 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10213
10214 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10215
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010216 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010217 if (Args.hasArg(options::OPT_static))
10218 crtbegin = "crtbeginT.o";
10219 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10220 crtbegin = "crtbeginS.o";
10221 else
10222 crtbegin = "crtbegin.o";
10223
10224 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10225 }
10226
10227 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010228 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010229 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10230 Args.AddAllArgs(CmdArgs, options::OPT_e);
10231 Args.AddAllArgs(CmdArgs, options::OPT_s);
10232 Args.AddAllArgs(CmdArgs, options::OPT_t);
10233 Args.AddAllArgs(CmdArgs, options::OPT_r);
10234
10235 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10236 CmdArgs.push_back("--no-demangle");
10237
10238 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10239
Douglas Katzman78b37b02015-11-17 20:28:07 +000010240 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010241 // For PS4, we always want to pass libm, libstdc++ and libkernel
10242 // libraries for both C and C++ compilations.
10243 CmdArgs.push_back("-lkernel");
10244 if (D.CCCIsCXX()) {
10245 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10246 if (Args.hasArg(options::OPT_pg))
10247 CmdArgs.push_back("-lm_p");
10248 else
10249 CmdArgs.push_back("-lm");
10250 }
10251 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10252 // the default system libraries. Just mimic this for now.
10253 if (Args.hasArg(options::OPT_pg))
10254 CmdArgs.push_back("-lgcc_p");
10255 else
10256 CmdArgs.push_back("-lcompiler_rt");
10257 if (Args.hasArg(options::OPT_static)) {
10258 CmdArgs.push_back("-lstdc++");
10259 } else if (Args.hasArg(options::OPT_pg)) {
10260 CmdArgs.push_back("-lgcc_eh_p");
10261 } else {
10262 CmdArgs.push_back("--as-needed");
10263 CmdArgs.push_back("-lstdc++");
10264 CmdArgs.push_back("--no-as-needed");
10265 }
10266
10267 if (Args.hasArg(options::OPT_pthread)) {
10268 if (Args.hasArg(options::OPT_pg))
10269 CmdArgs.push_back("-lpthread_p");
10270 else
10271 CmdArgs.push_back("-lpthread");
10272 }
10273
10274 if (Args.hasArg(options::OPT_pg)) {
10275 if (Args.hasArg(options::OPT_shared))
10276 CmdArgs.push_back("-lc");
10277 else {
10278 if (Args.hasArg(options::OPT_static)) {
10279 CmdArgs.push_back("--start-group");
10280 CmdArgs.push_back("-lc_p");
10281 CmdArgs.push_back("-lpthread_p");
10282 CmdArgs.push_back("--end-group");
10283 } else {
10284 CmdArgs.push_back("-lc_p");
10285 }
10286 }
10287 CmdArgs.push_back("-lgcc_p");
10288 } else {
10289 if (Args.hasArg(options::OPT_static)) {
10290 CmdArgs.push_back("--start-group");
10291 CmdArgs.push_back("-lc");
10292 CmdArgs.push_back("-lpthread");
10293 CmdArgs.push_back("--end-group");
10294 } else {
10295 CmdArgs.push_back("-lc");
10296 }
10297 CmdArgs.push_back("-lcompiler_rt");
10298 }
10299
10300 if (Args.hasArg(options::OPT_static)) {
10301 CmdArgs.push_back("-lstdc++");
10302 } else if (Args.hasArg(options::OPT_pg)) {
10303 CmdArgs.push_back("-lgcc_eh_p");
10304 } else {
10305 CmdArgs.push_back("--as-needed");
10306 CmdArgs.push_back("-lstdc++");
10307 CmdArgs.push_back("--no-as-needed");
10308 }
10309 }
10310
Douglas Katzman78b37b02015-11-17 20:28:07 +000010311 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010312 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10313 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10314 else
10315 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10316 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10317 }
10318
10319 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010320
10321 const char *Exec =
10322#ifdef LLVM_ON_WIN32
10323 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10324#else
10325 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10326#endif
10327
10328 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10329}
10330
10331void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10332 const InputInfo &Output,
10333 const InputInfoList &Inputs,
10334 const ArgList &Args,
10335 const char *LinkingOutput) const {
10336 const toolchains::FreeBSD &ToolChain =
10337 static_cast<const toolchains::FreeBSD &>(getToolChain());
10338 const Driver &D = ToolChain.getDriver();
10339 bool PS4Linker;
10340 StringRef LinkerOptName;
10341 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10342 LinkerOptName = A->getValue();
10343 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10344 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10345 }
10346
10347 if (LinkerOptName == "gold")
10348 PS4Linker = false;
10349 else if (LinkerOptName == "ps4")
10350 PS4Linker = true;
10351 else
10352 PS4Linker = !Args.hasArg(options::OPT_shared);
10353
10354 if (PS4Linker)
10355 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10356 else
10357 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10358}